|
|
1.1 root 1: static char sccsid[] = "@(#)mwrite.c 4.1 (Berkeley) 9/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(<imeCur);
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(<imeSent);
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.