summaryrefslogtreecommitdiffstats
path: root/st.c
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2014-08-28 12:48:29 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2014-09-23 07:12:41 +0200
commit5afb3862ba368de8888c0c570098baababc7bc19 (patch)
tree614c4238669f5513bc0bd3fe4007aa4770a3fc81 /st.c
parentRemove indentation level in xdrawcursor (diff)
downloadst-5afb3862ba368de8888c0c570098baababc7bc19.tar.gz
st-5afb3862ba368de8888c0c570098baababc7bc19.zip
Add support for utmp in st
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.
Diffstat (limited to '')
-rw-r--r--st.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/st.c b/st.c
index dd3301b..ab3fa6e 100644
--- a/st.c
+++ b/st.c
@@ -1153,16 +1153,22 @@ execsh(void) {
1153 else 1153 else
1154 die("who are you?\n"); 1154 die("who are you?\n");
1155 } 1155 }
1156 unsetenv("COLUMNS");
1157 unsetenv("LINES");
1158 unsetenv("TERMCAP");
1159 1156
1160 sh = (pw->pw_shell[0]) ? pw->pw_shell : shell; 1157 if (utmp)
1158 sh = utmp;
1159 else if (pw->pw_shell[0])
1160 sh = pw->pw_shell;
1161 else
1162 sh = shell;
1163 args = (opt_cmd) ? opt_cmd : (char *[]){sh, NULL};
1161 snprintf(buf, sizeof(buf), "%lu", xw.win); 1164 snprintf(buf, sizeof(buf), "%lu", xw.win);
1162 1165
1166 unsetenv("COLUMNS");
1167 unsetenv("LINES");
1168 unsetenv("TERMCAP");
1163 setenv("LOGNAME", pw->pw_name, 1); 1169 setenv("LOGNAME", pw->pw_name, 1);
1164 setenv("USER", pw->pw_name, 1); 1170 setenv("USER", pw->pw_name, 1);
1165 setenv("SHELL", sh, 1); 1171 setenv("SHELL", args[0], 1);
1166 setenv("HOME", pw->pw_dir, 1); 1172 setenv("HOME", pw->pw_dir, 1);
1167 setenv("TERM", termname, 1); 1173 setenv("TERM", termname, 1);
1168 setenv("WINDOWID", buf, 1); 1174 setenv("WINDOWID", buf, 1);
@@ -1174,7 +1180,6 @@ execsh(void) {
1174 signal(SIGTERM, SIG_DFL); 1180 signal(SIGTERM, SIG_DFL);
1175 signal(SIGALRM, SIG_DFL); 1181 signal(SIGALRM, SIG_DFL);
1176 1182
1177 args = opt_cmd ? opt_cmd : (char *[]){sh, "-i", NULL};
1178 execvp(args[0], args); 1183 execvp(args[0], args);
1179 exit(EXIT_FAILURE); 1184 exit(EXIT_FAILURE);
1180} 1185}