1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* spawn-unix.inc */ |
4 | /* */ |
5 | /* Execute other external programs (Unix version) */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 1999-2002 Ullrich von Bassewitz */ |
10 | /* Wacholderweg 14 */ |
11 | /* D-70597 Stuttgart */ |
12 | /* EMail: uz@musoftware.de */ |
13 | /* */ |
14 | /* */ |
15 | /* This software is provided 'as-is', without any expressed or implied */ |
16 | /* warranty. In no event will the authors be held liable for any damages */ |
17 | /* arising from the use of this software. */ |
18 | /* */ |
19 | /* Permission is granted to anyone to use this software for any purpose, */ |
20 | /* including commercial applications, and to alter it and redistribute it */ |
21 | /* freely, subject to the following restrictions: */ |
22 | /* */ |
23 | /* 1. The origin of this software must not be misrepresented; you must not */ |
24 | /* claim that you wrote the original software. If you use this software */ |
25 | /* in a product, an acknowledgment in the product documentation would be */ |
26 | /* appreciated but is not required. */ |
27 | /* 2. Altered source versions must be plainly marked as such, and must not */ |
28 | /* be misrepresented as being the original software. */ |
29 | /* 3. This notice may not be removed or altered from any source */ |
30 | /* distribution. */ |
31 | /* */ |
32 | /*****************************************************************************/ |
33 | |
34 | |
35 | |
36 | #include <unistd.h> |
37 | #include <string.h> |
38 | #include <errno.h> |
39 | #include <sys/types.h> |
40 | #include <sys/wait.h> |
41 | |
42 | |
43 | |
44 | /*****************************************************************************/ |
45 | /* Data */ |
46 | /*****************************************************************************/ |
47 | |
48 | |
49 | |
50 | /* Mode argument for spawn. This value is ignored by the function and only |
51 | ** provided for DOS/Windows compatibility. |
52 | */ |
53 | #ifndef P_WAIT |
54 | #define P_WAIT 0 |
55 | #endif |
56 | |
57 | |
58 | |
59 | /*****************************************************************************/ |
60 | /* Code */ |
61 | /*****************************************************************************/ |
62 | |
63 | |
64 | |
65 | int spawnvp (int Mode attribute ((unused)), const char* File, char* const argv []) |
66 | /* Execute the given program searching and wait until it terminates. The Mode |
67 | ** argument is ignored (compatibility only). The result of the function is |
68 | ** the return code of the program. The function will terminate the program |
69 | ** on errors. |
70 | */ |
71 | { |
72 | int Status = 0; |
73 | |
74 | /* Fork */ |
75 | int pid = fork (); |
76 | if (pid < 0) { |
77 | |
78 | /* Error forking */ |
79 | Error ("Cannot fork: %s" , strerror (errno)); |
80 | |
81 | } else if (pid == 0) { |
82 | |
83 | /* The son - exec the program */ |
84 | if (execvp (File, argv) < 0) { |
85 | Error ("Cannot exec '%s': %s" , File, strerror (errno)); |
86 | } |
87 | |
88 | } else { |
89 | |
90 | /* The father: Wait for the subprocess to terminate */ |
91 | if (waitpid (pid, &Status, 0) < 0) { |
92 | Error ("Failure waiting for subprocess: %s" , strerror (errno)); |
93 | } |
94 | |
95 | /* Examine the child status */ |
96 | if (!WIFEXITED (Status)) { |
97 | Error ("Subprocess '%s' aborted by signal %d" , File, WTERMSIG (Status)); |
98 | } |
99 | } |
100 | |
101 | /* Only the father goes here, we place a return here regardless of that |
102 | ** to avoid compiler warnings. |
103 | */ |
104 | return WEXITSTATUS (Status); |
105 | } |
106 | |