summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--process.c17
-rw-r--r--test/ruby/test_process.rb2
3 files changed, 21 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 318762bf8a..6c0c4bbddb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Thu Mar 3 22:10:26 2011 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * process.c (check_exec_redirect_fd, check_exec_redirect): raise
+ ArgumentError if fd >= 3 on Windows because the feature is not
+ supported.
+
+ * test/ruby/test_process.rb (test_execopts_redirect): remove meaningless
+ argument.
+
Thu Mar 3 21:21:42 2011 NAKAMURA Usaku <usa@ruby-lang.org>
* test/ruby/test_process.rb (test_execopts_redirect): redirecting fd
diff --git a/process.c b/process.c
index 7ca3dfe063..38f5e28faa 100644
--- a/process.c
+++ b/process.c
@@ -1294,7 +1294,7 @@ enum {
};
static VALUE
-check_exec_redirect_fd(VALUE v)
+check_exec_redirect_fd(VALUE v, int iskey)
{
VALUE tmp;
int fd;
@@ -1326,6 +1326,11 @@ check_exec_redirect_fd(VALUE v)
wrong:
rb_raise(rb_eArgError, "negative file descriptor");
}
+#ifdef _WIN32
+ else if (fd >= 3 && iskey) {
+ rb_raise(rb_eArgError, "wrong file descriptor (%d)", fd);
+ }
+#endif
return INT2FIX(fd);
}
@@ -1363,7 +1368,7 @@ check_exec_redirect(VALUE key, VALUE val, VALUE options)
break;
case T_FILE:
- val = check_exec_redirect_fd(val);
+ val = check_exec_redirect_fd(val, 0);
/* fall through */
case T_FIXNUM:
index = EXEC_OPTION_DUP2;
@@ -1375,7 +1380,7 @@ check_exec_redirect(VALUE key, VALUE val, VALUE options)
if (RARRAY_LEN(val) == 2 && SYMBOL_P(path) &&
SYM2ID(path) == rb_intern("child")) {
index = EXEC_OPTION_DUP2_CHILD;
- param = check_exec_redirect_fd(rb_ary_entry(val, 1));
+ param = check_exec_redirect_fd(rb_ary_entry(val, 1), 0);
}
else {
index = EXEC_OPTION_OPEN;
@@ -1399,7 +1404,7 @@ check_exec_redirect(VALUE key, VALUE val, VALUE options)
path = val;
FilePathValue(path);
if (TYPE(key) == T_FILE)
- key = check_exec_redirect_fd(key);
+ key = check_exec_redirect_fd(key, 1);
if (FIXNUM_P(key) && (FIX2INT(key) == 1 || FIX2INT(key) == 2))
flags = INT2NUM(O_WRONLY|O_CREAT|O_TRUNC);
else
@@ -1419,14 +1424,14 @@ check_exec_redirect(VALUE key, VALUE val, VALUE options)
rb_ary_store(options, index, ary);
}
if (TYPE(key) != T_ARRAY) {
- VALUE fd = check_exec_redirect_fd(key);
+ VALUE fd = check_exec_redirect_fd(key, !NIL_P(param));
rb_ary_push(ary, hide_obj(rb_assoc_new(fd, param)));
}
else {
int i, n=0;
for (i = 0 ; i < RARRAY_LEN(key); i++) {
VALUE v = RARRAY_PTR(key)[i];
- VALUE fd = check_exec_redirect_fd(v);
+ VALUE fd = check_exec_redirect_fd(v, !NIL_P(param));
rb_ary_push(ary, hide_obj(rb_assoc_new(fd, param)));
n++;
}
diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb
index e0351a6832..f3f3f9eb80 100644
--- a/test/ruby/test_process.rb
+++ b/test/ruby/test_process.rb
@@ -384,7 +384,7 @@ class TestProcess < Test::Unit::TestCase
Process.wait Process.spawn(*ECHO["c"], STDERR=>STDOUT, STDOUT=>["out", File::WRONLY|File::CREAT|File::TRUNC, 0644])
assert_equal("c", File.read("out").chomp)
File.open("out", "w") {|f|
- Process.wait Process.spawn(*ECHO["d"], f=>STDOUT, STDOUT=>f)
+ Process.wait Process.spawn(*ECHO["d"], STDOUT=>f)
assert_equal("d", File.read("out").chomp)
}
opts = {STDOUT=>["out", File::WRONLY|File::CREAT|File::TRUNC, 0644]}