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