X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fsubprocs.c;h=65b0079abd86941009eb0cc74662ecaa441838cd;hb=8afc01a67be4fbf3f1cc0fce9adf01b5289a21c6;hp=405a382b8bb6e70c94bd0de2aaee76e009bc1033;hpb=de460e831dc8578acfa8b72251ab9346c99c1f96;p=xscreensaver diff --git a/driver/subprocs.c b/driver/subprocs.c index 405a382b..65b0079a 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -1,5 +1,5 @@ /* subprocs.c --- choosing, spawning, and killing screenhacks. - * xscreensaver, Copyright (c) 1991-2008 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -484,6 +484,7 @@ static RETSIGTYPE sigchld_handler (int sig) { saver_info *si = global_si_kludge; /* I hate C so much... */ + in_signal_handler_p++; if (si->prefs.debug_p) { @@ -510,6 +511,7 @@ sigchld_handler (int sig) } init_sigchld(); + in_signal_handler_p--; } #endif /* SIGCHLD */ @@ -1099,6 +1101,7 @@ hack_environment (saver_info *si) if (def_path && *def_path) { const char *opath = getenv("PATH"); + if (! opath) opath = "/bin:/usr/bin"; /* WTF */ char *npath = (char *) malloc(strlen(def_path) + strlen(opath) + 20); strcpy (npath, "PATH="); strcat (npath, def_path); @@ -1179,6 +1182,8 @@ get_best_gl_visual (saver_info *si, Screen *screen) pid_t forked; int fds [2]; int in, out; + int errfds[2]; + int errin = -1, errout = -1; char buf[1024]; char *av[10]; @@ -1196,6 +1201,18 @@ get_best_gl_visual (saver_info *si, Screen *screen) in = fds [0]; out = fds [1]; + if (!si->prefs.verbose_p) + { + if (pipe (errfds)) + { + perror ("error creating pipe:"); + return 0; + } + + errin = errfds [0]; + errout = errfds [1]; + } + block_sigchld(); /* This blocks it in the parent and child, to avoid racing. It is never unblocked in the child before the child exits, but that doesn't matter. @@ -1211,16 +1228,25 @@ get_best_gl_visual (saver_info *si, Screen *screen) } case 0: { - int stdout_fd = 1; - close (in); /* don't need this one */ close (ConnectionNumber (si->dpy)); /* close display fd */ - if (dup2 (out, stdout_fd) < 0) /* pipe stdout */ + if (dup2 (out, STDOUT_FILENO) < 0) /* pipe stdout */ { perror ("could not dup() a new stdout:"); return 0; } + + if (! si->prefs.verbose_p) + { + close(errin); + if (dup2 (errout, STDERR_FILENO) < 0) + { + perror ("could not dup() a new stderr:"); + return 0; + } + } + hack_subproc_environment (screen, 0); /* set $DISPLAY */ execvp (av[0], av); /* shouldn't return. */ @@ -1251,6 +1277,12 @@ get_best_gl_visual (saver_info *si, Screen *screen) *buf = 0; fclose (f); + if (! si->prefs.verbose_p) + { + close (errout); + close (errin); + } + /* Wait for the child to die. */ waitpid (-1, &wait_status, 0);