summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-03 13:13:10 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-03 13:13:10 +0000
commit4f8f4a9ee4f03977aae81e41ced5b30f5607f939 (patch)
tree0448a35ceb009b60500b59c07593ba46955e02b8 /process.c
parent0ebf520671e0a25768e06237a1fe6439c148c1f5 (diff)
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c17
1 files changed, 11 insertions, 6 deletions
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++;
}