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

📄 getty.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#/* * getty -- adapt to terminal speed on dialup, and call login */#include <sgtty.h>#include <signal.h>#define ERASE	'#'#define KILL	'@'struct sgttyb tmode;struct tchars tchars = { '\177', '\034', '\021', '\023', '\004', '\377' };struct	tab {	char	tname;		/* this table name */	char	nname;		/* successor table name */	int	iflags;		/* initial flags */	int	fflags;		/* final flags */	int	ispeed;		/* input speed */	int	ospeed;		/* output speed */	char	*message;	/* login message */} itab[] = {/* table '0'-1-2-3 300,1200,150,110 */	'0', 1,	ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,	B300, B300,	"\n\r\033;\007login: ",	1, 2,	ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,	B1200, B1200,	"\n\r\033;login: ",	2, 3,	ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,	B150, B150,	"\n\r\033:\006\006\017login: ",	3, '0',	ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,	B110, B110,	"\n\rlogin: ",/* table '-' -- Console TTY 110 */	'-', '-',	ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,	B110, B110,	"\n\rlogin: ",/* table '1' -- 150 */	'1', '1',	ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,	B150, B150,	"\n\r\033:\006\006\017login: ",/* table '2' -- 9600 */	'2', '2',	ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,	B9600, B9600,	"\n\r\033;login: ",/* table '3'-'5' -- 1200,300 */	'3', '5',	ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,	B1200, B1200,	"\n\r\033;login: ",/* table '5'-'3' -- 300,1200 */	'5', '3',	ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,	B300, B300,	"\n\r\033;\007login: ",/* table '4' -- Console Decwriter */	'4', '4',	ANYP+RAW, ANYP+ECHO+CRMOD+XTABS,	B300, B300,	"\n\rlogin: ",/* table 'i' -- Interdata Console */	'i', 'i',	RAW+CRMOD, CRMOD+ECHO+LCASE,	0, 0,	"\n\rlogin: ",/* table 'l' -- LSI Chess Terminal */	'l', 'l',	ANYP+RAW/*+HUPCL*/, ANYP+ECHO/*+HUPCL*/,	B300, B300,	"*",/* table '6' -- 2400 11/23 line */	'6', '6',	ANYP+RAW+NL1+CR1, ANYP+ECHO,	B2400, B2400,	"\n\rlogin: ",};#define	NITAB	sizeof itab/sizeof itab[0]#define	EOT	04		/* EOT char */char	name[16];int	crmod;int	upper;int	lower;char partab[] = {	0001,0201,0201,0001,0201,0001,0001,0201,	0202,0004,0003,0205,0005,0206,0201,0001,	0201,0001,0001,0201,0001,0201,0201,0001,	0001,0201,0201,0001,0201,0001,0001,0201,	0200,0000,0000,0200,0000,0200,0200,0000,	0000,0200,0200,0000,0200,0000,0000,0200,	0000,0200,0200,0000,0200,0000,0000,0200,	0200,0000,0000,0200,0000,0200,0200,0000,	0200,0000,0000,0200,0000,0200,0200,0000,	0000,0200,0200,0000,0200,0000,0000,0200,	0000,0200,0200,0000,0200,0000,0000,0200,	0200,0000,0000,0200,0000,0200,0200,0000,	0000,0200,0200,0000,0200,0000,0000,0200,	0200,0000,0000,0200,0000,0200,0200,0000,	0200,0000,0000,0200,0000,0200,0200,0000,	0000,0200,0200,0000,0200,0000,0000,0201};main(argc, argv)char **argv;{	register struct tab *tabp;	int tname;	tname = '0';	if (argc > 1)		tname = argv[1][0];	switch (tname) {	case '3':		/* adapt to connect speed (212) */		ioctl(0, TIOCGETP, &tmode);		if (tmode.sg_ispeed==B300)			tname = '0';		else			tname = '3';		break;	}	for (;;) {		for(tabp = itab; tabp < &itab[NITAB]; tabp++)			if(tabp->tname == tname)				break;		if(tabp >= &itab[NITAB])			tabp = itab;		tmode.sg_flags = tabp->iflags;		tmode.sg_ispeed = tabp->ispeed;		tmode.sg_ospeed = tabp->ospeed;		ioctl(0, TIOCSETP, &tmode);		ioctl(0, TIOCSETC, &tchars);		puts(tabp->message);		if(getname()) {			tmode.sg_erase = ERASE;			tmode.sg_kill = KILL;			tmode.sg_flags = tabp->fflags;			if(crmod)				tmode.sg_flags |= CRMOD;			if(upper)				tmode.sg_flags |= LCASE;			if(lower)				tmode.sg_flags &= ~LCASE;			stty(0, &tmode);			putchr('\n');			execl("/bin/login", "login", name, 0);			exit(1);		}		tname = tabp->nname;	}}getname(){	register char *np;	register c;	char cs;	crmod = 0;	upper = 0;	lower = 0;	np = name;	for (;;) {		if (read(0, &cs, 1) <= 0)			exit(0);		if ((c = cs&0177) == 0)			return(0);		if (c==EOT)			exit(1);		if (c=='\r' || c=='\n' || np >= &name[16])			break;		putchr(cs);		if (c>='a' && c <='z')			lower++;		else if (c>='A' && c<='Z') {			upper++;			c += 'a'-'A';		} else if (c==ERASE) {			if (np > name)				np--;			continue;		} else if (c==KILL) {			putchr('\r');			putchr('\n');			np = name;			continue;		} else if(c == ' ')			c = '_';		*np++ = c;	}	*np = 0;	if (c == '\r')		crmod++;	return(1);}puts(as)char *as;{	register char *s;	s = as;	while (*s)		putchr(*s++);}putchr(cc){	char c;	c = cc;	c |= partab[c&0177] & 0200;	write(1, &c, 1);}

⌨️ 快捷键说明

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