aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2017-06-27 16:31:36 +0200
committerRon Yorston <rmy@pobox.com>2017-08-23 12:29:25 +0100
commit230944a8f7b03d2b27dd65e2649f2067c31c65ed (patch)
treed31b2df254b831994b2a2edf70141982f03a4446
parentd4dc5e4177056ae284c256278a853f51e347f13f (diff)
downloadbusybox-w32-230944a8f7b03d2b27dd65e2649f2067c31c65ed.tar.gz
busybox-w32-230944a8f7b03d2b27dd65e2649f2067c31c65ed.tar.bz2
busybox-w32-230944a8f7b03d2b27dd65e2649f2067c31c65ed.zip
win32/mingw: fix signatures of the *execv*() family of functions
The function signatures were inherited from Git's source code, but are inconsistent with the declarations in the POSIX standard. This requires quite a few changes in quite a few callers, unfortunately. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Ron Yorston <rmy@pobox.com>
-rw-r--r--coreutils/timeout.c2
-rw-r--r--include/mingw.h8
-rw-r--r--win32/process.c38
-rw-r--r--win32/system.c2
4 files changed, 24 insertions, 26 deletions
diff --git a/coreutils/timeout.c b/coreutils/timeout.c
index 4cdde4366..68188b389 100644
--- a/coreutils/timeout.c
+++ b/coreutils/timeout.c
@@ -140,7 +140,7 @@ int timeout_main(int argc UNUSED_PARAM, char **argv)
140 if (argv[0] == NULL) 140 if (argv[0] == NULL)
141 bb_show_usage(); 141 bb_show_usage();
142 142
143 if ((ret=mingw_spawn_proc(argv)) == -1) 143 if ((ret=mingw_spawn_proc((const char **)argv)) == -1)
144 bb_perror_msg_and_die("can't execute '%s'", argv[0]); 144 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
145 145
146 h = (HANDLE)ret; 146 h = (HANDLE)ret;
diff --git a/include/mingw.h b/include/mingw.h
index 05e0b20fc..65d32391f 100644
--- a/include/mingw.h
+++ b/include/mingw.h
@@ -456,10 +456,10 @@ DIR *mingw_opendir(const char *path);
456#define PRIuMAX "I64u" 456#define PRIuMAX "I64u"
457 457
458pid_t FAST_FUNC mingw_spawn(char **argv); 458pid_t FAST_FUNC mingw_spawn(char **argv);
459intptr_t FAST_FUNC mingw_spawn_proc(char **argv); 459intptr_t FAST_FUNC mingw_spawn_proc(const char **argv);
460int mingw_execv(const char *cmd, const char *const *argv); 460int mingw_execv(const char *cmd, char *const *argv);
461int mingw_execvp(const char *cmd, const char *const *argv); 461int mingw_execvp(const char *cmd, char *const *argv);
462int mingw_execve(const char *cmd, const char *const *argv, const char *const *envp); 462int mingw_execve(const char *cmd, char *const *argv, char *const *envp);
463#define spawn mingw_spawn 463#define spawn mingw_spawn
464#define execvp mingw_execvp 464#define execvp mingw_execvp
465#define execve mingw_execve 465#define execve mingw_execve
diff --git a/win32/process.c b/win32/process.c
index 968ea9afd..5eb52828b 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -208,14 +208,14 @@ quote_arg(const char *arg)
208} 208}
209 209
210static intptr_t 210static intptr_t
211spawnveq(int mode, const char *path, const char *const *argv, const char *const *env) 211spawnveq(int mode, const char *path, char *const *argv, char *const *env)
212{ 212{
213 char **new_argv; 213 char **new_argv;
214 int i, argc = 0; 214 int i, argc = 0;
215 intptr_t ret; 215 intptr_t ret;
216 216
217 if (!argv) { 217 if (!argv) {
218 const char *empty_argv[] = { path, NULL }; 218 char *const empty_argv[] = { (char *)path, NULL };
219 return spawnve(mode, path, empty_argv, env); 219 return spawnve(mode, path, empty_argv, env);
220 } 220 }
221 221
@@ -227,7 +227,7 @@ spawnveq(int mode, const char *path, const char *const *argv, const char *const
227 for (i = 0;i < argc;i++) 227 for (i = 0;i < argc;i++)
228 new_argv[i] = quote_arg(argv[i]); 228 new_argv[i] = quote_arg(argv[i]);
229 new_argv[argc] = NULL; 229 new_argv[argc] = NULL;
230 ret = spawnve(mode, path, (const char *const *)new_argv, env); 230 ret = spawnve(mode, path, new_argv, env);
231 for (i = 0;i < argc;i++) 231 for (i = 0;i < argc;i++)
232 if (new_argv[i] != argv[i]) 232 if (new_argv[i] != argv[i])
233 free(new_argv[i]); 233 free(new_argv[i]);
@@ -238,21 +238,21 @@ spawnveq(int mode, const char *path, const char *const *argv, const char *const
238#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE 238#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE
239static intptr_t 239static intptr_t
240mingw_spawn_applet(int mode, 240mingw_spawn_applet(int mode,
241 const char *const *argv, 241 char *const *argv,
242 const char *const *envp) 242 char *const *envp)
243{ 243{
244 return spawnveq(mode, bb_busybox_exec_path, argv, envp); 244 return spawnveq(mode, bb_busybox_exec_path, argv, envp);
245} 245}
246#endif 246#endif
247 247
248static intptr_t 248static intptr_t
249mingw_spawn_interpreter(int mode, const char *prog, const char *const *argv, const char *const *envp) 249mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, char *const *envp)
250{ 250{
251 intptr_t ret; 251 intptr_t ret;
252 char **opts; 252 char **opts;
253 int nopts; 253 int nopts;
254 const char *interpr = parse_interpreter(prog, &opts, &nopts); 254 const char *interpr = parse_interpreter(prog, &opts, &nopts);
255 const char **new_argv; 255 char **new_argv;
256 int argc = 0; 256 int argc = 0;
257 257
258 if (!interpr) 258 if (!interpr)
@@ -264,11 +264,11 @@ mingw_spawn_interpreter(int mode, const char *prog, const char *const *argv, con
264 new_argv = malloc(sizeof(*argv)*(argc+nopts+2)); 264 new_argv = malloc(sizeof(*argv)*(argc+nopts+2));
265 memcpy(new_argv+1, opts, sizeof(*opts)*nopts); 265 memcpy(new_argv+1, opts, sizeof(*opts)*nopts);
266 memcpy(new_argv+nopts+2, argv+1, sizeof(*argv)*argc); 266 memcpy(new_argv+nopts+2, argv+1, sizeof(*argv)*argc);
267 new_argv[nopts+1] = prog; /* pass absolute path */ 267 new_argv[nopts+1] = (char *)prog; /* pass absolute path */
268 268
269#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE 269#if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE
270 if (find_applet_by_name(interpr) >= 0) { 270 if (find_applet_by_name(interpr) >= 0) {
271 new_argv[0] = interpr; 271 new_argv[0] = (char *)interpr;
272 ret = mingw_spawn_applet(mode, new_argv, envp); 272 ret = mingw_spawn_applet(mode, new_argv, envp);
273 } else 273 } else
274#endif 274#endif
@@ -292,7 +292,7 @@ mingw_spawn_interpreter(int mode, const char *prog, const char *const *argv, con
292} 292}
293 293
294static intptr_t 294static intptr_t
295mingw_spawn_1(int mode, const char *cmd, const char *const *argv, const char *const *envp) 295mingw_spawn_1(int mode, const char *cmd, char *const *argv, char *const *envp)
296{ 296{
297 intptr_t ret; 297 intptr_t ret;
298 298
@@ -331,30 +331,28 @@ mingw_spawn(char **argv)
331{ 331{
332 intptr_t ret; 332 intptr_t ret;
333 333
334 ret = mingw_spawn_1(P_NOWAIT, argv[0], (const char *const *)argv, 334 ret = mingw_spawn_1(P_NOWAIT, argv[0], (char *const *)argv, environ);
335 (const char *const *)environ);
336 335
337 return ret == -1 ? -1 : GetProcessId((HANDLE)ret); 336 return ret == -1 ? -1 : GetProcessId((HANDLE)ret);
338} 337}
339 338
340intptr_t FAST_FUNC 339intptr_t FAST_FUNC
341mingw_spawn_proc(char **argv) 340mingw_spawn_proc(const char **argv)
342{ 341{
343 return mingw_spawn_1(P_NOWAIT, argv[0], (const char *const *)argv, 342 return mingw_spawn_1(P_NOWAIT, argv[0], (char *const *)argv, environ);
344 (const char *const *)environ);
345} 343}
346 344
347int 345int
348mingw_execvp(const char *cmd, const char *const *argv) 346mingw_execvp(const char *cmd, char *const *argv)
349{ 347{
350 int ret = (int)mingw_spawn_1(P_WAIT, cmd, argv, (const char *const *)environ); 348 int ret = (int)mingw_spawn_1(P_WAIT, cmd, argv, environ);
351 if (ret != -1) 349 if (ret != -1)
352 exit(ret); 350 exit(ret);
353 return ret; 351 return ret;
354} 352}
355 353
356int 354int
357mingw_execve(const char *cmd, const char *const *argv, const char *const *envp) 355mingw_execve(const char *cmd, char *const *argv, char *const *envp)
358{ 356{
359 int ret; 357 int ret;
360 int mode = P_WAIT; 358 int mode = P_WAIT;
@@ -366,9 +364,9 @@ mingw_execve(const char *cmd, const char *const *argv, const char *const *envp)
366} 364}
367 365
368int 366int
369mingw_execv(const char *cmd, const char *const *argv) 367mingw_execv(const char *cmd, char *const *argv)
370{ 368{
371 return mingw_execve(cmd, argv, (const char *const *)environ); 369 return mingw_execve(cmd, argv, environ);
372} 370}
373 371
374/* POSIX version in libbb/procps.c */ 372/* POSIX version in libbb/procps.c */
diff --git a/win32/system.c b/win32/system.c
index 02aaaa0a1..44a47f861 100644
--- a/win32/system.c
+++ b/win32/system.c
@@ -10,7 +10,7 @@ int mingw_system(const char *cmd)
10 if (cmd == NULL) 10 if (cmd == NULL)
11 return 1; 11 return 1;
12 12
13 if ((proc=mingw_spawn_proc((char **)argv)) == -1) 13 if ((proc=mingw_spawn_proc(argv)) == -1)
14 return -1; 14 return -1;
15 15
16 h = (HANDLE)proc; 16 h = (HANDLE)proc;