Hi Benno, thanks for your reply.
On Wed, 7 Mar 2018 15:22:28 +0100 Sebastian Benoit <be...@openbsd.org> wrote: > Hi, > > switchd and vmd use the same proc.c,and should stay in sync. Ack. I missed them. > > Also, this breaks -dvv (i.e. debug output when running inthe foreground), > at least for relayd. Stupid me, indeed. > > /Benno > Below is an updated patch that includes proc.c of switchd and vmd. It also passes the 'debug' flag to proc_init() so that it won't touch std* in that case. I was wandering if this would be a good idea to move the daemon(3) call into the PROC_PARENT case of proc_init(), too? Gerhard Index: usr.sbin/httpd/httpd.c =================================================================== RCS file: /cvs/src/usr.sbin/httpd/httpd.c,v retrieving revision 1.67 diff -u -p -u -p -r1.67 httpd.c --- usr.sbin/httpd/httpd.c 28 May 2017 10:37:26 -0000 1.67 +++ usr.sbin/httpd/httpd.c 7 Mar 2018 15:49:47 -0000 @@ -215,7 +215,7 @@ main(int argc, char *argv[]) } /* only the parent returns */ - proc_init(ps, procs, nitems(procs), argc0, argv, proc_id); + proc_init(ps, procs, nitems(procs), argc0, argv, proc_id, debug); log_procinit("parent"); if (!debug && daemon(1, 0) == -1) Index: usr.sbin/httpd/httpd.h =================================================================== RCS file: /cvs/src/usr.sbin/httpd/httpd.h,v retrieving revision 1.135 diff -u -p -u -p -r1.135 httpd.h --- usr.sbin/httpd/httpd.h 7 Feb 2018 03:28:05 -0000 1.135 +++ usr.sbin/httpd/httpd.h 7 Mar 2018 15:49:30 -0000 @@ -761,7 +761,7 @@ __dead void fatalx(const char *, ...) enum privsep_procid proc_getid(struct privsep_proc *, unsigned int, const char *); void proc_init(struct privsep *, struct privsep_proc *, unsigned int, - int, char **, enum privsep_procid); + int, char **, enum privsep_procid, int); void proc_kill(struct privsep *); void proc_connect(struct privsep *); void proc_dispatch(int, short event, void *); Index: usr.sbin/httpd/proc.c =================================================================== RCS file: /cvs/src/usr.sbin/httpd/proc.c,v retrieving revision 1.37 diff -u -p -u -p -r1.37 proc.c --- usr.sbin/httpd/proc.c 28 May 2017 10:37:26 -0000 1.37 +++ usr.sbin/httpd/proc.c 7 Mar 2018 15:50:06 -0000 @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <paths.h> #include <errno.h> #include <signal.h> #include <pwd.h> @@ -191,13 +192,14 @@ proc_connect(struct privsep *ps) void proc_init(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc, - int argc, char **argv, enum privsep_procid proc_id) + int argc, char **argv, enum privsep_procid proc_id, int debug) { struct privsep_proc *p = NULL; struct privsep_pipes *pa, *pb; unsigned int proc; unsigned int dst; int fds[2]; + int fd; /* Don't initiate anything if we are not really going to run. */ if (ps->ps_noaction) @@ -246,6 +248,13 @@ proc_init(struct privsep *ps, struct pri fatalx("%s: process %d missing process initialization", __func__, proc_id); + if (!debug && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if (fd > 2) + close(fd); + } p->p_init(ps, p); fatalx("failed to initiate child process"); Index: usr.sbin/relayd/proc.c =================================================================== RCS file: /cvs/src/usr.sbin/relayd/proc.c,v retrieving revision 1.39 diff -u -p -u -p -r1.39 proc.c --- usr.sbin/relayd/proc.c 28 May 2017 10:39:15 -0000 1.39 +++ usr.sbin/relayd/proc.c 7 Mar 2018 15:43:03 -0000 @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <paths.h> #include <errno.h> #include <signal.h> #include <pwd.h> @@ -191,13 +192,14 @@ proc_connect(struct privsep *ps) void proc_init(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc, - int argc, char **argv, enum privsep_procid proc_id) + int argc, char **argv, enum privsep_procid proc_id, int debug) { struct privsep_proc *p = NULL; struct privsep_pipes *pa, *pb; unsigned int proc; unsigned int dst; int fds[2]; + int fd; /* Don't initiate anything if we are not really going to run. */ if (ps->ps_noaction) @@ -246,6 +248,13 @@ proc_init(struct privsep *ps, struct pri fatalx("%s: process %d missing process initialization", __func__, proc_id); + if (!debug && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if (fd > 2) + close(fd); + } p->p_init(ps, p); fatalx("failed to initiate child process"); Index: usr.sbin/relayd/relayd.c =================================================================== RCS file: /cvs/src/usr.sbin/relayd/relayd.c,v retrieving revision 1.171 diff -u -p -u -p -r1.171 relayd.c --- usr.sbin/relayd/relayd.c 29 Nov 2017 15:24:50 -0000 1.171 +++ usr.sbin/relayd/relayd.c 7 Mar 2018 15:42:24 -0000 @@ -212,7 +212,7 @@ main(int argc, char *argv[]) ps->ps_title[proc_id] = title; /* only the parent returns */ - proc_init(ps, procs, nitems(procs), argc0, argv, proc_id); + proc_init(ps, procs, nitems(procs), argc0, argv, proc_id, debug); log_procinit("parent"); if (!debug && daemon(1, 0) == -1) Index: usr.sbin/relayd/relayd.h =================================================================== RCS file: /cvs/src/usr.sbin/relayd/relayd.h,v retrieving revision 1.248 diff -u -p -u -p -r1.248 relayd.h --- usr.sbin/relayd/relayd.h 28 Nov 2017 18:25:53 -0000 1.248 +++ usr.sbin/relayd/relayd.h 7 Mar 2018 15:42:34 -0000 @@ -1383,7 +1383,7 @@ enum privsep_procid proc_getid(struct privsep_proc *, unsigned int, const char *); int proc_flush_imsg(struct privsep *, enum privsep_procid, int); void proc_init(struct privsep *, struct privsep_proc *, unsigned int, - int, char **, enum privsep_procid); + int, char **, enum privsep_procid, int); void proc_kill(struct privsep *); void proc_connect(struct privsep *); void proc_dispatch(int, short event, void *); Index: usr.sbin/snmpd/proc.c =================================================================== RCS file: /cvs/src/usr.sbin/snmpd/proc.c,v retrieving revision 1.24 diff -u -p -u -p -r1.24 proc.c --- usr.sbin/snmpd/proc.c 29 May 2017 12:56:26 -0000 1.24 +++ usr.sbin/snmpd/proc.c 7 Mar 2018 15:48:23 -0000 @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <paths.h> #include <errno.h> #include <signal.h> #include <pwd.h> @@ -191,13 +192,14 @@ proc_connect(struct privsep *ps) void proc_init(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc, - int argc, char **argv, enum privsep_procid proc_id) + int argc, char **argv, enum privsep_procid proc_id, int debug) { struct privsep_proc *p = NULL; struct privsep_pipes *pa, *pb; unsigned int proc; unsigned int dst; int fds[2]; + int fd; /* Don't initiate anything if we are not really going to run. */ if (ps->ps_noaction) @@ -246,6 +248,13 @@ proc_init(struct privsep *ps, struct pri fatalx("%s: process %d missing process initialization", __func__, proc_id); + if (!debug && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if (fd > 2) + close(fd); + } p->p_init(ps, p); fatalx("failed to initiate child process"); Index: usr.sbin/snmpd/snmpd.c =================================================================== RCS file: /cvs/src/usr.sbin/snmpd/snmpd.c,v retrieving revision 1.37 diff -u -p -u -p -r1.37 snmpd.c --- usr.sbin/snmpd/snmpd.c 12 Aug 2017 04:29:57 -0000 1.37 +++ usr.sbin/snmpd/snmpd.c 7 Mar 2018 15:48:41 -0000 @@ -230,7 +230,7 @@ main(int argc, char *argv[]) pf_init(); snmpd_generate_engineid(env); - proc_init(ps, procs, nitems(procs), argc0, argv0, proc_id); + proc_init(ps, procs, nitems(procs), argc0, argv0, proc_id, debug); if (!debug && daemon(0, 0) == -1) err(1, "failed to daemonize"); Index: usr.sbin/snmpd/snmpd.h =================================================================== RCS file: /cvs/src/usr.sbin/snmpd/snmpd.h,v retrieving revision 1.77 diff -u -p -u -p -r1.77 snmpd.h --- usr.sbin/snmpd/snmpd.h 8 Feb 2018 00:21:10 -0000 1.77 +++ usr.sbin/snmpd/snmpd.h 7 Mar 2018 15:45:01 -0000 @@ -759,7 +759,7 @@ void usm_make_report(struct snmp_messa enum privsep_procid proc_getid(struct privsep_proc *, unsigned int, const char *); void proc_init(struct privsep *, struct privsep_proc *, unsigned int, - int, char **, enum privsep_procid); + int, char **, enum privsep_procid, int); void proc_kill(struct privsep *); void proc_connect(struct privsep *); void proc_dispatch(int, short event, void *); Index: usr.sbin/switchd/proc.c =================================================================== RCS file: /cvs/src/usr.sbin/switchd/proc.c,v retrieving revision 1.12 diff -u -p -u -p -r1.12 proc.c --- usr.sbin/switchd/proc.c 29 May 2017 12:56:26 -0000 1.12 +++ usr.sbin/switchd/proc.c 7 Mar 2018 15:52:24 -0000 @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <paths.h> #include <errno.h> #include <signal.h> #include <pwd.h> @@ -191,13 +192,14 @@ proc_connect(struct privsep *ps) void proc_init(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc, - int argc, char **argv, enum privsep_procid proc_id) + int argc, char **argv, enum privsep_procid proc_id, int debug) { struct privsep_proc *p = NULL; struct privsep_pipes *pa, *pb; unsigned int proc; unsigned int dst; int fds[2]; + int fd; /* Don't initiate anything if we are not really going to run. */ if (ps->ps_noaction) @@ -246,6 +248,13 @@ proc_init(struct privsep *ps, struct pri fatalx("%s: process %d missing process initialization", __func__, proc_id); + if (!debug && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if (fd > 2) + close(fd); + } p->p_init(ps, p); fatalx("failed to initiate child process"); Index: usr.sbin/switchd/proc.h =================================================================== RCS file: /cvs/src/usr.sbin/switchd/proc.h,v retrieving revision 1.6 diff -u -p -u -p -r1.6 proc.h --- usr.sbin/switchd/proc.h 9 Jan 2017 14:49:22 -0000 1.6 +++ usr.sbin/switchd/proc.h 7 Mar 2018 15:51:16 -0000 @@ -127,7 +127,7 @@ extern struct ctl_connlist ctl_conns; /* proc.c */ void proc_init(struct privsep *, struct privsep_proc *, unsigned int, - int, char **, enum privsep_procid); + int, char **, enum privsep_procid, int); void proc_kill(struct privsep *); void proc_connect(struct privsep *ps); void proc_dispatch(int, short event, void *); Index: usr.sbin/switchd/switchd.c =================================================================== RCS file: /cvs/src/usr.sbin/switchd/switchd.c,v retrieving revision 1.15 diff -u -p -u -p -r1.15 switchd.c --- usr.sbin/switchd/switchd.c 9 Jan 2017 14:49:22 -0000 1.15 +++ usr.sbin/switchd/switchd.c 7 Mar 2018 15:51:22 -0000 @@ -184,7 +184,7 @@ main(int argc, char *argv[]) ps->ps_title[proc_id] = title; /* Only the parent returns. */ - proc_init(ps, procs, nitems(procs), argc0, argv, proc_id); + proc_init(ps, procs, nitems(procs), argc0, argv, proc_id, debug); if (!debug && daemon(0, 0) == -1) fatal("failed to daemonize"); Index: usr.sbin/vmd/proc.c =================================================================== RCS file: /cvs/src/usr.sbin/vmd/proc.c,v retrieving revision 1.16 diff -u -p -u -p -r1.16 proc.c --- usr.sbin/vmd/proc.c 4 Nov 2017 07:40:31 -0000 1.16 +++ usr.sbin/vmd/proc.c 7 Mar 2018 15:56:13 -0000 @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <paths.h> #include <errno.h> #include <signal.h> #include <pwd.h> @@ -191,13 +192,14 @@ proc_connect(struct privsep *ps) void proc_init(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc, - int argc, char **argv, enum privsep_procid proc_id) + int argc, char **argv, enum privsep_procid proc_id, int debug) { struct privsep_proc *p = NULL; struct privsep_pipes *pa, *pb; unsigned int proc; unsigned int dst; int fds[2]; + int fd; /* Don't initiate anything if we are not really going to run. */ if (ps->ps_noaction) @@ -246,6 +248,13 @@ proc_init(struct privsep *ps, struct pri fatalx("%s: process %d missing process initialization", __func__, proc_id); + if (!debug && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + if (fd > 2) + close(fd); + } p->p_init(ps, p); fatalx("failed to initiate child process"); Index: usr.sbin/vmd/proc.h =================================================================== RCS file: /cvs/src/usr.sbin/vmd/proc.h,v retrieving revision 1.12 diff -u -p -u -p -r1.12 proc.h --- usr.sbin/vmd/proc.h 27 Mar 2017 00:28:04 -0000 1.12 +++ usr.sbin/vmd/proc.h 7 Mar 2018 15:53:14 -0000 @@ -159,7 +159,7 @@ struct privsep_fd { /* proc.c */ void proc_init(struct privsep *, struct privsep_proc *, unsigned int, - int, char **, enum privsep_procid); + int, char **, enum privsep_procid, int); void proc_kill(struct privsep *); void proc_connect(struct privsep *ps); void proc_dispatch(int, short event, void *); Index: usr.sbin/vmd/vmd.c =================================================================== RCS file: /cvs/src/usr.sbin/vmd/vmd.c,v retrieving revision 1.80 diff -u -p -u -p -r1.80 vmd.c --- usr.sbin/vmd/vmd.c 18 Feb 2018 01:00:25 -0000 1.80 +++ usr.sbin/vmd/vmd.c 7 Mar 2018 15:55:03 -0000 @@ -755,7 +755,8 @@ main(int argc, char **argv) ps->ps_title[proc_id] = title; /* only the parent returns */ - proc_init(ps, procs, nitems(procs), argc0, argv, proc_id); + proc_init(ps, procs, nitems(procs), argc0, argv, proc_id, + env->vmd_debug); log_procinit("parent"); if (!env->vmd_debug && daemon(0, 0) == -1)