diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2009-09-01 13:09:49 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2009-09-01 13:09:49 +0000 |
commit | 7d5e4947160d9355353c29a983e373b66c05abef (patch) | |
tree | efc2a0bce29bc661d657895828bb486c632a8cb1 /tmux.c | |
parent | f8aa5821be6bb802785c5ca7c23c91465cfba4a3 (diff) | |
download | rtmux-7d5e4947160d9355353c29a983e373b66c05abef.tar.gz rtmux-7d5e4947160d9355353c29a983e373b66c05abef.tar.bz2 rtmux-7d5e4947160d9355353c29a983e373b66c05abef.zip |
When using tmux as a login shell, there is currently no way to specify a shell
to be used as a login shell inside tmux, so add a default-shell session option.
This sets the shell invoked as a login shell when the default-command option is
empty.
The default option value is whichever of $SHELL, getpwuid(getuid())'s pw_shell
or /bin/sh is valid first.
Based on a diff from martynas@, changed by me to be a session option rather
than a window option.
Diffstat (limited to 'tmux.c')
-rw-r--r-- | tmux.c | 46 |
1 files changed, 46 insertions, 0 deletions
@@ -175,6 +175,50 @@ sigreset(void) fatal("sigaction failed"); } +const char * +getshell(void) +{ + struct passwd *pw; + const char *shell; + + shell = getenv("SHELL"); + if (checkshell(shell)) + return (shell); + + pw = getpwuid(getuid()); + if (pw != NULL && checkshell(pw->pw_shell)) + return (pw->pw_shell); + + return (_PATH_BSHELL); +} + +int +checkshell(const char *shell) +{ + if (shell == NULL || *shell == '\0' || areshell(shell)) + return (0); + if (access(shell, X_OK) != 0) + return (0); + return (1); +} + +int +areshell(const char *shell) +{ + const char *progname, *ptr; + + if ((ptr = strrchr(shell, '/')) != NULL) + ptr++; + else + ptr = shell; + progname = __progname; + if (*progname == '-') + progname++; + if (strcmp(ptr, progname) == 0) + return (1); + return (0); +} + char * makesockpath(const char *label) { @@ -346,6 +390,8 @@ main(int argc, char **argv) options_set_number(&global_s_options, "bell-action", BELL_ANY); options_set_number(&global_s_options, "buffer-limit", 9); options_set_string(&global_s_options, "default-command", "%s", ""); + options_set_string( + &global_s_options, "default-shell", "%s", getshell()); options_set_string(&global_s_options, "default-terminal", "screen"); options_set_number(&global_s_options, "display-panes-colour", 4); options_set_number(&global_s_options, "display-panes-time", 1000); |