|
|
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.