chiark / gitweb /
split --no-daemon into --no-daemon and --interactive
[inn-innduct.git] / backends / innduct.c
index fb5ddca266c491a63463724f7e378dd9c7546013..8104fee469826eb8e83f0b0480e3ecdfd35ab660 100644 (file)
@@ -365,7 +365,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 +373,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;
 
@@ -533,7 +533,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 +554,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 +1191,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 +1223,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");
 }  
@@ -1374,7 +1375,7 @@ static void connect_start(void) {
   assert(!connecting_fdpass_sock);
 
   info("starting connection attempt");
-  int ok_reconnect_delay_periods= reconnect_delay_periods;
+  int ok_until_connect= until_connect;
   reconnect_blocking_event();
 
   int socks[2];
@@ -1470,7 +1471,7 @@ static void connect_start(void) {
   on_fd_read_except(connecting_fdpass_sock, connchild_event);
 
   if (!conns.count)
-    reconnect_delay_periods= ok_reconnect_delay_periods;
+    until_connect= ok_until_connect;
 }
 
 /*---------- assigning articles to conns, and transmitting ----------*/
@@ -3311,11 +3312,11 @@ static void period(void) {
   debug("PERIOD"
        " sms=%s[%d] conns=%d until_connect=%d"
        " input_files main:%s flushing:%s backlog:%s[%d]"
-       " children connecting=%ld inndcomm=%ld"
+       " children connecting=%ld inndcomm=%ld lowvol_total=%d"
        ,
        sms_names[sms], until_flush, conns.count, until_connect,
        dipf_main, dipf_flushing, dipf_backlog, until_backlog_nextscan,
-       (long)connecting_child, (long)inndcomm_child
+       (long)connecting_child, (long)inndcomm_child, lowvol_total
        );
 
   free(dipf_main);
@@ -3406,6 +3407,17 @@ CCMD(dump) {
   DUMPV("%d", , cli_master);
   fprintf(f,"\n");
 
+  fprintf(f,"lowvol");
+  DUMPV("%d", , lowvol_circptr);
+  DUMPV("%d", , lowvol_total);
+  fprintf(f,":");
+  for (i=0; i<lowvol_periods; i++) {
+    fprintf(f," ");
+    if (i==lowvol_circptr) fprintf(f,"*");
+    fprintf(f,"%d",lowvol_perperiod[i]);
+  }
+  fprintf(f,"\n");
+
   fprintf(f,"filemon ");
   filemon_method_dump_info(f);
 
@@ -3469,7 +3481,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);
 }
@@ -3629,7 +3641,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      },
@@ -3774,6 +3787,7 @@ int main(int argc, char **argv) {
     lowvol_perperiod[i]= lowvol_thresh;
     lowvol_total += lowvol_thresh;
   }
+  lowvol_total -= lowvol_thresh;
 
   /* set things up */
 
@@ -3789,13 +3803,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);
@@ -3829,7 +3847,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();