diff options
Diffstat (limited to 'ext/pty')
-rw-r--r-- | ext/pty/extconf.rb | 1 | ||||
-rw-r--r-- | ext/pty/pty.c | 10 |
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; |