mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* process.c (rb_run_exec_options_err): chdir at last to interpret
relative pathnames from the current directory of the parent process. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34892 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
cb5217088b
commit
61c148723d
3 changed files with 35 additions and 20 deletions
|
@ -1,3 +1,8 @@
|
|||
Sat Mar 3 22:51:46 2012 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* process.c (rb_run_exec_options_err): chdir at last to interpret
|
||||
relative pathnames from the current directory of the parent process.
|
||||
|
||||
Sat Mar 3 12:20:44 2012 Tadayoshi Funaba <tadf@dotrb.org>
|
||||
|
||||
* ext/date/date_strftime.c: reassigned some variables.
|
||||
|
|
40
process.c
40
process.c
|
@ -2367,20 +2367,6 @@ rb_run_exec_options_err(const struct rb_exec_arg *e, struct rb_exec_arg *s, char
|
|||
}
|
||||
}
|
||||
|
||||
obj = rb_ary_entry(options, EXEC_OPTION_CHDIR);
|
||||
if (!NIL_P(obj)) {
|
||||
if (!NIL_P(soptions)) {
|
||||
char *cwd = my_getcwd();
|
||||
rb_ary_store(soptions, EXEC_OPTION_CHDIR,
|
||||
hide_obj(rb_str_new2(cwd)));
|
||||
xfree(cwd);
|
||||
}
|
||||
if (chdir(RSTRING_PTR(obj)) == -1) {
|
||||
ERRMSG("chdir");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
obj = rb_ary_entry(options, EXEC_OPTION_UMASK);
|
||||
if (!NIL_P(obj)) {
|
||||
mode_t mask = NUM2MODET(obj);
|
||||
|
@ -2424,6 +2410,20 @@ rb_run_exec_options_err(const struct rb_exec_arg *e, struct rb_exec_arg *s, char
|
|||
return -1;
|
||||
}
|
||||
|
||||
obj = rb_ary_entry(options, EXEC_OPTION_CHDIR);
|
||||
if (!NIL_P(obj)) {
|
||||
if (!NIL_P(soptions)) {
|
||||
char *cwd = my_getcwd();
|
||||
rb_ary_store(soptions, EXEC_OPTION_CHDIR,
|
||||
hide_obj(rb_str_new2(cwd)));
|
||||
xfree(cwd);
|
||||
}
|
||||
if (chdir(RSTRING_PTR(obj)) == -1) {
|
||||
ERRMSG("chdir");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3141,8 +3141,6 @@ rb_f_system(int argc, VALUE *argv)
|
|||
* resource limit: resourcename is core, cpu, data, etc. See Process.setrlimit.
|
||||
* :rlimit_resourcename => limit
|
||||
* :rlimit_resourcename => [cur_limit, max_limit]
|
||||
* current directory:
|
||||
* :chdir => str
|
||||
* umask:
|
||||
* :umask => int
|
||||
* redirection:
|
||||
|
@ -3165,6 +3163,8 @@ rb_f_system(int argc, VALUE *argv)
|
|||
* io : the file descriptor specified as io.fileno
|
||||
* file descriptor inheritance: close non-redirected non-standard fds (3, 4, 5, ...) or not
|
||||
* :close_others => true : don't inherit
|
||||
* current directory:
|
||||
* :chdir => str
|
||||
*
|
||||
* If a hash is given as +env+, the environment is
|
||||
* updated by +env+ before <code>exec(2)</code> in the child process.
|
||||
|
@ -3208,10 +3208,6 @@ rb_f_system(int argc, VALUE *argv)
|
|||
* pid = spawn(command, :rlimit_core=>max) # enable core dump
|
||||
* pid = spawn(command, :rlimit_core=>0) # never dump core.
|
||||
*
|
||||
* The <code>:chdir</code> key in +options+ specifies the current directory.
|
||||
*
|
||||
* pid = spawn(command, :chdir=>"/var/tmp")
|
||||
*
|
||||
* The <code>:umask</code> key in +options+ specifies the umask.
|
||||
*
|
||||
* pid = spawn(command, :umask=>077)
|
||||
|
@ -3291,6 +3287,10 @@ rb_f_system(int argc, VALUE *argv)
|
|||
* io = IO.popen(["sh", "-c", "echo out; echo err >&2", :err=>[:child, :out]])
|
||||
* p io.read #=> "out\nerr\n"
|
||||
*
|
||||
* The <code>:chdir</code> key in +options+ specifies the current directory.
|
||||
*
|
||||
* pid = spawn(command, :chdir=>"/var/tmp")
|
||||
*
|
||||
* spawn closes all non-standard unspecified descriptors by default.
|
||||
* The "standard" descriptors are 0, 1 and 2.
|
||||
* This behavior is specified by :close_others option.
|
||||
|
|
|
@ -327,6 +327,16 @@ class TestProcess < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_execopts_open_chdir
|
||||
with_tmpchdir {|d|
|
||||
Dir.mkdir "foo"
|
||||
system(*PWD, :chdir => "foo", :out => "open_chdir_test")
|
||||
assert(File.exist?("open_chdir_test"))
|
||||
assert(!File.exist?("foo/open_chdir_test"))
|
||||
assert_equal("#{d}/foo", File.read("open_chdir_test").chomp)
|
||||
}
|
||||
end
|
||||
|
||||
UMASK = [RUBY, '-e', 'printf "%04o\n", File.umask']
|
||||
|
||||
def test_execopts_umask
|
||||
|
|
Loading…
Reference in a new issue