On Sun, Sep 09, 2018 at 11:45:07PM +0200, Alexander Bluhm wrote:
> Hi,
> 
> Like the other proc.c daemons, vmd(8) children do not detach from
> the terminal properly.
> 
> ok?
> 

Reads ok to me but reyk@ should approve.

> 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