xref: /csrg-svn/old/berknet/mwrite.c (revision 8189)
1*8189Smckusick static char sccsid[] = "@(#)mwrite.c	4.1	(Berkeley)	09/12/82";
2*8189Smckusick 
3*8189Smckusick /* sccs id variable */
4*8189Smckusick static char *mwrite_sid = "@(#)mwrite.c	1.2";
5*8189Smckusick /*
6*8189Smckusick 
7*8189Smckusick 	Mwrite provides the "response" function in the network.
8*8189Smckusick 	It sends its standard input to "toaddress", either by opening
9*8189Smckusick 	his terminal and writing on it, or by mailing it to him.
10*8189Smckusick 	It is executed by a remote machine from netdameon.c, either for a
11*8189Smckusick 	response to be sent back or an errormsg to be sent back.
12*8189Smckusick 	It excutes mmail locally if it needs to.
13*8189Smckusick 
14*8189Smckusick Archaic Usage:
15*8189Smckusick 	mwrite toaddress ttystr lutmptime fmach fuser [command ltimeSent]
16*8189Smckusick 
17*8189Smckusick New Usage:
18*8189Smckusick 	mwrite [-t toaddress] [-f fromaddress] [-x lutmptime]
19*8189Smckusick 		[-c command] [-y ttystr] [-e ltimeSent] [-r rc]
20*8189Smckusick 
21*8189Smckusick 	fmach is a single letter.
22*8189Smckusick 	ttystr is the full name, e.g. /dev/tty0
23*8189Smckusick 	ltimeSent is number of secs since TIMEBASE in decimal.
24*8189Smckusick 	lutmptime is the login time from utmp in OCTAL in the old protocol
25*8189Smckusick 	and in decimal in the new protocol.
26*8189Smckusick 	rc is the decimal return code (exit code>>8) of the command.
27*8189Smckusick 	command and ltimeSent are optional.
28*8189Smckusick 
29*8189Smckusick 	There is duplication in this argument list.
30*8189Smckusick 	See the note in mmail.c about this stuff.
31*8189Smckusick 
32*8189Smckusick 	Mwrite must be setuid bin or setuid root, to get in group 0,
33*8189Smckusick 	on the CC machines, in order to write on the user's terminal.
34*8189Smckusick 
35*8189Smckusick 	Exit Codes:
36*8189Smckusick 		Returns 0 if the writing on the terminal works.
37*8189Smckusick 		Returns the return code of the mmail program if this is mailed.
38*8189Smckusick */
39*8189Smckusick # include "defs.h"
40*8189Smckusick jmp_buf env;
main(argc,argv)41*8189Smckusick main(argc,argv)
42*8189Smckusick   char **argv; {
43*8189Smckusick 	long lutmptime, otime, ltimeSent, ltimeCur, ltimeElap;
44*8189Smckusick 	int alarmint();
45*8189Smckusick 	FILE *file;
46*8189Smckusick 	int i;
47*8189Smckusick 	struct utmp *putmp;
48*8189Smckusick 	char buf[BUFSIZ],*s;
49*8189Smckusick 	char fromaddress[BUFSIZ], toaddress[BUFSIZ];
50*8189Smckusick 	char ttynamestr[BUFSIZ], cmdstr[BUFSIZ], *stimeCur, stimeSent[20];
51*8189Smckusick 	char src[10], stemp[BUFSIZ];
52*8189Smckusick 	struct stat statbuf;
53*8189Smckusick 
54*8189Smckusick 	debugflg = DBV;
55*8189Smckusick 	argv[argc] = 0;
56*8189Smckusick 	otime = 0;
57*8189Smckusick 	src[0] = 0;
58*8189Smckusick 	errno = 0;
59*8189Smckusick 
60*8189Smckusick 	/* NO LONGER NEEDED */
61*8189Smckusick 	strcpy(toaddress,argv[1]);
62*8189Smckusick 	strcpy(ttynamestr,argv[2]);
63*8189Smckusick 	sscanf(argv[3],"%lo",&lutmptime);
64*8189Smckusick 	sprintf(fromaddress,"%s:%s",longname(argv[4][0]),argv[5]);
65*8189Smckusick 	if(argc > 6)strcpy(cmdstr,argv[6]);
66*8189Smckusick 	else cmdstr[0] = 0;
67*8189Smckusick 	if(argc > 7)strcpy(stimeSent,argv[7]);
68*8189Smckusick 	else stimeSent[0] = 0;
69*8189Smckusick 
70*8189Smckusick 	/* parse arguments */
71*8189Smckusick 	for(i = 1; i < argc; i++){
72*8189Smckusick 		if(argv[i][0] == '-')
73*8189Smckusick 		switch(argv[i][1]){
74*8189Smckusick 		case 't':
75*8189Smckusick 			strcpy(toaddress,argv[++i]);
76*8189Smckusick 			break;
77*8189Smckusick 		case 'y':
78*8189Smckusick 			strcpy(ttynamestr,argv[++i]);
79*8189Smckusick 			break;
80*8189Smckusick 		case 'x':
81*8189Smckusick 			lutmptime = atol(argv[++i]);
82*8189Smckusick 			break;
83*8189Smckusick 		case 'f':
84*8189Smckusick 			strcpy(fromaddress,argv[++i]);
85*8189Smckusick 			break;
86*8189Smckusick 		case 'c':
87*8189Smckusick 			strcpy(cmdstr,argv[++i]);
88*8189Smckusick 			break;
89*8189Smckusick 		case 'e':
90*8189Smckusick 			strcpy(stimeSent,argv[++i]);
91*8189Smckusick 			break;
92*8189Smckusick 		case 'r':
93*8189Smckusick 			strcpy(src,argv[++i]);
94*8189Smckusick 			break;
95*8189Smckusick 		}
96*8189Smckusick 		/* it is important that this code ignore unknown flags
97*8189Smckusick 		   so that options can be added w/o recompiling */
98*8189Smckusick 	}
99*8189Smckusick 
100*8189Smckusick 	ltimeSent=atol(stimeSent)+TIMEBASE;
101*8189Smckusick 
102*8189Smckusick 	setjmp(env);
103*8189Smckusick 	alarm(0);
104*8189Smckusick 	signal(SIGALRM,alarmint);
105*8189Smckusick 	if(errno != 100 && ttynamestr[0] && ttynamestr[8] != 'x'){
106*8189Smckusick 		alarm(100);
107*8189Smckusick 		putmp = getutmp(ttynamestr);
108*8189Smckusick 		if(putmp != NULL) otime = putmp->ut_time;
109*8189Smckusick 		/*
110*8189Smckusick 		debug("lutmptime %lo otime %lo",lutmptime,otime);
111*8189Smckusick 		*/
112*8189Smckusick 		if(otime != 0 && otime == lutmptime) {
113*8189Smckusick 			file = fopen(ttynamestr,"w");
114*8189Smckusick 			if(file != NULL && fstat(fileno(file),&statbuf) !=  -1
115*8189Smckusick 				&& (statbuf.st_mode&02)){
116*8189Smckusick 				alarm(0);
117*8189Smckusick 				if(src[0] != 0)sprintf(stemp,", R: %s",src);
118*8189Smckusick 				else stemp[0] = 0;
119*8189Smckusick 				ltimeCur = gettime();
120*8189Smckusick 				stimeCur = ctime(&ltimeCur);
121*8189Smckusick 				stimeCur += 11;
122*8189Smckusick 				stimeCur[strlen(stimeCur)-9] = 0;
123*8189Smckusick 				fprintf(file,
124*8189Smckusick 					"\r\nMessage from %s at %s ...\r\n",
125*8189Smckusick 					fromaddress, stimeCur);
126*8189Smckusick 				if(cmdstr[0] != 0){
127*8189Smckusick 					s = ctime(&ltimeSent);
128*8189Smckusick 					s[strlen(s)-6] = 0;
129*8189Smckusick 					ltimeElap = ltimeCur - ltimeSent;
130*8189Smckusick 					fprintf(file,
131*8189Smckusick 					"(command: %s%s, sent %s, took %s)\r\n",
132*8189Smckusick 					cmdstr,stemp,s,comptime(ltimeElap));
133*8189Smckusick 				}
134*8189Smckusick 				while(fgets(buf,BUFSIZ,stdin) != NULL){
135*8189Smckusick 					fputs(buf,file);
136*8189Smckusick 					fputc('\r',file);
137*8189Smckusick 				}
138*8189Smckusick 				fprintf(file,"------\r\n");
139*8189Smckusick 				exit(EX_OK);
140*8189Smckusick 				}
141*8189Smckusick 			}
142*8189Smckusick 		}
143*8189Smckusick 
144*8189Smckusick 	/* well, couldn't write to him, so we'll mail to him on this mach */
145*8189Smckusick 	/* mail to "toaddress", saying its from "fromaddress", about a command
146*8189Smckusick 	   "cmdstr", which was sent at time "stimeSent" */
147*8189Smckusick 
148*8189Smckusick 	alarm(0);
149*8189Smckusick 	sprintf(stimeSent,"%ld",ltimeSent);
150*8189Smckusick 	if(cmdstr[0] != 0){
151*8189Smckusick 		if(src[0] != 0)
152*8189Smckusick 			mexecl(MMAILCMD,"mmail", "-r",src, "-c",cmdstr,
153*8189Smckusick 				"-e",stimeSent,"-f",fromaddress,
154*8189Smckusick 				"-t",toaddress,"-z",0);
155*8189Smckusick 		else
156*8189Smckusick 			mexecl(MMAILCMD,"mmail", "-c",cmdstr, "-e",stimeSent,
157*8189Smckusick 				"-f",fromaddress, "-t",toaddress,"-z",0);
158*8189Smckusick 	}
159*8189Smckusick 	else
160*8189Smckusick 		mexecl(MMAILCMD,"mmail", "-f",fromaddress, "-t",toaddress,
161*8189Smckusick 			"-z", 0);
162*8189Smckusick 	perror(MMAILCMD);
163*8189Smckusick 	exit(EX_UNAVAILABLE);
164*8189Smckusick }
alarmint()165*8189Smckusick alarmint(){
166*8189Smckusick 	errno = 100;
167*8189Smckusick 	signal(SIGALRM,SIG_IGN);		/* alarm off */
168*8189Smckusick 	longjmp(env,0);			/* ugh */
169*8189Smckusick 	}
170