mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 05:21:10 +00:00
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:
46
tmux.c
46
tmux.c
@ -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);
|
||||
|
Reference in New Issue
Block a user