http://www.uw-madison.lkams.kernel.org/pub/mirrors/fink/distfiles/xscreensaver-4...
[xscreensaver] / driver / subprocs.c
index 910d5cc92912bacc819fcbad128faff93a237981..463b3189450310fbbeb2f8e5ae552c17537de79e 100644 (file)
@@ -1,5 +1,5 @@
 /* subprocs.c --- choosing, spawning, and killing screenhacks.
- * xscreensaver, Copyright (c) 1991-2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1991-2003 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
@@ -88,6 +88,12 @@ extern saver_info *global_si_kludge; /* I hate C so much... */
 static void
 limit_subproc_memory (int address_space_limit, Bool verbose_p)
 {
+
+/* This has caused way more problems than it has solved...
+   Let's just completely ignore the "memoryLimit" option now.
+ */
+#undef HAVE_SETRLIMIT
+
 #if defined(HAVE_SETRLIMIT) && defined(RLIMIT_AS)
   struct rlimit r;
 
@@ -288,17 +294,28 @@ static void describe_dead_child (saver_info *, pid_t, int wait_status);
 static int block_sigchld_handler = 0;
 
 
-void
+#ifdef HAVE_SIGACTION
+ sigset_t
+#else  /* !HAVE_SIGACTION */
+ int
+#endif /* !HAVE_SIGACTION */
 block_sigchld (void)
 {
 #ifdef HAVE_SIGACTION
   sigset_t child_set;
   sigemptyset (&child_set);
   sigaddset (&child_set, SIGCHLD);
+  sigaddset (&child_set, SIGPIPE);
   sigprocmask (SIG_BLOCK, &child_set, 0);
 #endif /* HAVE_SIGACTION */
 
   block_sigchld_handler++;
+
+#ifdef HAVE_SIGACTION
+  return child_set;
+#else  /* !HAVE_SIGACTION */
+  return 0;
+#endif /* !HAVE_SIGACTION */
 }
 
 void
@@ -308,6 +325,7 @@ unblock_sigchld (void)
   sigset_t child_set;
   sigemptyset(&child_set);
   sigaddset(&child_set, SIGCHLD);
+  sigaddset(&child_set, SIGPIPE);
   sigprocmask(SIG_UNBLOCK, &child_set, 0);
 #endif /* HAVE_SIGACTION */
 
@@ -365,12 +383,12 @@ kill_job (saver_info *si, pid_t pid, int signal)
       if (errno == ESRCH)
        fprintf (stderr,
                  "%s: %d: child process %lu (%s) was already dead.\n",
-                blurb(), job->screen, job->pid, job->name);
+                blurb(), job->screen, (unsigned long) job->pid, job->name);
       else
        {
          char buf [1024];
          sprintf (buf, "%s: %d: couldn't kill child process %lu (%s)",
-                  blurb(), job->screen, job->pid, job->name);
+                  blurb(), job->screen, (unsigned long) job->pid, job->name);
          perror (buf);
        }
     }
@@ -661,6 +679,11 @@ spawn_screenhack_1 (saver_screen_info *ssi, Bool first_time_p)
           /* No hacks at all */
           new_hack = -1;
         }
+      else if (p->screenhacks_count == 1)
+        {
+          /* Exactly one hack in the list */
+          new_hack = 0;
+        }
       else if (si->selection_mode == -1)
         {
           /* Select the next hack, wrapping. */
@@ -765,8 +788,13 @@ spawn_screenhack_1 (saver_screen_info *ssi, Bool first_time_p)
                      (unsigned long) getpid ());
 
          exec_command (p->shell, hack->command, p->nice_inferior);
-          /* If that returned, we were unable to exec the subprocess. */
-          print_path_error (hack->command);
+
+          /* If that returned, we were unable to exec the subprocess.
+             Print an error message, if desired.
+           */
+          if (! p->ignore_uninstalled_p)
+            print_path_error (hack->command);
+
           exit (1);  /* exits child fork */
          break;
 
@@ -1011,14 +1039,23 @@ get_best_gl_visual (saver_screen_info *ssi)
         /* Wait for the child to die. */
         waitpid (-1, &wait_status, 0);
 
-        if (1 == sscanf (buf, "0x%x %c", &v, &c))
+        if (1 == sscanf (buf, "0x%lx %c", &v, &c))
           result = (int) v;
 
         if (result == 0)
           {
             if (si->prefs.verbose_p)
-              fprintf (stderr, "%s: %s did not report a GL visual!\n",
-                       blurb(), av[0]);
+              {
+                int L = strlen(buf);
+                fprintf (stderr, "%s: %s did not report a GL visual!\n",
+                         blurb(), av[0]);
+
+                if (L && buf[L-1] == '\n')
+                  buf[--L] = 0;
+                if (*buf)
+                  fprintf (stderr, "%s: %s said: \"%s\"\n",
+                           blurb(), av[0], buf);
+              }
             return 0;
           }
         else