|
|
1.1 ! root 1: static char sccsid[] = "@(#)mmail.c 4.1 (Berkeley) 9/12/82"; ! 2: ! 3: # include "defs.h" ! 4: /* sccs id variable */ ! 5: static char *mmail_sid = "@(#)mmail.c 1.2"; ! 6: ! 7: /* ! 8: Mmail is a berkeley network internal command. ! 9: It is executed locally by the mwrite command, ! 10: and from a remote machine by the sendberkmail command. ! 11: Its purpose is to send mail to a user on this ! 12: machine using the system mail program. ! 13: ! 14: Archaic Usage: ! 15: ! 16: mmail [-commandsent -timesent] fromuser frommach touser ! 17: ! 18: Correct Usage: ! 19: mmail [-c commandsent] [-e timesent] [-f fromaddress] [-t toaddress] ! 20: [-h hopcnt] [-r rc] [-z] ! 21: ! 22: The mwrite command uses all the options. ! 23: The sendberkmail command does not use the commandsend, timesent and rc ! 24: options. ! 25: Timesent is time in seconds since 1901 in decimal, as returned by time(). ! 26: Frommach is a multi-character name, not a single letter. ! 27: Rc is the return code (exit code>>8) of the command. ! 28: ! 29: Assumptions about the system mail command: ! 30: 1. We assume there is an optional argument "-r" which can be added to mail. ! 31: Mail argument format (two choices): ! 32: ! 33: mail -r fromaddress toaddress ! 34: ! 35: which becomes mail from "fromaddress" instead of "network". ! 36: ! 37: 2. We assume that mail accepts the "-h hopcnt" flag, and passes it thru ! 38: unchanged to the sendberkmail program. The hopcnt is incremented everytime ! 39: it passes thru mmail, so inifinite mail forwarding is detected. ! 40: Since both the from and to addresses cycle, it there is infinite looping ! 41: we simply mail to root to that effect and throw away the mail. ! 42: ! 43: ! 44: If this argument scheme looks flakey it is because I screwed up ! 45: in the argument design. With the network now up to 10 machines, ! 46: I can't add another parameter to the internal commands of the network ! 47: like mmail and mwrite. If I had used labeled parms instead of ! 48: positional parms, I would be able to add more options/info ! 49: without having to recompile all code... ! 50: ! 51: exit codes: ! 52: normally returns the exit code from the mail program ! 53: ! 54: */ ! 55: main(argc,argv) ! 56: char **argv; { ! 57: int n, ret, i, hopcnt = 0, pid; ! 58: char *sargv[20], *cmdstr=NULL, buf[BUFSIZ], *timestr, ! 59: fromaddress[BUFSIZ]; ! 60: char toaddress[BUFSIZ], src[20], snFrom[BUFSIZ], snto[BUFSIZ], ! 61: mchFrom, mchto, stemp[BUFSIZ], fisresponse = 0; ! 62: long timesent = TIMEBASE, el; ! 63: FILE *fdm; ! 64: ! 65: debugflg = DBV; ! 66: src[0] = 0; ! 67: ! 68: /* parse old format positional parms */ ! 69: if(argv[1][0] == '-'){ ! 70: cmdstr = argv[1] + 1; ! 71: timesent = atol(argv[2] + 1); ! 72: sprintf(fromaddress,"%s:%s",argv[4],argv[3]); ! 73: strcpy(toaddress,argv[5]); ! 74: } ! 75: else { ! 76: sprintf(fromaddress,"%s:%s",argv[2],argv[1]); ! 77: strcpy(toaddress,argv[3]); ! 78: } ! 79: argv[argc] = 0; ! 80: ! 81: /* parse labeled parameters */ ! 82: /* prob because of -cmd in arg1 and arg2 */ ! 83: for(i = 1; i < argc; i++){ ! 84: if(argv[i][0] == '-' && argv[i][2] == 0) ! 85: switch(argv[i][1]){ ! 86: case 'f': ! 87: strcpy(fromaddress,argv[++i]); ! 88: break; ! 89: case 'c': ! 90: cmdstr = argv[++i]; ! 91: break; ! 92: case 'e': ! 93: timesent = atol(argv[++i]); ! 94: break; ! 95: case 't': ! 96: strcpy(toaddress,argv[++i]); ! 97: break; ! 98: case 'h': ! 99: hopcnt = atoi(argv[++i]); ! 100: break; ! 101: case 'r': ! 102: strcpy(src,argv[++i]); ! 103: break; ! 104: case 'z': ! 105: fisresponse++; ! 106: break; ! 107: /* it is important there be no error if an unknown ! 108: flag is encountered */ ! 109: } ! 110: } ! 111: mchFrom = MchSFromAddr(snFrom,fromaddress); ! 112: ! 113: /* compute time send */ ! 114: timestr = ctime(×ent); ! 115: timestr[strlen(timestr) - 6] = 0; ! 116: el = gettime() - timesent; ! 117: ! 118: /* check the hopcnt */ ! 119: hopcnt++; ! 120: if(hopcnt > MAXHOPS)hopcnterr(toaddress, hopcnt); ! 121: ! 122: /* analyze the dest, if local, strip off mach name, otherwise ok */ ! 123: mchto = MchSFromAddr(snto,toaddress); ! 124: if(mchto == local)strcpy(toaddress,snto); ! 125: ! 126: /* it is important to realize that mmail is executed ! 127: either as root, network, or the USER! ! 128: So the -r option must be accepted (and possibly ignored) ! 129: by the mail program if the user is a reandom user. ! 130: */ ! 131: /* now we fork off a mail command. if fisresponse, then ! 132: we are "cautious" and don't use mail forwarders */ ! 133: ! 134: fdm = mailopen(toaddress, fromaddress, fisresponse, hopcnt); ! 135: if(cmdstr != NULL){ ! 136: if(src[0] != 0)sprintf(stemp,", R: %s", src); ! 137: else stemp[0] = 0; ! 138: fprintf(fdm,"Subject: \"%s\"%s, sent %s, took %s\n", ! 139: cmdstr,stemp,timestr,comptime(el)); ! 140: } ! 141: while((n = fread(buf,1,BUFSIZ,stdin)) > 0) ! 142: fwrite(buf,1,n,fdm); ! 143: ret = mailclose(fdm); ! 144: ret >>= 8; ! 145: if(ret != 0) ! 146: fprintf(stderr, ! 147: "Non-zero return code (%d) from the mail program.\n",ret); ! 148: exit(ret); ! 149: } ! 150: /* ! 151: hopcnterr() ! 152: ! 153: there appears to be infinite mail forwarding - ! 154: as detected by the hop count. Mail to root and give up. ! 155: Both the from and to addresses are cycling, so mail ! 156: can't be sent there. ! 157: */ ! 158: hopcnterr(toaddress,hopcnt) ! 159: char *toaddress; ! 160: int hopcnt; ! 161: { ! 162: char cmdstr[BUFSIZ]; ! 163: int rcode; ! 164: sprintf(cmdstr,"echo infinite mail loop for %s hops %d | mail root", ! 165: toaddress,hopcnt); ! 166: rcode = system(cmdstr); ! 167: exit(EX_OSERR); ! 168: /*UNREACHED*/ ! 169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.