From: Ian Jackson Date: Mon, 3 May 2010 13:41:39 +0000 (+0100) Subject: sort out cli dir stuff X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=inn-innduct.git;a=commitdiff_plain;h=2b227ef223abbe8dc57abd6509490f73cdc48755 sort out cli dir stuff --- diff --git a/backends/innduct.c b/backends/innduct.c index c5a49c9..7557b0f 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -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; diff --git a/doc/man/innduct.8 b/doc/man/innduct.8 index 2032e38..71c2afe 100644 --- a/doc/man/innduct.8 +++ b/doc/man/innduct.8 @@ -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 .