⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 login.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#/* * 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	010main(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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -