diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-10 01:29:58 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-10 01:29:58 +0000 |
commit | 18088467e7489eff252eeb5b904bc93c2949462f (patch) | |
tree | 84276ef8a48616ad2613f8e6d2ea00bc716b5339 | |
parent | 5bd7899b98fc4fd9631d08423f5c2fb6918c783d (diff) | |
download | ruby-18088467e7489eff252eeb5b904bc93c2949462f.tar.gz |
* process.c (rb_exec_async_signal_safe): exported.
* ext/pty/extconf.rb: modify $INCFLAGS to include internal.h
* ext/pty/pty.c: include internal.h.
(chfunc): don't call rb_thread_atfork_before_exec. use
rb_exec_async_signal_safe instead of rb_f_exec.
(establishShell): set up earg. use rb_fork_async_signal_safe
instead of rb_fork_err.
* internal.h (rb_exec_async_signal_safe): declared.
(rb_fork_async_signal_safe): declared.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36002 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | ext/pty/extconf.rb | 2 | ||||
-rw-r--r-- | ext/pty/pty.c | 18 | ||||
-rw-r--r-- | internal.h | 4 | ||||
-rw-r--r-- | process.c | 2 |
5 files changed, 29 insertions, 12 deletions
@@ -1,3 +1,18 @@ +Sun Jun 10 10:24:51 2012 Tanaka Akira <akr@fsij.org> + + * process.c (rb_exec_async_signal_safe): exported. + + * ext/pty/extconf.rb: modify $INCFLAGS to include internal.h + + * ext/pty/pty.c: include internal.h. + (chfunc): don't call rb_thread_atfork_before_exec. use + rb_exec_async_signal_safe instead of rb_f_exec. + (establishShell): set up earg. use rb_fork_async_signal_safe + instead of rb_fork_err. + + * internal.h (rb_exec_async_signal_safe): declared. + (rb_fork_async_signal_safe): declared. + Sun Jun 10 10:21:37 2012 Martin Bosslet <Martin.Bosslet@googlemail.com> * ext/openssl/ossl.c diff --git a/ext/pty/extconf.rb b/ext/pty/extconf.rb index 890269f857..1db9f6e8aa 100644 --- a/ext/pty/extconf.rb +++ b/ext/pty/extconf.rb @@ -1,5 +1,7 @@ require 'mkmf' +$INCFLAGS << " -I$(topdir) -I$(top_srcdir)" + if /mswin|mingw|bccwin|nacl/ !~ RUBY_PLATFORM have_header("sys/stropts.h") have_func("setresuid") diff --git a/ext/pty/pty.c b/ext/pty/pty.c index ee56d5862f..bdb52d42d1 100644 --- a/ext/pty/pty.c +++ b/ext/pty/pty.c @@ -32,6 +32,7 @@ #include "ruby/ruby.h" #include "ruby/io.h" #include "ruby/util.h" +#include "internal.h" #include <signal.h> #ifdef HAVE_SYS_STROPTS_H @@ -77,8 +78,7 @@ static void getDevice(int*, int*, char [DEVICELEN], int); struct child_info { int master, slave; char *slavename; - int argc; - VALUE *argv; + struct rb_exec_arg earg; }; static int @@ -87,16 +87,12 @@ chfunc(void *data, char *errbuf, size_t errbuf_len) struct child_info *carg = data; int master = carg->master; int slave = carg->slave; - int argc = carg->argc; - VALUE *argv = carg->argv; #define ERROR_EXIT(str) do { \ strlcpy(errbuf, (str), errbuf_len); \ return -1; \ } while (0) - rb_thread_atfork_before_exec(); - /* * Set free from process group and controlling terminal */ @@ -146,8 +142,7 @@ chfunc(void *data, char *errbuf, size_t errbuf_len) seteuid(getuid()); #endif - rb_f_exec(argc, argv); - return 0; + return rb_exec_async_signal_safe(&carg->earg, errbuf, sizeof(errbuf_len)); #undef ERROR_EXIT } @@ -181,15 +176,16 @@ establishShell(int argc, VALUE *argv, struct pty_info *info, argv = &v; } + rb_exec_arg_init(argc, argv, 1, &carg.earg); + rb_exec_arg_fixup(&carg.earg); + getDevice(&master, &slave, SlaveName, 0); carg.master = master; carg.slave = slave; carg.slavename = SlaveName; - carg.argc = argc; - carg.argv = argv; errbuf[0] = '\0'; - pid = rb_fork_err(&status, chfunc, &carg, Qnil, errbuf, sizeof(errbuf)); + pid = rb_fork_async_signal_safe(&status, chfunc, &carg, Qnil, errbuf, sizeof(errbuf)); if (pid < 0) { int e = errno; diff --git a/internal.h b/internal.h index d17d2ba826..adc7b5d8f1 100644 --- a/internal.h +++ b/internal.h @@ -261,6 +261,10 @@ VALUE rb_thread_call_without_gvl( /* io.c */ void rb_maygvl_fd_fix_cloexec(int fd); +/* process.c */ +int rb_exec_async_signal_safe(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen); +rb_pid_t rb_fork_async_signal_safe(int *status, int (*chfunc)(void*, char *, size_t), void *charg, VALUE fds, char *errmsg, size_t errmsg_buflen); + #if defined __GNUC__ && __GNUC__ >= 4 #pragma GCC visibility pop #endif @@ -2610,7 +2610,7 @@ rb_run_exec_options(const struct rb_exec_arg *e, struct rb_exec_arg *s) } /* This function should be async-signal-safe. Hopefully it is. */ -static int +int rb_exec_async_signal_safe(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen) { #if !defined(HAVE_FORK) |