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.
This commit is contained in:
Nicholas Marriott
2009-09-01 13:09:49 +00:00
parent f8aa5821be
commit 7d5e494716
9 changed files with 111 additions and 53 deletions

46
tmux.c
View File

@ -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);