Hi,

Like the other proc.c daemons, vmd(8) children do not detach from
the terminal properly.

ok?

bluhm

Index: src/usr.sbin/vmd/proc.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/vmd/proc.c,v
retrieving revision 1.17
diff -u -p -r1.17 proc.c
--- src/usr.sbin/vmd/proc.c     5 Aug 2018 08:20:54 -0000       1.17
+++ src/usr.sbin/vmd/proc.c     9 Sep 2018 21:26:32 -0000
@@ -29,13 +29,14 @@
 #include <string.h>
 #include <errno.h>
 #include <signal.h>
+#include <paths.h>
 #include <pwd.h>
 #include <event.h>
 #include <imsg.h>
 
 #include "proc.h"
 
-void    proc_exec(struct privsep *, struct privsep_proc *, unsigned int,
+void    proc_exec(struct privsep *, struct privsep_proc *, unsigned int, int,
            int, char **);
 void    proc_setup(struct privsep *, struct privsep_proc *, unsigned int);
 void    proc_open(struct privsep *, int, int);
@@ -80,7 +81,7 @@ proc_getid(struct privsep_proc *procs, u
 
 void
 proc_exec(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc,
-    int argc, char **argv)
+    int debug, int argc, char **argv)
 {
        unsigned int             proc, nargc, i, proc_i;
        char                    **nargv;
@@ -141,6 +142,16 @@ proc_exec(struct privsep *ps, struct pri
                                } else if (fcntl(fd, F_SETFD, 0) == -1)
                                        fatal("fcntl");
 
+                               /* Daemons detach from terminal. */
+                               if (!debug && (fd =
+                                   open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
+                                       (void)dup2(fd, STDIN_FILENO);
+                                       (void)dup2(fd, STDOUT_FILENO);
+                                       (void)dup2(fd, STDERR_FILENO);
+                                       if (fd > 2)
+                                               (void)close(fd);
+                               }
+
                                execvp(argv[0], nargv);
                                fatal("%s: execvp", __func__);
                                break;
@@ -191,7 +202,7 @@ 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 debug, int argc, char **argv, enum privsep_procid proc_id)
 {
        struct privsep_proc     *p = NULL;
        struct privsep_pipes    *pa, *pb;
@@ -231,7 +242,7 @@ proc_init(struct privsep *ps, struct pri
                }
 
                /* Engage! */
-               proc_exec(ps, procs, nproc, argc, argv);
+               proc_exec(ps, procs, nproc, debug, argc, argv);
                return;
        }
 
Index: src/usr.sbin/vmd/proc.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/vmd/proc.h,v
retrieving revision 1.15
diff -u -p -r1.15 proc.h
--- src/usr.sbin/vmd/proc.h     5 Aug 2018 08:20:54 -0000       1.15
+++ src/usr.sbin/vmd/proc.h     9 Sep 2018 21:15:50 -0000
@@ -156,7 +156,7 @@ struct privsep_fd {
 #define PROC_MAX_INSTANCES     32
 
 /* proc.c */
-void    proc_init(struct privsep *, struct privsep_proc *, unsigned int,
+void    proc_init(struct privsep *, struct privsep_proc *, unsigned int, int,
            int, char **, enum privsep_procid);
 void    proc_kill(struct privsep *);
 void    proc_connect(struct privsep *ps);
Index: src/usr.sbin/vmd/vmd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/vmd/vmd.c,v
retrieving revision 1.98
diff -u -p -r1.98 vmd.c
--- src/usr.sbin/vmd/vmd.c      15 Jul 2018 14:36:54 -0000      1.98
+++ src/usr.sbin/vmd/vmd.c      9 Sep 2018 21:25:57 -0000
@@ -792,7 +792,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), env->vmd_debug, argc0, argv,
+           proc_id);
 
        log_procinit("parent");
        if (!env->vmd_debug && daemon(0, 0) == -1)

Reply via email to