summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-01-06 04:30:27 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-01-06 04:30:27 +0000
commita8bb4ed57719a231d4a15bda964476b0b373d03c (patch)
tree97860f4f5b8b88e20718c5bb985b13691dc6803c
parent6a29dec1fde8d2d18bb3eb21f27ad45527d20734 (diff)
* process.c (proc_exec_v): follow to proc_spawn_v(). call do_aspawn()
on Win32. * process.c (rb_proc_exec): call do_spawn() on Win32. * win32/win32.c, win32/win32.h (do_spawn, do_aspawn): add mode flag. * process.c (proc_spawn_v, rb_f_system): follow above change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3298 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog11
-rw-r--r--process.c32
-rw-r--r--win32/win32.c58
-rw-r--r--win32/win32.h4
4 files changed, 83 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index efaa994f9a..409f7c1afa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Mon Jan 6 13:26:35 2003 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * process.c (proc_exec_v): follow to proc_spawn_v(). call do_aspawn()
+ on Win32.
+
+ * process.c (rb_proc_exec): call do_spawn() on Win32.
+
+ * win32/win32.c, win32/win32.h (do_spawn, do_aspawn): add mode flag.
+
+ * process.c (proc_spawn_v, rb_f_system): follow above change.
+
Mon Jan 06 05:11:15 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* ext/extmk.rb: make $0 normal variable.
diff --git a/process.c b/process.c
index bdf4301290..0866a09611 100644
--- a/process.c
+++ b/process.c
@@ -441,17 +441,13 @@ proc_exec_v(argv, prog)
char **argv;
char *prog;
{
- if (prog) {
- security(prog);
- }
- else {
- security(argv[0]);
- prog = dln_find_exe(argv[0], 0);
- if (!prog) {
- errno = ENOENT;
- return -1;
- }
- }
+ if (!prog)
+ prog = argv[0];
+ security(prog);
+ prog = dln_find_exe(prog, 0);
+ if (!prog)
+ return -1;
+
#if (defined(MSDOS) && !defined(DJGPP)) || defined(__human68k__) || defined(__EMX__) || defined(OS2)
{
#if defined(__human68k__)
@@ -490,7 +486,11 @@ proc_exec_v(argv, prog)
}
#endif /* MSDOS or __human68k__ or __EMX__ */
before_exec();
+#ifdef _WIN32
+ do_aspawn(P_OVERLAY, prog, argv);
+#else
execv(prog, argv);
+#endif
after_exec();
return -1;
}
@@ -531,6 +531,11 @@ rb_proc_exec(str)
while (*str && ISSPACE(*str))
str++;
+#ifdef _WIN32
+ before_exec();
+ do_spawn(P_OVERLAY, (char *)str);
+ after_exec();
+#else
for (s=str; *s; s++) {
if (*s != ' ' && !ISALPHA(*s) && strchr("*?{}[]<>()~&|\\$;'`\"\n",*s)) {
#if defined(MSDOS)
@@ -574,6 +579,7 @@ rb_proc_exec(str)
return proc_exec_v(argv, 0);
}
errno = ENOENT;
+#endif /* _WIN32 */
return -1;
}
@@ -619,7 +625,7 @@ proc_spawn_v(argv, prog)
#endif
before_exec();
#if defined(_WIN32)
- status = do_aspawn(prog, argv);
+ status = do_aspawn(P_WAIT, prog, argv);
#else
status = spawnv(P_WAIT, prog, argv);
#endif
@@ -860,7 +866,7 @@ rb_f_system(argc, argv)
if (argc == 1 && prog == 0) {
#if defined(_WIN32)
- status = do_spawn(RSTRING(argv[0])->ptr);
+ status = do_spawn(P_WAIT, RSTRING(argv[0])->ptr);
#else
status = proc_spawn(argv[0]);
#endif
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);