Commit | Line | Data |
---|---|---|
77184282 KM |
1 | static char sccsid[] = "@(#)sendberkmail.c 4.1 (Berkeley) %G%"; |
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 | } |