chiark / gitweb /
sort out cli dir stuff
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Mon, 3 May 2010 13:41:39 +0000 (14:41 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Mon, 3 May 2010 13:41:39 +0000 (14:41 +0100)
backends/innduct.c
doc/man/innduct.8

index c5a49c98b27d80a46ef47292e2e61776f5335f12..7557b0f694ed6863c53f3fffdf4de230a638b3ca 100644 (file)
@@ -356,7 +356,7 @@ static oop_rd_call peer_rd_err, peer_rd_ok;
 /* when changing defaults, remember to update the manpage */
 
 static const char *sitename, *remote_host;
-static const char *feedfile, *path_cli;
+static const char *feedfile, *path_cli, *path_cli_dir;
 static int quiet_multiple=0;
 static int become_daemon=1, try_filemon=1;
 static int try_stream=1;
@@ -1008,9 +1008,23 @@ static void cli_init(void) {
   memset(&sa,0,sizeof(sa));
   int maxlen= sizeof(sa.un.sun_path);
 
+  if (!path_cli) {
+    info("control command line disabled");
+    return;
+  }
+
   int pathlen= strlen(path_cli);
-  if (pathlen > maxlen)
-    NOCLI("cli socket path %s too long (%d>%d)", path_cli, pathlen, maxlen);
+  if (pathlen > maxlen) {
+    warn("no cli listener, because cli socket path %s too long (%d>%d)",
+        path_cli, pathlen, maxlen);
+    return;
+  }
+
+  if (path_cli_dir) {
+    int r= mkdir(path_cli_dir, 0700);
+    if (r && errno!=EEXIST)
+      NOCLI("create cli socket directory %s", path_cli_dir);
+  }
 
   int r= unlink(path_cli);
   if (r && errno!=ENOENT)
@@ -1019,7 +1033,7 @@ static void cli_init(void) {
   cli_master= socket(PF_UNIX, SOCK_STREAM, 0);
   if (cli_master<0) NOCLI("create new cli master socket");
 
-  int sl= strlen(sa.un.sun_path) + offsetof(struct sockaddr_un, sun_path);
+  int sl= pathlen + offsetof(struct sockaddr_un, sun_path);
   sa.un.sun_family= AF_UNIX;
   memcpy(sa.un.sun_path, path_cli, pathlen);
 
@@ -3553,7 +3567,7 @@ static const Option innduct_options[]= {
 {0,"no-filemon",         0,       &try_filemon,              op_setint, 0   },
 {'C',"inndconf",         "F",     &inndconffile,             op_string      },
 {'P',"port",             "PORT",  &port,                     op_integer     },
-{0,"cli",                0,       &path_cli,                 op_string      },
+{0,"cli",            "DIR/|PATH", &path_cli,                 op_string      },
 {0,"help",               0,       0,                         help           },
 
 {0,"max-connections",    "N",     &max_connections,          op_integer     },
@@ -3603,12 +3617,10 @@ static void convert_to_periods_rndup(int *store) {
   *store /= period_seconds;
 }
 
-static void assemble_path(const char **path_io, const char *suffix,
-                         const char *what) {
-  const char *const specified= *path_io;
-  if (!specified[0]) badusage("%s, if specified, must be nonempty", what);
-  if (specified[strlen(specified)-1]=='/')
-    *path_io= xasprintf("%s%s%s", specified, sitename, suffix);
+static int path_ends_slash(const char *specified) {
+  int l= strlen(specified);
+  assert(l);
+  return specified[l-1] == '/';
 }
 
 int main(int argc, char **argv) {
@@ -3653,11 +3665,23 @@ int main(int argc, char **argv) {
     badusage("bad input data ratio must be between 0..100");
   max_bad_data_ratio *= 0.01;
   
-  if (!feedfile) feedfile= xasprintf("%s/%s",innconf->pathoutgoing,sitename);
-  else assemble_path(&feedfile, "", "feed filename");
-
-  if (path_cli) path_cli= xasprintf("%s_cli", feedfile);
-  else assemble_path(&path_cli, "%s_cli", "cli socket path");
+  if (!feedfile) {
+    feedfile= xasprintf("%s/%s",innconf->pathoutgoing,sitename);
+  } else if (!feedfile[0]) {
+    badusage("feed filename, if specified, must be nonempty");
+  } else if (path_ends_slash(feedfile)) {
+    feedfile= xasprintf("%s%s", feedfile, sitename);
+  }
+
+  if (!path_cli) {
+    path_cli_dir= xasprintf("%s/innduct", innconf->pathrun);
+  } 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);
+  }
+  if (path_cli_dir)
+    path_cli= xasprintf("%s/%s", path_cli_dir, sitename);
 
   if (max_queue_per_ipf<0)
     max_queue_per_ipf= max_queue_per_conn * 2;
index 2032e38f0cb471858ad9f5b90a0f41841cd20789..71c2afe0a5124948229ebc2537f2dfe6180efa77 100644 (file)
@@ -107,20 +107,26 @@ Read
 instead of the default
 .BR inn.conf .
 .TP
-.BR \-\-cli= \fIDIR\fR / |\fIPATH\fR
+.BR \-\-cli= \fICLI-DIR\fR / |\fICLI-PATH\fR| none
 Listen for control command line connections on
-.IB DIR / site _cli
+.IB CLI-DIR / site
 (if the value ends with a
 .BR /)
 or
-.I PATH
+.I CLI-PATH
 (if it doesn't).  See CONTROLLING INNDUCT, below.
-This option may be essential, if the
-path to
-.I feedfile
+This option may be essential, if
+.I pathrun
+or
+.I site
 is too long, as there is a fairly short limit on the paths to AF_UNIX
-sockets.  The default is
-.IR feedfile \fB_cli\fR.  
+sockets.  If specified as
+.IR CLI-DIR \fB/\fR,
+the directory will be created with mode 700 if necessary.
+The default is
+.IB pathrun /innduct/
+which means to create that directory and listen on
+.RB \fIpathrun\fR /innduct/ \fIsite\fR.
 .TP
 .BI \-\-port= PORT
 Connect to port
@@ -322,14 +328,14 @@ corrupted; you just won't see some of the article stats.
 .LP
 innduct listens on an AF_UNIX socket, and provides a command-line
 interface which can be used to trigger various events and for
-debugging.  The socket is called
-.IB feedfile _cli
+debugging.  innduct listens on
+.IB pathrun /innduct/ site
 and when connected reads and writes lines (with unix line endings).
-It can most easily be accessed with a program like
+The cli can most easily be accessed with a program like
 .I netcat-openbsd
 (eg
-.B nc.openbsd -U
-.IR feedfile \fB_cli\fR)
+.B nc.openbsd -U /var/run/news/innduct/
+.IR site )
 or
 .IR socat .
 The prompt is
@@ -486,7 +492,7 @@ safely remove backlog files.  \fIsomething\fR may not contain \fB#\fR
 you rename it to match the pattern \fIfeedfile\fR\fB_backlog\fR*, as
 otherwise innduct may find and process the file and read it to EOF
 before you have finished creating it.
-.IP \fIfeedfile\fR_cli
+.IP \fIpathrun\fR\fB/innduct/\fB\fIsite\fR
 .IX Item "control command line socket"
 Default AF_UNIX listening socket for the control command line.  See
 CONTROLLING INNDUCT, above.
@@ -496,10 +502,17 @@ On request via a control connection innduct dumps a summary of its
 state to this text file.  This is mostly useful for debugging.
 .IP /etc/news/inn.conf
 .IX Item inn.conf
-Used to find
+Used for
 .IR pathoutgoing
-if none is specified, for finding how to communicate with innd,
-and also for
+(to compute default
+.IR feedfile
+and associated paths),
+.IR pathrun
+(to compute default
+.IR CLI-DIR
+and
+.IR CLI-PATH ),
+for finding how to communicate with innd, and also for
 .IR sourceaddress
 and/or
 .IR sourceaddress6 .