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