static char* TTY = "/dev/tty1";
static char* TERM = "linux";
static char* UTMP = "/var/run/utmp";
-static char Hostname[256] = {0};
-static char Username[256] = {0};
static void ignoresig(int signal, int ignore) {
struct sigaction sigact;
int fd;
/* First reset the tty and take control if necessary */
if ((fd = open(TTY, O_RDWR)) < 0)
- die("Failed to open %s\n", TTY);
+ die("Failed to open %s", TTY);
if (isatty(fd) == 0)
- die("%s is not a tty\n", TTY);
+ die("%s is not a tty", TTY);
if (ioctl(fd, TIOCSCTTY, (void *)1) != 0)
- warn("TIOCSCTTY: could not set controlling tty\n");
+ warn("TIOCSCTTY: could not set controlling tty");
vhangup();
close(fd);
/* Now open it for real */
if ((fd = open(TTY, O_RDWR)) < 0)
- die("Failed to open %s\n", TTY);
+ die("Failed to open %s", TTY);
return fd;
}
fclose(fp);
}
-static int dologin(void) {
- int i = 0, c = 0;
- /* Print the hostname */
- if (gethostname(Hostname, sizeof(Hostname)) == 0)
- printf("%s ", Hostname);
- printf("login: ");
- fflush(stdout);
- /* Read in the username */
- ioctl(0, TCFLSH, (void *)0);
- while (1) {
- if (0 == efread(&c, 1, 1, stdin))
- return 1;
- if (i >= (sizeof(Username) - 1))
- die("login name too long\n");
- if (c == '\n' || c == '\r')
- break;
- Username[i++] = c;
- }
- /* Execute the login command */
- if ((Username[0] == '\0') || (Username[0] == '-'))
- return 1;
- else
- return execlp("/bin/login", "login", "-p", Username, NULL);
-}
-
int main(int argc, char *argv[]) {
/* Print usage and exit if we receive any flags */
OPTBEGIN{
ignoresig(SIGHUP, 1); // ignore SIGHUP
setenv("TERM", TERM, 1);
setsid();
- /* Open the TTY for normal usage */
int fd = opentty();
dup2(fd, 0); // Make stdin the TTY
dup2(fd, 1); // Make stdout the TTY
dup2(fd, 2); // Make stderr the TTY
if (fchown(fd, 0, 0) < 0)
- warn("fchown %s:", TTY);
+ warn("chown of %s failed", TTY);
if (fchmod(fd, 0600) < 0)
- warn("fchmod %s:", TTY);
+ warn("chmod of %s failed", TTY);
ignoresig(SIGHUP, 0); // stop ignoring SIGHUP
/* clear all utmp entries for this TTY */
clearutmp();
if (argc > 2)
return execvp(argv[2], &(argv[2]));
else
- return dologin();
+ return execlp("/bin/login", "login", "-p", NULL);
}
static void
writeutmp(const char *user, const char *tty)
{
- struct utmp usr;
- FILE *fp;
-
- memset(&usr, 0, sizeof(usr));
-
- usr.ut_type = USER_PROCESS;
- usr.ut_pid = getpid();
- strlcpy(usr.ut_user, user, sizeof(usr.ut_user));
- strlcpy(usr.ut_line, tty, sizeof(usr.ut_line));
- usr.ut_tv.tv_sec = time(NULL);
-
- fp = fopen(UTMP_PATH, "a");
- if (fp) {
- if (fwrite(&usr, sizeof(usr), 1, fp) != 1)
- if (ferror(fp))
- weprintf("%s: write error:", UTMP_PATH);
- fclose(fp);
- } else {
- weprintf("fopen %s:", UTMP_PATH);
- }
+ struct utmp usr;
+ FILE *fp;
+
+ memset(&usr, 0, sizeof(usr));
+
+ usr.ut_type = USER_PROCESS;
+ usr.ut_pid = getpid();
+ strlcpy(usr.ut_user, user, sizeof(usr.ut_user));
+ strlcpy(usr.ut_line, tty, sizeof(usr.ut_line));
+ usr.ut_tv.tv_sec = time(NULL);
+
+ fp = fopen(UTMP_PATH, "a");
+ if (fp) {
+ if (fwrite(&usr, sizeof(usr), 1, fp) != 1)
+ if (ferror(fp))
+ weprintf("%s: write error:", UTMP_PATH);
+ fclose(fp);
+ } else {
+ weprintf("fopen %s:", UTMP_PATH);
+ }
}
static int
dologin(struct passwd *pw, int preserve)
{
- char *shell = pw->pw_shell[0] == '\0' ? "/bin/sh" : pw->pw_shell;
-
- if (preserve == 0)
- clearenv();
- setenv("HOME", pw->pw_dir, 1);
- setenv("SHELL", shell, 1);
- setenv("USER", pw->pw_name, 1);
- setenv("LOGNAME", pw->pw_name, 1);
- setenv("PATH", ENV_PATH, 1);
- if (chdir(pw->pw_dir) < 0)
- eprintf("chdir %s:", pw->pw_dir);
- execlp(shell, shell, "-l", NULL);
- weprintf("execlp %s:", shell);
- return (errno == ENOENT) ? 127 : 126;
+ char *shell = pw->pw_shell[0] == '\0' ? "/bin/sh" : pw->pw_shell;
+
+ if (preserve == 0)
+ clearenv();
+ setenv("HOME", pw->pw_dir, 1);
+ setenv("SHELL", shell, 1);
+ setenv("USER", pw->pw_name, 1);
+ setenv("LOGNAME", pw->pw_name, 1);
+ setenv("PATH", ENV_PATH, 1);
+ if (chdir(pw->pw_dir) < 0)
+ eprintf("chdir %s:", pw->pw_dir);
+ execlp(shell, shell, "-l", NULL);
+ weprintf("execlp %s:", shell);
+ return (errno == ENOENT) ? 127 : 126;
}
static void
usage(void)
{
- eprintf("usage: %s [-p] username\n", argv0);
+ eprintf("usage: %s [-p] username\n", argv0);
}
int
main(int argc, char *argv[])
{
- struct passwd *pw;
- char *pass, *user;
- char *tty;
- uid_t uid;
- gid_t gid;
- int pflag = 0;
-
- ARGBEGIN {
- case 'p':
- pflag = 1;
- break;
- default:
- usage();
- } ARGEND;
-
- if (argc < 1)
- usage();
-
- if (isatty(0) == 0 || isatty(1) == 0 || isatty(2) == 0)
- eprintf("no tty");
-
- user = argv[0];
- errno = 0;
- pw = getpwnam(user);
- if (!pw) {
- if (errno)
- eprintf("getpwnam %s:", user);
- else
- eprintf("who are you?\n");
- }
-
- uid = pw->pw_uid;
- gid = pw->pw_gid;
-
- /* Flush pending input */
- ioctl(0, TCFLSH, (void *)0);
-
- pass = getpass("Password: ");
- if (!pass)
- eprintf("getpass:");
- if (pw_check(pw, pass) <= 0)
- exit(1);
-
- tty = ttyname(0);
- if (!tty)
- eprintf("ttyname:");
-
- writeutmp(user, tty);
-
- if (initgroups(user, gid) < 0)
- eprintf("initgroups:");
- if (setgid(gid) < 0)
- eprintf("setgid:");
- if (setuid(uid) < 0)
- eprintf("setuid:");
-
- return dologin(pw, pflag);
+ struct passwd *pw;
+ char *pass, *user;
+ char *tty;
+ uid_t uid;
+ gid_t gid;
+ int pflag = 0;
+
+ ARGBEGIN {
+ case 'p':
+ pflag = 1;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc < 1)
+ usage();
+
+ if (isatty(0) == 0 || isatty(1) == 0 || isatty(2) == 0)
+ eprintf("no tty");
+
+ user = argv[0];
+ errno = 0;
+ pw = getpwnam(user);
+ if (!pw) {
+ if (errno)
+ eprintf("getpwnam %s:", user);
+ else
+ eprintf("who are you?\n");
+ }
+
+ uid = pw->pw_uid;
+ gid = pw->pw_gid;
+
+ /* Flush pending input */
+ ioctl(0, TCFLSH, (void *)0);
+
+ pass = getpass("Password: ");
+ if (!pass)
+ eprintf("getpass:");
+ if (pw_check(pw, pass) <= 0)
+ exit(1);
+
+ tty = ttyname(0);
+ if (!tty)
+ eprintf("ttyname:");
+
+ writeutmp(user, tty);
+
+ if (initgroups(user, gid) < 0)
+ eprintf("initgroups:");
+ if (setgid(gid) < 0)
+ eprintf("setgid:");
+ if (setuid(uid) < 0)
+ eprintf("setuid:");
+
+ return dologin(pw, pflag);
}