-\f
-/* Subprocess.
- (This bit mostly cribbed from phosphor.c)
- */
-
-static void
-subproc_cb (XtPointer closure, int *source, XtInputId *id)
-{
- /* state *s = (state *) closure; */
- /* s->input_available_p = True; */
-}
-
-
-static void
-launch_text_generator (state *s)
-{
- char *oprogram = get_string_resource (s->dpy, "program", "Program");
- char *program = (char *) malloc (strlen (oprogram) + 10);
- strcpy (program, "( ");
- strcat (program, oprogram);
- strcat (program, " ) 2>&1");
-
- if (s->debug_p)
- fprintf (stderr, "%s: forking: %s\n", progname, program);
-
- if ((s->pipe = popen (program, "r")))
- {
- s->pipe_id =
- XtAppAddInput (XtDisplayToApplicationContext (s->dpy),
- fileno (s->pipe),
- (XtPointer) (XtInputReadMask | XtInputExceptMask),
- subproc_cb, (XtPointer) s);
- }
- else
- {
- char buf[255];
- sprintf (buf, "%.100s: %.100s", progname, program);
- perror (buf);
- }
-
- free(oprogram);
- free(program);
-}
-
-
-static void
-relaunch_generator_timer (XtPointer closure, XtIntervalId *id)
-{
- state *s = (state *) closure;
- if (!s->timer_id) abort();
- s->timer_id = 0;
- launch_text_generator (s);
-}
-
-
-/* whether there is data available to be read on the file descriptor
- */
-static int
-input_available_p (int fd)
-{
- struct timeval tv = { 0, };
- fd_set fds;
-# if 0
- /* This breaks on BSD, which uses bzero() in the definition of FD_ZERO */
- FD_ZERO (&fds);
-# else
- memset (&fds, 0, sizeof(fds));
-# endif
- FD_SET (fd, &fds);
- return select (fd+1, &fds, NULL, NULL, &tv);
-}
-
-