Add original unix v6
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
#
|
||||
/*
|
||||
* login [ name ]
|
||||
*/
|
||||
|
||||
struct {
|
||||
char name[8];
|
||||
char tty;
|
||||
char ifill;
|
||||
int time[2];
|
||||
int ufill;
|
||||
} utmp;
|
||||
|
||||
struct {
|
||||
int speeds;
|
||||
char erase, kill;
|
||||
int tflags;
|
||||
} ttyb;
|
||||
|
||||
struct {
|
||||
int junk[5];
|
||||
int size;
|
||||
int more[12];
|
||||
} statb;
|
||||
|
||||
char *ttyx;
|
||||
|
||||
#define ECHO 010
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
char pbuf[128];
|
||||
register char *namep, *np;
|
||||
char pwbuf[9];
|
||||
int t, sflags, f, c, uid, gid;
|
||||
|
||||
signal(3, 1);
|
||||
signal(2, 1);
|
||||
nice(0);
|
||||
ttyx = "/dev/ttyx";
|
||||
if ((utmp.tty=ttyn(0)) == 'x') {
|
||||
write(1, "Sorry.\n", 7);
|
||||
exit();
|
||||
}
|
||||
ttyx[8] = utmp.tty;
|
||||
gtty(0, &ttyb);
|
||||
ttyb.erase = '#';
|
||||
ttyb.kill = '@';
|
||||
stty(0, &ttyb);
|
||||
loop:
|
||||
namep = utmp.name;
|
||||
if (argc>1) {
|
||||
np = argv[1];
|
||||
while (namep<utmp.name+8 && *np)
|
||||
*namep++ = *np++;
|
||||
argc = 0;
|
||||
} else {
|
||||
write(1, "Name: ", 7);
|
||||
while ((c = getchar()) != '\n') {
|
||||
if (c <= 0)
|
||||
exit();
|
||||
if (namep < utmp.name+8)
|
||||
*namep++ = c;
|
||||
}
|
||||
}
|
||||
while (namep < utmp.name+8)
|
||||
*namep++ = ' ';
|
||||
if (getpwentry(utmp.name, pbuf))
|
||||
goto bad;
|
||||
np = colon(pbuf);
|
||||
if (*np!=':') {
|
||||
sflags = ttyb.tflags;
|
||||
ttyb.tflags =& ~ ECHO;
|
||||
stty(0, &ttyb);
|
||||
write(1, "Password: ", 10);
|
||||
namep = pwbuf;
|
||||
while ((c=getchar()) != '\n') {
|
||||
if (c <= 0)
|
||||
exit();
|
||||
if (namep<pwbuf+8)
|
||||
*namep++ = c;
|
||||
}
|
||||
*namep++ = '\0';
|
||||
ttyb.tflags = sflags;
|
||||
stty(0, &ttyb);
|
||||
write(1, "\n", 1);
|
||||
namep = crypt(pwbuf);
|
||||
while (*namep++ == *np++);
|
||||
if (*--namep!='\0' || *--np!=':')
|
||||
goto bad;
|
||||
}
|
||||
np = colon(np);
|
||||
uid = 0;
|
||||
while (*np != ':')
|
||||
uid = uid*10 + *np++ - '0';
|
||||
np++;
|
||||
gid = 0;
|
||||
while (*np != ':')
|
||||
gid = gid*10 + *np++ - '0';
|
||||
np++;
|
||||
np = colon(np);
|
||||
namep = np;
|
||||
np = colon(np);
|
||||
if (chdir(namep)<0) {
|
||||
write(1, "No directory\n", 13);
|
||||
goto loop;
|
||||
}
|
||||
time(utmp.time);
|
||||
if ((f = open("/etc/utmp", 1)) >= 0) {
|
||||
t = utmp.tty;
|
||||
if (t>='a')
|
||||
t =- 'a' - (10+'0');
|
||||
seek(f, (t-'0')*16, 0);
|
||||
write(f, &utmp, 16);
|
||||
close(f);
|
||||
}
|
||||
if ((f = open("/usr/adm/wtmp", 1)) >= 0) {
|
||||
seek(f, 0, 2);
|
||||
write(f, &utmp, 16);
|
||||
close(f);
|
||||
}
|
||||
if ((f = open("/etc/motd", 0)) >= 0) {
|
||||
while(read(f, &t, 1) > 0)
|
||||
write(1, &t, 1);
|
||||
close(f);
|
||||
}
|
||||
if(stat(".mail", &statb) >= 0 && statb.size)
|
||||
write(1, "You have mail.\n", 15);
|
||||
chown(ttyx, uid);
|
||||
setgid(gid);
|
||||
setuid(uid);
|
||||
if (*np == '\0')
|
||||
np = "/bin/sh";
|
||||
execl(np, "-", 0);
|
||||
write(1, "No shell.\n", 9);
|
||||
exit();
|
||||
bad:
|
||||
write(1, "Login incorrect.\n", 17);
|
||||
goto loop;
|
||||
}
|
||||
|
||||
getpwentry(name, buf)
|
||||
char *name, *buf;
|
||||
{
|
||||
extern fin;
|
||||
int fi, r, c;
|
||||
register char *gnp, *rnp;
|
||||
|
||||
fi = fin;
|
||||
r = 1;
|
||||
if((fin = open("/etc/passwd", 0)) < 0)
|
||||
goto ret;
|
||||
loop:
|
||||
gnp = name;
|
||||
rnp = buf;
|
||||
while((c=getchar()) != '\n') {
|
||||
if(c <= 0)
|
||||
goto ret;
|
||||
*rnp++ = c;
|
||||
}
|
||||
*rnp++ = '\0';
|
||||
rnp = buf;
|
||||
while (*gnp++ == *rnp++);
|
||||
if ((*--gnp!=' ' && gnp<name+8) || *--rnp!=':')
|
||||
goto loop;
|
||||
r = 0;
|
||||
ret:
|
||||
close(fin);
|
||||
fin = 0;
|
||||
(&fin)[1] = 0;
|
||||
(&fin)[2] = 0;
|
||||
return(r);
|
||||
}
|
||||
|
||||
colon(p)
|
||||
char *p;
|
||||
{
|
||||
register char *rp;
|
||||
|
||||
rp = p;
|
||||
while (*rp != ':') {
|
||||
if (*rp++ == '\0') {
|
||||
write(1, "Bad /etc/passwd\n", 16);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
*rp++ = '\0';
|
||||
return(rp);
|
||||
}
|
||||
Reference in New Issue
Block a user