/*
- * 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,...]\
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 */
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;
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 ||
/*---------- 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);
DUMPV("%d",,filemon_inotify_fd);
DUMPV("%d",,filemon_inotify_wdmax);
for (i=0; i<filemon_inotify_wdmax; i++)
- fprintf(f," wd2ipf[%d]=%p\n", i, filemon_inotify_wd2ipf[i],);
+ fprintf(f," wd2ipf[%d]=%p\n", i, filemon_inotify_wd2ipf[i]);
}
#endif /* HAVE_INOTIFY && !HAVE_FILEMON */
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) {
{'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 },
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();