ast@cs.vu.nl (Andy Tanenbaum) (04/21/87)
By accident, I seem to have omitted login.c from the distribution. Here it
is.
Gary Oliver - if you see this, send me your exact path from seismo; I am
trying to communicate with you about the hard disk, but all mail comes back.
Andy Tanenbaum (ast@cs.vu.nl)
--------------cut here -------------------------------------
/* login - log into the system Author: Patrick van Kleef */
#include "signal.h"
#include "sgtty.h"
#include "pwd.h"
main()
{
char buf[30],
buf1[30],
*crypt();
int n, n1, bad;
struct sgttyb args;
struct passwd *pwd, *getpwnam();
args.sg_kill = '@';
args.sg_erase = '\b';
args.sg_flags = 06030;
ioctl (0, TIOCSETP, &args);
/* Get login name and passwd. */
for (;;) {
bad = 0;
do {
write(1,"login: ",7);
n = read (0, buf, 30);
} while (n < 2);
buf[n - 1] = 0;
/* Look up login/passwd. */
if ((pwd = getpwnam (buf)) == 0)
bad++;
if (bad || strlen (pwd->pw_passwd) != 0) {
args.sg_flags = 06020;
ioctl (0, TIOCSETP, &args);
write(1,"Password: ",10);
n1 = read (0, buf1, 30);
buf1[n1 - 1] = 0;
write(1,"\n",1);
args.sg_flags = 06030;
ioctl (0, TIOCSETP, &args);
if (bad || strcmp (pwd->pw_passwd, crypt(buf1, pwd->pw_passwd))) {
write (1,"Login incorrect\n",16);
continue;
}
}
/* Successful login. */
setgid (pwd->pw_gid);
setuid (pwd->pw_uid);
chdir (pwd->pw_dir);
if (pwd->pw_shell) {
execl(pwd->pw_shell, "-", 0);
}
execl("/bin/sh", "-", 0);
write(1,"exec failure\n",13);
}
}