diff options
Diffstat (limited to 'win32')
-rw-r--r-- | win32/win32.c | 58 | ||||
-rw-r--r-- | win32/win32.h | 4 |
2 files changed, 53 insertions, 9 deletions
diff --git a/win32/win32.c b/win32/win32.c index d9c9cf3624..f3ccdfeb92 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -630,19 +630,43 @@ pipe_exec(char *cmd, int mode, FILE **fpr, FILE **fpw) extern VALUE rb_last_status; int -do_spawn(cmd) +do_spawn(mode, cmd) +int mode; char *cmd; { - struct ChildRecord *child = CreateChild(cmd, NULL, NULL, NULL, NULL, NULL); + struct ChildRecord *child; + + switch (mode) { + case P_WAIT: + case P_NOWAIT: + case P_OVERLAY: + break; + default: + errno = EINVAL; + return -1; + } + + child = CreateChild(cmd, NULL, NULL, NULL, NULL, NULL); if (!child) { return -1; } - rb_syswait(child->pid); - return NUM2INT(rb_last_status); + + switch (mode) { + case P_WAIT: + rb_syswait(child->pid); + return NUM2INT(rb_last_status); + case P_NOWAIT: + return child->pid; + case P_OVERLAY: + exit(0); + default: + return -1; /* not reached */ + } } int -do_aspawn(prog, argv) +do_aspawn(mode, prog, argv) +int mode; char *prog; char **argv; { @@ -650,6 +674,16 @@ char **argv; int len, n, bs, quote; struct ChildRecord *child; + switch (mode) { + case P_WAIT: + case P_NOWAIT: + case P_OVERLAY: + break; + default: + errno = EINVAL; + return -1; + } + for (t = argv, len = 0; *t; t++) { for (p = *t, n = quote = bs = 0; *p; ++p) { switch (*p) { @@ -706,8 +740,18 @@ char **argv; if (!child) { return -1; } - rb_syswait(child->pid); - return NUM2INT(rb_last_status); + + switch (mode) { + case P_WAIT: + rb_syswait(child->pid); + return NUM2INT(rb_last_status); + case P_NOWAIT: + return child->pid; + case P_OVERLAY: + exit(0); + default: + return -1; /* not reached */ + } } static struct ChildRecord * diff --git a/win32/win32.h b/win32/win32.h index 0b7754b350..6880b65a2d 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -176,8 +176,8 @@ extern int chown(const char *, int, int); extern int link(char *, char *); extern int gettimeofday(struct timeval *, struct timezone *); extern pid_t waitpid (pid_t, int *, int); -extern int do_spawn(char *); -extern int do_aspawn(char *, char **); +extern int do_spawn(int, char *); +extern int do_aspawn(int, char *, char **); extern int kill(int, int); extern pid_t rb_w32_getpid(void); |