aboutsummaryrefslogtreecommitdiffstats
path: root/ext
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-30 01:09:07 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-30 01:09:07 +0000
commit00a2285917002726747929b1d13b6742ee87ea58 (patch)
treeddc604c8e29bd53666fbfc6866999c1081545eee /ext
parent3908b3da227456c0dd0cddc390ab725ba5ade9b5 (diff)
downloadruby-00a2285917002726747929b1d13b6742ee87ea58.tar.gz
pty.c: user shell
* ext/pty/pty.c (establishShell): honor USER environment variable and login name over uid, one pid can be shared by some login names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/pty/extconf.rb1
-rw-r--r--ext/pty/pty.c10
2 files changed, 9 insertions, 2 deletions
diff --git a/ext/pty/extconf.rb b/ext/pty/extconf.rb
index b37057f3c9..844902b1f7 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 106f35329d..8340e96f1d 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;