зеркало из https://github.com/github/ruby.git
* internal.h (rb_execarg): add close_others_given, close_others_do and
close_others_maxhint fields. * process.c (EXEC_OPTION_CLOSE_OTHERS): removed. (rb_execarg_addopt): update the new fields, instead of options array. (check_exec_fds): take eargp as an argument. update the close_others_maxhint field. (rb_execarg_fixup): follow the argument change of check_exec_fds. (rb_execarg_run_options): use the new fields. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36194 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
40ae2e0108
Коммит
f527ad625d
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
Sat Jun 23 13:20:47 2012 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* internal.h (rb_execarg): add close_others_given, close_others_do and
|
||||||
|
close_others_maxhint fields.
|
||||||
|
|
||||||
|
* process.c (EXEC_OPTION_CLOSE_OTHERS): removed.
|
||||||
|
(rb_execarg_addopt): update the new fields, instead of options array.
|
||||||
|
(check_exec_fds): take eargp as an argument. update the
|
||||||
|
close_others_maxhint field.
|
||||||
|
(rb_execarg_fixup): follow the argument change of check_exec_fds.
|
||||||
|
(rb_execarg_run_options): use the new fields.
|
||||||
|
|
||||||
Sat Jun 23 10:41:59 2012 Tanaka Akira <akr@fsij.org>
|
Sat Jun 23 10:41:59 2012 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* internal.h (rb_execarg): add unsetenv_others_given and
|
* internal.h (rb_execarg): add unsetenv_others_given and
|
||||||
|
|
|
@ -180,8 +180,11 @@ struct rb_execarg {
|
||||||
unsigned umask_given : 1;
|
unsigned umask_given : 1;
|
||||||
unsigned unsetenv_others_given : 1;
|
unsigned unsetenv_others_given : 1;
|
||||||
unsigned unsetenv_others_do : 1;
|
unsigned unsetenv_others_do : 1;
|
||||||
|
unsigned close_others_given : 1;
|
||||||
|
unsigned close_others_do : 1;
|
||||||
pid_t pgroup_pgid; /* asis(-1), new pgroup(0), specified pgroup (0<V). */
|
pid_t pgroup_pgid; /* asis(-1), new pgroup(0), specified pgroup (0<V). */
|
||||||
mode_t umask_mask;
|
mode_t umask_mask;
|
||||||
|
int close_others_maxhint;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* argv_str contains extra two elements.
|
/* argv_str contains extra two elements.
|
||||||
|
|
21
process.c
21
process.c
|
@ -1261,7 +1261,6 @@ enum {
|
||||||
EXEC_OPTION_CLOSE,
|
EXEC_OPTION_CLOSE,
|
||||||
EXEC_OPTION_OPEN,
|
EXEC_OPTION_OPEN,
|
||||||
EXEC_OPTION_DUP2_CHILD,
|
EXEC_OPTION_DUP2_CHILD,
|
||||||
EXEC_OPTION_CLOSE_OTHERS,
|
|
||||||
EXEC_OPTION_NEW_PGROUP
|
EXEC_OPTION_NEW_PGROUP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1639,11 +1638,11 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
|
||||||
eargp->umask_mask = cmask;
|
eargp->umask_mask = cmask;
|
||||||
}
|
}
|
||||||
else if (id == rb_intern("close_others")) {
|
else if (id == rb_intern("close_others")) {
|
||||||
if (!NIL_P(rb_ary_entry(options, EXEC_OPTION_CLOSE_OTHERS))) {
|
if (eargp->close_others_given) {
|
||||||
rb_raise(rb_eArgError, "close_others option specified twice");
|
rb_raise(rb_eArgError, "close_others option specified twice");
|
||||||
}
|
}
|
||||||
val = RTEST(val) ? Qtrue : Qfalse;
|
eargp->close_others_given = 1;
|
||||||
rb_ary_store(options, EXEC_OPTION_CLOSE_OTHERS, val);
|
eargp->close_others_do = RTEST(val) ? 1 : 0;
|
||||||
}
|
}
|
||||||
else if (id == rb_intern("in")) {
|
else if (id == rb_intern("in")) {
|
||||||
key = INT2FIX(0);
|
key = INT2FIX(0);
|
||||||
|
@ -1694,8 +1693,9 @@ check_exec_options_i(st_data_t st_key, st_data_t st_val, st_data_t arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
check_exec_fds(VALUE options)
|
check_exec_fds(struct rb_execarg *eargp)
|
||||||
{
|
{
|
||||||
|
VALUE options = eargp->options;
|
||||||
VALUE h = rb_hash_new();
|
VALUE h = rb_hash_new();
|
||||||
VALUE ary;
|
VALUE ary;
|
||||||
int index, maxhint = -1;
|
int index, maxhint = -1;
|
||||||
|
@ -1758,9 +1758,7 @@ check_exec_fds(VALUE options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rb_ary_entry(options, EXEC_OPTION_CLOSE_OTHERS) != Qfalse) {
|
eargp->close_others_maxhint = maxhint;
|
||||||
rb_ary_store(options, EXEC_OPTION_CLOSE_OTHERS, INT2FIX(maxhint));
|
|
||||||
}
|
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2119,7 +2117,7 @@ rb_execarg_fixup(VALUE execarg_obj)
|
||||||
VALUE envopts;
|
VALUE envopts;
|
||||||
VALUE ary;
|
VALUE ary;
|
||||||
|
|
||||||
eargp->redirect_fds = check_exec_fds(eargp->options);
|
eargp->redirect_fds = check_exec_fds(eargp);
|
||||||
|
|
||||||
ary = rb_ary_entry(eargp->options, EXEC_OPTION_DUP2);
|
ary = rb_ary_entry(eargp->options, EXEC_OPTION_DUP2);
|
||||||
if (!NIL_P(ary)) {
|
if (!NIL_P(ary)) {
|
||||||
|
@ -2803,9 +2801,8 @@ rb_execarg_run_options(const struct rb_execarg *eargp, struct rb_execarg *sargp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_FORK
|
#ifdef HAVE_FORK
|
||||||
obj = rb_ary_entry(options, EXEC_OPTION_CLOSE_OTHERS);
|
if (!eargp->close_others_given || eargp->close_others_do) {
|
||||||
if (obj != Qfalse) {
|
rb_close_before_exec(3, eargp->close_others_maxhint, eargp->redirect_fds); /* async-signal-safe */
|
||||||
rb_close_before_exec(3, FIX2INT(obj), eargp->redirect_fds); /* async-signal-safe */
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче