window.c.diff   [plain text]


--- window.c.orig	2006-09-05 17:08:57.000000000 -0700
+++ window.c	2006-09-05 17:15:33.000000000 -0700
@@ -25,6 +25,7 @@
 #include <sys/stat.h>
 #include <signal.h>
 #include <fcntl.h>
+#include <unistd.h>
 #ifndef sun
 # include <sys/ioctl.h>
 #endif
@@ -1387,6 +1388,38 @@
   return pid;
 }
 
+#ifdef RUN_LOGIN
+/*
+ * All of the logic to maintain utmpx is now built into /usr/bin/login, so
+ * all we need to do is call it, and pass the shell command to it.
+ */
+extern char *LoginName;
+
+static int
+run_login(const char *path, char *const argv[], char *const envp[])
+{
+  const char *shargs[MAXARGS + 1 + 3];
+  const char **fp, **tp;
+
+  if (access(path, X_OK) < 0)
+    return -1;
+  shargs[0] = "login";
+  shargs[1] = (*argv[0] == '-') ? "-pfq" : "-pflq";
+  shargs[2] = LoginName;
+  shargs[3] = path;
+  fp = (const char **)argv + 1;
+  tp = shargs + 4;
+  /* argv has already been check for length */
+  while ((*tp++ = *fp++) != NULL) {}
+  /* shouldn't return unless there was an error */
+  return (execve("/usr/bin/login", (char *const*)shargs, envp));
+}
+
+/* replace the following occurrences of execve() with run_login() */
+#define execve run_login
+
+#endif /* RUN_LOGIN */
+
 void
 execvpe(prog, args, env)
 char *prog, **args, **env;