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

📄 write.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
/* * write to another user */#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <signal.h>#include <utmp.h>char	*strcat();char	*strcpy();struct	utmp ubuf;int	signum[] = {SIGHUP, SIGINT, SIGQUIT, 0};char	me[10]	= "???";char	*him;char	*mytty;char	histty[32];char	*histtya;char	*ttyname();char	*rindex(), *index();int	logcnt;int	eof();int	timout();FILE	*tf;main(argc, argv)char *argv[];{	struct stat stbuf;	register i;	register FILE *uf;	int c1, c2;	if(argc < 2) {		printf("usage: write user [ttyname]\n");		exit(1);	}	him = argv[1];	if(argc > 2)		histtya = argv[2];	if ((uf = fopen("/etc/utmp", "r")) == NULL) {		printf("cannot open /etc/utmp\n");		goto cont;	}	mytty = ttyname(2);	if (mytty == NULL) {		printf("Can't find your tty\n");		exit(1);	}	mytty = index(mytty+1, '/') + 1;	if (histtya) {		strcpy(histty, "/dev/");		strcat(histty, histtya);	}	while (fread((char *)&ubuf, sizeof(ubuf), 1, uf) == 1) {		if (strcmp(ubuf.ut_line, mytty)==0) {			for(i=0; i<8; i++) {				c1 = ubuf.ut_name[i];				if(c1 == ' ')					c1 = 0;				me[i] = c1;				if(c1 == 0)					break;			}		}		if(him[0] != '-' || him[1] != 0)		for(i=0; i<8; i++) {			c1 = him[i];			c2 = ubuf.ut_name[i];			if(c1 == 0)				if(c2 == 0 || c2 == ' ')					break;			if(c1 != c2)				goto nomat;		}		logcnt++;		if (histty[0]==0) {			strcpy(histty, "/dev/");			strcat(histty, ubuf.ut_line);		}	nomat:		;	}cont:	if (logcnt==0 && histty[0]=='\0') {		printf("%s not logged in.\n", him);		exit(1);	}	fclose(uf);	if (histtya==0 && logcnt > 1) {		printf("%s logged more than once\nwriting to %s\n", him, histty+5);	}	if(histty[0] == 0) {		printf(him);		if(logcnt)			printf(" not on that tty\n"); else			printf(" not logged in\n");		exit(1);	}	if (access(histty, 0) < 0) {		printf("%s: ", histty);		printf("No such tty\n");		exit(1);	}	signal(SIGALRM, timout);	alarm(5);	if ((tf = fopen(histty, "w")) == NULL)		goto perm;	alarm(0);	if (fstat(fileno(tf), &stbuf) < 0)		goto perm;	if ((stbuf.st_mode&02) == 0)		goto perm;	sigs(eof);	fprintf(tf, "Message from ");#ifdef interdata	fprintf(tf, "(Interdata) " );#endif	fprintf(tf, "%s %s...\n", me, mytty);	fflush(tf);	for(;;) {		char buf[128];		i = read(0, buf, 128);		if(i <= 0)			eof();		if(buf[0] == '!') {			buf[i] = 0;			ex(buf);			continue;		}		write(fileno(tf), buf, i);	}perm:	printf("Permission denied\n");	exit(1);}timout(){	printf("Timeout opening his tty\n");	exit(1);}eof(){	fprintf(tf, "EOF\n");	exit(0);}ex(bp)char *bp;{	register i;	sigs(SIG_IGN);	i = fork();	if(i < 0) {		printf("Try again\n");		goto out;	}	if(i == 0) {		sigs((int (*)())0);		execl("/bin/sh", "sh", "-c", bp+1, 0);		exit(0);	}	while(wait((int *)NULL) != i)		;	printf("!\n");out:	sigs(eof);}sigs(sig)int (*sig)();{	register i;	for(i=0;signum[i];i++)		signal(signum[i],sig);}

⌨️ 快捷键说明

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