aboutsummaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
Diffstat (limited to 'win32')
-rw-r--r--win32/process.c60
1 files changed, 58 insertions, 2 deletions
diff --git a/win32/process.c b/win32/process.c
index b51f25d5c..35480e08d 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -248,6 +248,51 @@ grow_argv(char **argv, int n)
248 return new_argv; 248 return new_argv;
249} 249}
250 250
251#if ENABLE_FEATURE_HTTPD_CGI
252static int
253create_detached_process(const char *prog, char *const *argv)
254{
255 int argc, i;
256 char *command = NULL;
257 STARTUPINFO siStartInfo;
258 PROCESS_INFORMATION piProcInfo;
259 int success;
260
261 argc = string_array_len((char **)argv);
262 for (i = 0; i < argc; i++)
263 command = xappendword(command, quote_arg(argv[i]));
264
265 ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
266 siStartInfo.cb = sizeof(STARTUPINFO);
267 siStartInfo.hStdInput = (HANDLE)_get_osfhandle(STDIN_FILENO);
268 siStartInfo.hStdOutput = (HANDLE)_get_osfhandle(STDOUT_FILENO);
269 siStartInfo.dwFlags = STARTF_USESTDHANDLES;
270
271 success = CreateProcess((LPCSTR)prog,
272 (LPSTR)command, /* command line */
273 NULL, /* process security attributes */
274 NULL, /* primary thread security attributes */
275 TRUE, /* handles are inherited */
276 DETACHED_PROCESS, /* creation flags */
277 NULL, /* use parent's environment */
278 NULL, /* use parent's current directory */
279 &siStartInfo, /* STARTUPINFO pointer */
280 &piProcInfo); /* receives PROCESS_INFORMATION */
281
282 free(command);
283
284 if (!success)
285 return -1;
286 exit(0);
287}
288
289# define SPAWNVEQ(m, p, a, e) \
290 ((m != HTTPD_DETACH) ? spawnveq(m, p, a, e) : \
291 create_detached_process(p, a))
292#else
293# define SPAWNVEQ(m, p, a, e) spawnveq(m, p, a, e)
294#endif
295
251static intptr_t 296static intptr_t
252mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, 297mingw_spawn_interpreter(int mode, const char *prog, char *const *argv,
253 char *const *envp, int level) 298 char *const *envp, int level)
@@ -259,7 +304,7 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv,
259 char *path = NULL; 304 char *path = NULL;
260 305
261 if (!parse_interpreter(prog, &interp)) 306 if (!parse_interpreter(prog, &interp))
262 return spawnveq(mode, prog, argv, envp); 307 return SPAWNVEQ(mode, prog, argv, envp);
263 308
264 if (++level > 4) { 309 if (++level > 4) {
265 errno = ELOOP; 310 errno = ELOOP;
@@ -275,7 +320,7 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv,
275 if (unix_path(interp.path) && find_applet_by_name(interp.name) >= 0) { 320 if (unix_path(interp.path) && find_applet_by_name(interp.name) >= 0) {
276 /* the fake path indicates the index of the script */ 321 /* the fake path indicates the index of the script */
277 new_argv[0] = path = xasprintf("%d:/%s", nopts+1, interp.name); 322 new_argv[0] = path = xasprintf("%d:/%s", nopts+1, interp.name);
278 ret = mingw_spawn_applet(mode, new_argv, envp); 323 ret = SPAWNVEQ(mode, bb_busybox_exec_path, new_argv, envp);
279 goto done; 324 goto done;
280 } 325 }
281#endif 326#endif
@@ -428,6 +473,17 @@ mingw_execv(const char *cmd, char *const *argv)
428 return mingw_execve(cmd, argv, NULL); 473 return mingw_execve(cmd, argv, NULL);
429} 474}
430 475
476#if ENABLE_FEATURE_HTTPD_CGI
477int httpd_execv_detach(const char *script, char *const *argv)
478{
479 intptr_t ret = mingw_spawn_interpreter(HTTPD_DETACH, script,
480 (char *const *)argv, NULL, 0);
481 if (ret != -1)
482 exit(0);
483 return ret;
484}
485#endif
486
431static inline long long filetime_to_ticks(const FILETIME *ft) 487static inline long long filetime_to_ticks(const FILETIME *ft)
432{ 488{
433 return (((long long)ft->dwHighDateTime << 32) + ft->dwLowDateTime)/ 489 return (((long long)ft->dwHighDateTime << 32) + ft->dwLowDateTime)/