Add regression test infrastructure.
[dragonfly.git] / usr.bin / make / job.c
1 /*
2  * Copyright (c) 1988, 1989, 1990, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  * Copyright (c) 1988, 1989 by Adam de Boor
5  * Copyright (c) 1989 by Berkeley Softworks
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Adam de Boor.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *      This product includes software developed by the University of
22  *      California, Berkeley and its contributors.
23  * 4. Neither the name of the University nor the names of its contributors
24  *    may be used to endorse or promote products derived from this software
25  *    without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37  * SUCH DAMAGE.
38  *
39  * @(#)job.c    8.2 (Berkeley) 3/19/94
40  * $FreeBSD: src/usr.bin/make/job.c,v 1.17.2.2 2001/02/13 03:13:57 will Exp $
41  * $DragonFly: src/usr.bin/make/job.c,v 1.40 2005/01/31 08:30:51 okumoto Exp $
42  */
43
44 #ifndef OLD_JOKE
45 #define OLD_JOKE 0
46 #endif /* OLD_JOKE */
47
48 /*-
49  * job.c --
50  *      handle the creation etc. of our child processes.
51  *
52  * Interface:
53  *      Job_Make                Start the creation of the given target.
54  *
55  *      Job_CatchChildren       Check for and handle the termination of any
56  *                              children. This must be called reasonably
57  *                              frequently to keep the whole make going at
58  *                              a decent clip, since job table entries aren't
59  *                              removed until their process is caught this way.
60  *                              Its single argument is TRUE if the function
61  *                              should block waiting for a child to terminate.
62  *
63  *      Job_CatchOutput         Print any output our children have produced.
64  *                              Should also be called fairly frequently to
65  *                              keep the user informed of what's going on.
66  *                              If no output is waiting, it will block for
67  *                              a time given by the SEL_* constants, below,
68  *                              or until output is ready.
69  *
70  *      Job_Init                Called to intialize this module. in addition,
71  *                              any commands attached to the .BEGIN target
72  *                              are executed before this function returns.
73  *                              Hence, the makefile must have been parsed
74  *                              before this function is called.
75  *
76  *      Job_Full                Return TRUE if the job table is filled.
77  *
78  *      Job_Empty               Return TRUE if the job table is completely
79  *                              empty.
80  *
81  *      Job_ParseShell          Given the line following a .SHELL target, parse
82  *                              the line as a shell specification. Returns
83  *                              FAILURE if the spec was incorrect.
84  *
85  *      Job_Finish                      Perform any final processing which needs doing.
86  *                              This includes the execution of any commands
87  *                              which have been/were attached to the .END
88  *                              target. It should only be called when the
89  *                              job table is empty.
90  *
91  *      Job_AbortAll            Abort all currently running jobs. It doesn't
92  *                              handle output or do anything for the jobs,
93  *                              just kills them. It should only be called in
94  *                              an emergency, as it were.
95  *
96  *      Job_CheckCommands       Verify that the commands for a target are
97  *                              ok. Provide them if necessary and possible.
98  *
99  *      Job_Touch               Update a target without really updating it.
100  *
101  *      Job_Wait                Wait for all currently-running jobs to finish.
102  */
103
104 #include <sys/types.h>
105 #include <sys/select.h>
106 #include <sys/stat.h>
107 #include <sys/wait.h>
108 #include <ctype.h>
109 #include <errno.h>
110 #include <fcntl.h>
111 #include <signal.h>
112 #include <stdlib.h>
113 #include <string.h>
114 #include <unistd.h>
115 #include <utime.h>
116
117 #ifdef USE_KQUEUE
118 #include <sys/event.h>
119 #endif
120
121 #include "arch.h"
122 #include "buf.h"
123 #include "compat.h"
124 #include "dir.h"
125 #include "globals.h"
126 #include "GNode.h"
127 #include "job.h"
128 #include "make.h"
129 #include "parse.h"
130 #include "pathnames.h"
131 #include "str.h"
132 #include "targ.h"
133 #include "util.h"
134 #include "var.h"
135
136 #define STATIC static
137
138 /*
139  * error handling variables
140  */
141 static int      errors = 0;         /* number of errors reported */
142 static int      aborting = 0;       /* why is the make aborting? */
143 #define ABORT_ERROR     1           /* Because of an error */
144 #define ABORT_INTERRUPT 2           /* Because it was interrupted */
145 #define ABORT_WAIT      3           /* Waiting for jobs to finish */
146
147 /*
148  * XXX: Avoid SunOS bug... FILENO() is fp->_file, and file
149  * is a char! So when we go above 127 we turn negative!
150  */
151 #define FILENO(a) ((unsigned)fileno(a))
152
153 /*
154  * post-make command processing. The node postCommands is really just the
155  * .END target but we keep it around to avoid having to search for it
156  * all the time.
157  */
158 static GNode      *postCommands;    /* node containing commands to execute when
159                                      * everything else is done */
160 static int        numCommands;      /* The number of commands actually printed
161                                      * for a target. Should this number be
162                                      * 0, no shell will be executed. */
163
164 /*
165  * Return values from JobStart.
166  */
167 #define JOB_RUNNING     0       /* Job is running */
168 #define JOB_ERROR       1       /* Error in starting the job */
169 #define JOB_FINISHED    2       /* The job is already finished */
170 #define JOB_STOPPED     3       /* The job is stopped */
171
172 /*
173  * tfile is used to build temp file names to store shell commands to
174  * execute.
175  */
176 static char     tfile[sizeof(TMPPAT)];
177
178 /*
179  * Descriptions for various shells.
180  */
181 static const DEF_SHELL_STRUCT(CShell, const) shells[] = {
182     /*
183      * CSH description. The csh can do echo control by playing
184      * with the setting of the 'echo' shell variable. Sadly,
185      * however, it is unable to do error control nicely.
186      */
187 {
188     "csh",
189     TRUE, "unset verbose", "set verbose", "unset verbose", 13,
190     FALSE, "echo \"%s\"\n", "csh -c \"%s || exit 0\"",
191     "v", "e",
192 },
193     /*
194      * SH description. Echo control is also possible and, under
195      * sun UNIX anyway, one can even control error checking.
196      */
197 {
198     "sh",
199     TRUE, "set -", "set -v", "set -", 5,
200     TRUE, "set -e", "set +e",
201 #ifdef OLDBOURNESHELL
202     FALSE, "echo \"%s\"\n", "sh -c '%s || exit 0'\n",
203 #endif
204     "v", "e",
205 },
206     /*
207      * KSH description. The Korn shell has a superset of
208      * the Bourne shell's functionality.
209      */
210 {
211     "ksh",
212     TRUE, "set -", "set -v", "set -", 5,
213     TRUE, "set -e", "set +e",
214     "v", "e",
215 },
216 };
217 static Shell    *commandShell = NULL;   /* this is the shell to which we pass
218                                          * all commands in the Makefile. It is
219                                          * set by the Job_ParseShell function */
220 char            *shellPath = NULL,      /* full pathname of executable image */
221                 *shellName = NULL;      /* last component of shell */
222
223
224 int maxJobs;            /* The most children we can run at once */
225 STATIC int      nJobs;          /* The number of children currently running */
226
227 /* The structures that describe them */
228 STATIC Lst jobs = Lst_Initializer(jobs);
229
230 STATIC Boolean  jobFull;        /* Flag to tell when the job table is full. It
231                                  * is set TRUE when (1) the total number of
232                                  * running jobs equals the maximum allowed */
233 #ifdef USE_KQUEUE
234 static int      kqfd;           /* File descriptor obtained by kqueue() */
235 #else
236 static fd_set   outputs;        /* Set of descriptors of pipes connected to
237                                  * the output channels of children */
238 #endif
239
240 STATIC GNode    *lastNode;      /* The node for which output was most recently
241                                  * produced. */
242 STATIC const char *targFmt;     /* Format string to use to head output from a
243                                  * job when it's not the most-recent job heard
244                                  * from */
245
246 #define TARG_FMT  "--- %s ---\n" /* Default format */
247 #define MESSAGE(fp, gn) \
248          fprintf(fp, targFmt, gn->name);
249
250 /*
251  * When JobStart attempts to run a job but isn't allowed to
252  * or when Job_CatchChildren detects a job that has
253  * been stopped somehow, the job is placed on the stoppedJobs queue to be run
254  * when the next job finishes.
255  *
256  * Lst of Job structures describing jobs that were stopped due to
257  * concurrency limits or externally
258  */
259 STATIC Lst stoppedJobs = Lst_Initializer(stoppedJobs);
260
261 STATIC int      fifoFd;         /* Fd of our job fifo */
262 STATIC char     fifoName[] = "/tmp/make_fifo_XXXXXXXXX";
263 STATIC int      fifoMaster;
264
265 static sig_atomic_t interrupted;
266
267
268 #if defined(USE_PGRP) && defined(SYSV)
269 # define KILL(pid, sig)         killpg(-(pid), (sig))
270 #else
271 # if defined(USE_PGRP)
272 #  define KILL(pid, sig)        killpg((pid), (sig))
273 # else
274 #  define KILL(pid, sig)        kill((pid), (sig))
275 # endif
276 #endif
277
278 /*
279  * Grmpf... There is no way to set bits of the wait structure
280  * anymore with the stupid W*() macros. I liked the union wait
281  * stuff much more. So, we devise our own macros... This is
282  * really ugly, use dramamine sparingly. You have been warned.
283  */
284 #define W_SETMASKED(st, val, fun)                               \
285         {                                                       \
286                 int sh = (int)~0;                               \
287                 int mask = fun(sh);                             \
288                                                                 \
289                 for (sh = 0; ((mask >> sh) & 1) == 0; sh++)     \
290                         continue;                               \
291                 *(st) = (*(st) & ~mask) | ((val) << sh);        \
292         }
293
294 #define W_SETTERMSIG(st, val) W_SETMASKED(st, val, WTERMSIG)
295 #define W_SETEXITSTATUS(st, val) W_SETMASKED(st, val, WEXITSTATUS)
296
297
298 static int JobCondPassSig(void *, void *);
299 static void JobPassSig(int);
300 static int JobPrintCommand(void *, void *);
301 static int JobSaveCommand(void *, void *);
302 static void JobClose(Job *);
303 static void JobFinish(Job *, int *);
304 static void JobExec(Job *, char **);
305 static void JobMakeArgv(Job *, char **);
306 static void JobRestart(Job *);
307 static int JobStart(GNode *, int, Job *);
308 static char *JobOutput(Job *, char *, char *, int);
309 static void JobDoOutput(Job *, Boolean);
310 static Shell *JobMatchShell(const char *);
311 static void JobInterrupt(int, int);
312 static void JobRestartJobs(void);
313
314 /*
315  * JobCatchSignal
316  *
317  * Got a signal. Set global variables and hope that someone will
318  * handle it.
319  */
320 static void
321 JobCatchSig(int signo)
322 {
323
324         interrupted = signo;
325 }
326
327 /*-
328  *-----------------------------------------------------------------------
329  * JobCondPassSig --
330  *      Pass a signal to a job if USE_PGRP is defined.
331  *
332  * Results:
333  *      === 0
334  *
335  * Side Effects:
336  *      None, except the job may bite it.
337  *
338  *-----------------------------------------------------------------------
339  */
340 static int
341 JobCondPassSig(void *jobp, void *signop)
342 {
343     Job *job = jobp;
344     int signo = *(int *)signop;
345
346     DEBUGF(JOB, ("JobCondPassSig passing signal %d to child %d.\n",
347         signo, job->pid));
348     KILL(job->pid, signo);
349     return (0);
350 }
351
352 /*-
353  *-----------------------------------------------------------------------
354  * JobPassSig --
355  *      Pass a signal on to all local jobs if
356  *      USE_PGRP is defined, then die ourselves.
357  *
358  * Results:
359  *      None.
360  *
361  * Side Effects:
362  *      We die by the same signal.
363  *
364  *-----------------------------------------------------------------------
365  */
366 static void
367 JobPassSig(int signo)
368 {
369     sigset_t nmask, omask;
370     struct sigaction act;
371
372     sigemptyset(&nmask);
373     sigaddset(&nmask, signo);
374     sigprocmask(SIG_SETMASK, &nmask, &omask);
375
376     DEBUGF(JOB, ("JobPassSig(%d) called.\n", signo));
377     Lst_ForEach(&jobs, JobCondPassSig, &signo);
378
379     /*
380      * Deal with proper cleanup based on the signal received. We only run
381      * the .INTERRUPT target if the signal was in fact an interrupt. The other
382      * three termination signals are more of a "get out *now*" command.
383      */
384     if (signo == SIGINT) {
385         JobInterrupt(TRUE, signo);
386     } else if ((signo == SIGHUP) || (signo == SIGTERM) || (signo == SIGQUIT)) {
387         JobInterrupt(FALSE, signo);
388     }
389
390     /*
391      * Leave gracefully if SIGQUIT, rather than core dumping.
392      */
393     if (signo == SIGQUIT) {
394         signo = SIGINT;
395     }
396
397     /*
398      * Send ourselves the signal now we've given the message to everyone else.
399      * Note we block everything else possible while we're getting the signal.
400      * This ensures that all our jobs get continued when we wake up before
401      * we take any other signal.
402      * XXX this comment seems wrong.
403      */
404     act.sa_handler = SIG_DFL;
405     sigemptyset(&act.sa_mask);
406     act.sa_flags = 0;
407     sigaction(signo, &act, NULL);
408
409     DEBUGF(JOB, ("JobPassSig passing signal to self, mask = %x.\n",
410         ~0 & ~(1 << (signo - 1))));
411     signal(signo, SIG_DFL);
412
413     KILL(getpid(), signo);
414
415     signo = SIGCONT;
416     Lst_ForEach(&jobs, JobCondPassSig, &signo);
417
418     sigprocmask(SIG_SETMASK, &omask, NULL);
419     sigprocmask(SIG_SETMASK, &omask, NULL);
420     act.sa_handler = JobPassSig;
421     sigaction(signo, &act, NULL);
422 }
423
424 /*-
425  *-----------------------------------------------------------------------
426  * JobCmpPid  --
427  *      Compare the pid of the job with the given pid and return 0 if they
428  *      are equal. This function is called from Job_CatchChildren via
429  *      Lst_Find to find the job descriptor of the finished job.
430  *
431  * Results:
432  *      0 if the pid's match
433  *
434  * Side Effects:
435  *      None
436  *-----------------------------------------------------------------------
437  */
438 static int
439 JobCmpPid(const void *job, const void *pid)
440 {
441
442     return (*(const int *)pid - ((const Job *)job)->pid);
443 }
444
445 /*-
446  *-----------------------------------------------------------------------
447  * JobPrintCommand  --
448  *      Put out another command for the given job. If the command starts
449  *      with an @ or a - we process it specially. In the former case,
450  *      so long as the -s and -n flags weren't given to make, we stick
451  *      a shell-specific echoOff command in the script. In the latter,
452  *      we ignore errors for the entire job, unless the shell has error
453  *      control.
454  *      If the command is just "..." we take all future commands for this
455  *      job to be commands to be executed once the entire graph has been
456  *      made and return non-zero to signal that the end of the commands
457  *      was reached. These commands are later attached to the postCommands
458  *      node and executed by Job_Finish when all things are done.
459  *      This function is called from JobStart via Lst_ForEach.
460  *
461  * Results:
462  *      Always 0, unless the command was "..."
463  *
464  * Side Effects:
465  *      If the command begins with a '-' and the shell has no error control,
466  *      the JOB_IGNERR flag is set in the job descriptor.
467  *      If the command is "..." and we're not ignoring such things,
468  *      tailCmds is set to the successor node of the cmd.
469  *      numCommands is incremented if the command is actually printed.
470  *-----------------------------------------------------------------------
471  */
472 static int
473 JobPrintCommand(void *cmdp, void *jobp)
474 {
475     Boolean     noSpecials;     /* true if we shouldn't worry about
476                                  * inserting special commands into
477                                  * the input stream. */
478     Boolean     shutUp = FALSE; /* true if we put a no echo command
479                                  * into the command file */
480     Boolean     errOff = FALSE; /* true if we turned error checking
481                                  * off before printing the command
482                                  * and need to turn it back on */
483     const char  *cmdTemplate;   /* Template to use when printing the
484                                  * command */
485     char        *cmdStart;      /* Start of expanded command */
486     LstNode     *cmdNode;       /* Node for replacing the command */
487     char        *cmd = cmdp;
488     Job         *job = jobp;
489
490     noSpecials = (noExecute && !(job->node->type & OP_MAKE));
491
492     if (strcmp(cmd, "...") == 0) {
493         job->node->type |= OP_SAVE_CMDS;
494         if ((job->flags & JOB_IGNDOTS) == 0) {
495             job->tailCmds = Lst_Succ(Lst_Member(&job->node->commands, cmd));
496             return (1);
497         }
498         return (0);
499     }
500
501 #define DBPRINTF(fmt, arg)                      \
502    DEBUGF(JOB, (fmt, arg));                     \
503     fprintf(job->cmdFILE, fmt, arg);    \
504     fflush(job->cmdFILE);
505
506     numCommands += 1;
507
508     /*
509      * For debugging, we replace each command with the result of expanding
510      * the variables in the command.
511      */
512     cmdNode = Lst_Member(&job->node->commands, cmd);
513     {
514         Buffer *buf;
515         buf = Var_Subst(NULL, cmd, job->node, FALSE);
516         cmd = Buf_GetAll(buf, NULL);
517         Buf_Destroy(buf, FALSE);
518         cmdStart = cmd;
519     }
520     Lst_Replace(cmdNode, cmdStart);
521
522     cmdTemplate = "%s\n";
523
524     /*
525      * Check for leading @', -' or +'s to control echoing, error checking,
526      * and execution on -n.
527      */
528     while (*cmd == '@' || *cmd == '-' || *cmd == '+') {
529         switch (*cmd) {
530
531           case '@':
532             shutUp = DEBUG(LOUD) ? FALSE : TRUE;
533             break;
534
535           case '-':
536             errOff = TRUE;
537             break;
538
539           case '+':
540             if (noSpecials) {
541                 /*
542                  * We're not actually exececuting anything...
543                  * but this one needs to be - use compat mode just for it.
544                  */
545                 Compat_RunCommand(cmdp, job->node);
546                 return (0);
547             }
548             break;
549         }
550         cmd++;
551     }
552
553     while (isspace((unsigned char)*cmd))
554         cmd++;
555
556     if (shutUp) {
557         if (!(job->flags & JOB_SILENT) && !noSpecials &&
558             commandShell->hasEchoCtl) {
559                 DBPRINTF("%s\n", commandShell->echoOff);
560         } else {
561             shutUp = FALSE;
562         }
563     }
564
565     if (errOff) {
566         if ( !(job->flags & JOB_IGNERR) && !noSpecials) {
567             if (commandShell->hasErrCtl) {
568                 /*
569                  * we don't want the error-control commands showing
570                  * up either, so we turn off echoing while executing
571                  * them. We could put another field in the shell
572                  * structure to tell JobDoOutput to look for this
573                  * string too, but why make it any more complex than
574                  * it already is?
575                  */
576                 if (!(job->flags & JOB_SILENT) && !shutUp &&
577                     commandShell->hasEchoCtl) {
578                         DBPRINTF("%s\n", commandShell->echoOff);
579                         DBPRINTF("%s\n", commandShell->ignErr);
580                         DBPRINTF("%s\n", commandShell->echoOn);
581                 } else {
582                     DBPRINTF("%s\n", commandShell->ignErr);
583                 }
584             } else if (commandShell->ignErr &&
585                       (*commandShell->ignErr != '\0'))
586             {
587                 /*
588                  * The shell has no error control, so we need to be
589                  * weird to get it to ignore any errors from the command.
590                  * If echoing is turned on, we turn it off and use the
591                  * errCheck template to echo the command. Leave echoing
592                  * off so the user doesn't see the weirdness we go through
593                  * to ignore errors. Set cmdTemplate to use the weirdness
594                  * instead of the simple "%s\n" template.
595                  */
596                 if (!(job->flags & JOB_SILENT) && !shutUp &&
597                     commandShell->hasEchoCtl) {
598                         DBPRINTF("%s\n", commandShell->echoOff);
599                         DBPRINTF(commandShell->errCheck, cmd);
600                         shutUp = TRUE;
601                 }
602                 cmdTemplate = commandShell->ignErr;
603                 /*
604                  * The error ignoration (hee hee) is already taken care
605                  * of by the ignErr template, so pretend error checking
606                  * is still on.
607                  */
608                 errOff = FALSE;
609             } else {
610                 errOff = FALSE;
611             }
612         } else {
613             errOff = FALSE;
614         }
615     }
616
617     DBPRINTF(cmdTemplate, cmd);
618
619     if (errOff) {
620         /*
621          * If echoing is already off, there's no point in issuing the
622          * echoOff command. Otherwise we issue it and pretend it was on
623          * for the whole command...
624          */
625         if (!shutUp && !(job->flags & JOB_SILENT) && commandShell->hasEchoCtl) {
626             DBPRINTF("%s\n", commandShell->echoOff);
627             shutUp = TRUE;
628         }
629         DBPRINTF("%s\n", commandShell->errCheck);
630     }
631     if (shutUp) {
632         DBPRINTF("%s\n", commandShell->echoOn);
633     }
634     return (0);
635 }
636
637 /*-
638  *-----------------------------------------------------------------------
639  * JobSaveCommand --
640  *      Save a command to be executed when everything else is done.
641  *      Callback function for JobFinish...
642  *
643  * Results:
644  *      Always returns 0
645  *
646  * Side Effects:
647  *      The command is tacked onto the end of postCommands's commands list.
648  *
649  *-----------------------------------------------------------------------
650  */
651 static int
652 JobSaveCommand(void *cmd, void *gn)
653 {
654     Buffer      *buf;
655     char        *str;
656
657     buf = Var_Subst(NULL, cmd, gn, FALSE);
658     str = Buf_GetAll(buf, NULL);
659     Buf_Destroy(buf, FALSE);
660
661     Lst_AtEnd(&postCommands->commands, str);
662     return (0);
663 }
664
665
666 /*-
667  *-----------------------------------------------------------------------
668  * JobClose --
669  *      Called to close both input and output pipes when a job is finished.
670  *
671  * Results:
672  *      Nada
673  *
674  * Side Effects:
675  *      The file descriptors associated with the job are closed.
676  *
677  *-----------------------------------------------------------------------
678  */
679 static void
680 JobClose(Job *job)
681 {
682
683     if (usePipes) {
684 #if !defined(USE_KQUEUE)
685         FD_CLR(job->inPipe, &outputs);
686 #endif
687         if (job->outPipe != job->inPipe) {
688            close(job->outPipe);
689         }
690         JobDoOutput(job, TRUE);
691         close(job->inPipe);
692     } else {
693         close(job->outFd);
694         JobDoOutput(job, TRUE);
695     }
696 }
697
698 /*-
699  *-----------------------------------------------------------------------
700  * JobFinish  --
701  *      Do final processing for the given job including updating
702  *      parents and starting new jobs as available/necessary. Note
703  *      that we pay no attention to the JOB_IGNERR flag here.
704  *      This is because when we're called because of a noexecute flag
705  *      or something, jstat.w_status is 0 and when called from
706  *      Job_CatchChildren, the status is zeroed if it s/b ignored.
707  *
708  * Results:
709  *      None
710  *
711  * Side Effects:
712  *      Some nodes may be put on the toBeMade queue.
713  *      Final commands for the job are placed on postCommands.
714  *
715  *      If we got an error and are aborting (aborting == ABORT_ERROR) and
716  *      the job list is now empty, we are done for the day.
717  *      If we recognized an error (errors !=0), we set the aborting flag
718  *      to ABORT_ERROR so no more jobs will be started.
719  *-----------------------------------------------------------------------
720  */
721 /*ARGSUSED*/
722 static void
723 JobFinish(Job *job, int *status)
724 {
725     Boolean      done;
726
727     if ((WIFEXITED(*status) &&
728          (((WEXITSTATUS(*status) != 0) && !(job->flags & JOB_IGNERR)))) ||
729         (WIFSIGNALED(*status) && (WTERMSIG(*status) != SIGCONT)))
730     {
731         /*
732          * If it exited non-zero and either we're doing things our
733          * way or we're not ignoring errors, the job is finished.
734          * Similarly, if the shell died because of a signal
735          * the job is also finished. In these
736          * cases, finish out the job's output before printing the exit
737          * status...
738          */
739         JobClose(job);
740         if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
741             fclose(job->cmdFILE);
742         }
743         done = TRUE;
744     } else if (WIFEXITED(*status)) {
745         /*
746          * Deal with ignored errors in -B mode. We need to print a message
747          * telling of the ignored error as well as setting status.w_status
748          * to 0 so the next command gets run. To do this, we set done to be
749          * TRUE if in -B mode and the job exited non-zero.
750          */
751         done = WEXITSTATUS(*status) != 0;
752         /*
753          * Old comment said: "Note we don't
754          * want to close down any of the streams until we know we're at the
755          * end."
756          * But we do. Otherwise when are we going to print the rest of the
757          * stuff?
758          */
759         JobClose(job);
760     } else {
761         /*
762          * No need to close things down or anything.
763          */
764         done = FALSE;
765     }
766
767     if (done ||
768         WIFSTOPPED(*status) ||
769         (WIFSIGNALED(*status) && (WTERMSIG(*status) == SIGCONT)) ||
770         DEBUG(JOB))
771     {
772         FILE      *out;
773
774         if (compatMake && !usePipes && (job->flags & JOB_IGNERR)) {
775             /*
776              * If output is going to a file and this job is ignoring
777              * errors, arrange to have the exit status sent to the
778              * output file as well.
779              */
780             out = fdopen(job->outFd, "w");
781             if (out == NULL)
782                 Punt("Cannot fdopen");
783         } else {
784             out = stdout;
785         }
786
787         if (WIFEXITED(*status)) {
788             DEBUGF(JOB, ("Process %d exited.\n", job->pid));
789             if (WEXITSTATUS(*status) != 0) {
790                 if (usePipes && job->node != lastNode) {
791                     MESSAGE(out, job->node);
792                     lastNode = job->node;
793                 }
794                  fprintf(out, "*** Error code %d%s\n",
795                                WEXITSTATUS(*status),
796                                (job->flags & JOB_IGNERR) ? "(ignored)" : "");
797
798                 if (job->flags & JOB_IGNERR) {
799                     *status = 0;
800                 }
801             } else if (DEBUG(JOB)) {
802                 if (usePipes && job->node != lastNode) {
803                     MESSAGE(out, job->node);
804                     lastNode = job->node;
805                 }
806                 fprintf(out, "*** Completed successfully\n");
807             }
808         } else if (WIFSTOPPED(*status)) {
809             DEBUGF(JOB, ("Process %d stopped.\n", job->pid));
810             if (usePipes && job->node != lastNode) {
811                 MESSAGE(out, job->node);
812                 lastNode = job->node;
813             }
814             fprintf(out, "*** Stopped -- signal %d\n",
815                 WSTOPSIG(*status));
816             job->flags |= JOB_RESUME;
817             Lst_AtEnd(&stoppedJobs, job);
818             fflush(out);
819             return;
820         } else if (WTERMSIG(*status) == SIGCONT) {
821             /*
822              * If the beastie has continued, shift the Job from the stopped
823              * list to the running one (or re-stop it if concurrency is
824              * exceeded) and go and get another child.
825              */
826             if (job->flags & (JOB_RESUME|JOB_RESTART)) {
827                 if (usePipes && job->node != lastNode) {
828                     MESSAGE(out, job->node);
829                     lastNode = job->node;
830                 }
831                  fprintf(out, "*** Continued\n");
832             }
833             if (!(job->flags & JOB_CONTINUING)) {
834                 DEBUGF(JOB, ("Warning: process %d was not continuing.\n", job->pid));
835 #ifdef notdef
836                 /*
837                  * We don't really want to restart a job from scratch just
838                  * because it continued, especially not without killing the
839                  * continuing process!  That's why this is ifdef'ed out.
840                  * FD - 9/17/90
841                  */
842                 JobRestart(job);
843 #endif
844             }
845             job->flags &= ~JOB_CONTINUING;
846             Lst_AtEnd(&jobs, job);
847             nJobs += 1;
848             DEBUGF(JOB, ("Process %d is continuing locally.\n", job->pid));
849             if (nJobs == maxJobs) {
850                 jobFull = TRUE;
851                 DEBUGF(JOB, ("Job queue is full.\n"));
852             }
853             fflush(out);
854             return;
855         } else {
856             if (usePipes && job->node != lastNode) {
857                 MESSAGE(out, job->node);
858                 lastNode = job->node;
859             }
860             fprintf(out, "*** Signal %d\n", WTERMSIG(*status));
861         }
862
863         fflush(out);
864     }
865
866     /*
867      * Now handle the -B-mode stuff. If the beast still isn't finished,
868      * try and restart the job on the next command. If JobStart says it's
869      * ok, it's ok. If there's an error, this puppy is done.
870      */
871     if (compatMake && WIFEXITED(*status) &&
872         Lst_Succ(job->node->compat_command) != NULL) {
873         switch (JobStart(job->node, job->flags & JOB_IGNDOTS, job)) {
874         case JOB_RUNNING:
875             done = FALSE;
876             break;
877         case JOB_ERROR:
878             done = TRUE;
879             W_SETEXITSTATUS(status, 1);
880             break;
881         case JOB_FINISHED:
882             /*
883              * If we got back a JOB_FINISHED code, JobStart has already
884              * called Make_Update and freed the job descriptor. We set
885              * done to false here to avoid fake cycles and double frees.
886              * JobStart needs to do the update so we can proceed up the
887              * graph when given the -n flag..
888              */
889             done = FALSE;
890             break;
891         default:
892             break;
893         }
894     } else {
895         done = TRUE;
896     }
897
898
899     if (done &&
900         (aborting != ABORT_ERROR) &&
901         (aborting != ABORT_INTERRUPT) &&
902         (*status == 0))
903     {
904         /*
905          * As long as we aren't aborting and the job didn't return a non-zero
906          * status that we shouldn't ignore, we call Make_Update to update
907          * the parents. In addition, any saved commands for the node are placed
908          * on the .END target.
909          */
910         if (job->tailCmds != NULL) {
911             Lst_ForEachFrom(&job->node->commands, job->tailCmds,
912                 JobSaveCommand, job->node);
913         }
914         job->node->made = MADE;
915         Make_Update(job->node);
916         free(job);
917     } else if (*status != 0) {
918         errors += 1;
919         free(job);
920     }
921
922     JobRestartJobs();
923
924     /*
925      * Set aborting if any error.
926      */
927     if (errors && !keepgoing && (aborting != ABORT_INTERRUPT)) {
928         /*
929          * If we found any errors in this batch of children and the -k flag
930          * wasn't given, we set the aborting flag so no more jobs get
931          * started.
932          */
933         aborting = ABORT_ERROR;
934     }
935
936     if ((aborting == ABORT_ERROR) && Job_Empty())
937         /*
938          * If we are aborting and the job table is now empty, we finish.
939          */
940         Finish(errors);
941 }
942
943 /*-
944  *-----------------------------------------------------------------------
945  * Job_Touch --
946  *      Touch the given target. Called by JobStart when the -t flag was
947  *      given.  Prints messages unless told to be silent.
948  *
949  * Results:
950  *      None
951  *
952  * Side Effects:
953  *      The data modification of the file is changed. In addition, if the
954  *      file did not exist, it is created.
955  *-----------------------------------------------------------------------
956  */
957 void
958 Job_Touch(GNode *gn, Boolean silent)
959 {
960     int           streamID;     /* ID of stream opened to do the touch */
961     struct utimbuf times;       /* Times for utime() call */
962
963     if (gn->type & (OP_JOIN | OP_USE | OP_EXEC | OP_OPTIONAL)) {
964         /*
965          * .JOIN, .USE, .ZEROTIME and .OPTIONAL targets are "virtual" targets
966          * and, as such, shouldn't really be created.
967          */
968         return;
969     }
970
971     if (!silent) {
972          fprintf(stdout, "touch %s\n", gn->name);
973          fflush(stdout);
974     }
975
976     if (noExecute) {
977         return;
978     }
979
980     if (gn->type & OP_ARCHV) {
981         Arch_Touch(gn);
982     } else if (gn->type & OP_LIB) {
983         Arch_TouchLib(gn);
984     } else {
985         char    *file = gn->path ? gn->path : gn->name;
986
987         times.actime = times.modtime = now;
988         if (utime(file, &times) < 0){
989             streamID = open(file, O_RDWR | O_CREAT, 0666);
990
991             if (streamID >= 0) {
992                 char    c;
993
994                 /*
995                  * Read and write a byte to the file to change the
996                  * modification time, then close the file.
997                  */
998                 if (read(streamID, &c, 1) == 1) {
999                      lseek(streamID, (off_t)0, SEEK_SET);
1000                     write(streamID, &c, 1);
1001                 }
1002
1003                 close(streamID);
1004             } else {
1005                  fprintf(stdout, "*** couldn't touch %s: %s",
1006                                file, strerror(errno));
1007                  fflush(stdout);
1008             }
1009         }
1010     }
1011 }
1012
1013 /*-
1014  *-----------------------------------------------------------------------
1015  * Job_CheckCommands --
1016  *      Make sure the given node has all the commands it needs.
1017  *
1018  * Results:
1019  *      TRUE if the commands list is/was ok.
1020  *
1021  * Side Effects:
1022  *      The node will have commands from the .DEFAULT rule added to it
1023  *      if it needs them.
1024  *-----------------------------------------------------------------------
1025  */
1026 Boolean
1027 Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
1028 {
1029
1030     if (OP_NOP(gn->type) && Lst_IsEmpty(&gn->commands) &&
1031         (gn->type & OP_LIB) == 0) {
1032         /*
1033          * No commands. Look for .DEFAULT rule from which we might infer
1034          * commands
1035          */
1036         if ((DEFAULT != NULL) && !Lst_IsEmpty(&DEFAULT->commands)) {
1037             char *p1;
1038             /*
1039              * Make only looks for a .DEFAULT if the node was never the
1040              * target of an operator, so that's what we do too. If
1041              * a .DEFAULT was given, we substitute its commands for gn's
1042              * commands and set the IMPSRC variable to be the target's name
1043              * The DEFAULT node acts like a transformation rule, in that
1044              * gn also inherits any attributes or sources attached to
1045              * .DEFAULT itself.
1046              */
1047             Make_HandleUse(DEFAULT, gn);
1048             Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), gn);
1049             free(p1);
1050         } else if (Dir_MTime(gn) == 0) {
1051             /*
1052              * The node wasn't the target of an operator we have no .DEFAULT
1053              * rule to go on and the target doesn't already exist. There's
1054              * nothing more we can do for this branch. If the -k flag wasn't
1055              * given, we stop in our tracks, otherwise we just don't update
1056              * this node's parents so they never get examined.
1057              */
1058             static const char msg[] = "make: don't know how to make";
1059
1060             if (gn->type & OP_OPTIONAL) {
1061                  fprintf(stdout, "%s %s(ignored)\n", msg, gn->name);
1062                  fflush(stdout);
1063             } else if (keepgoing) {
1064                  fprintf(stdout, "%s %s(continuing)\n", msg, gn->name);
1065                  fflush(stdout);
1066                  return (FALSE);
1067             } else {
1068 #if OLD_JOKE
1069                 if (strcmp(gn->name,"love") == 0)
1070                     (*abortProc)("Not war.");
1071                 else
1072 #endif
1073                     (*abortProc)("%s %s. Stop", msg, gn->name);
1074                 return (FALSE);
1075             }
1076         }
1077     }
1078     return (TRUE);
1079 }
1080
1081 /*-
1082  *-----------------------------------------------------------------------
1083  * JobExec --
1084  *      Execute the shell for the given job. Called from JobStart and
1085  *      JobRestart.
1086  *
1087  * Results:
1088  *      None.
1089  *
1090  * Side Effects:
1091  *      A shell is executed, outputs is altered and the Job structure added
1092  *      to the job table.
1093  *
1094  *-----------------------------------------------------------------------
1095  */
1096 static void
1097 JobExec(Job *job, char **argv)
1098 {
1099     int           cpid;         /* ID of new child */
1100
1101     if (DEBUG(JOB)) {
1102         int       i;
1103
1104         DEBUGF(JOB, ("Running %s\n", job->node->name));
1105         DEBUGF(JOB, ("\tCommand: "));
1106         for (i = 0; argv[i] != NULL; i++) {
1107             DEBUGF(JOB, ("%s ", argv[i]));
1108         }
1109         DEBUGF(JOB, ("\n"));
1110     }
1111
1112     /*
1113      * Some jobs produce no output and it's disconcerting to have
1114      * no feedback of their running (since they produce no output, the
1115      * banner with their name in it never appears). This is an attempt to
1116      * provide that feedback, even if nothing follows it.
1117      */
1118     if ((lastNode != job->node) && (job->flags & JOB_FIRST) &&
1119         !(job->flags & JOB_SILENT)) {
1120         MESSAGE(stdout, job->node);
1121         lastNode = job->node;
1122     }
1123
1124     if ((cpid = vfork()) == -1) {
1125         Punt("Cannot fork");
1126     } else if (cpid == 0) {
1127
1128         if (fifoFd >= 0)
1129             close(fifoFd);
1130         /*
1131          * Must duplicate the input stream down to the child's input and
1132          * reset it to the beginning (again). Since the stream was marked
1133          * close-on-exec, we must clear that bit in the new input.
1134          */
1135         if (dup2(FILENO(job->cmdFILE), 0) == -1)
1136             Punt("Cannot dup2: %s", strerror(errno));
1137         fcntl(0, F_SETFD, 0);
1138         lseek(0, (off_t)0, SEEK_SET);
1139
1140         if (usePipes) {
1141             /*
1142              * Set up the child's output to be routed through the pipe
1143              * we've created for it.
1144              */
1145             if (dup2(job->outPipe, 1) == -1)
1146                 Punt("Cannot dup2: %s", strerror(errno));
1147         } else {
1148             /*
1149              * We're capturing output in a file, so we duplicate the
1150              * descriptor to the temporary file into the standard
1151              * output.
1152              */
1153             if (dup2(job->outFd, 1) == -1)
1154                 Punt("Cannot dup2: %s", strerror(errno));
1155         }
1156         /*
1157          * The output channels are marked close on exec. This bit was
1158          * duplicated by the dup2 (on some systems), so we have to clear
1159          * it before routing the shell's error output to the same place as
1160          * its standard output.
1161          */
1162         fcntl(1, F_SETFD, 0);
1163         if (dup2(1, 2) == -1)
1164             Punt("Cannot dup2: %s", strerror(errno));
1165
1166 #ifdef USE_PGRP
1167         /*
1168          * We want to switch the child into a different process family so
1169          * we can kill it and all its descendants in one fell swoop,
1170          * by killing its process family, but not commit suicide.
1171          */
1172 # if defined(SYSV)
1173         setsid();
1174 # else
1175         setpgid(0, getpid());
1176 # endif
1177 #endif /* USE_PGRP */
1178
1179         execv(shellPath, argv);
1180
1181         write(STDERR_FILENO, "Could not execute shell\n",
1182                      sizeof("Could not execute shell"));
1183         _exit(1);
1184     } else {
1185         job->pid = cpid;
1186
1187         if (usePipes && (job->flags & JOB_FIRST) ) {
1188             /*
1189              * The first time a job is run for a node, we set the current
1190              * position in the buffer to the beginning and mark another
1191              * stream to watch in the outputs mask
1192              */
1193 #ifdef USE_KQUEUE
1194             struct kevent       kev[2];
1195 #endif
1196             job->curPos = 0;
1197
1198 #if defined(USE_KQUEUE)
1199             EV_SET(&kev[0], job->inPipe, EVFILT_READ, EV_ADD, 0, 0, job);
1200             EV_SET(&kev[1], job->pid, EVFILT_PROC, EV_ADD | EV_ONESHOT,
1201                 NOTE_EXIT, 0, NULL);
1202             if (kevent(kqfd, kev, 2, NULL, 0, NULL) != 0) {
1203                 /* kevent() will fail if the job is already finished */
1204                 if (errno != EINTR && errno != EBADF && errno != ESRCH)
1205                     Punt("kevent: %s", strerror(errno));
1206             }
1207 #else
1208             FD_SET(job->inPipe, &outputs);
1209 #endif /* USE_KQUEUE */
1210         }
1211
1212         if (job->cmdFILE != NULL && job->cmdFILE != stdout) {
1213             fclose(job->cmdFILE);
1214             job->cmdFILE = NULL;
1215         }
1216     }
1217
1218     /*
1219      * Now the job is actually running, add it to the table.
1220      */
1221     nJobs += 1;
1222     Lst_AtEnd(&jobs, job);
1223     if (nJobs == maxJobs) {
1224         jobFull = TRUE;
1225     }
1226 }
1227
1228 /*-
1229  *-----------------------------------------------------------------------
1230  * JobMakeArgv --
1231  *      Create the argv needed to execute the shell for a given job.
1232  *
1233  *
1234  * Results:
1235  *
1236  * Side Effects:
1237  *
1238  *-----------------------------------------------------------------------
1239  */
1240 static void
1241 JobMakeArgv(Job *job, char **argv)
1242 {
1243     int           argc;
1244     static char   args[10];     /* For merged arguments */
1245
1246     argv[0] = shellName;
1247     argc = 1;
1248
1249     if ((commandShell->exit && (*commandShell->exit != '-')) ||
1250         (commandShell->echo && (*commandShell->echo != '-')))
1251     {
1252         /*
1253          * At least one of the flags doesn't have a minus before it, so
1254          * merge them together. Have to do this because the *(&(@*#*&#$#
1255          * Bourne shell thinks its second argument is a file to source.
1256          * Grrrr. Note the ten-character limitation on the combined arguments.
1257          */
1258         sprintf(args, "-%s%s",
1259                       ((job->flags & JOB_IGNERR) ? "" :
1260                        (commandShell->exit ? commandShell->exit : "")),
1261                       ((job->flags & JOB_SILENT) ? "" :
1262                        (commandShell->echo ? commandShell->echo : "")));
1263
1264         if (args[1]) {
1265             argv[argc] = args;
1266             argc++;
1267         }
1268     } else {
1269         if (!(job->flags & JOB_IGNERR) && commandShell->exit) {
1270             argv[argc] = commandShell->exit;
1271             argc++;
1272         }
1273         if (!(job->flags & JOB_SILENT) && commandShell->echo) {
1274             argv[argc] = commandShell->echo;
1275             argc++;
1276         }
1277     }
1278     argv[argc] = NULL;
1279 }
1280
1281 /*-
1282  *-----------------------------------------------------------------------
1283  * JobRestart --
1284  *      Restart a job that stopped for some reason.
1285  *
1286  * Results:
1287  *      None.
1288  *
1289  * Side Effects:
1290  *      jobFull will be set if the job couldn't be run.
1291  *
1292  *-----------------------------------------------------------------------
1293  */
1294 static void
1295 JobRestart(Job *job)
1296 {
1297
1298     if (job->flags & JOB_RESTART) {
1299         /*
1300          * Set up the control arguments to the shell. This is based on the
1301          * flags set earlier for this job. If the JOB_IGNERR flag is clear,
1302          * the 'exit' flag of the commandShell is used to cause it to exit
1303          * upon receiving an error. If the JOB_SILENT flag is clear, the
1304          * 'echo' flag of the commandShell is used to get it to start echoing
1305          * as soon as it starts processing commands.
1306          */
1307         char      *argv[4];
1308
1309         JobMakeArgv(job, argv);
1310
1311         DEBUGF(JOB, ("Restarting %s...", job->node->name));
1312         if (((nJobs >= maxJobs) && !(job->flags & JOB_SPECIAL))) {
1313             /*
1314              * Can't be exported and not allowed to run locally -- put it
1315              * back on the hold queue and mark the table full
1316              */
1317             DEBUGF(JOB, ("holding\n"));
1318             Lst_AtFront(&stoppedJobs, (void *)job);
1319             jobFull = TRUE;
1320             DEBUGF(JOB, ("Job queue is full.\n"));
1321             return;
1322         } else {
1323             /*
1324              * Job may be run locally.
1325              */
1326             DEBUGF(JOB, ("running locally\n"));
1327         }
1328         JobExec(job, argv);
1329     } else {
1330         /*
1331          * The job has stopped and needs to be restarted. Why it stopped,
1332          * we don't know...
1333          */
1334         DEBUGF(JOB, ("Resuming %s...", job->node->name));
1335         if (((nJobs < maxJobs) ||
1336             ((job->flags & JOB_SPECIAL) &&
1337              (maxJobs == 0))) &&
1338            (nJobs != maxJobs))
1339         {
1340             /*
1341              * If we haven't reached the concurrency limit already (or the
1342              * job must be run and maxJobs is 0), it's ok to resume it.
1343              */
1344             Boolean error;
1345             int status;
1346
1347             error = (KILL(job->pid, SIGCONT) != 0);
1348
1349             if (!error) {
1350                 /*
1351                  * Make sure the user knows we've continued the beast and
1352                  * actually put the thing in the job table.
1353                  */
1354                 job->flags |= JOB_CONTINUING;
1355                 W_SETTERMSIG(&status, SIGCONT);
1356                 JobFinish(job, &status);
1357
1358                 job->flags &= ~(JOB_RESUME|JOB_CONTINUING);
1359                 DEBUGF(JOB, ("done\n"));
1360             } else {
1361                 Error("couldn't resume %s: %s",
1362                     job->node->name, strerror(errno));
1363                 status = 0;
1364                 W_SETEXITSTATUS(&status, 1);
1365                 JobFinish(job, &status);
1366             }
1367         } else {
1368             /*
1369              * Job cannot be restarted. Mark the table as full and
1370              * place the job back on the list of stopped jobs.
1371              */
1372             DEBUGF(JOB, ("table full\n"));
1373             Lst_AtFront(&stoppedJobs, (void *)job);
1374             jobFull = TRUE;
1375             DEBUGF(JOB, ("Job queue is full.\n"));
1376         }
1377     }
1378 }
1379
1380 /*-
1381  *-----------------------------------------------------------------------
1382  * JobStart  --
1383  *      Start a target-creation process going for the target described
1384  *      by the graph node gn.
1385  *
1386  * Results:
1387  *      JOB_ERROR if there was an error in the commands, JOB_FINISHED
1388  *      if there isn't actually anything left to do for the job and
1389  *      JOB_RUNNING if the job has been started.
1390  *
1391  * Side Effects:
1392  *      A new Job node is created and added to the list of running
1393  *      jobs. PMake is forked and a child shell created.
1394  *-----------------------------------------------------------------------
1395  */
1396 static int
1397 JobStart(GNode *gn, int flags, Job *previous)
1398 {
1399     Job           *job;       /* new job descriptor */
1400     char          *argv[4];   /* Argument vector to shell */
1401     Boolean       cmdsOK;     /* true if the nodes commands were all right */
1402     Boolean       noExec;     /* Set true if we decide not to run the job */
1403     int           tfd;        /* File descriptor for temp file */
1404
1405     if (interrupted) {
1406         JobPassSig(interrupted);
1407         return (JOB_ERROR);
1408     }
1409     if (previous != NULL) {
1410         previous->flags &= ~(JOB_FIRST|JOB_IGNERR|JOB_SILENT);
1411         job = previous;
1412     } else {
1413         job = emalloc(sizeof(Job));
1414         flags |= JOB_FIRST;
1415     }
1416
1417     job->node = gn;
1418     job->tailCmds = NULL;
1419
1420     /*
1421      * Set the initial value of the flags for this job based on the global
1422      * ones and the node's attributes... Any flags supplied by the caller
1423      * are also added to the field.
1424      */
1425     job->flags = 0;
1426     if (Targ_Ignore(gn)) {
1427         job->flags |= JOB_IGNERR;
1428     }
1429     if (Targ_Silent(gn)) {
1430         job->flags |= JOB_SILENT;
1431     }
1432     job->flags |= flags;
1433
1434     /*
1435      * Check the commands now so any attributes from .DEFAULT have a chance
1436      * to migrate to the node
1437      */
1438     if (!compatMake && job->flags & JOB_FIRST) {
1439         cmdsOK = Job_CheckCommands(gn, Error);
1440     } else {
1441         cmdsOK = TRUE;
1442     }
1443
1444     /*
1445      * If the -n flag wasn't given, we open up OUR (not the child's)
1446      * temporary file to stuff commands in it. The thing is rd/wr so we don't
1447      * need to reopen it to feed it to the shell. If the -n flag *was* given,
1448      * we just set the file to be stdout. Cute, huh?
1449      */
1450     if ((gn->type & OP_MAKE) || (!noExecute && !touchFlag)) {
1451         /*
1452          * We're serious here, but if the commands were bogus, we're
1453          * also dead...
1454          */
1455         if (!cmdsOK) {
1456             DieHorribly();
1457         }
1458
1459         strcpy(tfile, TMPPAT);
1460         if ((tfd = mkstemp(tfile)) == -1)
1461             Punt("Cannot create temp file: %s", strerror(errno));
1462         job->cmdFILE = fdopen(tfd, "w+");
1463         eunlink(tfile);
1464         if (job->cmdFILE == NULL) {
1465             close(tfd);
1466             Punt("Could not open %s", tfile);
1467         }
1468         fcntl(FILENO(job->cmdFILE), F_SETFD, 1);
1469         /*
1470          * Send the commands to the command file, flush all its buffers then
1471          * rewind and remove the thing.
1472          */
1473         noExec = FALSE;
1474
1475         /*
1476          * used to be backwards; replace when start doing multiple commands
1477          * per shell.
1478          */
1479         if (compatMake) {
1480             /*
1481              * Be compatible: If this is the first time for this node,
1482              * verify its commands are ok and open the commands list for
1483              * sequential access by later invocations of JobStart.
1484              * Once that is done, we take the next command off the list
1485              * and print it to the command file. If the command was an
1486              * ellipsis, note that there's nothing more to execute.
1487              */
1488             if (job->flags & JOB_FIRST)
1489                 gn->compat_command = Lst_First(&gn->commands);
1490             else
1491                 gn->compat_command = Lst_Succ(gn->compat_command);
1492
1493             if (gn->compat_command == NULL ||
1494                 JobPrintCommand(Lst_Datum(gn->compat_command), job))
1495                 noExec = TRUE;
1496
1497             if (noExec && !(job->flags & JOB_FIRST)) {
1498                 /*
1499                  * If we're not going to execute anything, the job
1500                  * is done and we need to close down the various
1501                  * file descriptors we've opened for output, then
1502                  * call JobDoOutput to catch the final characters or
1503                  * send the file to the screen... Note that the i/o streams
1504                  * are only open if this isn't the first job.
1505                  * Note also that this could not be done in
1506                  * Job_CatchChildren b/c it wasn't clear if there were
1507                  * more commands to execute or not...
1508                  */
1509                  JobClose(job);
1510             }
1511         } else {
1512             /*
1513              * We can do all the commands at once. hooray for sanity
1514              */
1515             numCommands = 0;
1516             Lst_ForEach(&gn->commands, JobPrintCommand, job);
1517
1518             /*
1519              * If we didn't print out any commands to the shell script,
1520              * there's not much point in executing the shell, is there?
1521              */
1522             if (numCommands == 0) {
1523                 noExec = TRUE;
1524             }
1525         }
1526     } else if (noExecute) {
1527         /*
1528          * Not executing anything -- just print all the commands to stdout
1529          * in one fell swoop. This will still set up job->tailCmds correctly.
1530          */
1531         if (lastNode != gn) {
1532             MESSAGE(stdout, gn);
1533             lastNode = gn;
1534         }
1535         job->cmdFILE = stdout;
1536         /*
1537          * Only print the commands if they're ok, but don't die if they're
1538          * not -- just let the user know they're bad and keep going. It
1539          * doesn't do any harm in this case and may do some good.
1540          */
1541         if (cmdsOK) {
1542             Lst_ForEach(&gn->commands, JobPrintCommand, job);
1543         }
1544         /*
1545          * Don't execute the shell, thank you.
1546          */
1547         noExec = TRUE;
1548     } else {
1549         /*
1550          * Just touch the target and note that no shell should be executed.
1551          * Set cmdFILE to stdout to make life easier. Check the commands, too,
1552          * but don't die if they're no good -- it does no harm to keep working
1553          * up the graph.
1554          */
1555         job->cmdFILE = stdout;
1556         Job_Touch(gn, job->flags & JOB_SILENT);
1557         noExec = TRUE;
1558     }
1559
1560     /*
1561      * If we're not supposed to execute a shell, don't.
1562      */
1563     if (noExec) {
1564         /*
1565          * Unlink and close the command file if we opened one
1566          */
1567         if (job->cmdFILE != stdout) {
1568             if (job->cmdFILE != NULL)
1569                  fclose(job->cmdFILE);
1570         } else {
1571               fflush(stdout);
1572         }
1573
1574         /*
1575          * We only want to work our way up the graph if we aren't here because
1576          * the commands for the job were no good.
1577          */
1578         if (cmdsOK) {
1579             if (aborting == 0) {
1580                 if (job->tailCmds != NULL) {
1581                     Lst_ForEachFrom(&job->node->commands, job->tailCmds,
1582                         JobSaveCommand, job->node);
1583                 }
1584                 job->node->made = MADE;
1585                 Make_Update(job->node);
1586             }
1587             free(job);
1588             return(JOB_FINISHED);
1589         } else {
1590             free(job);
1591             return(JOB_ERROR);
1592         }
1593     } else {
1594          fflush(job->cmdFILE);
1595     }
1596
1597     /*
1598      * Set up the control arguments to the shell. This is based on the flags
1599      * set earlier for this job.
1600      */
1601     JobMakeArgv(job, argv);
1602
1603     /*
1604      * If we're using pipes to catch output, create the pipe by which we'll
1605      * get the shell's output. If we're using files, print out that we're
1606      * starting a job and then set up its temporary-file name.
1607      */
1608     if (!compatMake || (job->flags & JOB_FIRST)) {
1609         if (usePipes) {
1610             int fd[2];
1611
1612             if (pipe(fd) == -1)
1613                 Punt("Cannot create pipe: %s", strerror(errno));
1614             job->inPipe = fd[0];
1615             job->outPipe = fd[1];
1616             fcntl(job->inPipe, F_SETFD, 1);
1617             fcntl(job->outPipe, F_SETFD, 1);
1618         } else {
1619             fprintf(stdout, "Remaking `%s'\n", gn->name);
1620             fflush(stdout);
1621             strcpy(job->outFile, TMPPAT);
1622             if ((job->outFd = mkstemp(job->outFile)) == -1)
1623                 Punt("cannot create temp file: %s", strerror(errno));
1624             fcntl(job->outFd, F_SETFD, 1);
1625         }
1626     }
1627
1628     if ((nJobs >= maxJobs) && !(job->flags & JOB_SPECIAL) && (maxJobs != 0)) {
1629         /*
1630          * We've hit the limit of concurrency, so put the job on hold until
1631          * some other job finishes. Note that the special jobs (.BEGIN,
1632          * .INTERRUPT and .END) may be run even when the limit has been reached
1633          * (e.g. when maxJobs == 0).
1634          */
1635         jobFull = TRUE;
1636
1637         DEBUGF(JOB, ("Can only run job locally.\n"));
1638         job->flags |= JOB_RESTART;
1639         Lst_AtEnd(&stoppedJobs, job);
1640     } else {
1641         if (nJobs >= maxJobs) {
1642             /*
1643              * If we're running this job locally as a special case (see above),
1644              * at least say the table is full.
1645              */
1646             jobFull = TRUE;
1647             DEBUGF(JOB, ("Local job queue is full.\n"));
1648         }
1649         JobExec(job, argv);
1650     }
1651     return (JOB_RUNNING);
1652 }
1653
1654 static char *
1655 JobOutput(Job *job, char *cp, char *endp, int msg)
1656 {
1657     char *ecp;
1658
1659     if (commandShell->noPrint) {
1660         ecp = strstr(cp, commandShell->noPrint);
1661         while (ecp != NULL) {
1662             if (cp != ecp) {
1663                 *ecp = '\0';
1664                 if (msg && job->node != lastNode) {
1665                     MESSAGE(stdout, job->node);
1666                     lastNode = job->node;
1667                 }
1668                 /*
1669                  * The only way there wouldn't be a newline after
1670                  * this line is if it were the last in the buffer.
1671                  * however, since the non-printable comes after it,
1672                  * there must be a newline, so we don't print one.
1673                  */
1674                  fprintf(stdout, "%s", cp);
1675                  fflush(stdout);
1676             }
1677             cp = ecp + commandShell->noPLen;
1678             if (cp != endp) {
1679                 /*
1680                  * Still more to print, look again after skipping
1681                  * the whitespace following the non-printable
1682                  * command....
1683                  */
1684                 cp++;
1685                 while (*cp == ' ' || *cp == '\t' || *cp == '\n') {
1686                     cp++;
1687                 }
1688                 ecp = strstr(cp, commandShell->noPrint);
1689             } else {
1690                 return (cp);
1691             }
1692         }
1693     }
1694     return (cp);
1695 }
1696
1697 /*-
1698  *-----------------------------------------------------------------------
1699  * JobDoOutput  --
1700  *      This function is called at different times depending on
1701  *      whether the user has specified that output is to be collected
1702  *      via pipes or temporary files. In the former case, we are called
1703  *      whenever there is something to read on the pipe. We collect more
1704  *      output from the given job and store it in the job's outBuf. If
1705  *      this makes up a line, we print it tagged by the job's identifier,
1706  *      as necessary.
1707  *      If output has been collected in a temporary file, we open the
1708  *      file and read it line by line, transfering it to our own
1709  *      output channel until the file is empty. At which point we
1710  *      remove the temporary file.
1711  *      In both cases, however, we keep our figurative eye out for the
1712  *      'noPrint' line for the shell from which the output came. If
1713  *      we recognize a line, we don't print it. If the command is not
1714  *      alone on the line (the character after it is not \0 or \n), we
1715  *      do print whatever follows it.
1716  *
1717  * Results:
1718  *      None
1719  *
1720  * Side Effects:
1721  *      curPos may be shifted as may the contents of outBuf.
1722  *-----------------------------------------------------------------------
1723  */
1724 STATIC void
1725 JobDoOutput(Job *job, Boolean finish)
1726 {
1727     Boolean       gotNL = FALSE;  /* true if got a newline */
1728     Boolean       fbuf;           /* true if our buffer filled up */
1729     int           nr;             /* number of bytes read */
1730     int           i;              /* auxiliary index into outBuf */
1731     int           max;            /* limit for i (end of current data) */
1732     int           nRead;          /* (Temporary) number of bytes read */
1733
1734     FILE          *oFILE;         /* Stream pointer to shell's output file */
1735     char          inLine[132];
1736
1737     if (usePipes) {
1738         /*
1739          * Read as many bytes as will fit in the buffer.
1740          */
1741 end_loop:
1742         gotNL = FALSE;
1743         fbuf = FALSE;
1744
1745         nRead = read(job->inPipe, &job->outBuf[job->curPos],
1746                          JOB_BUFSIZE - job->curPos);
1747         /*
1748          * Check for interrupt here too, because the above read may block
1749          * when the child process is stopped. In this case the interrupt
1750          * will unblock it (we don't use SA_RESTART).
1751          */
1752         if (interrupted)
1753             JobPassSig(interrupted);
1754
1755         if (nRead < 0) {
1756             DEBUGF(JOB, ("JobDoOutput(piperead)"));
1757             nr = 0;
1758         } else {
1759             nr = nRead;
1760         }
1761
1762         /*
1763          * If we hit the end-of-file (the job is dead), we must flush its
1764          * remaining output, so pretend we read a newline if there's any
1765          * output remaining in the buffer.
1766          * Also clear the 'finish' flag so we stop looping.
1767          */
1768         if ((nr == 0) && (job->curPos != 0)) {
1769             job->outBuf[job->curPos] = '\n';
1770             nr = 1;
1771             finish = FALSE;
1772         } else if (nr == 0) {
1773             finish = FALSE;
1774         }
1775
1776         /*
1777          * Look for the last newline in the bytes we just got. If there is
1778          * one, break out of the loop with 'i' as its index and gotNL set
1779          * TRUE.
1780          */
1781         max = job->curPos + nr;
1782         for (i = job->curPos + nr - 1; i >= job->curPos; i--) {
1783             if (job->outBuf[i] == '\n') {
1784                 gotNL = TRUE;
1785                 break;
1786             } else if (job->outBuf[i] == '\0') {
1787                 /*
1788                  * Why?
1789                  */
1790                 job->outBuf[i] = ' ';
1791             }
1792         }
1793
1794         if (!gotNL) {
1795             job->curPos += nr;
1796             if (job->curPos == JOB_BUFSIZE) {
1797                 /*
1798                  * If we've run out of buffer space, we have no choice
1799                  * but to print the stuff. sigh.
1800                  */
1801                 fbuf = TRUE;
1802                 i = job->curPos;
1803             }
1804         }
1805         if (gotNL || fbuf) {
1806             /*
1807              * Need to send the output to the screen. Null terminate it
1808              * first, overwriting the newline character if there was one.
1809              * So long as the line isn't one we should filter (according
1810              * to the shell description), we print the line, preceded
1811              * by a target banner if this target isn't the same as the
1812              * one for which we last printed something.
1813              * The rest of the data in the buffer are then shifted down
1814              * to the start of the buffer and curPos is set accordingly.
1815              */
1816             job->outBuf[i] = '\0';
1817             if (i >= job->curPos) {
1818                 char *cp;
1819
1820                 cp = JobOutput(job, job->outBuf, &job->outBuf[i], FALSE);
1821
1822                 /*
1823                  * There's still more in that thar buffer. This time, though,
1824                  * we know there's no newline at the end, so we add one of
1825                  * our own free will.
1826                  */
1827                 if (*cp != '\0') {
1828                     if (job->node != lastNode) {
1829                         MESSAGE(stdout, job->node);
1830                         lastNode = job->node;
1831                     }
1832                      fprintf(stdout, "%s%s", cp, gotNL ? "\n" : "");
1833                      fflush(stdout);
1834                 }
1835             }
1836             if (i < max - 1) {
1837                 /* shift the remaining characters down */
1838                  memcpy(job->outBuf, &job->outBuf[i + 1], max - (i + 1));
1839                 job->curPos = max - (i + 1);
1840
1841             } else {
1842                 /*
1843                  * We have written everything out, so we just start over
1844                  * from the start of the buffer. No copying. No nothing.
1845                  */
1846                 job->curPos = 0;
1847             }
1848         }
1849         if (finish) {
1850             /*
1851              * If the finish flag is true, we must loop until we hit
1852              * end-of-file on the pipe. This is guaranteed to happen
1853              * eventually since the other end of the pipe is now closed
1854              * (we closed it explicitly and the child has exited). When
1855              * we do get an EOF, finish will be set FALSE and we'll fall
1856              * through and out.
1857              */
1858             goto end_loop;
1859         }
1860     } else {
1861         /*
1862          * We've been called to retrieve the output of the job from the
1863          * temporary file where it's been squirreled away. This consists of
1864          * opening the file, reading the output line by line, being sure not
1865          * to print the noPrint line for the shell we used, then close and
1866          * remove the temporary file. Very simple.
1867          *
1868          * Change to read in blocks and do FindSubString type things as for
1869          * pipes? That would allow for "@echo -n..."
1870          */
1871         oFILE = fopen(job->outFile, "r");
1872         if (oFILE != NULL) {
1873             fprintf(stdout, "Results of making %s:\n", job->node->name);
1874             fflush(stdout);
1875             while (fgets(inLine, sizeof(inLine), oFILE) != NULL) {
1876                 char    *cp, *endp, *oendp;
1877
1878                 cp = inLine;
1879                 oendp = endp = inLine + strlen(inLine);
1880                 if (endp[-1] == '\n') {
1881                     *--endp = '\0';
1882                 }
1883                 cp = JobOutput(job, inLine, endp, FALSE);
1884
1885                 /*
1886                  * There's still more in that thar buffer. This time, though,
1887                  * we know there's no newline at the end, so we add one of
1888                  * our own free will.
1889                  */
1890                 fprintf(stdout, "%s", cp);
1891                 fflush(stdout);
1892                 if (endp != oendp) {
1893                      fprintf(stdout, "\n");
1894                      fflush(stdout);
1895                 }
1896             }
1897             fclose(oFILE);
1898             eunlink(job->outFile);
1899         }
1900     }
1901 }
1902
1903 /*-
1904  *-----------------------------------------------------------------------
1905  * Job_CatchChildren --
1906  *      Handle the exit of a child. Called from Make_Make.
1907  *
1908  * Results:
1909  *      none.
1910  *
1911  * Side Effects:
1912  *      The job descriptor is removed from the list of children.
1913  *
1914  * Notes:
1915  *      We do waits, blocking or not, according to the wisdom of our
1916  *      caller, until there are no more children to report. For each
1917  *      job, call JobFinish to finish things off. This will take care of
1918  *      putting jobs on the stoppedJobs queue.
1919  *
1920  *-----------------------------------------------------------------------
1921  */
1922 void
1923 Job_CatchChildren(Boolean block)
1924 {
1925     int           pid;          /* pid of dead child */
1926     Job           *job;         /* job descriptor for dead child */
1927     LstNode      *jnode;        /* list element for finding job */
1928     int           status;       /* Exit/termination status */
1929
1930     /*
1931      * Don't even bother if we know there's no one around.
1932      */
1933     if (nJobs == 0) {
1934         return;
1935     }
1936
1937     for (;;) {
1938         pid = waitpid((pid_t)-1, &status, (block ? 0 : WNOHANG) | WUNTRACED);
1939         if (pid <= 0)
1940             break;
1941         DEBUGF(JOB, ("Process %d exited or stopped.\n", pid));
1942
1943         jnode = Lst_Find(&jobs, &pid, JobCmpPid);
1944
1945         if (jnode == NULL) {
1946             if (WIFSIGNALED(status) && (WTERMSIG(status) == SIGCONT)) {
1947                 jnode = Lst_Find(&stoppedJobs, &pid, JobCmpPid);
1948                 if (jnode == NULL) {
1949                     Error("Resumed child (%d) not in table", pid);
1950                     continue;
1951                 }
1952                 job = Lst_Datum(jnode);
1953                 Lst_Remove(&stoppedJobs, jnode);
1954             } else {
1955                 Error("Child (%d) not in table?", pid);
1956                 continue;
1957             }
1958         } else {
1959             job = Lst_Datum(jnode);
1960             Lst_Remove(&jobs, jnode);
1961             nJobs -= 1;
1962             if (fifoFd >= 0 && maxJobs > 1) {
1963                 write(fifoFd, "+", 1);
1964                 maxJobs--;
1965                 if (nJobs >= maxJobs)
1966                     jobFull = TRUE;
1967                 else
1968                     jobFull = FALSE;
1969             } else {
1970                 DEBUGF(JOB, ("Job queue is no longer full.\n"));
1971                 jobFull = FALSE;
1972             }
1973         }
1974
1975         JobFinish(job, &status);
1976     }
1977     if (interrupted)
1978         JobPassSig(interrupted);
1979 }
1980
1981 /*-
1982  *-----------------------------------------------------------------------
1983  * Job_CatchOutput --
1984  *      Catch the output from our children, if we're using
1985  *      pipes do so. Otherwise just block time until we get a
1986  *      signal(most likely a SIGCHLD) since there's no point in
1987  *      just spinning when there's nothing to do and the reaping
1988  *      of a child can wait for a while.
1989  *
1990  * Results:
1991  *      None
1992  *
1993  * Side Effects:
1994  *      Output is read from pipes if we're piping.
1995  * -----------------------------------------------------------------------
1996  */
1997 void
1998 #ifdef USE_KQUEUE
1999 Job_CatchOutput(int flag __unused)
2000 #else
2001 Job_CatchOutput(int flag)
2002 #endif
2003 {
2004     int                   nfds;
2005 #ifdef USE_KQUEUE
2006 #define KEV_SIZE        4
2007     struct kevent         kev[KEV_SIZE];
2008     int                   i;
2009 #else
2010     struct timeval        timeout;
2011     fd_set                readfds;
2012     LstNode               *ln;
2013     Job                   *job;
2014 #endif
2015
2016      fflush(stdout);
2017
2018     if (usePipes) {
2019 #ifdef USE_KQUEUE
2020         if ((nfds = kevent(kqfd, NULL, 0, kev, KEV_SIZE, NULL)) == -1) {
2021             if (errno != EINTR)
2022                 Punt("kevent: %s", strerror(errno));
2023             if (interrupted)
2024                 JobPassSig(interrupted);
2025         } else {
2026             for (i = 0; i < nfds; i++) {
2027                 if (kev[i].flags & EV_ERROR) {
2028                     warnc(kev[i].data, "kevent");
2029                     continue;
2030                 }
2031                 switch (kev[i].filter) {
2032                 case EVFILT_READ:
2033                     JobDoOutput(kev[i].udata, FALSE);
2034                     break;
2035                 case EVFILT_PROC:
2036                     /* Just wake up and let Job_CatchChildren() collect the
2037                      * terminated job. */
2038                     break;
2039                 }
2040             }
2041         }
2042 #else
2043         readfds = outputs;
2044         timeout.tv_sec = SEL_SEC;
2045         timeout.tv_usec = SEL_USEC;
2046         if (flag && jobFull && fifoFd >= 0)
2047             FD_SET(fifoFd, &readfds);
2048
2049         nfds = select(FD_SETSIZE, &readfds, (fd_set *)NULL,
2050                            (fd_set *)NULL, &timeout);
2051         if (nfds <= 0) {
2052             if (interrupted)
2053                 JobPassSig(interrupted);
2054             return;
2055         }
2056         if (fifoFd >= 0 && FD_ISSET(fifoFd, &readfds)) {
2057             if (--nfds <= 0)
2058                 return;
2059         }
2060         for (ln = Lst_First(&jobs); nfds != 0 && ln != NULL; ln = Lst_Succ(ln)){
2061             job = Lst_Datum(ln);
2062             if (FD_ISSET(job->inPipe, &readfds)) {
2063                 JobDoOutput(job, FALSE);
2064                 nfds -= 1;
2065             }
2066         }
2067 #endif /* !USE_KQUEUE */
2068     }
2069 }
2070
2071 /*-
2072  *-----------------------------------------------------------------------
2073  * Job_Make --
2074  *      Start the creation of a target. Basically a front-end for
2075  *      JobStart used by the Make module.
2076  *
2077  * Results:
2078  *      None.
2079  *
2080  * Side Effects:
2081  *      Another job is started.
2082  *
2083  *-----------------------------------------------------------------------
2084  */
2085 void
2086 Job_Make(GNode *gn)
2087 {
2088
2089      JobStart(gn, 0, NULL);
2090 }
2091
2092 /*
2093  * JobCopyShell:
2094  *
2095  * Make a new copy of the shell structure including a copy of the strings
2096  * in it. This also defaults some fields in case they are NULL.
2097  *
2098  * The function returns a pointer to the new shell structure otherwise.
2099  */
2100 static Shell *
2101 JobCopyShell(const Shell *osh)
2102 {
2103         Shell *nsh;
2104
2105         nsh = emalloc(sizeof(*nsh));
2106         nsh->name = estrdup(osh->name);
2107
2108         if (osh->echoOff != NULL)
2109                 nsh->echoOff = estrdup(osh->echoOff);
2110         else
2111                 nsh->echoOff = NULL;
2112         if (osh->echoOn != NULL)
2113                 nsh->echoOn = estrdup(osh->echoOn);
2114         else
2115                 nsh->echoOn = NULL;
2116         nsh->hasEchoCtl = osh->hasEchoCtl;
2117
2118         if (osh->noPrint != NULL)
2119                 nsh->noPrint = estrdup(osh->noPrint);
2120         else
2121                 nsh->noPrint = NULL;
2122         nsh->noPLen = osh->noPLen;
2123
2124         nsh->hasErrCtl = osh->hasErrCtl;
2125         if (osh->errCheck == NULL)
2126                 nsh->errCheck = estrdup("");
2127         else
2128                 nsh->errCheck = estrdup(osh->errCheck);
2129         if (osh->ignErr == NULL)
2130                 nsh->ignErr = estrdup("%s");
2131         else
2132                 nsh->ignErr = estrdup(osh->ignErr);
2133
2134         if (osh->echo == NULL)
2135                 nsh->echo = estrdup("");
2136         else
2137                 nsh->echo = estrdup(osh->echo);
2138
2139         if (osh->exit == NULL)
2140                 nsh->exit = estrdup("");
2141         else
2142                 nsh->exit = estrdup(osh->exit);
2143
2144         return (nsh);
2145 }
2146
2147 /*
2148  * JobFreeShell:
2149  *
2150  * Free a shell structure and all associated strings.
2151  */
2152 static void
2153 JobFreeShell(Shell *sh)
2154 {
2155
2156         if (sh != NULL) {
2157                 free(sh->name);
2158                 free(sh->echoOff);
2159                 free(sh->echoOn);
2160                 free(sh->noPrint);
2161                 free(sh->errCheck);
2162                 free(sh->ignErr);
2163                 free(sh->echo);
2164                 free(sh->exit);
2165                 free(sh);
2166         }
2167 }
2168
2169 void
2170 Shell_Init(void)
2171 {
2172
2173     if (commandShell == NULL)
2174         commandShell = JobMatchShell(shells[DEFSHELL].name);
2175
2176     if (shellPath == NULL) {
2177         /*
2178          * The user didn't specify a shell to use, so we are using the
2179          * default one... Both the absolute path and the last component
2180          * must be set. The last component is taken from the 'name' field
2181          * of the default shell description pointed-to by commandShell.
2182          * All default shells are located in _PATH_DEFSHELLDIR.
2183          */
2184         shellName = commandShell->name;
2185         shellPath = str_concat(_PATH_DEFSHELLDIR, shellName, STR_ADDSLASH);
2186     }
2187 }
2188
2189 /*-
2190  *-----------------------------------------------------------------------
2191  * Job_Init --
2192  *      Initialize the process module, given a maximum number of jobs.
2193  *
2194  * Results:
2195  *      none
2196  *
2197  * Side Effects:
2198  *      lists and counters are initialized
2199  *-----------------------------------------------------------------------
2200  */
2201 void
2202 Job_Init(int maxproc)
2203 {
2204     GNode         *begin;     /* node for commands to do at the very start */
2205     const char    *env;
2206     struct sigaction sa;
2207
2208     fifoFd = -1;
2209     env = getenv("MAKE_JOBS_FIFO");
2210
2211     if (env == NULL && maxproc > 1) {
2212         /*
2213          * We did not find the environment variable so we are the leader.
2214          * Create the fifo, open it, write one char per allowed job into
2215          * the pipe.
2216          */
2217         mktemp(fifoName);
2218         if (!mkfifo(fifoName, 0600)) {
2219             fifoFd = open(fifoName, O_RDWR | O_NONBLOCK, 0);
2220             if (fifoFd >= 0) {
2221                 fifoMaster = 1;
2222                 fcntl(fifoFd, F_SETFL, O_NONBLOCK);
2223                 env = fifoName;
2224                 setenv("MAKE_JOBS_FIFO", env, 1);
2225                 while (maxproc-- > 0) {
2226                     write(fifoFd, "+", 1);
2227                 }
2228                 /* The master make does not get a magic token */
2229                 jobFull = TRUE;
2230                 maxJobs = 0;
2231             } else {
2232                 unlink(fifoName);
2233                 env = NULL;
2234             }
2235         }
2236     } else if (env != NULL) {
2237         /*
2238          * We had the environment variable so we are a slave.
2239          * Open fifo and give ourselves a magic token which represents
2240          * the token our parent make has grabbed to start his make process.
2241          * Otherwise the sub-makes would gobble up tokens and the proper
2242          * number of tokens to specify to -j would depend on the depth of
2243          * the tree and the order of execution.
2244          */
2245         fifoFd = open(env, O_RDWR, 0);
2246         if (fifoFd >= 0) {
2247             fcntl(fifoFd, F_SETFL, O_NONBLOCK);
2248             maxJobs = 1;
2249             jobFull = FALSE;
2250         }
2251     }
2252     if (fifoFd <= 0) {
2253         maxJobs = maxproc;
2254         jobFull = FALSE;
2255     } else {
2256     }
2257     nJobs = 0;
2258
2259     aborting = 0;
2260     errors = 0;
2261
2262     lastNode = NULL;
2263
2264     if ((maxJobs == 1 && fifoFd < 0) || beVerbose == 0) {
2265         /*
2266          * If only one job can run at a time, there's no need for a banner,
2267          * no is there?
2268          */
2269         targFmt = "";
2270     } else {
2271         targFmt = TARG_FMT;
2272     }
2273
2274     Shell_Init();
2275
2276     /*
2277      * Catch the four signals that POSIX specifies if they aren't ignored.
2278      * JobCatchSignal will just set global variables and hope someone
2279      * else is going to handle the interrupt.
2280      */
2281     sa.sa_handler = JobCatchSig;
2282     sigemptyset(&sa.sa_mask);
2283     sa.sa_flags = 0;
2284
2285     if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
2286         sigaction(SIGINT, &sa, NULL);
2287     }
2288     if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
2289         sigaction(SIGHUP, &sa, NULL);
2290     }
2291     if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) {
2292         sigaction(SIGQUIT, &sa, NULL);
2293     }
2294     if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
2295         sigaction(SIGTERM, &sa, NULL);
2296     }
2297     /*
2298      * There are additional signals that need to be caught and passed if
2299      * either the export system wants to be told directly of signals or if
2300      * we're giving each job its own process group (since then it won't get
2301      * signals from the terminal driver as we own the terminal)
2302      */
2303 #if defined(USE_PGRP)
2304     if (signal(SIGTSTP, SIG_IGN) != SIG_IGN) {
2305         sigaction(SIGTSTP, &sa, NULL);
2306     }
2307     if (signal(SIGTTOU, SIG_IGN) != SIG_IGN) {
2308         sigaction(SIGTTOU, &sa, NULL);
2309     }
2310     if (signal(SIGTTIN, SIG_IGN) != SIG_IGN) {
2311         sigaction(SIGTTIN, &sa, NULL);
2312     }
2313     if (signal(SIGWINCH, SIG_IGN) != SIG_IGN) {
2314         sigaction(SIGWINCH, &sa, NULL);
2315     }
2316 #endif
2317
2318 #ifdef USE_KQUEUE
2319     if ((kqfd = kqueue()) == -1) {
2320         Punt("kqueue: %s", strerror(errno));
2321     }
2322 #endif
2323
2324     begin = Targ_FindNode(".BEGIN", TARG_NOCREATE);
2325
2326     if (begin != NULL) {
2327         JobStart(begin, JOB_SPECIAL, (Job *)NULL);
2328         while (nJobs) {
2329             Job_CatchOutput(0);
2330             Job_CatchChildren(!usePipes);
2331         }
2332     }
2333     postCommands = Targ_FindNode(".END", TARG_CREATE);
2334 }
2335
2336 /*-
2337  *-----------------------------------------------------------------------
2338  * Job_Full --
2339  *      See if the job table is full. It is considered full if it is OR
2340  *      if we are in the process of aborting OR if we have
2341  *      reached/exceeded our local quota. This prevents any more jobs
2342  *      from starting up.
2343  *
2344  * Results:
2345  *      TRUE if the job table is full, FALSE otherwise
2346  * Side Effects:
2347  *      None.
2348  *-----------------------------------------------------------------------
2349  */
2350 Boolean
2351 Job_Full(void)
2352 {
2353     char c;
2354     int i;
2355
2356     if (aborting)
2357         return (aborting);
2358     if (fifoFd >= 0 && jobFull) {
2359         i = read(fifoFd, &c, 1);
2360         if (i > 0) {
2361             maxJobs++;
2362             jobFull = FALSE;
2363         }
2364     }
2365     return (jobFull);
2366 }
2367
2368 /*-
2369  *-----------------------------------------------------------------------
2370  * Job_Empty --
2371  *      See if the job table is empty.  Because the local concurrency may
2372  *      be set to 0, it is possible for the job table to become empty,
2373  *      while the list of stoppedJobs remains non-empty. In such a case,
2374  *      we want to restart as many jobs as we can.
2375  *
2376  * Results:
2377  *      TRUE if it is. FALSE if it ain't.
2378  *
2379  * Side Effects:
2380  *      None.
2381  *
2382  * -----------------------------------------------------------------------
2383  */
2384 Boolean
2385 Job_Empty(void)
2386 {
2387     if (nJobs == 0) {
2388         if (!Lst_IsEmpty(&stoppedJobs) && !aborting) {
2389             /*
2390              * The job table is obviously not full if it has no jobs in
2391              * it...Try and restart the stopped jobs.
2392              */
2393             jobFull = FALSE;
2394             JobRestartJobs();
2395             return (FALSE);
2396         } else {
2397             return (TRUE);
2398         }
2399     } else {
2400         return (FALSE);
2401     }
2402 }
2403
2404 /*-
2405  *-----------------------------------------------------------------------
2406  * JobMatchShell --
2407  *      Find a matching shell in 'shells' given its final component.
2408  *
2409  * Results:
2410  *      A pointer to a freshly allocated Shell structure with a copy
2411  *      of the static structure or NULL if no shell with the given name
2412  *      is found.
2413  *
2414  * Side Effects:
2415  *      None.
2416  *
2417  *-----------------------------------------------------------------------
2418  */
2419 static Shell *
2420 JobMatchShell(const char *name)
2421 {
2422     const struct CShell *sh;          /* Pointer into shells table */
2423     struct Shell *nsh;
2424
2425     for (sh = shells; sh < shells + __arysize(shells); sh++)
2426         if (strcmp(sh->name, name) == 0)
2427             break;
2428
2429     if (sh == shells + __arysize(shells))
2430         return (NULL);
2431
2432     /* make a copy */
2433     nsh = emalloc(sizeof(*nsh));
2434
2435     nsh->name = estrdup(sh->name);
2436     nsh->echoOff = estrdup(sh->echoOff);
2437     nsh->echoOn = estrdup(sh->echoOn);
2438     nsh->hasEchoCtl = sh->hasEchoCtl;
2439     nsh->noPrint = estrdup(sh->noPrint);
2440     nsh->noPLen = sh->noPLen;
2441     nsh->hasErrCtl = sh->hasErrCtl;
2442     nsh->errCheck = estrdup(sh->errCheck);
2443     nsh->ignErr = estrdup(sh->ignErr);
2444     nsh->echo = estrdup(sh->echo);
2445     nsh->exit = estrdup(sh->exit);
2446
2447     return (nsh);
2448 }
2449
2450 /*-
2451  *-----------------------------------------------------------------------
2452  * Job_ParseShell --
2453  *      Parse a shell specification and set up commandShell, shellPath
2454  *      and shellName appropriately.
2455  *
2456  * Results:
2457  *      FAILURE if the specification was incorrect.
2458  *
2459  * Side Effects:
2460  *      commandShell points to a Shell structure (either predefined or
2461  *      created from the shell spec), shellPath is the full path of the
2462  *      shell described by commandShell, while shellName is just the
2463  *      final component of shellPath.
2464  *
2465  * Notes:
2466  *      A shell specification consists of a .SHELL target, with dependency
2467  *      operator, followed by a series of blank-separated words. Double
2468  *      quotes can be used to use blanks in words. A backslash escapes
2469  *      anything (most notably a double-quote and a space) and
2470  *      provides the functionality it does in C. Each word consists of
2471  *      keyword and value separated by an equal sign. There should be no
2472  *      unnecessary spaces in the word. The keywords are as follows:
2473  *          name            Name of shell.
2474  *          path            Location of shell. Overrides "name" if given
2475  *          quiet           Command to turn off echoing.
2476  *          echo            Command to turn echoing on
2477  *          filter          Result of turning off echoing that shouldn't be
2478  *                          printed.
2479  *          echoFlag        Flag to turn echoing on at the start
2480  *          errFlag         Flag to turn error checking on at the start
2481  *          hasErrCtl       True if shell has error checking control
2482  *          check           Command to turn on error checking if hasErrCtl
2483  *                          is TRUE or template of command to echo a command
2484  *                          for which error checking is off if hasErrCtl is
2485  *                          FALSE.
2486  *          ignore          Command to turn off error checking if hasErrCtl
2487  *                          is TRUE or template of command to execute a
2488  *                          command so as to ignore any errors it returns if
2489  *                          hasErrCtl is FALSE.
2490  *
2491  *-----------------------------------------------------------------------
2492  */
2493 ReturnStatus
2494 Job_ParseShell(char *line)
2495 {
2496     char          **words;
2497     int           wordCount;
2498     char          **argv;
2499     int           argc;
2500     char          *path;
2501     Shell         newShell;
2502     Shell         *sh;
2503     Boolean       fullSpec = FALSE;
2504
2505     while (isspace((unsigned char)*line)) {
2506         line++;
2507     }
2508     words = brk_string(line, &wordCount, TRUE);
2509
2510     memset(&newShell, 0, sizeof(newShell));
2511
2512     /*
2513      * Parse the specification by keyword
2514      */
2515     for (path = NULL, argc = wordCount - 1, argv = words + 1;
2516          argc != 0;
2517          argc--, argv++) {
2518              if (strncmp(*argv, "path=", 5) == 0) {
2519                  path = &argv[0][5];
2520              } else if (strncmp(*argv, "name=", 5) == 0) {
2521                  newShell.name = &argv[0][5];
2522              } else {
2523                  if (strncmp(*argv, "quiet=", 6) == 0) {
2524                      newShell.echoOff = &argv[0][6];
2525                  } else if (strncmp(*argv, "echo=", 5) == 0) {
2526                      newShell.echoOn = &argv[0][5];
2527                  } else if (strncmp(*argv, "filter=", 7) == 0) {
2528                      newShell.noPrint = &argv[0][7];
2529                      newShell.noPLen = strlen(newShell.noPrint);
2530                  } else if (strncmp(*argv, "echoFlag=", 9) == 0) {
2531                      newShell.echo = &argv[0][9];
2532                  } else if (strncmp(*argv, "errFlag=", 8) == 0) {
2533                      newShell.exit = &argv[0][8];
2534                  } else if (strncmp(*argv, "hasErrCtl=", 10) == 0) {
2535                      char c = argv[0][10];
2536                      newShell.hasErrCtl = !((c != 'Y') && (c != 'y') &&
2537                                            (c != 'T') && (c != 't'));
2538                  } else if (strncmp(*argv, "check=", 6) == 0) {
2539                      newShell.errCheck = &argv[0][6];
2540                  } else if (strncmp(*argv, "ignore=", 7) == 0) {
2541                      newShell.ignErr = &argv[0][7];
2542                  } else {
2543                      Parse_Error(PARSE_FATAL, "Unknown keyword \"%s\"",
2544                                   *argv);
2545                      return (FAILURE);
2546                  }
2547                  fullSpec = TRUE;
2548              }
2549     }
2550
2551     /*
2552      * Some checks (could be more)
2553      */
2554     if (fullSpec) {
2555         if ((newShell.echoOn != NULL) ^ (newShell.echoOff != NULL))
2556             Parse_Error(PARSE_FATAL, "Shell must have either both echoOff and "
2557                 "echoOn or none of them");
2558
2559         if (newShell.echoOn != NULL && newShell.echoOff)
2560             newShell.hasEchoCtl = TRUE;
2561     }
2562
2563     if (path == NULL) {
2564         /*
2565          * If no path was given, the user wants one of the pre-defined shells,
2566          * yes? So we find the one s/he wants with the help of JobMatchShell
2567          * and set things up the right way. shellPath will be set up by
2568          * Job_Init.
2569          */
2570         if (newShell.name == NULL) {
2571             Parse_Error(PARSE_FATAL, "Neither path nor name specified");
2572             return (FAILURE);
2573         }
2574         if ((sh = JobMatchShell(newShell.name)) == NULL) {
2575             Parse_Error(PARSE_FATAL, "%s: no matching shell", newShell.name);
2576             return (FAILURE);
2577         }
2578
2579     } else {
2580         /*
2581          * The user provided a path. If s/he gave nothing else (fullSpec is
2582          * FALSE), try and find a matching shell in the ones we know of.
2583          * Else we just take the specification at its word and copy it
2584          * to a new location. In either case, we need to record the
2585          * path the user gave for the shell.
2586          */
2587         free(shellPath);
2588         shellPath = estrdup(path);
2589         if (newShell.name == NULL) {
2590             /* get the base name as the name */
2591             path = strrchr(path, '/');
2592             if (path == NULL) {
2593                 path = shellPath;
2594             } else {
2595                 path += 1;
2596             }
2597             newShell.name = path;
2598         }
2599
2600         if (!fullSpec) {
2601             if ((sh = JobMatchShell(newShell.name)) == NULL) {
2602                 Parse_Error(PARSE_FATAL, "%s: no matching shell",
2603                     newShell.name);
2604                 return (FAILURE);
2605             }
2606         } else {
2607             sh = JobCopyShell(&newShell);
2608         }
2609     }
2610
2611     /* set the new shell */
2612     JobFreeShell(commandShell);
2613     commandShell = sh;
2614
2615     shellName = commandShell->name;
2616
2617     return (SUCCESS);
2618 }
2619
2620 /*-
2621  *-----------------------------------------------------------------------
2622  * JobInterrupt --
2623  *      Handle the receipt of an interrupt.
2624  *
2625  * Results:
2626  *      None
2627  *
2628  * Side Effects:
2629  *      All children are killed. Another job will be started if the
2630  *      .INTERRUPT target was given.
2631  *-----------------------------------------------------------------------
2632  */
2633 static void
2634 JobInterrupt(int runINTERRUPT, int signo)
2635 {
2636     LstNode       *ln;          /* element in job table */
2637     Job           *job;         /* job descriptor in that element */
2638     GNode         *interrupt;   /* the node describing the .INTERRUPT target */
2639
2640     aborting = ABORT_INTERRUPT;
2641
2642     for (ln = Lst_First(&jobs); ln != NULL; ln = Lst_Succ(ln)) {
2643         job = Lst_Datum(ln);
2644
2645         if (!Targ_Precious(job->node)) {
2646             char *file = (job->node->path == NULL ?
2647                                 job->node->name :
2648                                 job->node->path);
2649             if (!noExecute && eunlink(file) != -1) {
2650                 Error("*** %s removed", file);
2651             }
2652         }
2653         if (job->pid) {
2654             DEBUGF(JOB, ("JobInterrupt passing signal to child %d.\n",
2655                    job->pid));
2656             KILL(job->pid, signo);
2657         }
2658     }
2659
2660     if (runINTERRUPT && !touchFlag) {
2661         /* clear the interrupted flag because we would get an
2662          * infinite loop otherwise */
2663         interrupted = 0;
2664
2665         interrupt = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
2666         if (interrupt != NULL) {
2667             ignoreErrors = FALSE;
2668
2669             JobStart(interrupt, JOB_IGNDOTS, (Job *)NULL);
2670             while (nJobs) {
2671                 Job_CatchOutput(0);
2672                 Job_CatchChildren(!usePipes);
2673             }
2674         }
2675     }
2676 }
2677
2678 /*
2679  *-----------------------------------------------------------------------
2680  * Job_Finish --
2681  *      Do final processing such as the running of the commands
2682  *      attached to the .END target.
2683  *
2684  * Results:
2685  *      Number of errors reported.
2686  *-----------------------------------------------------------------------
2687  */
2688 int
2689 Job_Finish(void)
2690 {
2691
2692     if (postCommands != NULL && !Lst_IsEmpty(&postCommands->commands)) {
2693         if (errors) {
2694             Error("Errors reported so .END ignored");
2695         } else {
2696             JobStart(postCommands, JOB_SPECIAL | JOB_IGNDOTS, NULL);
2697
2698             while (nJobs) {
2699                 Job_CatchOutput(0);
2700                 Job_CatchChildren(!usePipes);
2701             }
2702         }
2703     }
2704     if (fifoFd >= 0) {
2705         close(fifoFd);
2706         fifoFd = -1;
2707         if (fifoMaster)
2708             unlink(fifoName);
2709     }
2710     return (errors);
2711 }
2712
2713 /*-
2714  *-----------------------------------------------------------------------
2715  * Job_Wait --
2716  *      Waits for all running jobs to finish and returns. Sets 'aborting'
2717  *      to ABORT_WAIT to prevent other jobs from starting.
2718  *
2719  * Results:
2720  *      None.
2721  *
2722  * Side Effects:
2723  *      Currently running jobs finish.
2724  *
2725  *-----------------------------------------------------------------------
2726  */
2727 void
2728 Job_Wait(void)
2729 {
2730
2731     aborting = ABORT_WAIT;
2732     while (nJobs != 0) {
2733         Job_CatchOutput(0);
2734         Job_CatchChildren(!usePipes);
2735     }
2736     aborting = 0;
2737 }
2738
2739 /*-
2740  *-----------------------------------------------------------------------
2741  * Job_AbortAll --
2742  *      Abort all currently running jobs without handling output or anything.
2743  *      This function is to be called only in the event of a major
2744  *      error. Most definitely NOT to be called from JobInterrupt.
2745  *
2746  * Results:
2747  *      None
2748  *
2749  * Side Effects:
2750  *      All children are killed, not just the firstborn
2751  *-----------------------------------------------------------------------
2752  */
2753 void
2754 Job_AbortAll(void)
2755 {
2756     LstNode             *ln;    /* element in job table */
2757     Job                 *job;   /* the job descriptor in that element */
2758     int                 foo;
2759
2760     aborting = ABORT_ERROR;
2761
2762     if (nJobs) {
2763         for (ln = Lst_First(&jobs); ln != NULL; ln = Lst_Succ(ln)) {
2764             job = Lst_Datum(ln);
2765
2766             /*
2767              * kill the child process with increasingly drastic signals to make
2768              * darn sure it's dead.
2769              */
2770             KILL(job->pid, SIGINT);
2771             KILL(job->pid, SIGKILL);
2772         }
2773     }
2774
2775     /*
2776      * Catch as many children as want to report in at first, then give up
2777      */
2778     while (waitpid((pid_t)-1, &foo, WNOHANG) > 0)
2779         continue;
2780 }
2781
2782 /*-
2783  *-----------------------------------------------------------------------
2784  * JobRestartJobs --
2785  *      Tries to restart stopped jobs if there are slots available.
2786  *      Note that this tries to restart them regardless of pending errors.
2787  *      It's not good to leave stopped jobs lying around!
2788  *
2789  * Results:
2790  *      None.
2791  *
2792  * Side Effects:
2793  *      Resumes(and possibly migrates) jobs.
2794  *
2795  *-----------------------------------------------------------------------
2796  */
2797 static void
2798 JobRestartJobs(void)
2799 {
2800     while (!jobFull && !Lst_IsEmpty(&stoppedJobs)) {
2801         DEBUGF(JOB, ("Job queue is not full. Restarting a stopped job.\n"));
2802         JobRestart(Lst_DeQueue(&stoppedJobs));
2803     }
2804 }