X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=backends%2Finnduct.c;h=c884af08a056441f0e654870b3ee5ec840f57f8d;hb=f9b5dbab2446675c69bb2a43a262e977a05d3739;hp=c5a49c98b27d80a46ef47292e2e61776f5335f12;hpb=eb7754d254aef3377fec9f268ae9de80bc7dfae8;p=innduct.git diff --git a/backends/innduct.c b/backends/innduct.c index c5a49c9..c884af0 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 (!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= xasprintf("%s_cli", feedfile); - else assemble_path(&path_cli, "%s_cli", "cli socket path"); + 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; @@ -3700,7 +3724,7 @@ int main(int argc, char **argv) { if (child1) _exit(0); pid_t sid= setsid(); - if (sid != child1) sysfatal("setsid failed"); + if (sid == -1) sysfatal("setsid failed"); pid_t child2= xfork("daemonise second fork"); if (child2) _exit(0);