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