reconnect.diff (2205B)
1 cio.c | 33 ++++++++++++++++++++++++++------- 2 1 file changed, 26 insertions(+), 7 deletions(-) 3 4 diff --git a/cio.c b/cio.c 5 index f346646..da3d8e9 100644 6 --- a/cio.c 7 +++ b/cio.c 8 @@ -83,6 +83,7 @@ enum { 9 PingDelay = 6, 10 UtfSz = 4, 11 RuneInvalid = 0xFFFD, 12 + MaxRecons = 10, /* -1 for infinitely many */ 13 }; 14 15 typedef wchar_t Rune; 16 @@ -927,7 +928,7 @@ main(int argc, char *argv[]) 17 const char *server = SRV; 18 const char *port = PORT; 19 const char *err; 20 - int o, ping; 21 + int o, ping, reconn; 22 23 signal(SIGPIPE, SIG_IGN); 24 while ((o = getopt(argc, argv, "hvTVn:c:u:s:p:l:")) >= 0) 25 @@ -982,13 +983,14 @@ main(int argc, char *argv[]) 26 tinit(); 27 err = dial(server, port); 28 #ifdef __OpenBSD__ 29 - if (pledge("stdio tty", NULL) == -1) 30 + if (pledge("stdio tty rpath inet dns", NULL) == -1) 31 die("pledge"); 32 #endif /* __OpenBSD__ */ 33 if (err) die("cio: %s", err); 34 chadd(server, 0); 35 sinit(nick, user); 36 ping = 0; 37 + reconn = 0; 38 while (!quit) { 39 struct timeval t = {.tv_sec = 5}; 40 fd_set rfs, wfs; 41 @@ -997,17 +999,33 @@ main(int argc, char *argv[]) 42 FD_ZERO(&wfs); 43 FD_ZERO(&rfs); 44 FD_SET(0, &rfs); 45 - FD_SET(srv.fd, &rfs); 46 - if (outp != outb) 47 - FD_SET(srv.fd, &wfs); 48 + if (!reconn) { 49 + FD_SET(srv.fd, &rfs); 50 + if (outp != outb) 51 + FD_SET(srv.fd, &wfs); 52 + } 53 if (select(srv.fd + 1, &rfs, &wfs, 0, &t) < 0) { 54 if (errno == EINTR) 55 continue; 56 die("cio: select failed:"); 57 } 58 + if (reconn) { 59 + hangup(); 60 + if (reconn > MaxRecons) 61 + die("cio: link lost"); 62 + pushf(0, "-!- Link lost, attempt %d/%d...", reconn++, MaxRecons); 63 + if (dial(server, port) != 0) 64 + continue; 65 + sinit(nick, user); 66 + for (struct Chan *c = chl; c < &chl[nch]; ++c) 67 + if (c->join) 68 + sndf("JOIN %s", c->name); 69 + reconn = 0; 70 + } 71 if (FD_ISSET(srv.fd, &rfs)) { 72 if (!srd()) { 73 - die("cio: connection closed by remote host"); 74 + reconn = 1; 75 + continue; 76 } 77 } 78 if (FD_ISSET(srv.fd, &wfs)) { 79 @@ -1018,7 +1036,8 @@ main(int argc, char *argv[]) 80 else 81 wr = write(srv.fd, outb, len); 82 if (wr <= 0) { 83 - die("cio: write failed: connection lost"); 84 + reconn = 1; 85 + continue; 86 } 87 outp -= wr; 88 memmove(outb, outb + wr, outp - outb);