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(&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:     }

Defined functions

alarmint defined in line 165; used 2 times
main defined in line 41; never used

Defined variables

env defined in line 40; used 2 times
mwrite_sid defined in line 4; never used
sccsid defined in line 1; never used
Last modified: 1982-09-13
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 836
Valid CSS Valid XHTML 1.0 Strict