-static void
-fork_and_exec (saver_info *si, const char *command, const char *desc)
-{
- saver_preferences *p = &si->prefs;
- pid_t forked;
- char buf [512];
- char *av[5];
- int ac;
-
- if (!command || !*command)
- {
- fprintf (stderr, "%s: no %s command has been specified.\n",
- blurb(), desc);
- return;
- }
-
- switch ((int) (forked = fork ()))
- {
- case -1:
- sprintf (buf, "%s: couldn't fork", blurb());
- perror (buf);
- break;
-
- case 0:
- close (ConnectionNumber (si->dpy)); /* close display fd */
- hack_subproc_environment (si->default_screen); /* set $DISPLAY */
- ac = 0;
- av [ac++] = (char *) p->shell;
- av [ac++] = (char *) "-c";
- av [ac++] = (char *) command;
- av [ac] = 0;
- execvp (av[0], av); /* shouldn't return. */
-
- sprintf (buf, "%s: execvp(\"%s\", \"%s\", \"%s\") failed",
- blurb(), av[0], av[1], av[2]);
- perror (buf);
- fflush (stderr);
- fflush (stdout);
- exit (1); /* Note that this only exits a child fork. */
- break;
-
- default:
- /* parent fork. */
- break;
- }
-}
-