X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;ds=sidebyside;f=backends%2Finnduct.c;h=d59d888362c3fd838ecab027abec067ab0826f37;hb=8dabf92db4447ec601ecbab0a709650f427d016b;hp=c42771d885729dae0115eba0ff00f06d04c62e69;hpb=87034f9481f8c7722d8958cf13acf1ad4bffc87f;p=inn-innduct.git diff --git a/backends/innduct.c b/backends/innduct.c index c42771d..d59d888 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -23,13 +23,6 @@ * with GPLv3. If not then please let me know. -Ian Jackson.) */ -/* - * todo - * - * don't mind reconnecting if we just disconnected due to idle - * some weird disconnection event still investigating - */ - /* * Newsfeeds file entries should look like this: * host.name.of.site[/exclude,exclude,...]\ @@ -365,7 +358,7 @@ static oop_rd_call peer_rd_err, peer_rd_ok; static const char *sitename, *remote_host; static const char *feedfile, *path_run, *path_cli, *path_cli_dir; static int quiet_multiple=0; -static int become_daemon=1, try_filemon=1; +static int interactive=0, try_filemon=1; static int try_stream=1; static int port=119; static const char *inndconffile; @@ -373,7 +366,7 @@ static const char *inndconffile; static int max_connections=10; static int max_queue_per_conn=200; static int target_max_feedfile_size=100000; -static int period_seconds=60; +static int period_seconds=30; static int filepoll_seconds=5; static int max_queue_per_ipf=-1; @@ -511,6 +504,7 @@ struct Conn { ISNODE(Conn); int fd; /* may be 0, meaning closed (during construction/destruction) */ oop_read *rd; /* likewise */ + int oopwriting; /* since on_fd is not idempotent */ int max_queue, stream; const char *quitting; int since_activity; /* periods */ @@ -533,7 +527,7 @@ static char *globpat_backlog; static pid_t self_pid; static int *lowvol_perperiod; static int lowvol_circptr; -static int lowvol_total; +static int lowvol_total; /* does not include current period */ /* statemc_init initialises */ static StateMachineState sms; @@ -554,7 +548,7 @@ int simulate_flush= -1; static void logcore(int sysloglevel, const char *fmt, ...) PRINTF(2,3); static void logcore(int sysloglevel, const char *fmt, ...) { VA; - if (become_daemon) { + if (interactive < 2) { vsyslog(sysloglevel,fmt,al); } else { if (self_pid) fprintf(stderr,"[%lu] ",(unsigned long)self_pid); @@ -1191,9 +1185,10 @@ static void conn_idle_close(Conn *conn, const char *why) { static void check_idle_conns(void) { Conn *conn; - int verylowvol= lowvol_perperiod[lowvol_circptr]; + int volthisperiod= lowvol_perperiod[lowvol_circptr]; lowvol_circptr++; lowvol_circptr %= lowvol_periods; + lowvol_total += volthisperiod; lowvol_total -= lowvol_perperiod[lowvol_circptr]; lowvol_perperiod[lowvol_circptr]= 0; @@ -1222,9 +1217,9 @@ static void check_idle_conns(void) { } conn= LIST_HEAD(conns); - if (!verylowvol && + if (!volthisperiod && conns.count==1 && - lowvol_total+verylowvol < lowvol_thresh && + lowvol_total < lowvol_thresh && !conn_busy(conn)) conn_idle_close(conn, "low volume"); } @@ -1546,12 +1541,16 @@ static void conn_maybe_write(Conn *conn) { conn_make_some_xmits(conn); if (!conn->xmitu) { loop->cancel_fd(loop, conn->fd, OOP_WRITE); + conn->oopwriting= 0; return; } void *rp= conn_write_some_xmits(conn); if (rp==OOP_CONTINUE) { - loop->on_fd(loop, conn->fd, OOP_WRITE, conn_writeable, conn); + if (!conn->oopwriting) { + loop->on_fd(loop, conn->fd, OOP_WRITE, conn_writeable, conn); + conn->oopwriting= 1; + } return; } else if (rp==OOP_HALT) { return; @@ -3406,7 +3405,7 @@ CCMD(dump) { DUMPV("%d", , cli_master); fprintf(f,"\n"); - fprintf(f,"lowvol "); + fprintf(f,"lowvol"); DUMPV("%d", , lowvol_circptr); DUMPV("%d", , lowvol_total); fprintf(f,":"); @@ -3480,7 +3479,7 @@ static void vbadusage(const char *fmt, va_list al) { fprintf(stderr, "bad usage: %s\n" "say --help for help, or read the manpage\n", m); - if (become_daemon) + if (interactive < 2) syslog(LOG_CRIT,"innduct: invoked with bad usage: %s",m); exit(8); } @@ -3640,7 +3639,8 @@ static void help(const Option *o, const char *val); static const Option innduct_options[]= { {'f',"feedfile", "F", &feedfile, op_string }, {'q',"quiet-multiple", 0, &quiet_multiple, op_setint, 1 }, -{0,"no-daemon", 0, &become_daemon, op_setint, 0 }, +{0,"no-daemon", 0, &interactive, op_setint, 1 }, +{0,"interactive", 0, &interactive, op_setint, 2 }, {0,"no-streaming", 0, &try_stream, op_setint, 0 }, {0,"no-filemon", 0, &try_filemon, op_setint, 0 }, {'C',"inndconf", "F", &inndconffile, op_string }, @@ -3785,6 +3785,7 @@ int main(int argc, char **argv) { lowvol_perperiod[i]= lowvol_thresh; lowvol_total += lowvol_thresh; } + lowvol_total -= lowvol_thresh; /* set things up */ @@ -3800,13 +3801,17 @@ int main(int argc, char **argv) { LIST_INIT(conns); - if (become_daemon) { + if (interactive < 1) { int i; for (i=3; i<255; i++) /* do this now before we open syslog, etc. */ close(i); + } + + if (interactive < 2) openlog("innduct",LOG_NDELAY|LOG_PID,LOG_NEWS); + if (interactive < 1) { int null= open("/dev/null",O_RDWR); if (null<0) sysfatal("failed to open /dev/null"); dup2(null,0); @@ -3840,7 +3845,7 @@ int main(int argc, char **argv) { r= SMsetup(SM_PREOPEN, &val); if (!r) warn("SMsetup SM_PREOPEN failed"); r= SMinit(); if (!r) die("storage manager initialisation (SMinit) failed"); - if (!become_daemon) + if (interactive >= 2) cli_stdio(); cli_init();