mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* internal.h (rb_execarg): add env_modification field.
* process.c (EXEC_OPTION_ENV): removed. (mark_exec_arg): mark env_modification field. (rb_exec_fillarg): update the new field, instead of options array. (rb_execarg_fixup): use the new field. (save_env): ditto. (rb_execarg_run_options): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36197 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f732c5046e
commit
26ecb6cbc4
3 changed files with 20 additions and 8 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
Sat Jun 23 17:04:08 2012 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* internal.h (rb_execarg): add env_modification field.
|
||||||
|
|
||||||
|
* process.c (EXEC_OPTION_ENV): removed.
|
||||||
|
(mark_exec_arg): mark env_modification field.
|
||||||
|
(rb_exec_fillarg): update the new field, instead of options array.
|
||||||
|
(rb_execarg_fixup): use the new field.
|
||||||
|
(save_env): ditto.
|
||||||
|
(rb_execarg_run_options): ditto.
|
||||||
|
|
||||||
Sat Jun 23 16:27:01 2012 Tanaka Akira <akr@fsij.org>
|
Sat Jun 23 16:27:01 2012 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* internal.h (rb_execarg): add rlimit_limits field.
|
* internal.h (rb_execarg): add rlimit_limits field.
|
||||||
|
|
|
@ -187,6 +187,7 @@ struct rb_execarg {
|
||||||
VALUE rlimit_limits; /* Qfalse or [[rtype, softlim, hardlim], ...] */
|
VALUE rlimit_limits; /* Qfalse or [[rtype, softlim, hardlim], ...] */
|
||||||
mode_t umask_mask;
|
mode_t umask_mask;
|
||||||
int close_others_maxhint;
|
int close_others_maxhint;
|
||||||
|
VALUE env_modification; /* Qfalse or [[k1,v1], ...] */
|
||||||
VALUE chdir_dir;
|
VALUE chdir_dir;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
16
process.c
16
process.c
|
@ -1254,7 +1254,6 @@ rb_proc_exec(const char *str)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
EXEC_OPTION_ENV,
|
|
||||||
EXEC_OPTION_DUP2,
|
EXEC_OPTION_DUP2,
|
||||||
EXEC_OPTION_CLOSE,
|
EXEC_OPTION_CLOSE,
|
||||||
EXEC_OPTION_OPEN,
|
EXEC_OPTION_OPEN,
|
||||||
|
@ -1280,6 +1279,7 @@ mark_exec_arg(void *ptr)
|
||||||
rb_gc_mark(eargp->envp_buf);
|
rb_gc_mark(eargp->envp_buf);
|
||||||
rb_gc_mark(eargp->dup2_tmpbuf);
|
rb_gc_mark(eargp->dup2_tmpbuf);
|
||||||
rb_gc_mark(eargp->rlimit_limits);
|
rb_gc_mark(eargp->rlimit_limits);
|
||||||
|
rb_gc_mark(eargp->env_modification);
|
||||||
rb_gc_mark(eargp->chdir_dir);
|
rb_gc_mark(eargp->chdir_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1896,7 +1896,7 @@ rb_exec_fillarg(VALUE prog, int argc, VALUE *argv, VALUE env, VALUE opthash, VAL
|
||||||
}
|
}
|
||||||
if (!NIL_P(env)) {
|
if (!NIL_P(env)) {
|
||||||
env = rb_check_exec_env(env);
|
env = rb_check_exec_env(env);
|
||||||
rb_ary_store(options, EXEC_OPTION_ENV, env);
|
eargp->env_modification = env;
|
||||||
}
|
}
|
||||||
|
|
||||||
eargp->use_shell = argc == 0;
|
eargp->use_shell = argc == 0;
|
||||||
|
@ -2128,8 +2128,8 @@ rb_execarg_fixup(VALUE execarg_obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsetenv_others = eargp->unsetenv_others_given && eargp->unsetenv_others_do;
|
unsetenv_others = eargp->unsetenv_others_given && eargp->unsetenv_others_do;
|
||||||
envopts = rb_ary_entry(eargp->options, EXEC_OPTION_ENV);
|
envopts = eargp->env_modification;
|
||||||
if (unsetenv_others || !NIL_P(envopts)) {
|
if (unsetenv_others || envopts != Qfalse) {
|
||||||
VALUE envtbl, envp_str, envp_buf;
|
VALUE envtbl, envp_str, envp_buf;
|
||||||
char *p, *ep;
|
char *p, *ep;
|
||||||
if (unsetenv_others) {
|
if (unsetenv_others) {
|
||||||
|
@ -2705,13 +2705,13 @@ save_env(struct rb_execarg *sargp)
|
||||||
if (!sargp)
|
if (!sargp)
|
||||||
return;
|
return;
|
||||||
soptions = sargp->options;
|
soptions = sargp->options;
|
||||||
if (NIL_P(rb_ary_entry(soptions, EXEC_OPTION_ENV))) {
|
if (sargp->env_modification == Qfalse) {
|
||||||
VALUE env = rb_const_get(rb_cObject, rb_intern("ENV"));
|
VALUE env = rb_const_get(rb_cObject, rb_intern("ENV"));
|
||||||
if (RTEST(env)) {
|
if (RTEST(env)) {
|
||||||
VALUE ary = hide_obj(rb_ary_new());
|
VALUE ary = hide_obj(rb_ary_new());
|
||||||
rb_block_call(env, rb_intern("each"), 0, 0, save_env_i,
|
rb_block_call(env, rb_intern("each"), 0, 0, save_env_i,
|
||||||
(VALUE)ary);
|
(VALUE)ary);
|
||||||
rb_ary_store(soptions, EXEC_OPTION_ENV, ary);
|
sargp->env_modification = ary;
|
||||||
}
|
}
|
||||||
rb_ary_store(soptions, EXEC_OPTION_UNSETENV_OTHERS, Qtrue);
|
rb_ary_store(soptions, EXEC_OPTION_UNSETENV_OTHERS, Qtrue);
|
||||||
}
|
}
|
||||||
|
@ -2757,8 +2757,8 @@ rb_execarg_run_options(const struct rb_execarg *eargp, struct rb_execarg *sargp,
|
||||||
rb_env_clear();
|
rb_env_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
obj = rb_ary_entry(options, EXEC_OPTION_ENV);
|
obj = eargp->env_modification;
|
||||||
if (!NIL_P(obj)) {
|
if (obj != Qfalse) {
|
||||||
long i;
|
long i;
|
||||||
save_env(sargp);
|
save_env(sargp);
|
||||||
for (i = 0; i < RARRAY_LEN(obj); i++) {
|
for (i = 0; i < RARRAY_LEN(obj); i++) {
|
||||||
|
|
Loading…
Reference in a new issue