chiark / gitweb /
Merge branch 'master' of login.chiark.greenend.org.uk:public-git/inn-innduct
[innduct.git] / backends / innduct.c
index 813091fd01908cff20d64a0766923da474e1272b..b08205ca4156681b9404caa0590f8579bf946138 100644 (file)
@@ -1,17 +1,10 @@
 /*
- * warning if no inotify
- * inotify not working ?
- * some per-conn info thing for control
-
  * todo
- *  - actually do something with readable on control master
- *  - option for realsockdir
- *  - option for filepoll
- *  - option for no inotify
+ *  - inotify not working ?
+ *  - some per-conn info thing for control
  *  - manpage: document control master stuff
- *  - manpage: innconf is used for communicating with innd
- *  - debug this:
+ *
+ * debugging rune:
  *      build-lfs/backends/innduct --no-daemon -f `pwd`/fee sit dom
  */
 
@@ -330,7 +323,7 @@ static oop_rd_call peer_rd_err, peer_rd_ok;
 static const char *sitename, *remote_host;
 static const char *feedfile, *realsockdir="/tmp/innduct.control";
 static int quiet_multiple=0;
-static int become_daemon=1;
+static int become_daemon=1, try_filemon=1;
 static int try_stream=1;
 static int port=119;
 static const char *inndconffile;
@@ -339,6 +332,7 @@ 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 filepoll_seconds=5;
 
 static int connection_setup_timeout=200;
 static int inndcomm_flush_timeout=100;
@@ -955,7 +949,7 @@ static void control_init(void) {
       uid_t self= geteuid();
       if (!S_ISDIR(stab.st_mode) ||
          stab.st_uid != self ||
-         stab.st_mode & 0077) {
+         stab.st_mode & 0007) {
        warn("no control socket, because real socket directory"
             " is somehow wrong (ISDIR=%d, uid=%lu (exp.%lu), mode %lo)",
             !!S_ISDIR(stab.st_mode),
@@ -3122,8 +3116,10 @@ static const Option innduct_options[]= {
 {'q',"quiet-multiple",   0,       &quiet_multiple,           op_setint, 1   },
 {0,"no-daemon",          0,       &become_daemon,            op_setint, 0   },
 {0,"no-streaming",       0,       &try_stream,               op_setint, 0   },
+{0,"no-filemon",         0,       &try_filemon,              op_setint, 0   },
 {'C',"inndconf",         "F",     &inndconffile,             op_string      },
 {'P',"port",             "PORT",  &port,                     op_integer     },
+{0,"ctrl-sock-dir",      0,       &realsockdir,              op_string      },
 {0,"help",               0,       0,                         help           },
 
 {0,"max-connections",    "N",     &max_connections,          op_integer     },
@@ -3131,8 +3127,9 @@ static const Option innduct_options[]= {
 {0,"feedfile-flush-size","BYTES", &target_max_feedfile_size, op_integer     },
 {0,"period-interval",    "TIME",  &period_seconds,           op_seconds     },
 
-{0,"connection-timeout", "TIME",  &connection_setup_timeout, op_seconds     },
-{0,"stuck-flush-timeout","TIME",  &inndcomm_flush_timeout,   op_seconds     },
+{0,"connection-timeout",   "TIME",  &connection_setup_timeout, op_seconds   },
+{0,"stuck-flush-timeout",  "TIME",  &inndcomm_flush_timeout,   op_seconds   },
+{0,"feedfile-poll",        "TIME",  &filepoll_seconds,         op_seconds   },
 
 {0,"no-check-proportion",   "PERCENT",   &nocheck_thresh,       op_double   },
 {0,"no-check-response-time","ARTICLES",  &nocheck_decay,        op_double   },
@@ -3279,10 +3276,16 @@ int main(int argc, char **argv) {
 
   control_init();
 
-  if (!filemon_method_init()) {
-    warn("filemon: no file monitoring available, polling");
-    every(5,0,filepoll);
+  int filemon_ok= 0;
+  if (!try_filemon) {
+    notice("filemon: suppressed by command line option, polling");
+  } else {
+    filemon_ok= filemon_method_init();
+    if (!filemon_ok)
+      warn("filemon: no file monitoring available, polling");
   }
+  if (!filemon_ok)
+    every(filepoll_seconds,0,filepoll);
 
   every(period_seconds,1,period);