chiark / gitweb /
Allow overriding of perms check on real control path
[inn-innduct.git] / backends / innduct.c
index b829841613d0aa010d7ce43bdd0e0934479a5fe6..d29e48f85be113464c1b6b28372cb9b32a8a9ac3 100644 (file)
@@ -1,28 +1,28 @@
 /*
- * debugging rune:
- *  build-lfs/backends/innduct --connection-timeout=30 --no-daemon -C ../inn.conf -f `pwd`/fee sit localhost
+ *  innduct
+ *  tailing reliable realtime streaming feeder for inn
+ *
+ *  Copyright (C) 2010 Ian Jackson <ijackson@chiark.greenend.org.uk>
+ * 
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ * 
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ * 
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  (I believe that when you compile and link this as part of the inn2
+ *  build, with the Makefile runes I have provided, all the libraries
+ *  and files which end up included in innduct are licence-compatible
+ *  with GPLv3.  If not then please let me know.  -Ian Jackson.)
  */
 
-/*--
-flow control notes
-to ensure articles go away eventually
-separate queue for each input file
-  queue expiry
-    every period, check head of backlog queue for expiry with SMretrieve
-      if too old: discard, and check next article
-    also check every backlog article as we read it
-  flush expiry
-    after too long in SEPARATED/DROPPING ie Separated/Finishing/Dropping
-    one-off: eat queued articles from flushing and write them to defer
-    one-off: connfail all connections which have any articles from flushing
-    newly read articles from flushing go straight to defer
-    this should take care of it and get us out of this state
-to avoid filling up ram needlessly
-  input control
-    limit number of queued articles for each ipf
-    pause/resume inputfile tailing
---*/
-
 /*
  * Newsfeeds file entries should look like this:
  *     host.name.of.site[/exclude,exclude,...]\
@@ -350,6 +350,7 @@ static void connfail(Conn *conn, const char *fmt, ...)         PRINTF(2,3);
 static const oop_rd_style peer_rd_style;
 static oop_rd_call peer_rd_err, peer_rd_ok;
 
+
 /*----- configuration options -----*/
 /* when changing defaults, remember to update the manpage */
 
@@ -367,6 +368,7 @@ static int target_max_feedfile_size=100000;
 static int period_seconds=60;
 static int filepoll_seconds=5;
 static int max_queue_per_ipf=-1;
+static int realsockdir_any_perms=0;
 
 static int connection_setup_timeout=200;
 static int inndcomm_flush_timeout=100;
@@ -1029,7 +1031,7 @@ static void control_init(void) {
       r= mkdir(realsockdir, 0700);
       if (r) NOCONTROL("mkdir real socket dir %s", realsockdir);
 
-    } else {
+    } else if (!realsockdir_any_perms) {
       uid_t self= geteuid();
       if (!S_ISDIR(stab.st_mode) ||
          stab.st_uid != self ||
@@ -1539,6 +1541,26 @@ static void conn_maybe_write(Conn *conn)  {
 
 /*---------- expiry, flow control and deferral ----------*/
 
+/*
+ * flow control notes
+ * to ensure articles go away eventually
+ * separate queue for each input file
+ *   queue expiry
+ *     every period, check head of backlog queue for expiry with SMretrieve
+ *       if too old: discard, and check next article
+ *     also check every backlog article as we read it
+ *   flush expiry
+ *     after too long in SEPARATED/DROPPING ie Separated/Finishing/Dropping
+ *     one-off: eat queued articles from flushing and write them to defer
+ *     one-off: connfail all connections which have any articles from flushing
+ *     newly read articles from flushing go straight to defer
+ *     this should take care of it and get us out of this state
+ * to avoid filling up ram needlessly
+ *   input control
+ *     limit number of queued articles for each ipf
+ *     pause/resume inputfile tailing
+ */
+
 static void check_reading_pause_resume(InputFile *ipf) {
   if (ipf->queue.count >= max_queue_per_ipf)
     inputfile_reading_pause(ipf);
@@ -3305,6 +3327,7 @@ static void dump_input_file(FILE *f, const ControlCommand *c,
     DUMPV("%d", ipf->,readcount_ok);
     DUMPV("%d", ipf->,readcount_blank);
     DUMPV("%d", ipf->,readcount_err);
+    DUMPV("%d", ipf->,count_nooffer_missing);
   }
   fprintf(f,"\n");
   if (ipf) {
@@ -3576,6 +3599,7 @@ static const Option innduct_options[]= {
 {'C',"inndconf",         "F",     &inndconffile,             op_string      },
 {'P',"port",             "PORT",  &port,                     op_integer     },
 {0,"ctrl-sock-dir",      0,       &realsockdir,              op_string      },
+{0,"no-ctrl-sock-dir-perms-check",0,&realsockdir_any_perms,  op_setint, 0   },
 {0,"help",               0,       0,                         help           },
 
 {0,"max-connections",    "N",     &max_connections,          op_integer     },
@@ -3732,6 +3756,10 @@ int main(int argc, char **argv) {
 
   notice("starting");
 
+  int val= 1;
+  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)
     control_stdio();