Hi folks.

As many of us, I'm a happy tmux user.
There's a small glitch, though, that I have "fixed" in my local tree,
and I was thinking about sharing it.

I know that tmux spawns login shells by default, and I've read about
people asking how to disable that.  Sadly, the solutions that can be
tried, currently, are:
- set default-shell to something appropriate.  I don't know which options
  are really available here.
- set default-command to "ksh" / "/bin/ksh".  This leads to exec'ing
  $SHELL to fire default-command.  default-command might be set to "ksh",
  or "/bin/ksh".  If set to "exec ksh", you should save a call to
  fork(), and an entry in the process table.  The problem, imho, is that
  it leads to exec'ing two shells instead of one.  Which is (*imho*) not
  elegant.
- modify the source.

What I propose is that tmux doesn't fire a login shell unless
explicitely told to.  tmux already has an internal login_shell variable,
which is used in the tmux.c/shell_exec() function, but not in
window.c/window_pane_spawn().  This variable seems to be properly
modified when tmux is called as a login shell.  Shells shouldn't
(*imho*) be spawned as login shells by default.  This could be a benefit
for slow machines users (as /etc/profile and ~/.profile might be
expensive), and matches (still imho) the least astonishment principle.

So, I've used the following patch since a long time, but haven't tested
it much with tmux set as login shell.  I might take a bit of time to
check it, but I'd prefer people that *really care* to do it.  I've also
updated the manpage to match the behaviour change.

This might very well break some people's setup relying on tmux
implicitely spawning login shells, but I honestly don't care much about
that. :P
The change could be documented in current.html and release notes for the
portable version.

The following diff introduces a new auto variable and makes xasprintf()
unable to check the format string (with WARNINGS=Yes), but since the
format string it trivial, I thought it wasn't such a big problem.

Please don't hesitate to bash me if I've missed something important. :P

Regards.
--
Jérémie Courrèges-Anglas
GPG fingerprint: 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494

(Replaces last use of literal "tmux" by .Nm, btw)

Index: names.c
===================================================================
RCS file: /home/cvs/src/usr.bin/tmux/names.c,v
retrieving revision 1.15
diff -u -p -r1.15 names.c
--- names.c     11 Apr 2012 07:45:30 -0000      1.15
+++ names.c     20 Jun 2012 22:25:13 -0000
@@ -64,8 +64,8 @@ window_name_callback(unused int fd, unus
                wname = default_window_name(w);
        else {
                /*
-                * If tmux is using the default command, it will be a login
-                * shell and argv[0] may have a - prefix. Remove this if it is
+                * If tmux is using the default command, it may be a login
+                * shell thus argv[0] could have a - prefix. Remove this if it 
is
                 * present. Ick.
                 */
                if (w->active->cmd != NULL && *w->active->cmd == '\0' &&
Index: tmux.1
===================================================================
RCS file: /home/cvs/src/usr.bin/tmux/tmux.1,v
retrieving revision 1.294
diff -u -p -r1.294 tmux.1
--- tmux.1      22 May 2012 11:35:37 -0000      1.294
+++ tmux.1      20 Jun 2012 18:36:25 -0000
@@ -156,8 +156,11 @@ signal may be sent to the
 server process to recreate it.
 .It Fl l
 Behave as a login shell.
-This flag currently has no effect and is for compatibility with other shells
-when using tmux as a login shell.
+Needed for compatibility with other shells when using
+.Nm
+as a login shell. See the
+.Ic default-shell
+option.
 .It Fl q
 Set the
 .Ic quiet
@@ -1961,7 +1964,7 @@ which may be any
 command.
 The default is an empty string, which instructs
 .Nm
-to create a login shell using the value of the
+to create a shell using the value of the
 .Ic default-shell
 option.
 .It Ic default-path Ar path
@@ -1975,7 +1978,7 @@ flag to
 .Ic new-window .
 .It Ic default-shell Ar path
 Specify the default shell.
-This is used as the login shell for new windows when the
+This is used as the shell for new windows when the
 .Ic default-command
 option is set to empty, and must be the full path of the executable.
 When started
@@ -1989,6 +1992,10 @@ or
 This option should be configured when
 .Nm
 is used as a login shell.
+Note that if
+.Nm
+is used as a login shell, then child shell processes are also launched as
+login shells.
 .It Ic default-terminal Ar terminal
 Set the default terminal for new windows created in this session - the
 default value of the
Index: window.c
===================================================================
RCS file: /home/cvs/src/usr.bin/tmux/window.c,v
retrieving revision 1.80
diff -u -p -r1.80 window.c
--- window.c    28 May 2012 08:55:43 -0000      1.80
+++ window.c    20 Jun 2012 21:36:17 -0000
@@ -686,7 +686,7 @@ window_pane_spawn(struct window_pane *wp
 {
        struct winsize   ws;
        char            *argv0, paneid[16];
-       const char      *ptr;
+       const char      *ptr, *shell_fmt;
        struct termios   tio2;

        if (wp->fd != -1) {
@@ -752,11 +752,12 @@ window_pane_spawn(struct window_pane *wp
                        fatal("execl failed");
                }

-               /* No command; fork a login shell. */
+               /* No command; fork a shell. */
+               shell_fmt = login_shell ? "-%s" : "%s";
                if (ptr != NULL && *(ptr + 1) != '\0')
-                       xasprintf(&argv0, "-%s", ptr + 1);
+                       xasprintf(&argv0, shell_fmt, ptr + 1);
                else
-                       xasprintf(&argv0, "-%s", wp->shell);
+                       xasprintf(&argv0, shell_fmt, wp->shell);
                execl(wp->shell, argv0, (char *) NULL);
                fatal("execl failed");
        }

Reply via email to