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