* makes new listening socket
* makes first-instance socketpair
* forks setup (script, sock fds indicated in env)
- * fd0, fd1, fd2: from-outer-caller
+ * fd0, fd1, fd2: from-outer
* other fd: call(client-end)(fake)
* reaps setup (and reports error)
* (implicitly releases lock)
*
* setup (pre-exec) fd0: null,
- * fd[12: fd2-from-outer-caller
+ * fd[12]: fd2-from-outer
* env fds: listener, call(server-end)(fake)
- * env fds: orig-fd[01]
* close fd: lockfile
+ * possibly clean env, argv
*
* setup (script) runs initialisation parts of the script
* at prefork establishment point:
* [2] exits
*
# server (pm) [1] [fd0: null],
- * [fd[12: fd2-from-outer-caller]
- * right away, forks one fa-monitor
+ * [fd[12]: fd2-from-outer]
+ * right away, forks init monitor
* [2] closes outer caller fds and call(fake)
* [server (pm)] fd[012]: null
* other fds: listener, syslog
* runs in loop accepting and forking,
- * reaping and limiting children (incl fa-monitor)
+ * reaping and limiting children (incl init monitor)
* reports failures of monitors to syslog
*
- * f-a monitor forks executor
- * closes fd: listener
- * [fd[12: fd2-from-outer-caller]
- * [other fds: call(server-end)(fake), syslog]
- * runs as monitor, below
- *
- *
* [client (C wrapper)] if client connect succeeds:
* now fd: call(client-end)
* sends message with: cmdline, env
* sends fds
*
- * [server (script)] accepts, forks monitor
+ * [server (script)] accepts, forks subseq monitor
*
- * monitor [1] [fd[012]: null]
- * other fds: syslog, call(server-end)
+ * monitor [1] [fd0: null]
+ * (init [fd[12]: init: fd2-from-outer; subseq: null]
+ * or errors: init: fd2; subseq: syslog
+ * subseq) other fds: syslog, call(server-end)
* sends ack byte
* receives args, env, fds
* forks executor
*
* executor sorts out fds:
- * fd0, fd1, fd2: from-outer-caller
+ * fd0, fd1, fd2: from-outer
* close fds: call(server-end)
* retained fds: syslog
*
* exits normally
*
* [monitor] [fd[012]: null]
- * [other fds: call(server-end), syslog]
+ * [fd[12]: init: fd2-from-outer; subseq: null]
+ * [errors: init: fd2; subseq: syslog]
* reaps executor
* reports status via socket
*
- * [client (C wrapper)] [fd0, fd1, fd2: from-outer-caller]
+ * [client (C wrapper)] [fd0, fd1, fd2: from-outer]
* [other fd: call(client-end)]
* receives status, exits appropriately
* (if was bad signal, reports to stderr, exits 127)
// We must start a fresh one, and we hold the lock
r = unlink(socket_path);
- if (r<0) diee("failed to remove stale socket %s", socket_path);
+ if (r<0 && errno!=ENOENT)
+ diee("failed to remove stale socket %s", socket_path);
int fake_pair[2];
r = socketpair(AF_UNIX, SOCK_STREAM, 0, fake_pair);