cio

a simple irc client
git clone git://kloet.net/cio
Download | Log | Files | Refs | README | LICENSE

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);