* 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:
akr 2012-06-23 04:23:03 +00:00
Родитель 40ae2e0108
Коммит f527ad625d
3 изменённых файлов: 24 добавлений и 12 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -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