commit c25c3793466e2516395e40e2061134ffe553cfe8
parent 39907c79a4c5509db8500b4ad3fb7947eb7b94d9
Author: Petr Vaněk <arkamar@atlas.cz>
Date: Thu, 29 Sep 2022 10:40:48 +0200
Always clean before exit
This improves situations when ii exits unexpectedly, due to a ping
timeout or closed remote connection, for example. If this happens, all
"in" FIFOs are removed before exit in similar fashion to regular exit
issued with "/q" command.
Diffstat:
M | ii.c | | | 27 | +++++++++++++++++++-------- |
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/ii.c b/ii.c
@@ -54,6 +54,7 @@ static int channel_open(Channel *);
static void channel_print(Channel *, const char *);
static int channel_reopen(Channel *);
static void channel_rm(Channel *);
+static void clean(void);
static void create_dirtree(const char *);
static void create_filepath(char *, size_t, const char *, const char *, const char *);
static void die(const char *, ...);
@@ -92,6 +93,8 @@ die(const char *fmt, ...)
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
+
+ clean();
exit(1);
}
@@ -171,6 +174,20 @@ channel_normalize_name(char *s)
}
static void
+clean(void)
+{
+ Channel *c, *tmp;
+
+ if (channelmaster)
+ channel_leave(channelmaster);
+
+ for (c = channels; c; c = tmp) {
+ tmp = c->next;
+ channel_leave(c);
+ }
+}
+
+static void
create_filepath(char *filepath, size_t len, const char *path,
const char *channel, const char *suffix)
{
@@ -757,6 +774,7 @@ run(int ircfd, const char *host)
} else if (r == 0) {
if (time(NULL) - last_response >= PING_TIMEOUT) {
channel_print(channelmaster, "-!- ii shutting down: ping timeout");
+ clean();
exit(2); /* status code 2 for timeout */
}
ewritestr(ircfd, ping_msg);
@@ -777,7 +795,6 @@ run(int ircfd, const char *host)
int
main(int argc, char *argv[])
{
- Channel *c, *tmp;
struct passwd *spw;
const char *key = NULL, *fullname = NULL, *host = "";
const char *uds = NULL, *service = "6667";
@@ -843,13 +860,7 @@ main(int argc, char *argv[])
loginuser(ircfd, host, fullname && *fullname ? fullname : nick);
setup();
run(ircfd, host);
- if (channelmaster)
- channel_leave(channelmaster);
-
- for (c = channels; c; c = tmp) {
- tmp = c->next;
- channel_leave(c);
- }
+ clean();
return 0;
}