1 /* Definitions for managing subprocesses in GNU Make. 2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 3 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software 4 Foundation, Inc. 5 This file is part of GNU Make. 6 7 GNU Make is free software; you can redistribute it and/or modify it under the 8 terms of the GNU General Public License as published by the Free Software 9 Foundation; either version 3 of the License, or (at your option) any later 10 version. 11 12 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY 13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 14 A PARTICULAR PURPOSE. See the GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License along with 17 this program. If not, see <http://www.gnu.org/licenses/>. */ 18 19 #ifndef SEEN_JOB_H 20 #define SEEN_JOB_H 21 22 #ifdef HAVE_FCNTL_H 23 # include <fcntl.h> 24 #else 25 # include <sys/file.h> 26 #endif 27 28 /* How to set close-on-exec for a file descriptor. */ 29 30 #if !defined F_SETFD 31 # define CLOSE_ON_EXEC(_d) 32 #else 33 # ifndef FD_CLOEXEC 34 # define FD_CLOEXEC 1 35 # endif 36 # define CLOSE_ON_EXEC(_d) (void) fcntl ((_d), F_SETFD, FD_CLOEXEC) 37 #endif 38 39 /* Structure describing a running or dead child process. */ 40 41 struct child 42 { 43 struct child *next; /* Link in the chain. */ 44 45 struct file *file; /* File being remade. */ 46 47 char **environment; /* Environment for commands. */ 48 49 char **command_lines; /* Array of variable-expanded cmd lines. */ 50 unsigned int command_line; /* Index into above. */ 51 char *command_ptr; /* Ptr into command_lines[command_line]. */ 52 53 pid_t pid; /* Child process's ID number. */ 54 #ifdef VMS 55 int efn; /* Completion event flag number */ 56 int cstatus; /* Completion status */ 57 char *comname; /* Temporary command file name */ 58 #endif 59 char *sh_batch_file; /* Script file for shell commands */ 60 #ifdef CONFIG_WITH_KMK_BUILTIN 61 int status; /* Status of the job. */ 62 unsigned int has_status:1; /* Nonzero if status is available. */ 63 #endif 64 unsigned int remote:1; /* Nonzero if executing remotely. */ 65 66 unsigned int noerror:1; /* Nonzero if commands contained a `-'. */ 67 68 unsigned int good_stdin:1; /* Nonzero if this child has a good stdin. */ 69 unsigned int deleted:1; /* Nonzero if targets have been deleted. */ 70 unsigned int dontcare:1; /* Saved dontcare flag. */ 71 #ifdef CONFIG_WITH_PRINT_TIME_SWITCH 72 big_int start_ts; /* nano_timestamp of the first command. */ 73 #endif 74 }; 75 76 extern struct child *children; 77 78 int is_bourne_compatible_shell(const char *path); 79 void new_job (struct file *file); 80 void reap_children (int block, int err); 81 void start_waiting_jobs (void); 82 83 char **construct_command_argv (char *line, char **restp, struct file *file, 84 int cmd_flags, char** batch_file); 85 #ifdef VMS 86 int child_execute_job (char *argv, struct child *child); 87 #elif defined(__EMX__) 88 int child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp); 89 #else 90 void child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp); 91 #endif 92 #ifdef _AMIGA 93 void exec_command (char **argv); 94 #elif defined(__EMX__) 95 int exec_command (char **argv, char **envp); 96 #else 97 void exec_command (char **argv, char **envp); 98 #endif 99 100 extern unsigned int job_slots_used; 101 102 void block_sigs (void); 103 #ifdef POSIX 104 void unblock_sigs (void); 105 #else 106 #ifdef HAVE_SIGSETMASK 107 extern int fatal_signal_mask; 108 #define unblock_sigs() sigsetmask (0) 109 #else 110 #define unblock_sigs() 111 #endif 112 #endif 113 114 extern unsigned int jobserver_tokens; 115 116 #endif /* SEEN_JOB_H */ 117