|
|
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: Returns 101 if can't exec mail program.
34: Returns 102 if can't read the utmp file.
35: */
36: # include "defs.h"
37: jmp_buf env;
38: main(argc,argv)
39: char **argv; {
40: long lutmptime, otime, ltimeSent, ltimeCur, ltimeElap;
41: int alarmint();
42: FILE *file;
43: int i;
44: struct utmp utmpstr;
45: char buf[BUFSIZ],*s;
46: char fromaddress[BUFSIZ], toaddress[BUFSIZ];
47: char ttynamestr[BUFSIZ], cmdstr[BUFSIZ], *stimeCur, stimeSent[20];
48: char src[10], stemp[BUFSIZ];
49: struct stat statbuf;
50:
51: debugflg = DBV;
52: argv[argc] = 0;
53: otime = 0;
54: src[0] = 0;
55: errno = 0;
56:
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: /* parse arguments */
67: for(i = 1; i < argc; i++){
68: if(argv[i][0] == '-')
69: switch(argv[i][1]){
70: case 't':
71: strcpy(toaddress,argv[++i]);
72: break;
73: case 'y':
74: strcpy(ttynamestr,argv[++i]);
75: break;
76: case 'x':
77: lutmptime = atol(argv[++i]);
78: break;
79: case 'f':
80: strcpy(fromaddress,argv[++i]);
81: break;
82: case 'c':
83: strcpy(cmdstr,argv[++i]);
84: break;
85: case 'e':
86: strcpy(stimeSent,argv[++i]);
87: break;
88: case 'r':
89: strcpy(src,argv[++i]);
90: break;
91: }
92: /* it is important that this code ignore unknown flags
93: so that options can be added w/o recompiling */
94: }
95:
96: ltimeSent=atol(stimeSent)+TIMEBASE;
97:
98: setjmp(env);
99: alarm(0);
100: signal(SIGCLK,alarmint);
101: if(errno != 100 && ttynamestr[0] && ttynamestr[8] != 'x'){
102: alarm(100);
103: file = fopen("/etc/utmp","r");
104: if(file == NULL){
105: perror("/etc/utmp");
106: exit(201);
107: }
108: while(fread(&utmpstr,1,sizeof utmpstr,file) == sizeof utmpstr){
109: # ifdef OLDTTY
110: if(utmpstr.ut_tty == ttynamestr[8]){
111: # else
112: if(strcmp(utmpstr.ut_line,ttynamestr+5) == 0){
113: # endif
114: otime = utmpstr.ut_time;
115: break;
116: }
117: }
118: fclose(file);
119: /*
120: debug("lutmptime %lo otime %lo",lutmptime,otime);
121: */
122: if(otime != 0 && otime == lutmptime) {
123: file = fopen(ttynamestr,"w");
124: if(file != NULL && fstat(fileno(file),&statbuf) != -1
125: && (statbuf.st_mode&02)){
126: if(src[0] != 0)sprintf(stemp,", R: %s",src);
127: else stemp[0] = 0;
128: ltimeCur = gettime();
129: stimeCur = ctime(<imeCur);
130: stimeCur += 11;
131: stimeCur[strlen(stimeCur)-9] = 0;
132: fprintf(file,
133: "\r\nMessage from %s at %s ...\r\n",
134: fromaddress, stimeCur);
135: if(cmdstr[0] != 0){
136: s = ctime(<imeSent);
137: s[strlen(s)-6] = 0;
138: ltimeElap = ltimeCur - ltimeSent;
139: fprintf(file,
140: "(command: %s%s, sent %s, took %s)\r\n",
141: cmdstr,stemp,s,comptime(ltimeElap));
142: }
143: while(fgets(buf,BUFSIZ,stdin) != NULL){
144: fputs(buf,file);
145: fputc('\r',file);
146: }
147: fprintf(file,"------\r\n");
148: exit(0);
149: }
150: }
151: }
152:
153: /* well, couldn't write to him, so we'll mail to him on this mach */
154: /* mail to "toaddress", saying its from "fromaddress", about a command
155: "cmdstr", which was sent at time "stimeSent" */
156:
157: sprintf(stimeSent,"%ld",ltimeSent);
158: if(cmdstr[0] != 0){
159: if(src[0] != 0)
160: mexecl(MMAILCMD,"mmail", "-r",src, "-c",cmdstr,
161: "-e",stimeSent,"-f",fromaddress,
162: "-t",toaddress,"-z",0);
163: else
164: mexecl(MMAILCMD,"mmail", "-c",cmdstr, "-e",stimeSent,
165: "-f",fromaddress, "-t",toaddress,"-z",0);
166: }
167: else
168: mexecl(MMAILCMD,"mmail", "-f",fromaddress, "-t",toaddress,
169: "-z", 0);
170: exit(101);
171: }
172: alarmint(){
173: errno = 100;
174: signal(SIGCLK,SIG_IGN); /* alarm off */
175: longjmp(env,0); /* ugh */
176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.