X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fsubprocs.c;h=b6948e8789c30dd8c8c025f79eeafa1d7a568c27;hb=4cecfc89e5e889c7232693897c06168fb378bd5c;hp=62ae9ae9040281054a50711acfd5b0c5ae395a04;hpb=a94197e76a5dea5cb60542840809d6c20d0abbf3;p=xscreensaver diff --git a/driver/subprocs.c b/driver/subprocs.c index 62ae9ae9..b6948e87 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -1,5 +1,5 @@ /* subprocs.c --- choosing, spawning, and killing screenhacks. - * xscreensaver, Copyright (c) 1991-2001 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2003 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 @@ -365,12 +365,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 +661,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. */ @@ -732,8 +737,8 @@ spawn_screenhack_1 (saver_screen_info *ssi, Bool first_time_p) */ if (p->verbose_p) fprintf(stderr, - "%s: no suitable visuals for these programs.\n", - blurb()); + "%s: %d: no programs enabled, or no suitable visuals.\n", + blurb(), ssi->number); return; } else @@ -765,8 +770,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; @@ -885,6 +895,11 @@ hack_environment (saver_info *si) if (putenv (npath)) abort (); + + /* don't free (npath) -- some implementations of putenv (BSD 4.4, + glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2) + do not. So we must leak it (and/or the previous setting). Yay. + */ } #endif /* HAVE_PUTENV && DEFAULT_PATH_PREFIX */ } @@ -923,6 +938,7 @@ hack_subproc_environment (saver_screen_info *ssi) #ifdef HAVE_PUTENV if (putenv (ndpy)) abort (); + /* do not free(ndpy) -- see above. */ #endif /* HAVE_PUTENV */ } @@ -1005,14 +1021,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