summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ext/pty/extconf.rb1
-rw-r--r--ext/pty/pty.c10
3 files changed, 15 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index fbd4cf6..4d99ca8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Apr 30 10:09:04 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/pty/pty.c (establishShell): honor USER environment variable
+ and login name over uid, one pid can be shared by some login
+ names.
+
Fri Apr 29 22:40:28 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* doc/maintainers.rdoc (ext/io/nonblock): still maintained, as
diff --git a/ext/pty/extconf.rb b/ext/pty/extconf.rb
index b37057f..844902b 100644
--- a/ext/pty/extconf.rb
+++ b/ext/pty/extconf.rb
@@ -9,6 +9,7 @@ if /mswin|mingw|bccwin|nacl/ !~ RUBY_PLATFORM
have_header("libutil.h")
have_header("util.h") # OpenBSD openpty
have_header("pty.h")
+ have_header("pwd.h")
have_library("util", "openpty")
if have_func("posix_openpt") or
have_func("openpty") or
diff --git a/ext/pty/pty.c b/ext/pty/pty.c
index 106f353..8340e96 100644
--- a/ext/pty/pty.c
+++ b/ext/pty/pty.c
@@ -9,7 +9,9 @@
#include <sys/file.h>
#include <fcntl.h>
#include <errno.h>
+#ifdef HAVE_PWD_H
#include <pwd.h>
+#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
@@ -157,7 +159,6 @@ establishShell(int argc, VALUE *argv, struct pty_info *info,
int master, slave, status = 0;
rb_pid_t pid;
char *p, *getenv();
- struct passwd *pwent;
VALUE v;
struct child_info carg;
char errbuf[32];
@@ -169,11 +170,16 @@ establishShell(int argc, VALUE *argv, struct pty_info *info,
shellname = p;
}
else {
- pwent = getpwuid(getuid());
+#if defined HAVE_PWD_H
+ const char *username = getenv("USER");
+ struct passwd *pwent = getpwnam(username ? username : getlogin());
if (pwent && pwent->pw_shell)
shellname = pwent->pw_shell;
else
shellname = "/bin/sh";
+#else
+ shellname = "/bin/sh";
+#endif
}
v = rb_str_new2(shellname);
argc = 1;