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:
parent
5bd7899b98
commit
18088467e7
5 changed files with 29 additions and 12 deletions
15
ChangeLog
15
ChangeLog
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue