X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=backends%2Finnduct.c;h=a7679334ca196e01445d645f5135017f4e425b26;hb=3df79b4d579a18b4138463457f6266adce966474;hp=609cf7951f9e1fa3be9db346e61d5a2b8d11c27d;hpb=f16f3ea9fecefeeb1b33bb71ffd9b20bc14aea33;p=inn-innduct.git diff --git a/backends/innduct.c b/backends/innduct.c index 609cf79..a767933 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -23,16 +23,6 @@ * with GPLv3. If not then please let me know. -Ian Jackson.) */ -/* - * todo - * specify perms of /tmp/innduct.control - */ - -/* - * debugging rune: - * build-lfs/backends/innduct --connection-timeout=30 --no-daemon -C ../inn.conf -f `pwd`/fee sit localhost - */ - /* * Newsfeeds file entries should look like this: * host.name.of.site[/exclude,exclude,...]\ @@ -361,11 +351,12 @@ static void connfail(Conn *conn, const char *fmt, ...) PRINTF(2,3); 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 const char *sitename, *remote_host; -static const char *feedfile, *realsockdir="/tmp/innduct.control"; +static const char *feedfile, *path_control; static int quiet_multiple=0; static int become_daemon=1, try_filemon=1; static int try_stream=1; @@ -527,8 +518,7 @@ struct Conn { /* main initialises */ static oop_source *loop; static ConnList conns; -static char *path_lock, *path_flushing, *path_defer; -static char *path_control, *path_dump; +static char *path_lock, *path_flushing, *path_defer, *path_dump; static char *globpat_backlog; static pid_t self_pid; @@ -1010,8 +1000,6 @@ static void *control_master_readable(oop_source *lp, int master, }while(0) static void control_init(void) { - char *real=0; - union { struct sockaddr sa; struct sockaddr_un un; @@ -1020,66 +1008,24 @@ static void control_init(void) { memset(&sa,0,sizeof(sa)); int maxlen= sizeof(sa.un.sun_path); - int reallen= readlink(path_control, sa.un.sun_path, maxlen); - if (reallen<0) { - if (errno != ENOENT) - NOCONTROL("readlink control socket symlink path %s", path_control); - } - if (reallen >= maxlen) { - debug("control socket symlink path too long (r=%d)",reallen); - xunlink(path_control, "old (overlong) control socket symlink"); - reallen= -1; - } - - if (reallen<0) { - struct stat stab; - int r= lstat(realsockdir,&stab); - if (r) { - if (errno != ENOENT) NOCONTROL("lstat real socket dir %s", realsockdir); - - r= mkdir(realsockdir, 0700); - if (r) NOCONTROL("mkdir real socket dir %s", realsockdir); - - } else { - uid_t self= geteuid(); - if (!S_ISDIR(stab.st_mode) || - stab.st_uid != self || - stab.st_mode & 0007) { - warn("no control socket, because real socket directory" - " is somehow wrong (ISDIR=%d, uid=%lu (exp.%lu), mode %lo)", - !!S_ISDIR(stab.st_mode), - (unsigned long)stab.st_uid, (unsigned long)self, - (unsigned long)stab.st_mode & 0777UL); - goto nocontrol; - } - } - - real= xasprintf("%s/s%lx.%lx", realsockdir, - (unsigned long)xtime(), (unsigned long)self_pid); - int reallen= strlen(real); - - if (reallen >= maxlen) { - warn("no control socket, because tmpnam gave overly-long path" - " %s", real); - goto nocontrol; - } - r= symlink(real, path_control); - if (r) NOCONTROL("make control socket path %s a symlink to real" - " socket path %s", path_control, real); - memcpy(sa.un.sun_path, real, reallen); - } + int pathlen= strlen(path_control); + if (pathlen > maxlen) + NOCONTROL("control socket path %s too long (%d>%d)", + path_control, pathlen, maxlen); - int r= unlink(sa.un.sun_path); + int r= unlink(path_control); if (r && errno!=ENOENT) - NOCONTROL("remove old real socket %s", sa.un.sun_path); + NOCONTROL("remove old control socket %s", path_control); control_master= socket(PF_UNIX, SOCK_STREAM, 0); if (control_master<0) NOCONTROL("create new control socket"); - sa.un.sun_family= AF_UNIX; int sl= strlen(sa.un.sun_path) + offsetof(struct sockaddr_un, sun_path); + sa.un.sun_family= AF_UNIX; + memcpy(sa.un.sun_path, path_control, pathlen); + r= bind(control_master, &sa.sa, sl); - if (r) NOCONTROL("bind to real socket path %s", sa.un.sun_path); + if (r) NOCONTROL("bind to control socket path %s", sa.un.sun_path); r= listen(control_master, 5); if (r) NOCONTROL("listen"); @@ -1087,12 +1033,11 @@ static void control_init(void) { xsetnonblock(control_master, 1); loop->on_fd(loop, control_master, OOP_READ, control_master_readable, 0); - info("control socket ok, real path %s", sa.un.sun_path); + info("control socket ok, listening on %s", path_control); return; nocontrol: - free(real); xclose_perhaps(&control_master, "control master",0); return; } @@ -3421,10 +3366,11 @@ CCMD(dump) { } fprintf(f,"paths"); + DUMPV("%s", , feedfile); + DUMPV("%s", , path_control); DUMPV("%s", , path_lock); DUMPV("%s", , path_flushing); DUMPV("%s", , path_defer); - DUMPV("%s", , path_control); DUMPV("%s", , path_dump); DUMPV("%s", , globpat_backlog); fprintf(f,"\n"); @@ -3608,7 +3554,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,"ctrl-sock-dir", 0, &realsockdir, op_string }, +{0,"cli", 0, &path_control, op_string }, {0,"help", 0, 0, help }, {0,"max-connections", "N", &max_connections, op_integer }, @@ -3658,6 +3604,14 @@ 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); +} + int main(int argc, char **argv) { if (!argv[1]) { printusage(stderr); @@ -3699,14 +3653,12 @@ int main(int argc, char **argv) { if (max_bad_data_ratio < 0 || max_bad_data_ratio > 100) 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 must be nonempty"); - } else if (feedfile[strlen(feedfile)-1]=='/') { - feedfile= xasprintf("%s%s",feedfile,sitename); - } + if (path_control) path_control= xasprintf("%s_cli", feedfile); + else assemble_path(&path_control, "%s_cli", "control socket path"); if (max_queue_per_ipf<0) max_queue_per_ipf= max_queue_per_conn * 2; @@ -3722,7 +3674,6 @@ int main(int argc, char **argv) { path_lock= xasprintf("%s_lock", feedfile); path_flushing= xasprintf("%s_flushing", feedfile); path_defer= xasprintf("%s_defer", feedfile); - path_control= xasprintf("%s_control", feedfile); path_dump= xasprintf("%s_dump", feedfile); globpat_backlog= xasprintf("%s_backlog*", feedfile); @@ -3767,7 +3718,7 @@ int main(int argc, char **argv) { 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"); +// r= SMinit(); if (!r) die("storage manager initialisation (SMinit) failed"); if (!become_daemon) control_stdio();