Rev 3298 | Rev 3340 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3298 | Rev 3304 | ||
---|---|---|---|
Line 38... | Line 38... | ||
38 | #include <stdlib.h> |
38 | #include <stdlib.h> |
39 | #include <unistd.h> |
39 | #include <unistd.h> |
40 | #include <string.h> |
40 | #include <string.h> |
41 | #include <fcntl.h> |
41 | #include <fcntl.h> |
42 | 42 | ||
43 | #ifndef HELENOS |
- | |
44 | #include <linux/limits.h> |
- | |
45 | #include <sys/errno.h> |
- | |
46 | #include <sys/wait.h> |
- | |
47 | #endif |
- | |
48 | - | ||
49 | #include "config.h" |
43 | #include "config.h" |
50 | #include "util.h" |
44 | #include "util.h" |
51 | #include "exec.h" |
45 | #include "exec.h" |
52 | #include "errors.h" |
46 | #include "errors.h" |
53 | 47 | ||
Line 79... | Line 73... | ||
79 | size_t x = strlen(cmd) + 2; |
73 | size_t x = strlen(cmd) + 2; |
80 | 74 | ||
81 | found = (char *)malloc(PATH_MAX); |
75 | found = (char *)malloc(PATH_MAX); |
82 | 76 | ||
83 | /* The user has specified a full or relative path, just give it back. */ |
77 | /* The user has specified a full or relative path, just give it back. */ |
84 | #ifdef HELENOS |
- | |
85 | if (-1 != try_access(cmd)) |
78 | if (-1 != try_access(cmd)) { |
86 | #else |
- | |
87 | if (-1 != access(cmd, F_OK)) |
- | |
88 | #endif |
- | |
89 | { |
- | |
90 | return (char *) cmd; |
79 | return (char *) cmd; |
91 | } |
80 | } |
92 | - | ||
93 | #ifdef HELENOS |
- | |
94 | path_orig = PATH; |
81 | path_orig = PATH; |
95 | #else |
- | |
96 | path_orig = getenv("PATH"); |
- | |
97 | if (NULL == path_orig) |
- | |
98 | path_orig = PATH; |
- | |
99 | #endif |
- | |
100 | - | ||
101 | path_tok = cli_strdup(path_orig); |
82 | path_tok = cli_strdup(path_orig); |
102 | 83 | ||
103 | /* Extract the PATH env to a path[] array */ |
84 | /* Extract the PATH env to a path[] array */ |
104 | path[n] = cli_strtok(path_tok, PATH_DELIM); |
85 | path[n] = cli_strtok(path_tok, PATH_DELIM); |
105 | while (NULL != path[n]) { |
86 | while (NULL != path[n]) { |
Line 114... | Line 95... | ||
114 | 95 | ||
115 | /* We now have n places to look for the command */ |
96 | /* We now have n places to look for the command */ |
116 | for (i=0; path[i]; i++) { |
97 | for (i=0; path[i]; i++) { |
117 | memset(found, 0, sizeof(found)); |
98 | memset(found, 0, sizeof(found)); |
118 | snprintf(found, PATH_MAX, "%s/%s", path[i], cmd); |
99 | snprintf(found, PATH_MAX, "%s/%s", path[i], cmd); |
119 | #ifdef HELENOS |
- | |
120 | if (-1 != try_access(found)) |
100 | if (-1 != try_access(found)) { |
121 | #else |
- | |
122 | if (-1 != access(found, F_OK)) |
- | |
123 | #endif |
- | |
124 | { |
- | |
125 | free(path_tok); |
101 | free(path_tok); |
126 | return (char *) found; |
102 | return (char *) found; |
127 | } |
103 | } |
128 | } |
104 | } |
129 | 105 | ||
Line 131... | Line 107... | ||
131 | * set in the parent shell */ |
107 | * set in the parent shell */ |
132 | free(path_tok); |
108 | free(path_tok); |
133 | return (char *) cmd; |
109 | return (char *) cmd; |
134 | } |
110 | } |
135 | 111 | ||
136 | #ifdef HELENOS |
- | |
137 | task_id_t try_exec(char *cmd, char **argv) |
112 | task_id_t try_exec(char *cmd, char **argv) |
138 | { |
113 | { |
139 | task_id_t tid; |
114 | task_id_t tid; |
140 | char *tmp; |
115 | char *tmp; |
141 | 116 | ||
Line 153... | Line 128... | ||
153 | * a task ID of 0 as a generic failure. */ |
128 | * a task ID of 0 as a generic failure. */ |
154 | cli_error(CL_EEXEC, "Can not spawn %s", cmd); |
129 | cli_error(CL_EEXEC, "Can not spawn %s", cmd); |
155 | 130 | ||
156 | return tid; |
131 | return tid; |
157 | } |
132 | } |
158 | - | ||
159 | #else |
- | |
160 | int try_exec(char *cmd, char **argv) |
- | |
161 | { |
- | |
162 | char *tmp; |
- | |
163 | pid_t pid; |
- | |
164 | int status; |
- | |
165 | - | ||
166 | /* Copy the result of allocated 'found' */ |
- | |
167 | tmp = cli_strdup(find_command(cmd)); |
- | |
168 | /* free the pointer, no longer needed */ |
- | |
169 | free(found); |
- | |
170 | - | ||
171 | if (-1 == (access(tmp, F_OK))) { |
- | |
172 | cli_error(CL_EFAIL, |
- | |
173 | "%s : No such external, modular or builtin command", tmp); |
- | |
174 | free(tmp); |
- | |
175 | return CL_EFAIL; |
- | |
176 | } |
- | |
177 | - | ||
178 | /* Create a child to run the program */ |
- | |
179 | pid = fork(); |
- | |
180 | if (pid == 0) { |
- | |
181 | execv(tmp, argv); |
- | |
182 | exit(errno); |
- | |
183 | } else if (pid > 0) { |
- | |
184 | /* Block until we get a PID (and result) */ |
- | |
185 | wait(&status); |
- | |
186 | status = status / 256; |
- | |
187 | } else { |
- | |
188 | /* Could not fork, ulimit or out of memory */ |
- | |
189 | cli_error(CL_ENOMEM, "Could not fork"); |
- | |
190 | free(tmp); |
- | |
191 | return CL_ENOMEM; |
- | |
192 | } |
- | |
193 | - | ||
194 | free(tmp); |
- | |
195 | - | ||
196 | /* Decode any errors from execv() (these explain themselves) */ |
- | |
197 | switch (status) { |
- | |
198 | case ENOTDIR: |
- | |
199 | cli_error(CL_EFAIL, "%s : No such file or directory", tmp); |
- | |
200 | status = CL_EFAIL; |
- | |
201 | break; |
- | |
202 | case EISDIR: |
- | |
203 | cli_error(CL_EFAIL, "%s : Command is a directory", tmp); |
- | |
204 | status = CL_EFAIL; |
- | |
205 | break; |
- | |
206 | case EACCES: |
- | |
207 | cli_error(CL_EPERM, "%s :", tmp); |
- | |
208 | status = CL_EFAIL; |
- | |
209 | break; |
- | |
210 | case ENOMEM: |
- | |
211 | cli_error(CL_ENOMEM, "%s :", tmp); |
- | |
212 | status = CL_EFAIL; |
- | |
213 | break; |
- | |
214 | case ENAMETOOLONG: |
- | |
215 | cli_error(CL_EFAIL, "Argument list too long"); |
- | |
216 | status = CL_EFAIL; |
- | |
217 | break; |
- | |
218 | case EFAULT: |
- | |
219 | cli_error(CL_EFAIL, "Invalid argument pointer\n(please report " |
- | |
220 | "this to %s)", PACKAGE_BUGREPORT); |
- | |
221 | status = CL_EFAIL; |
- | |
222 | break; |
- | |
223 | } |
- | |
224 | - | ||
225 | return status; |
- | |
226 | } |
- | |
227 | - | ||
228 | #endif /* HELENOS */ |
- |