chiark / gitweb /
Support CMDLINE_CPPFLAGS
[innduct.git] / duct.c
diff --git a/duct.c b/duct.c
index 6ff7bad88db1aae929265824361daef6eea77df4..8f7af2cc5e5f7248754c610e20c8702ebf09dbc7 100644 (file)
--- a/duct.c
+++ b/duct.c
@@ -1,7 +1,7 @@
 /*
  *  innduct
  *  tailing reliable realtime streaming feeder for inn
- *  innduct.c - main program, option parsing and startup
+ *  duct.c - main program, option parsing and startup
  *
  *  Copyright (C) 2010 Ian Jackson <ijackson@chiark.greenend.org.uk>
  * 
@@ -44,6 +44,7 @@ pid_t self_pid;
 int *lowvol_perperiod;
 int lowvol_circptr;
 int lowvol_total; /* does not include current period */
+int until_stats_log=1;
 
 /*---------- configuration option variables ----------*/
 /* when changing defaults, remember to update the manpage */
@@ -77,6 +78,7 @@ int backlog_spontrescan_periods=300;
 int spontaneous_flush_periods=100000;
 int max_separated_periods=2000;
 int need_activity_periods=1000;
+int stats_log_periods=2500;
 int lowvol_thresh=3;
 int lowvol_periods=1000;
 
@@ -169,6 +171,9 @@ void period(void) {
   free(dipf_flushing);
   free(dipf_backlog);
 
+  if (until_stats_log) until_stats_log--;
+  else showstats();
+
   if (until_connect) until_connect--;
 
   inputfile_queue_check_expired(backlog_input_file);
@@ -184,7 +189,7 @@ void period(void) {
 
 static void vbadusage(const char *fmt, va_list al) NORET_PRINTF(1,0);
 static void vbadusage(const char *fmt, va_list al) {
-  char *m= xvasprintf(fmt,al);
+  char *m= mvasprintf(fmt,al);
   fprintf(stderr, "bad usage: %s\n"
          "say --help for help, or read the manpage\n",
          m);
@@ -277,7 +282,7 @@ static void print_options(const Option *options, FILE *f) {
   const Option *o;
   for (o=options; o->shrt || o->lng; o++) {
     char shrt[2] = { o->shrt, 0 };
-    char *optspec= xasprintf("%s%s%s%s%s",
+    char *optspec= masprintf("%s%s%s%s%s",
                             o->shrt ? "-" : "", shrt,
                             o->shrt && o->lng ? "|" : "",
                             DELIMPERHAPS("--", o->lng));
@@ -378,6 +383,7 @@ static const Option innduct_options[]= {
 {0,"max-flush-interval",     "PERIOD", &spontaneous_flush_periods,op_seconds },
 {0,"flush-finish-timeout",   "PERIOD", &max_separated_periods,    op_seconds },
 {0,"idle-timeout",           "PERIOD", &need_activity_periods,    op_seconds },
+{0,"stats-log-interval",     "PERIOD", &stats_log_periods,        op_seconds },
 {0,"low-volume-thresh",      "PERIOD", &lowvol_thresh,            op_integer },
 {0,"low-volume-window",      "PERIOD", &lowvol_periods,           op_seconds },
 
@@ -393,6 +399,14 @@ static void printusage(FILE *f) {
   print_options(innduct_options, f);
 }
 
+static void printcopyright(FILE *f) {
+  fputs(
+ "innduct is Copyright (C)2010 Ian Jackson.\n"
+ "It is free software, licenced under GPL version 3 or later.\n"
+ "It is provided WITHOUT ANY WARRANTY.  See the file GPL-3 for details\n",
+        stderr);
+}
+
 static void help(const Option *o, const char *val) {
   printusage(stdout);
   if (ferror(stdout) || fflush(stdout)) {
@@ -426,6 +440,7 @@ int main(int argc, char **argv) {
 
   if (!argv[1]) {
     printusage(stderr);
+    printcopyright(stderr);
     exit(8);
   }
 
@@ -463,6 +478,7 @@ int main(int argc, char **argv) {
   convert_to_periods_rndup(&spontaneous_flush_periods);
   convert_to_periods_rndup(&max_separated_periods);
   convert_to_periods_rndup(&need_activity_periods);
+  convert_to_periods_rndup(&stats_log_periods);
   convert_to_periods_rndup(&lowvol_periods);
 
   if (max_bad_data_ratio < 0 || max_bad_data_ratio > 100)
@@ -475,19 +491,19 @@ int main(int argc, char **argv) {
   if (!feedfile) feedfile= sitename;
   if (!feedfile[0]) badusage("feed filename, if specified, must be nonempty");
   if (path_ends_slash(feedfile))
-    feedfile= xasprintf("%s%s", feedfile, sitename);
+    feedfile= masprintf("%s%s", feedfile, sitename);
   if (feedfile[0] != '/')
-    feedfile= xasprintf("%s/%s", innconf->pathoutgoing, feedfile);
+    feedfile= masprintf("%s/%s", innconf->pathoutgoing, feedfile);
 
   if (!path_cli) {
     path_cli_dir= "innduct";
   } else if (!path_cli[0] || !strcmp(path_cli,"none")) {
     path_cli= 0; /* ok, don't then */
   } else if (path_ends_slash(path_cli)) {
-    path_cli_dir= xasprintf("%.*s", strlen(path_cli)-1, path_cli);
+    path_cli_dir= masprintf("%.*s", strlen(path_cli)-1, path_cli);
   }
   if (path_cli_dir)
-    path_cli= xasprintf("%s/%s", path_cli_dir, sitename);
+    path_cli= masprintf("%s/%s", path_cli_dir, sitename);
 
   if (max_queue_per_ipf<0)
     max_queue_per_ipf= max_queue_per_conn * 2;
@@ -508,11 +524,11 @@ int main(int argc, char **argv) {
 
   /* set things up */
 
-  path_lock=        xasprintf("%s_lock",      feedfile);
-  path_flushing=    xasprintf("%s_flushing",  feedfile);
-  path_defer=       xasprintf("%s_defer",     feedfile);
-  path_dump=        xasprintf("%s_dump",      feedfile);
-  globpat_backlog=  xasprintf("%s_backlog*",  feedfile);
+  path_lock=        masprintf("%s_lock",      feedfile);
+  path_flushing=    masprintf("%s_flushing",  feedfile);
+  path_defer=       masprintf("%s_defer",     feedfile);
+  path_dump=        masprintf("%s_dump",      feedfile);
+  globpat_backlog=  masprintf("%s_backlog*",  feedfile);
 
   oop_source_sys *sysloop= oop_sys_new();
   if (!sysloop) syscrash("could not create liboop event loop");
@@ -526,7 +542,7 @@ int main(int argc, char **argv) {
       close(i);
   }
 
-  logv_prefix= xasprintf("%s| ", sitename);
+  logv_prefix= masprintf("%s| ", sitename);
   if (interactive < 2) {
     openlog("innduct",LOG_NDELAY|LOG_PID,LOG_NEWS);
     logv_use_syslog= 1;
@@ -540,13 +556,13 @@ int main(int argc, char **argv) {
     dup2(null,2);
     xclose(null, "/dev/null original fd",0);
 
-    pid_t child1= xfork("daemonise first fork");
+    pid_t child1= xfork_bare("daemonise first fork");
     if (child1) _exit(0);
 
     pid_t sid= setsid();
     if (sid == -1) sysdie("setsid failed");
 
-    pid_t child2= xfork("daemonise second fork");
+    pid_t child2= xfork_bare("daemonise second fork");
     if (child2) _exit(0);
   }