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