From http://www.jwz.org/xscreensaver/xscreensaver-5.27.tar.gz
[xscreensaver] / driver / subprocs.c
index 405a382b8bb6e70c94bd0de2aaee76e009bc1033..65b0079abd86941009eb0cc74662ecaa441838cd 100644 (file)
@@ -1,5 +1,5 @@
 /* subprocs.c --- choosing, spawning, and killing screenhacks.
- * xscreensaver, Copyright (c) 1991-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * 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);