1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
akr 2012-06-10 01:29:58 +00:00
parent 5bd7899b98
commit 18088467e7
5 changed files with 29 additions and 12 deletions

View file

@ -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> Sun Jun 10 10:21:37 2012 Martin Bosslet <Martin.Bosslet@googlemail.com>
* ext/openssl/ossl.c * ext/openssl/ossl.c

View file

@ -1,5 +1,7 @@
require 'mkmf' require 'mkmf'
$INCFLAGS << " -I$(topdir) -I$(top_srcdir)"
if /mswin|mingw|bccwin|nacl/ !~ RUBY_PLATFORM if /mswin|mingw|bccwin|nacl/ !~ RUBY_PLATFORM
have_header("sys/stropts.h") have_header("sys/stropts.h")
have_func("setresuid") have_func("setresuid")

View file

@ -32,6 +32,7 @@
#include "ruby/ruby.h" #include "ruby/ruby.h"
#include "ruby/io.h" #include "ruby/io.h"
#include "ruby/util.h" #include "ruby/util.h"
#include "internal.h"
#include <signal.h> #include <signal.h>
#ifdef HAVE_SYS_STROPTS_H #ifdef HAVE_SYS_STROPTS_H
@ -77,8 +78,7 @@ static void getDevice(int*, int*, char [DEVICELEN], int);
struct child_info { struct child_info {
int master, slave; int master, slave;
char *slavename; char *slavename;
int argc; struct rb_exec_arg earg;
VALUE *argv;
}; };
static int static int
@ -87,16 +87,12 @@ chfunc(void *data, char *errbuf, size_t errbuf_len)
struct child_info *carg = data; struct child_info *carg = data;
int master = carg->master; int master = carg->master;
int slave = carg->slave; int slave = carg->slave;
int argc = carg->argc;
VALUE *argv = carg->argv;
#define ERROR_EXIT(str) do { \ #define ERROR_EXIT(str) do { \
strlcpy(errbuf, (str), errbuf_len); \ strlcpy(errbuf, (str), errbuf_len); \
return -1; \ return -1; \
} while (0) } while (0)
rb_thread_atfork_before_exec();
/* /*
* Set free from process group and controlling terminal * Set free from process group and controlling terminal
*/ */
@ -146,8 +142,7 @@ chfunc(void *data, char *errbuf, size_t errbuf_len)
seteuid(getuid()); seteuid(getuid());
#endif #endif
rb_f_exec(argc, argv); return rb_exec_async_signal_safe(&carg->earg, errbuf, sizeof(errbuf_len));
return 0;
#undef ERROR_EXIT #undef ERROR_EXIT
} }
@ -181,15 +176,16 @@ establishShell(int argc, VALUE *argv, struct pty_info *info,
argv = &v; argv = &v;
} }
rb_exec_arg_init(argc, argv, 1, &carg.earg);
rb_exec_arg_fixup(&carg.earg);
getDevice(&master, &slave, SlaveName, 0); getDevice(&master, &slave, SlaveName, 0);
carg.master = master; carg.master = master;
carg.slave = slave; carg.slave = slave;
carg.slavename = SlaveName; carg.slavename = SlaveName;
carg.argc = argc;
carg.argv = argv;
errbuf[0] = '\0'; 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) { if (pid < 0) {
int e = errno; int e = errno;

View file

@ -261,6 +261,10 @@ VALUE rb_thread_call_without_gvl(
/* io.c */ /* io.c */
void rb_maygvl_fd_fix_cloexec(int fd); 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 #if defined __GNUC__ && __GNUC__ >= 4
#pragma GCC visibility pop #pragma GCC visibility pop
#endif #endif

View file

@ -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. */ /* 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) rb_exec_async_signal_safe(const struct rb_exec_arg *e, char *errmsg, size_t errmsg_buflen)
{ {
#if !defined(HAVE_FORK) #if !defined(HAVE_FORK)