|
|
1.1 ! root 1: static char sccsid[] = "@(#)sendberkmail.c 4.1 (Berkeley) 9/12/82"; ! 2: ! 3: # include "defs.h" ! 4: ! 5: /* ! 6: Usage: ! 7: sendberkmail [-m mach ] [-f addrfrom] [-h hopcnt] -t addrto ! 8: ! 9: Archaic Usage: ! 10: sendberkmail mach:user ! 11: ! 12: Send remote mail to user on mach. ! 13: Only one addrto allowed. ! 14: ! 15: Sendberkmail uses the network to send an mmail command ! 16: to the remote machine. It specifies the source, destination, ! 17: and a hop count only. ! 18: ! 19: Sendberkmail uses the -q option of net, so only error msgs ! 20: and non-zero return codes will be sent back. ! 21: ! 22: It is best to think of sendberkmail as a transport mechanism: ! 23: It takes mail from one machine to another machine (specified ! 24: using the -m option) and executes the local mail program ! 25: there with a to-address of "addrto", and a from-address ! 26: of "addrfrom". If the -m option is not given, it parses the ! 27: "addrto" field to get a berkeley network address. ! 28: This extreme generality is necessary when destinations are on ! 29: different networks, consider a command from the Ing70: ! 30: ! 31: sendberkmail -m csvax -f schmidt@parc -t research!chuck ! 32: ! 33: This is clearly a forwarding function- send mail from the Arpanet ! 34: to the Bell Net, which calls our CSVAX. ! 35: Alternatively, executed on the CSVAX, ! 36: sendberkmail -m ing70 -f research!chuck -t schmidt@parc ! 37: sends mail the other way. ! 38: ! 39: There is duplication in the arguments because of ! 40: a need to convert to labelled parameters. ! 41: See the note in mmail.c to that effect. ! 42: ! 43: ! 44: Options: ! 45: -t addrto mail command on remote machine will be ! 46: fed "addrto" as address ! 47: -f addrfrom mail will be "From" addrfrom ! 48: -m mach send this mail to the "mach" machine ! 49: -h hopcnt if this hopcnt hits a threshold, there ! 50: is presumed to be an infinite loop. ! 51: ! 52: */ ! 53: main(argc,argv) ! 54: char **argv; { ! 55: char addrto[BUFSIZ], addrfrom[BUFSIZ], *sn; ! 56: char mchto = 0, snto[BUFSIZ], snfrom[BUFSIZ], smchto[20], mchfrom; ! 57: int cmdstr[BUFSIZ], hopcntstr[20]; ! 58: char rcmd[BUFSIZ]; ! 59: int hopcnt = 0; ! 60: ! 61: argc[argv] = 0; ! 62: debugflg = DBV; ! 63: addrfrom[0] = 0; ! 64: addrto[0] = 0; ! 65: ! 66: while(argc > 1 && argv[1][0] == '-'){ ! 67: argc--; argv++; ! 68: switch(argv[0][1]){ ! 69: case 'f': ! 70: harg(addrfrom); ! 71: break; ! 72: case 'h': ! 73: harg(hopcntstr); ! 74: hopcnt = atoi(hopcntstr); ! 75: break; ! 76: case 'm': ! 77: harg(smchto); ! 78: mchto = lookup(smchto); ! 79: break; ! 80: case 't': ! 81: harg(addrto); ! 82: break; ! 83: /* it is important to ignore unknown flags ! 84: for compatibility reasons */ ! 85: } ! 86: } ! 87: ! 88: /* handle to address */ ! 89: if(argc > 1)strcpy(addrto,argv[1]); ! 90: if(addrto[0] == 0){ ! 91: fprintf(stderr,"Usage: sendberkmail mach:user\n"); ! 92: exit(EX_USAGE); ! 93: } ! 94: if(mchto == 0) ! 95: mchto = MchSFromAddr(snto,addrto); ! 96: else ! 97: strcpy(snto,addrto); ! 98: if(mchto == 0){ ! 99: fprintf(stderr,"Unknown host %s\n",addrto); ! 100: exit(EX_NOHOST); ! 101: }; ! 102: if(mchto == local){ ! 103: fprintf(stderr, ! 104: "Use mail to send to %s on this machine. Mail not delivered.\n", ! 105: addrto); ! 106: exit(EX_NOUSER); ! 107: } ! 108: sprintf(rcmd,"mail %s",addrto); ! 109: ! 110: /* handle from address */ ! 111: if(addrfrom[0] == 0){ ! 112: char name[100]; ! 113: SnCurrent(name); ! 114: sprintf(addrfrom,"%s:%s",longname(local),name); ! 115: } ! 116: mchfrom = MchSFromAddr(snfrom,addrfrom); ! 117: ! 118: /* uses new options of mmail */ ! 119: /* X's are for compatibility with mmail */ ! 120: sprintf(cmdstr,"%s XXX XXX XXX -f '%s' -t '%s' -h %d", MMAILCMD, ! 121: addrfrom,addrto,hopcnt); ! 122: /* old code: ! 123: sprintf(cmdstr,"%s '%s' %s '%s'", MMAILCMD,snfrom, ! 124: longname(mchfrom),snto); ! 125: */ ! 126: ! 127: ! 128: mexecl(netcmd,"net","-m",longname(mchto),"-q","-l","network", ! 129: "-","-c",rcmd,cmdstr,0); ! 130: perror(netcmd); ! 131: fprintf(stderr,"Network is down\n"); ! 132: exit(EX_UNAVAILABLE); ! 133: } ! 134: ! 135: SnCurrent(name) ! 136: char *name; ! 137: { ! 138: char *sn; ! 139: sn = getlogin(); ! 140: if(sn == NULL || *sn == 0 || *sn == ' '){ ! 141: struct passwd *pwd; ! 142: pwd = getpwuid(getuid()); /* will read passwd file */ ! 143: if(pwd != NULL) sn = pwd->pw_name; ! 144: if(sn == NULL){ ! 145: fprintf(stderr,"Who are you?\n"); ! 146: exit(EX_OSERR); ! 147: } ! 148: } ! 149: strcpy(name, sn); ! 150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.