]> git.armaanb.net Git - st.git/commitdiff
Add support for utmp in st
authorRoberto E. Vargas Caballero <k0ga@shike2.com>
Thu, 28 Aug 2014 10:48:29 +0000 (12:48 +0200)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Tue, 23 Sep 2014 05:12:41 +0000 (07:12 +0200)
St runs an interactive shell and not a login shell, and it means
that profile is not loaded. The default terminal configuration
in some system is not the correct for st, but since profile is
not loaded there is no way of getting a script configures the
correct values.

St doesn't update the utmp files, this is the job of another
suckless tool, utmp. Utmp also opens a login shell (it is the
logical behaviour when you create a new user record) it is a
good option execute utmp and then get a correct input in
utmp, wtmp and lastlog file, and execute the content of the
profile.

config.def.h
st.c

index fe810789e50d948f63949442e674894c901f1229..cc16f97664502e03dce11cc455ae8d9ba647f55d 100644 (file)
@@ -8,6 +8,7 @@
 static char font[] = "Liberation Mono:pixelsize=12:antialias=false:autohint=false";
 static int borderpx = 2;
 static char shell[] = "/bin/sh";
+static char *utmp = NULL;
 
 /* identification sequence returned in DA and DECID */
 static char vtiden[] = "\033[?6c";
diff --git a/st.c b/st.c
index dd3301b121083cfaeea2383d7912e31634f2b860..ab3fa6e6ab2caf1ca8ce264870b5082275c02fcd 100644 (file)
--- a/st.c
+++ b/st.c
@@ -1153,16 +1153,22 @@ execsh(void) {
                else
                        die("who are you?\n");
        }
-       unsetenv("COLUMNS");
-       unsetenv("LINES");
-       unsetenv("TERMCAP");
 
-       sh = (pw->pw_shell[0]) ? pw->pw_shell : shell;
+       if (utmp)
+               sh = utmp;
+       else if (pw->pw_shell[0])
+               sh = pw->pw_shell;
+       else
+               sh = shell;
+       args = (opt_cmd) ? opt_cmd : (char *[]){sh, NULL};
        snprintf(buf, sizeof(buf), "%lu", xw.win);
 
+       unsetenv("COLUMNS");
+       unsetenv("LINES");
+       unsetenv("TERMCAP");
        setenv("LOGNAME", pw->pw_name, 1);
        setenv("USER", pw->pw_name, 1);
-       setenv("SHELL", sh, 1);
+       setenv("SHELL", args[0], 1);
        setenv("HOME", pw->pw_dir, 1);
        setenv("TERM", termname, 1);
        setenv("WINDOWID", buf, 1);
@@ -1174,7 +1180,6 @@ execsh(void) {
        signal(SIGTERM, SIG_DFL);
        signal(SIGALRM, SIG_DFL);
 
-       args = opt_cmd ? opt_cmd : (char *[]){sh, "-i", NULL};
        execvp(args[0], args);
        exit(EXIT_FAILURE);
 }