1 /* Job execution and handling for GNU Make.
2 Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
3 This file is part of GNU Make.
5 GNU Make is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 GNU Make is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNU Make; see the file COPYING. If not, write to
17 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
26 /* Default shell to use. */
27 char default_shell
[] = "/bin/sh";
31 static int dos_pid
= 123;
32 static int dos_status
;
33 static char *dos_bname
;
34 static char *dos_bename
;
35 static int dos_batch_file
;
39 /* If NGROUPS_MAX == 0 then try other methods for finding a real value. */
40 #if defined (NGROUPS_MAX) && NGROUPS_MAX == 0
42 #endif /* NGROUPS_MAX == 0 */
46 #define GET_NGROUPS_MAX sysconf (_SC_NGROUPS_MAX)
47 #else /* Not POSIX. */
48 #define NGROUPS_MAX NGROUPS
52 #ifdef HAVE_SYS_WAIT_H
57 #define WAIT_NOHANG(status) waitpid (-1, (status), WNOHANG)
58 #else /* Don't have waitpid. */
63 #define WAIT_NOHANG(status) wait3 ((status), WNOHANG, (struct rusage *) 0)
64 #endif /* Have wait3. */
65 #endif /* Have waitpid. */
67 #if !defined (wait) && !defined (POSIX)
71 #ifndef HAVE_UNION_WAIT
76 #define WTERMSIG(x) ((x) & 0x7f)
79 #define WCOREDUMP(x) ((x) & 0x80)
82 #define WEXITSTATUS(x) (((x) >> 8) & 0xff)
85 #define WIFSIGNALED(x) (WTERMSIG (x) != 0)
88 #define WIFEXITED(x) (WTERMSIG (x) == 0)
91 #else /* Have `union wait'. */
93 #define WAIT_T union wait
95 #define WTERMSIG(x) ((x).w_termsig)
98 #define WCOREDUMP(x) ((x).w_coredump)
101 #define WEXITSTATUS(x) ((x).w_retcode)
104 #define WIFSIGNALED(x) (WTERMSIG(x) != 0)
107 #define WIFEXITED(x) (WTERMSIG(x) == 0)
110 #endif /* Don't have `union wait'. */
113 #ifndef HAVE_UNISTD_H
115 extern int execve ();
116 extern void _exit ();
117 extern int geteuid (), getegid ();
118 extern int setgid (), getgid ();
121 #ifndef getdtablesize
122 #ifdef HAVE_GETDTABLESIZE
123 extern int getdtablesize ();
125 #ifdef HAVE_SYSCONF_OPEN_MAX
126 #define getdtablesize() ((int) sysconf (_SC_OPEN_MAX))
128 #include <sys/param.h>
129 #define getdtablesize() NOFILE
130 #if !defined (NOFILE) && defined (NOFILES_MAX)
131 /* SCO 3.2 "devsys 4.2" defines NOFILES_{MIN,MAX} in lieu of NOFILE. */
132 #define NOFILE NOFILES_MAX
138 extern int getloadavg ();
139 extern int start_remote_job_p ();
140 extern int start_remote_job (), remote_status ();
142 RETSIGTYPE
child_handler ();
143 static void free_child (), start_job_command ();
144 static int load_too_high (), job_next_command ();
146 /* Chain of all live (or recently deceased) children. */
148 struct child
*children
= 0;
150 /* Number of children currently running. */
152 unsigned int job_slots_used
= 0;
154 /* Nonzero if the `good' standard input is in use. */
156 static int good_stdin_used
= 0;
158 /* Chain of children waiting to run until the load average goes down. */
160 static struct child
*waiting_jobs
= 0;
162 /* Write an error message describing the exit status given in
163 EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME.
164 Append "(ignored)" if IGNORED is nonzero. */
167 child_error (target_name
, exit_code
, exit_sig
, coredump
, ignored
)
169 int exit_code
, exit_sig
, coredump
;
173 error (ignored
? "[%s] Error %d (ignored)" :
175 target_name
, exit_code
);
178 char *coredump_string
= coredump
? " (core dumped)" : "";
179 if (exit_sig
> 0 && exit_sig
< NSIG
)
180 error ("*** [%s] %s%s",
181 target_name
, sys_siglist
[exit_sig
], coredump_string
);
183 error ("*** [%s] Signal %d%s", target_name
, exit_sig
, coredump_string
);
187 static unsigned int dead_children
= 0;
189 /* Notice that a child died.
190 reap_children should be called when convenient. */
198 printf ("Got a SIGCHLD; %d unreaped children.\n", dead_children
);
201 extern int shell_function_pid
, shell_function_completed
;
203 /* Reap dead children, storing the returned status and the new command
204 state (`cs_finished') in the `file' member of the `struct child' for the
205 dead child, and removing the child from the chain. If BLOCK nonzero,
206 reap at least one child, waiting for it to die if necessary. If ERR is
207 nonzero, print an error message first. */
210 reap_children (block
, err
)
215 while ((children
!= 0 || shell_function_pid
!= 0) &&
216 (block
|| dead_children
> 0))
220 int exit_code
, exit_sig
, coredump
;
221 register struct child
*lastc
, *c
;
223 int any_remote
, any_local
;
225 if (err
&& dead_children
== 0)
227 /* We might block for a while, so let the user know why. */
229 error ("*** Waiting for unfinished jobs....");
232 /* We have one less dead child to reap.
233 The test and decrement are not atomic; if it is compiled into:
234 register = dead_children - 1;
235 dead_children = register;
236 a SIGCHLD could come between the two instructions.
237 child_handler increments dead_children.
238 The second instruction here would lose that increment. But the
239 only effect of dead_children being wrong is that we might wait
240 longer than necessary to reap a child, and lose some parallelism;
241 and we might print the "Waiting for unfinished jobs" message above
242 when not necessary. */
244 if (dead_children
!= 0)
248 any_local
= shell_function_pid
!= -1;
249 for (c
= children
; c
!= 0; c
= c
->next
)
251 any_remote
|= c
->remote
;
252 any_local
|= ! c
->remote
;
254 printf ("Live child 0x%08lx PID %d%s\n",
255 (unsigned long int) c
,
256 c
->pid
, c
->remote
? " (remote)" : "");
259 /* First, check for remote children. */
261 pid
= remote_status (&exit_code
, &exit_sig
, &coredump
, 0);
271 pfatal_with_name ("remote_status");
276 /* No remote children. Check for local children. */
282 pid
= WAIT_NOHANG (&status
);
285 pid
= wait (&status
);
296 pfatal_with_name ("wait");
300 /* No local children. */
301 if (block
&& any_remote
)
303 /* Now try a blocking wait for a remote child. */
304 pid
= remote_status (&exit_code
, &exit_sig
, &coredump
, 1);
306 goto remote_status_lose
;
308 /* No remote children either. Finally give up. */
311 /* We got a remote child. */
319 /* Chop the status word up. */
320 exit_code
= WEXITSTATUS (status
);
321 exit_sig
= WIFSIGNALED (status
) ? WTERMSIG (status
) : 0;
322 coredump
= WCOREDUMP (status
);
325 /* Life is very different on MSDOS. */
328 exit_code
= dos_status
;
331 #endif /* Not MSDOS. */
334 /* We got a remote child. */
337 /* Check if this is the child of the `shell' function. */
338 if (!remote
&& pid
== shell_function_pid
)
340 /* It is. Leave an indicator for the `shell' function. */
341 if (exit_sig
== 0 && exit_code
== 127)
342 shell_function_completed
= -1;
344 shell_function_completed
= 1;
348 child_failed
= exit_sig
!= 0 || exit_code
!= 0;
350 /* Search for a child matching the deceased one. */
352 for (c
= children
; c
!= 0; lastc
= c
, c
= c
->next
)
353 if (c
->remote
== remote
&& c
->pid
== pid
)
358 /* An unknown child died. */
360 sprintf (buf
, "Unknown%s job %d", remote
? " remote" : "", pid
);
362 child_error (buf
, exit_code
, exit_sig
, coredump
,
365 error ("%s finished.", buf
);
370 printf ("Reaping %s child 0x%08lx PID %d%s\n",
371 child_failed
? "losing" : "winning",
372 (unsigned long int) c
,
373 c
->pid
, c
->remote
? " (remote)" : "");
375 /* If this child had the good stdin, say it is now free. */
379 if (child_failed
&& !c
->noerror
&& !ignore_errors_flag
)
381 /* The commands failed. Write an error message,
382 delete non-precious targets, and abort. */
383 static int delete_on_error
= -1;
384 child_error (c
->file
->name
, exit_code
, exit_sig
, coredump
, 0);
385 c
->file
->update_status
= 1;
386 if (delete_on_error
== -1)
388 struct file
*f
= lookup_file (".DELETE_ON_ERROR");
389 delete_on_error
= f
!= 0 && f
->is_target
;
391 if (exit_sig
!= 0 || delete_on_error
)
392 delete_child_targets (c
);
398 /* The commands failed, but we don't care. */
399 child_error (c
->file
->name
,
400 exit_code
, exit_sig
, coredump
, 1);
404 /* If there are more commands to run, try to start them. */
405 if (job_next_command (c
))
407 if (handling_fatal_signal
)
409 /* Never start new commands while we are dying.
410 Since there are more commands that wanted to be run,
411 the target was not completely remade. So we treat
412 this as if a command had failed. */
413 c
->file
->update_status
= 1;
417 /* Check again whether to start remotely.
418 Whether or not we want to changes over time.
419 Also, start_remote_job may need state set up
420 by start_remote_job_p. */
421 c
->remote
= start_remote_job_p ();
422 start_job_command (c
);
423 if (c
->file
->command_state
== cs_running
)
424 /* We successfully started the new command.
425 Loop to reap more children. */
429 if (c
->file
->update_status
!= 0)
430 /* We failed to start the commands. */
431 delete_child_targets (c
);
434 /* There are no more commands. We got through them all
435 without an unignored error. Now the target has been
436 successfully updated. */
437 c
->file
->update_status
= 0;
440 /* When we get here, all the commands for C->file are finished
441 (or aborted) and C->file->update_status contains 0 or 1. But
442 C->file->command_state is still cs_running if all the commands
443 ran; notice_finish_file looks for cs_running to tell it that
444 it's interesting to check the file's modtime again now. */
446 if (! handling_fatal_signal
)
447 /* Notice if the target of the commands has been changed.
448 This also propagates its values for command_state and
449 update_status to its also_make files. */
450 notice_finished_file (c
->file
);
453 printf ("Removing child 0x%08lx PID %d%s from chain.\n",
454 (unsigned long int) c
,
455 c
->pid
, c
->remote
? " (remote)" : "");
457 /* Remove the child from the chain and free it. */
461 lastc
->next
= c
->next
;
462 if (! handling_fatal_signal
) /* Avoid nonreentrancy. */
465 /* There is now another slot open. */
468 /* If the job failed, and the -k flag was not given, die,
469 unless we are already in the process of dying. */
470 if (!err
&& child_failed
&& !keep_going_flag
)
474 /* Only block for one child. */
479 /* Free the storage allocated for CHILD. */
483 register struct child
*child
;
485 if (child
->command_lines
!= 0)
487 register unsigned int i
;
488 for (i
= 0; i
< child
->file
->cmds
->ncommand_lines
; ++i
)
489 free (child
->command_lines
[i
]);
490 free ((char *) child
->command_lines
);
493 if (child
->environment
!= 0)
495 register char **ep
= child
->environment
;
498 free ((char *) child
->environment
);
501 free ((char *) child
);
512 extern sigset_t fatal_signal_set
;
518 sigemptyset (&empty
);
519 sigprocmask (SIG_SETMASK
, &empty
, (sigset_t
*) 0);
524 /* Start a job to run the commands specified in CHILD.
525 CHILD is updated to reflect the commands and ID of the child process. */
528 start_job_command (child
)
529 register struct child
*child
;
531 static int bad_stdin
= -1;
536 /* Combine the flags parsed for the line itself with
537 the flags specified globally for this target. */
538 flags
= (child
->file
->command_flags
539 | child
->file
->cmds
->lines_flags
[child
->command_line
- 1]);
541 p
= child
->command_ptr
;
542 child
->noerror
= flags
& COMMANDS_NOERROR
;
546 flags
|= COMMANDS_SILENT
;
548 flags
|= COMMANDS_RECURSE
;
551 else if (!isblank (*p
) && *p
!= '+')
556 /* If -q was given, just say that updating `failed'. The exit status of
557 1 tells the user that -q is saying `something to do'; the exit status
558 for a random error is 2. */
559 if (question_flag
&& !(flags
& COMMANDS_RECURSE
))
561 child
->file
->update_status
= 1;
562 notice_finished_file (child
->file
);
566 /* There may be some preceding whitespace left if there
567 was nothing but a backslash on the first line. */
570 /* Figure out an argument list from this command line. */
574 argv
= construct_command_argv (p
, &end
, child
->file
);
576 child
->command_ptr
= NULL
;
580 child
->command_ptr
= end
;
584 if (touch_flag
&& !(flags
& COMMANDS_RECURSE
))
586 /* Go on to the next command. It might be the recursive one.
587 We construct ARGV only to find the end of the command line. */
589 free ((char *) argv
);
596 /* This line has no commands. Go to the next. */
597 if (job_next_command (child
))
598 start_job_command (child
);
601 /* No more commands. All done. */
602 child
->file
->update_status
= 0;
603 notice_finished_file (child
->file
);
608 /* Print out the command. */
610 if (just_print_flag
|| (!(flags
& COMMANDS_SILENT
) && !silent_flag
))
613 /* Tell update_goal_chain that a command has been started on behalf of
614 this target. It is important that this happens here and not in
615 reap_children (where we used to do it), because reap_children might be
616 reaping children from a different target. We want this increment to
617 guaranteedly indicate that a command was started for the dependency
618 chain (i.e., update_file recursion chain) we are processing. */
622 /* If -n was given, recurse to get the next line in the sequence. */
624 if (just_print_flag
&& !(flags
& COMMANDS_RECURSE
))
627 free ((char *) argv
);
631 /* Flush the output streams so they won't have things written twice. */
636 /* Set up a bad standard input that reads from a broken pipe. */
640 /* Make a file descriptor that is the read end of a broken pipe.
641 This will be used for some children's standard inputs. */
645 /* Close the write side. */
646 (void) close (pd
[1]);
647 /* Save the read side. */
652 /* Decide whether to give this child the `good' standard input
653 (one that points to the terminal or whatever), or the `bad' one
654 that points to the read side of a broken pipe. */
656 child
->good_stdin
= !good_stdin_used
;
657 if (child
->good_stdin
)
662 /* Set up the environment for the child. */
663 if (child
->environment
== 0)
664 child
->environment
= target_environment (child
->file
);
668 /* start_waiting_job has set CHILD->remote if we can start a remote job. */
671 int is_remote
, id
, used_stdin
;
672 if (start_remote_job (argv
, child
->environment
,
673 child
->good_stdin
? 0 : bad_stdin
,
674 &is_remote
, &id
, &used_stdin
))
678 if (child
->good_stdin
&& !used_stdin
)
680 child
->good_stdin
= 0;
683 child
->remote
= is_remote
;
689 /* Fork the child process. */
691 char **parent_environ
;
694 (void) sigprocmask (SIG_BLOCK
, &fatal_signal_set
, (sigset_t
*) 0);
696 #ifdef HAVE_SIGSETMASK
697 (void) sigblock (fatal_signal_mask
);
702 parent_environ
= environ
;
703 child
->pid
= vfork ();
704 environ
= parent_environ
; /* Restore value child may have clobbered. */
707 /* We are the child side. */
709 child_execute_job (child
->good_stdin
? 0 : bad_stdin
, 1,
710 argv
, child
->environment
);
712 else if (child
->pid
< 0)
716 perror_with_name ("vfork", "");
722 dos_status
= spawnvpe (P_WAIT
, argv
[0], argv
, child
->environment
);
724 child
->pid
= dos_pid
++;
728 remove (dos_bname
); /* Ignore errors. */
729 if (access (dos_bename
, 0))
735 #endif /* Not MSDOS. */
737 /* We are the parent side. Set the state to
738 say the commands are running and return. */
740 set_command_state (child
->file
, cs_running
);
742 /* Free the storage used by the child's argument list. */
745 free ((char *) argv
);
750 child
->file
->update_status
= 2;
751 notice_finished_file (child
->file
);
754 /* Try to start a child running.
755 Returns nonzero if the child was started (and maybe finished), or zero if
756 the load was too high and the child was put on the `waiting_jobs' chain. */
759 start_waiting_job (c
)
762 /* If we can start a job remotely, we always want to, and don't care about
763 the local load average. We record that the job should be started
764 remotely in C->remote for start_job_command to test. */
766 c
->remote
= start_remote_job_p ();
768 /* If this job is to be started locally, and we are already running
769 some jobs, make this one wait if the load average is too high. */
770 if (!c
->remote
&& job_slots_used
> 0 && load_too_high ())
772 /* Put this child on the chain of children waiting
773 for the load average to go down. */
774 set_command_state (c
->file
, cs_running
);
775 c
->next
= waiting_jobs
;
780 /* Start the first command; reap_children will run later command lines. */
781 start_job_command (c
);
783 switch (c
->file
->command_state
)
788 printf ("Putting child 0x%08lx PID %05d%s on the chain.\n",
789 (unsigned long int) c
,
790 c
->pid
, c
->remote
? " (remote)" : "");
792 /* One more job slot is in use. */
798 /* All the command lines turned out to be empty. */
799 c
->file
->update_status
= 0;
803 notice_finished_file (c
->file
);
808 assert (c
->file
->command_state
== cs_finished
);
815 /* Create a `struct child' for FILE and start its commands running. */
819 register struct file
*file
;
821 register struct commands
*cmds
= file
->cmds
;
822 register struct child
*c
;
824 register unsigned int i
;
826 /* Let any previously decided-upon jobs that are waiting
827 for the load to go down start before this new one. */
828 start_waiting_jobs ();
830 /* Reap any children that might have finished recently. */
831 reap_children (0, 0);
833 /* Chop the commands up into lines if they aren't already. */
834 chop_commands (cmds
);
837 /* Wait for a job slot to be freed up. */
838 while (job_slots_used
== job_slots
)
839 reap_children (1, 0);
841 /* Expand the command lines and store the results in LINES. */
842 lines
= (char **) xmalloc (cmds
->ncommand_lines
* sizeof (char *));
843 for (i
= 0; i
< cmds
->ncommand_lines
; ++i
)
845 /* Collapse backslash-newline combinations that are inside variable
846 or function references. These are left alone by the parser so
847 that they will appear in the echoing of commands (where they look
848 nice); and collapsed by construct_command_argv when it tokenizes.
849 But letting them survive inside function invocations loses because
850 we don't want the functions to see them as part of the text. */
852 char *in
, *out
, *ref
;
854 /* IN points to where in the line we are scanning.
855 OUT points to where in the line we are writing.
856 When we collapse a backslash-newline combination,
857 IN gets ahead out OUT. */
859 in
= out
= cmds
->command_lines
[i
];
860 while ((ref
= index (in
, '$')) != 0)
862 ++ref
; /* Move past the $. */
865 /* Copy the text between the end of the last chunk
866 we processed (where IN points) and the new chunk
867 we are about to process (where REF points). */
868 bcopy (in
, out
, ref
- in
);
870 /* Move both pointers past the boring stuff. */
874 if (*ref
== '(' || *ref
== '{')
876 char openparen
= *ref
;
877 char closeparen
= openparen
== '(' ? ')' : '}';
881 *out
++ = *in
++; /* Copy OPENPAREN. */
882 /* IN now points past the opening paren or brace.
883 Count parens or braces until it is matched. */
887 if (*in
== closeparen
&& --count
< 0)
889 else if (*in
== '\\' && in
[1] == '\n')
891 /* We have found a backslash-newline inside a
892 variable or function reference. Eat it and
893 any following whitespace. */
896 for (p
= in
- 1; p
> ref
&& *p
== '\\'; --p
)
900 /* There were two or more backslashes, so this is
901 not really a continuation line. We don't collapse
902 the quoting backslashes here as is done in
903 collapse_continuations, because the line will
904 be collapsed again after expansion. */
908 /* Skip the backslash, newline and
909 any following whitespace. */
910 in
= next_token (in
+ 2);
912 /* Discard any preceding whitespace that has
913 already been written to the output. */
914 while (out
> ref
&& isblank (out
[-1]))
917 /* Replace it all with a single space. */
923 if (*in
== openparen
)
932 /* There are no more references in this line to worry about.
933 Copy the remaining uninteresting text to the output. */
937 /* Finally, expand the line. */
938 lines
[i
] = allocated_variable_expand_for_file (cmds
->command_lines
[i
],
942 /* Start the command sequence, record it in a new
943 `struct child', and add that to the chain. */
945 c
= (struct child
*) xmalloc (sizeof (struct child
));
947 c
->command_lines
= lines
;
952 /* Fetch the first command line to be run. */
953 if (! job_next_command (c
))
955 /* There were no commands! */
957 c
->file
->update_status
= 0;
961 /* The job is now primed. Start it running. */
962 start_waiting_job (c
);
965 /* Since there is only one job slot, make things run linearly.
966 Wait for the child to die, setting the state to `cs_finished'. */
967 while (file
->command_state
== cs_running
)
968 reap_children (1, 0);
972 /* Move CHILD's pointers to the next command for it to execute.
973 Returns nonzero if there is another command. */
976 job_next_command (child
)
979 if (child
->command_ptr
== 0 || *child
->command_ptr
== '\0')
981 /* There are no more lines in the expansion of this line. */
982 if (child
->command_line
== child
->file
->cmds
->ncommand_lines
)
984 /* There are no more lines to be expanded. */
985 child
->command_ptr
= 0;
989 /* Get the next line to run. */
990 child
->command_ptr
= child
->command_lines
[child
->command_line
++];
1001 extern int getloadavg ();
1004 if (max_load_average
< 0)
1008 if (getloadavg (&load
, 1) != 1)
1010 static int lossage
= -1;
1011 /* Complain only once for the same error. */
1012 if (lossage
== -1 || errno
!= lossage
)
1015 /* An errno value of zero means getloadavg is just unsupported. */
1016 error ("cannot enforce load limits on this operating system");
1018 perror_with_name ("cannot enforce load limit: ", "getloadavg");
1025 return load
>= max_load_average
;
1029 /* Start jobs that are waiting for the load to be lower. */
1032 start_waiting_jobs ()
1036 if (waiting_jobs
== 0)
1041 /* Check for recently deceased descendants. */
1042 reap_children (0, 0);
1044 /* Take a job off the waiting list. */
1046 waiting_jobs
= job
->next
;
1048 /* Try to start that job. We break out of the loop as soon
1049 as start_waiting_job puts one back on the waiting list. */
1050 } while (start_waiting_job (job
) && waiting_jobs
!= 0);
1053 /* Replace the current process with one executing the command in ARGV.
1054 STDIN_FD and STDOUT_FD are used as the process's stdin and stdout; ENVP is
1055 the environment of the new program. This function does not return. */
1058 child_execute_job (stdin_fd
, stdout_fd
, argv
, envp
)
1059 int stdin_fd
, stdout_fd
;
1060 char **argv
, **envp
;
1063 (void) dup2 (stdin_fd
, 0);
1065 (void) dup2 (stdout_fd
, 1);
1067 /* Free up file descriptors. */
1070 int max
= getdtablesize ();
1071 for (d
= 3; d
< max
; ++d
)
1075 /* Run the command. */
1076 exec_command (argv
, envp
);
1081 /* Default path to search for executables. */
1082 static char default_path
[] = ":/bin:/usr/bin";
1084 /* Search PATH for FILE.
1085 If successful, store the full pathname in PROGRAM and return 1.
1086 If not sucessful, return zero. */
1089 search_path (file
, path
, program
)
1090 char *file
, *path
, *program
;
1092 if (path
== 0 || path
[0] == '\0')
1093 path
= default_path
;
1097 strpbrk (file
, "/\\:")
1103 strcpy (program
, file
);
1110 #ifdef HAVE_GETGROUPS
1111 #ifndef HAVE_UNISTD_H
1112 extern int getgroups ();
1114 static int ngroups
= -1;
1116 static GETGROUPS_T groups
[NGROUPS_MAX
];
1117 #define ngroups_max NGROUPS_MAX
1119 static GETGROUPS_T
*groups
= 0;
1120 static int ngroups_max
;
1123 ngroups_max
= GET_NGROUPS_MAX
;
1124 groups
= (GETGROUPS_T
*) malloc (ngroups_max
* sizeof (GETGROUPS_T
));
1127 if (groups
!= 0 && ngroups
== -1)
1128 ngroups
= getgroups (ngroups_max
, groups
);
1129 #endif /* Have getgroups. */
1131 len
= strlen (file
) + 1;
1138 p
= index (path
, PATH_SEPARATOR_CHAR
);
1140 p
= path
+ strlen (path
);
1143 bcopy (file
, program
, len
);
1146 bcopy (path
, program
, p
- path
);
1147 program
[p
- path
] = '/';
1148 bcopy (file
, program
+ (p
- path
) + 1, len
);
1151 if (safe_stat (program
, &st
) == 0
1152 && S_ISREG (st
.st_mode
))
1154 if (st
.st_uid
== geteuid ())
1155 perm
= (st
.st_mode
& 0100);
1156 else if (st
.st_gid
== getegid ())
1157 perm
= (st
.st_mode
& 0010);
1160 #ifdef HAVE_GETGROUPS
1162 for (i
= 0; i
< ngroups
; ++i
)
1163 if (groups
[i
] == st
.st_gid
)
1166 perm
= (st
.st_mode
& 0010);
1168 #endif /* Have getgroups. */
1169 perm
= (st
.st_mode
& 0001);
1177 } while (*path
!= '\0');
1182 #endif /* search_path commented out */
1184 /* Replace the current process with one running the command in ARGV,
1185 with environment ENVP. This function does not return. */
1188 exec_command (argv
, envp
)
1189 char **argv
, **envp
;
1191 /* Be the user, permanently. */
1194 /* Run the program. */
1196 execvp (argv
[0], argv
);
1201 error ("%s: Command not found", argv
[0]);
1205 /* The file is not executable. Try it as a shell script. */
1206 extern char *getenv ();
1211 shell
= getenv ("SHELL");
1213 shell
= default_shell
;
1216 while (argv
[argc
] != 0)
1219 new_argv
= (char **) alloca ((1 + argc
+ 1) * sizeof (char *));
1220 new_argv
[0] = shell
;
1221 new_argv
[1] = program
;
1224 new_argv
[1 + argc
] = argv
[argc
];
1228 execvp (shell
, new_argv
);
1229 if (errno
== ENOENT
)
1230 error ("%s: Shell program not found", shell
);
1232 perror_with_name ("execvp: ", shell
);
1237 perror_with_name ("execvp: ", argv
[0]);
1244 /* Figure out the argument list necessary to run LINE as a command. Try to
1245 avoid using a shell. This routine handles only ' quoting, and " quoting
1246 when no backslash, $ or ` characters are seen in the quotes. Starting
1247 quotes may be escaped with a backslash. If any of the characters in
1248 sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[]
1249 is the first word of a line, the shell is used.
1251 If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
1252 If *RESTP is NULL, newlines will be ignored.
1254 SHELL is the shell to use, or nil to use the default shell.
1255 IFS is the value of $IFS, or nil (meaning the default). */
1258 construct_command_argv_internal (line
, restp
, shell
, ifs
)
1259 char *line
, **restp
;
1263 static char sh_chars
[] = "\"|<>";
1264 static char *sh_cmds
[] = { "break", "call", "cd", "chcp", "chdir", "cls",
1265 "copy", "ctty", "date", "del", "dir", "echo",
1266 "erase", "exit", "for", "goto", "if", "if", "md",
1267 "mkdir", "path", "pause", "prompt", "rem", "ren",
1268 "rename", "set", "shift", "time", "type",
1269 "ver", "verify", "vol", ":", 0 };
1271 static char sh_chars
[] = "#;\"*?[]&|<>(){}$`^";
1272 static char *sh_cmds
[] = { "cd", "eval", "exec", "exit", "login",
1273 "logout", "set", "umask", "wait", "while", "for",
1274 "case", "if", ":", ".", "break", "continue",
1275 "export", "read", "readonly", "shift", "times",
1276 "trap", "switch", 0 };
1282 int instring
, word_has_equals
, seen_nonequals
;
1283 char **new_argv
= 0;
1288 /* Make sure not to bother processing an empty line. */
1289 while (isblank (*line
))
1294 /* See if it is safe to parse commands internally. */
1296 shell
= default_shell
;
1297 else if (strcmp (shell
, default_shell
))
1301 for (ap
= ifs
; *ap
!= '\0'; ++ap
)
1302 if (*ap
!= ' ' && *ap
!= '\t' && *ap
!= '\n')
1305 i
= strlen (line
) + 1;
1307 /* More than 1 arg per character is impossible. */
1308 new_argv
= (char **) xmalloc (i
* sizeof (char *));
1310 /* All the args can fit in a buffer as big as LINE is. */
1311 ap
= new_argv
[0] = (char *) xmalloc (i
);
1314 /* I is how many complete arguments have been found. */
1316 instring
= word_has_equals
= seen_nonequals
= 0;
1317 for (p
= line
; *p
!= '\0'; ++p
)
1325 /* Inside a string, just copy any char except a closing quote
1326 or a backslash-newline combination. */
1329 else if (*p
== '\\' && p
[1] == '\n')
1330 goto swallow_escaped_newline
;
1331 else if (*p
== '\n' && restp
!= NULL
)
1333 /* End of the command line. */
1337 /* Backslash, $, and ` are special inside double quotes.
1338 If we see any of those, punt. */
1339 else if (instring
== '"' && index ("\\$`", *p
) != 0)
1344 else if (index (sh_chars
, *p
) != 0)
1345 /* Not inside a string, but it's a special char. */
1348 /* Not a special char. */
1352 /* Equals is a special character in leading words before the
1353 first word with no equals sign in it. This is not the case
1354 with sh -k, but we never get here when using nonstandard
1356 if (! seen_nonequals
)
1358 word_has_equals
= 1;
1363 /* Backslash-newline combinations are eaten. */
1366 swallow_escaped_newline
:
1368 /* Eat the backslash, the newline, and following whitespace,
1369 replacing it all with a single space. */
1372 /* If there is a tab after a backslash-newline,
1373 remove it from the source line which will be echoed,
1374 since it was most likely used to line
1375 up the continued line with the previous one. */
1383 if (ap
!= new_argv
[i
])
1384 /* Treat this as a space, ending the arg.
1385 But if it's at the beginning of the arg, it should
1386 just get eaten, rather than becoming an empty arg. */
1389 p
= next_token (p
) - 1;
1392 else if (p
[1] != '\0')
1393 /* Copy and skip the following char. */
1405 /* End of the command line. */
1410 /* Newlines are not special. */
1417 /* We have the end of an argument.
1418 Terminate the text of the argument. */
1422 /* Update SEEN_NONEQUALS, which tells us if every word
1423 heretofore has contained an `='. */
1424 seen_nonequals
|= ! word_has_equals
;
1425 if (word_has_equals
&& ! seen_nonequals
)
1426 /* An `=' in a word before the first
1427 word without one is magical. */
1429 word_has_equals
= 0; /* Prepare for the next word. */
1431 /* If this argument is the command name,
1432 see if it is a built-in shell command.
1433 If so, have the shell handle it. */
1437 for (j
= 0; sh_cmds
[j
] != 0; ++j
)
1438 if (streq (sh_cmds
[j
], new_argv
[0]))
1442 /* Ignore multiple whitespace chars. */
1444 /* Next iteration should examine the first nonwhite char. */
1456 /* Let the shell deal with an unterminated quote. */
1459 /* Terminate the last argument and the argument list. */
1462 if (new_argv
[i
][0] != '\0')
1469 for (j
= 0; sh_cmds
[j
] != 0; ++j
)
1470 if (streq (sh_cmds
[j
], new_argv
[0]))
1474 if (new_argv
[0] == 0)
1475 /* Line was empty. */
1481 /* We must use the shell. */
1485 /* Free the old argument list we were working on. */
1496 dos_bname
= tempnam (".", "mk");
1497 for (i
= 0; dos_bname
[i
] != '\0'; ++i
)
1498 if (dos_bname
[i
] == '/')
1499 dos_bname
[i
] = '\\';
1500 dos_bename
= (char *) xmalloc (strlen (dos_bname
) + 5);
1501 strcpy (dos_bename
, dos_bname
);
1502 strcat (dos_bname
, ".bat");
1503 strcat (dos_bename
, ".err");
1505 batch
= fopen(bename
, "w"); /* Create a file. */
1508 batch
= fopen (dos_bname
, "w");
1509 fputs ("@echo off\n", batch
);
1510 fputs (line
, batch
);
1511 fprintf (batch
, "\nif errorlevel 1 del %s\n", dos_bename
);
1513 new_argv
= (char **) xmalloc(2 * sizeof(char *));
1514 new_argv
[0] = strdup (bname
);
1517 #else /* Not MSDOS. */
1519 /* SHELL may be a multi-word command. Construct a command line
1520 "SHELL -c LINE", with all special chars in LINE escaped.
1521 Then recurse, expanding this command line to get the final
1524 unsigned int shell_len
= strlen (shell
);
1525 static char minus_c
[] = " -c ";
1526 unsigned int line_len
= strlen (line
);
1528 char *new_line
= (char *) alloca (shell_len
+ (sizeof (minus_c
) - 1)
1529 + (line_len
* 2) + 1);
1532 bcopy (shell
, ap
, shell_len
);
1534 bcopy (minus_c
, ap
, sizeof (minus_c
) - 1);
1535 ap
+= sizeof (minus_c
) - 1;
1536 for (p
= line
; *p
!= '\0'; ++p
)
1538 if (restp
!= NULL
&& *p
== '\n')
1543 else if (*p
== '\\' && p
[1] == '\n')
1545 /* Eat the backslash, the newline, and following whitespace,
1546 replacing it all with a single space (which is escaped
1550 /* If there is a tab after a backslash-newline,
1551 remove it from the source line which will be echoed,
1552 since it was most likely used to line
1553 up the continued line with the previous one. */
1564 if (*p
== '\\' || *p
== '\'' || *p
== '"'
1566 || index (sh_chars
, *p
) != 0)
1572 new_argv
= construct_command_argv_internal (new_line
, (char **) NULL
,
1573 (char *) 0, (char *) 0);
1580 /* Figure out the argument list necessary to run LINE as a command. Try to
1581 avoid using a shell. This routine handles only ' quoting, and " quoting
1582 when no backslash, $ or ` characters are seen in the quotes. Starting
1583 quotes may be escaped with a backslash. If any of the characters in
1584 sh_chars[] is seen, or any of the builtin commands listed in sh_cmds[]
1585 is the first word of a line, the shell is used.
1587 If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
1588 If *RESTP is NULL, newlines will be ignored.
1590 FILE is the target whose commands these are. It is used for
1591 variable expansion for $(SHELL) and $(IFS). */
1594 construct_command_argv (line
, restp
, file
)
1595 char *line
, **restp
;
1602 /* Turn off --warn-undefined-variables while we expand SHELL and IFS. */
1603 int save
= warn_undefined_variables_flag
;
1604 warn_undefined_variables_flag
= 0;
1606 shell
= allocated_variable_expand_for_file ("$(SHELL)", file
);
1607 ifs
= allocated_variable_expand_for_file ("$(IFS)", file
);
1609 warn_undefined_variables_flag
= save
;
1612 argv
= construct_command_argv_internal (line
, restp
, shell
, ifs
);