X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=driver%2Fsubprocs.c;h=009bb6dc529905286b79573e90a469c959d81194;hb=488f2fa8fbdbc77e91a70da2962d73af49e6cace;hp=01329d0effb0426a26b27ba3042e5e8e978510c6;hpb=0d6b320def9180cf907ceaed56b23a972a11b757;p=xscreensaver diff --git a/driver/subprocs.c b/driver/subprocs.c index 01329d0e..009bb6dc 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -1,5 +1,5 @@ /* subprocs.c --- choosing, spawning, and killing screenhacks. - * xscreensaver, Copyright (c) 1991-2005 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2007 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 @@ -25,6 +25,7 @@ #endif #include /* sys/resource.h needs this for timeval */ +#include /* for PATH_MAX */ #ifdef HAVE_SYS_WAIT_H # include /* for waitpid() and associated macros */ @@ -65,6 +66,7 @@ extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ #define Widget void* #include "xscreensaver.h" +#include "exec.h" #include "yarandom.h" #include "visual.h" /* for id_to_visual() */ @@ -91,7 +93,7 @@ no_malloc_number_to_string (long num) num = -num; } - while ((num > 0) && (num_digits < sizeof(string - 1))) + while ((num > 0) && (num_digits < sizeof(string) - 1)) { int digit; digit = (int) num % 10; @@ -216,7 +218,10 @@ struct screenhack_job { static struct screenhack_job *jobs = 0; -/* for debugging -- nothing calls this, but it's useful to invoke from gdb. */ +/* for debugging -- nothing calls this, but it's useful to invoke from gdb. + */ +void show_job_list (void); + void show_job_list (void) { @@ -355,12 +360,20 @@ static int block_sigchld_handler = 0; block_sigchld (void) { #ifdef HAVE_SIGACTION + struct sigaction sa; sigset_t child_set; + + memset (&sa, 0, sizeof (sa)); + sa.sa_handler = SIG_IGN; + sigaction (SIGPIPE, &sa, NULL); + sigemptyset (&child_set); sigaddset (&child_set, SIGCHLD); - sigaddset (&child_set, SIGPIPE); sigprocmask (SIG_BLOCK, &child_set, 0); -#endif /* HAVE_SIGACTION */ + +#else /* !HAVE_SIGACTION */ + signal (SIGPIPE, SIG_IGN); +#endif /* !HAVE_SIGACTION */ block_sigchld_handler++; @@ -375,12 +388,20 @@ void unblock_sigchld (void) { #ifdef HAVE_SIGACTION + struct sigaction sa; sigset_t child_set; + + memset(&sa, 0, sizeof (sa)); + sa.sa_handler = SIG_DFL; + sigaction(SIGPIPE, &sa, NULL); + sigemptyset(&child_set); sigaddset(&child_set, SIGCHLD); - sigaddset(&child_set, SIGPIPE); sigprocmask(SIG_UNBLOCK, &child_set, 0); -#endif /* HAVE_SIGACTION */ + +#else /* !HAVE_SIGACTION */ + signal(SIGPIPE, SIG_DFL); +#endif /* !HAVE_SIGACTION */ block_sigchld_handler--; } @@ -954,6 +975,7 @@ spawn_screenhack_1 (saver_screen_info *ssi, Bool first_time_p) if (!force && (!hack->enabled_p || + !on_path_p (hack->command) || !select_visual_of_hack (ssi, hack))) { if (++retry_count > (p->screenhacks_count*4)) @@ -1134,14 +1156,17 @@ hack_subproc_environment (saver_screen_info *ssi) const char *odpy = DisplayString (si->dpy); char *ndpy = (char *) malloc (strlen(odpy) + 20); char *nssw = (char *) malloc (40); - char *s; + char *s, *c; strcpy (ndpy, "DISPLAY="); s = ndpy + strlen(ndpy); strcpy (s, odpy); - while (*s && *s != ':') s++; /* skip to colon */ - while (*s == ':') s++; /* skip over colons */ + /* We have to find the last colon since it is the boundary between + hostname & screen - IPv6 numeric format addresses may have many + colons before that point, and DECnet addresses always have two colons */ + c = strrchr(s,':'); /* skip to last colon */ + if (c != NULL) s = c+1; while (isdigit(*s)) s++; /* skip over dpy number */ while (*s == '.') s++; /* skip over dot */ if (s[-1] != '.') *s++ = '.'; /* put on a dot */