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

📄 lpr.c

📁 UNIX v6源代码 这几乎是最经典的unix版本 unix操作系统设计和莱昂氏unix源代码分析都是用的该版
💻 C
字号:
/* *	dpr -- off line print via dataphone daemon to GCOS *		normally invoked through opr */char	tfname[]	"/usr/lpd/tfaXXXXX";char	cfname[]	"/usr/lpd/cfaXXXXX";char	lfname[]	"/usr/lpd/lfaXXXXX";char	dfname[]	"/usr/lpd/dfaXXXXX";int	nact;int	tff;int	mailflg;char	person[10];int	inchar;int	maxrec	1000;main(argc, argv)int argc;char *argv[];{	register char *arg;	int c, f, flag;	int out();	pidfn();	if((signal(1, 1) & 01) == 0)		signal(1, out);	if((signal(2, 1) & 01) == 0)		signal(2, out);	if((signal(3, 1) & 01) == 0)		signal(3, out);	flag = 0;	tff = nfile(tfname);	while (argc>1 && (arg = argv[1])[0]=='-') {		switch (arg[1]) {		case 'c':			flag = '+';			break;		case 'r':			flag = '-';			break;		case 'm':			mailflg = 1;			break;		}		argc--;		argv++;	}	ident();	if(argc == 1)		copy(0);	while(--argc) {		arg = *++argv;		if(flag == '+')			goto cf;		if(*arg == '/' && flag != '-') {			card('F', arg);			nact++;			continue;		}		if(link(arg, lfname) < 0)			goto cf;		card('F', lfname);		card('U', lfname);		lfname[inchar]++;		nact++;		goto df;	cf:		f = open(arg, 0);		if(f < 0) {			printf("Cannot open %s\n", arg);			continue;		}		copy(f);		close(f);	df:		if(flag == '-') {			f = unlink(arg);			if(f < 0)				printf("Cannot remove %s\n", arg);		}	}	if(nact) {		tfname[inchar]--;		f = link(tfname, dfname);		if(f < 0) {			printf("Cannot rename %s\n", dfname);			tfname[inchar]++;			out();		}		unlink(tfname);		execl("/etc/lpd", "lpd", 0);		dfname[inchar]++;	}	out();}copy(f)int f;{	int ff, i, nr, nc;	static int buf[256];	card('F', cfname);	card('U', cfname);	ff = nfile(cfname);	nc = 0;	nr = 0;	while((i = read(f, buf, 512)) > 0) {		write(ff, buf, i);		nc =+ i;		if(nc >= 512) {			nc =- 512;			nr++;			if(nr > maxrec) {				printf("Copy file is too large\n");				break;			}		}	}	close(ff);	nact++;}card(c, s)int c;char s[];{	char *p1, *p2;	static char buf[512];	int col;	p1 = buf;	p2 = s;	col = 0;	*p1++ = c;	while((c = *p2++) != '\0') {		*p1++ = c;		col++;	}	*p1++ = '\n';	write(tff, buf, col+2);}ident(){	int c, n;	register char *b1p, *pp, *b2p;	static char b1[100], b2[100];	b1p = b1;	if(getpw(getuid(), b1p)) {		b1p = "pdp::::m0000,m000:";	}	n = 0;	b2p = b2;	while(*b2p++ = "$	ident	"[n++]);	b2p--;	n = 5;	while(--n) while(*b1p++ != ':');	while((*b2p++ = *b1p++) != ':');	b2p[-1] = ',';	b1p = b1;	pp = person;	while((c = *b1p++) != ':') {		*b2p++ = c;		*pp++ = c;	}	*b2p++ = 0;	*pp++ = 0;	card('L', b2);	if (mailflg)		card('M', person);}pidfn(){	register i, j, c;	int p;	p = getpid();	i = 0;	while(tfname[i] != 'X')		i++;	i =+ 4;	for(j=0; j<5; j++) {		c = (p%10) + '0';		p =/ 10;		tfname[i] = c;		cfname[i] = c;		lfname[i] = c;		dfname[i] = c;		i--;	}	inchar = i;}nfile(name)char *name;{	register f;	f = creat(name, 0666);	if(f < 0) {		printf("Cannot create %s\n", name);		out();	}	name[inchar]++;	return(f);}out(){	register i;	signal(1, 1);	signal(1, 2);	signal(1, 3);	i = inchar;	while(tfname[i] != 'a') {		tfname[i]--;		unlink(tfname);	}	while(cfname[i] != 'a') {		cfname[i]--;		unlink(cfname);	}	while(lfname[i] != 'a') {		lfname[i]--;		unlink(lfname);	}	while(dfname[i] != 'a') {		dfname[i]--;		unlink(dfname);	}	exit();}

⌨️ 快捷键说明

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