summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
Diffstat (limited to 'win32')
-rw-r--r--win32/win32.c58
-rw-r--r--win32/win32.h4
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);