=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/tmux/window.c 2009/07/07 19:49:19 1.7 --- src/usr.bin/tmux/window.c 2009/07/08 05:26:45 1.8 *************** *** 1,4 **** ! /* $OpenBSD: window.c,v 1.7 2009/07/07 19:49:19 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window.c,v 1.8 2009/07/08 05:26:45 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 23,28 **** --- 23,29 ---- #include #include #include + #include #include #include #include *************** *** 57,62 **** --- 58,80 ---- RB_GENERATE(winlinks, winlink, entry, winlink_cmp); + const char * + window_default_command(void) + { + const char *shell; + struct passwd *pw; + + shell = getenv("SHELL"); + if (shell != NULL && *shell != '\0') + return (shell); + + pw = getpwuid(getuid()); + if (pw != NULL && pw->pw_shell != NULL && *pw->pw_shell != '\0') + return (pw->pw_shell); + + return (_PATH_BSHELL); + } + int winlink_cmp(struct winlink *wl1, struct winlink *wl2) { *************** *** 424,430 **** { struct winsize ws; int mode; ! const char **envq; struct timeval tv; if (wp->fd != -1) --- 442,449 ---- { struct winsize ws; int mode; ! const char **envq, *ptr; ! char *argv0; struct timeval tv; if (wp->fd != -1) *************** *** 465,471 **** sigreset(); log_close(); ! execl(_PATH_BSHELL, "sh", "-c", wp->cmd, (char *) NULL); fatal("execl failed"); } --- 484,501 ---- sigreset(); log_close(); ! if (*wp->cmd != '\0') { ! execl(_PATH_BSHELL, "sh", "-c", wp->cmd, (char *) NULL); ! fatal("execl failed"); ! } ! ! /* No command; fork a login shell. */ ! cmd = window_default_command(); ! if ((ptr = strrchr(cmd, '/')) != NULL && *(ptr + 1) != '\0') ! xasprintf(&argv0, "-%s", ptr + 1); ! else ! xasprintf(&argv0, "-%s", cmd); ! execl(cmd, argv0, (char *) NULL); fatal("execl failed"); }