mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/pty/pty.c (get_device_once): delay rb_fd_set_cloexec() until
grantpt() on Solaris. grantpt() doesn't work with CLOEXEC on Solaris 10. reported by Naohisa GOTO. [ruby-dev:44688] [Bug #5475] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33519 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
be561cbebe
commit
5153fd2a5e
2 changed files with 23 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Mon Oct 24 22:38:08 2011 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* ext/pty/pty.c (get_device_once): delay rb_fd_set_cloexec() until
|
||||||
|
grantpt() on Solaris. grantpt() doesn't work with CLOEXEC on
|
||||||
|
Solaris 10.
|
||||||
|
reported by Naohisa GOTO. [ruby-dev:44688] [Bug #5475]
|
||||||
|
|
||||||
Mon Oct 24 08:18:14 2011 Tanaka Akira <akr@fsij.org>
|
Mon Oct 24 08:18:14 2011 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* io.c (copy_stream_fallback_body): check nil for EOF of read method.
|
* io.c (copy_stream_fallback_body): check nil for EOF of read method.
|
||||||
|
|
|
@ -290,10 +290,18 @@ get_device_once(int *master, int *slave, char SlaveName[DEVICELEN], int nomesg,
|
||||||
dfl.sa_flags = 0;
|
dfl.sa_flags = 0;
|
||||||
sigemptyset(&dfl.sa_mask);
|
sigemptyset(&dfl.sa_mask);
|
||||||
|
|
||||||
|
#if defined(__sun)
|
||||||
|
/* workaround for Solaris 10: grantpt() doesn't work if FD_CLOEXEC is set. [ruby-dev:44688] */
|
||||||
|
if ((masterfd = posix_openpt(O_RDWR|O_NOCTTY)) == -1) goto error;
|
||||||
|
if (sigaction(SIGCHLD, &dfl, &old) == -1) goto error;
|
||||||
|
if (grantpt(masterfd) == -1) goto grantpt_error;
|
||||||
|
rb_fd_set_cloexec(masterfd);
|
||||||
|
#else
|
||||||
if ((masterfd = posix_openpt(O_RDWR|O_NOCTTY)) == -1) goto error;
|
if ((masterfd = posix_openpt(O_RDWR|O_NOCTTY)) == -1) goto error;
|
||||||
rb_fd_set_cloexec(masterfd);
|
rb_fd_set_cloexec(masterfd);
|
||||||
if (sigaction(SIGCHLD, &dfl, &old) == -1) goto error;
|
if (sigaction(SIGCHLD, &dfl, &old) == -1) goto error;
|
||||||
if (grantpt(masterfd) == -1) goto grantpt_error;
|
if (grantpt(masterfd) == -1) goto grantpt_error;
|
||||||
|
#endif
|
||||||
if (sigaction(SIGCHLD, &old, NULL) == -1) goto error;
|
if (sigaction(SIGCHLD, &old, NULL) == -1) goto error;
|
||||||
if (unlockpt(masterfd) == -1) goto error;
|
if (unlockpt(masterfd) == -1) goto error;
|
||||||
if ((slavedevice = ptsname(masterfd)) == NULL) goto error;
|
if ((slavedevice = ptsname(masterfd)) == NULL) goto error;
|
||||||
|
@ -365,10 +373,18 @@ get_device_once(int *master, int *slave, char SlaveName[DEVICELEN], int nomesg,
|
||||||
extern int unlockpt(int);
|
extern int unlockpt(int);
|
||||||
extern int grantpt(int);
|
extern int grantpt(int);
|
||||||
|
|
||||||
|
#if defined(__sun)
|
||||||
|
/* workaround for Solaris 10: grantpt() doesn't work if FD_CLOEXEC is set. [ruby-dev:44688] */
|
||||||
|
if((masterfd = open("/dev/ptmx", O_RDWR, 0)) == -1) goto error;
|
||||||
|
s = signal(SIGCHLD, SIG_DFL);
|
||||||
|
if(grantpt(masterfd) == -1) goto error;
|
||||||
|
rb_fd_set_cloexec(masterfd);
|
||||||
|
#else
|
||||||
if((masterfd = open("/dev/ptmx", O_RDWR, 0)) == -1) goto error;
|
if((masterfd = open("/dev/ptmx", O_RDWR, 0)) == -1) goto error;
|
||||||
rb_fd_set_cloexec(masterfd);
|
rb_fd_set_cloexec(masterfd);
|
||||||
s = signal(SIGCHLD, SIG_DFL);
|
s = signal(SIGCHLD, SIG_DFL);
|
||||||
if(grantpt(masterfd) == -1) goto error;
|
if(grantpt(masterfd) == -1) goto error;
|
||||||
|
#endif
|
||||||
signal(SIGCHLD, s);
|
signal(SIGCHLD, s);
|
||||||
if(unlockpt(masterfd) == -1) goto error;
|
if(unlockpt(masterfd) == -1) goto error;
|
||||||
if((slavedevice = ptsname(masterfd)) == NULL) goto error;
|
if((slavedevice = ptsname(masterfd)) == NULL) goto error;
|
||||||
|
|
Loading…
Add table
Reference in a new issue