|
|
1.1 root 1: /*
2: **
3: ** rmail/smail - UUCP mailer with automatic routing.
4: **
5: ** Christopher Seiwald /+\
6: ** [email protected] +\
7: ** January, 1985 \+/
8: **
9: */
10:
11: #ifndef lint
12: static char *sccsid="@(#)main.c 2.5 (smail) 9/15/87";
13: #endif
14:
15: /*
16: **
17: ** usage: rmail [options] address...
18: ** smail [options] address...
19: ** options:
20: ** -d debug - verbose and don't invoke mailers.
21: ** -v verbose - just verbose.
22: ** -A print mapped addresses. don't invoke mailers.
23: ** -h hostname set hostname
24: ** -H hostdomain set hostdomain (default hostname.MYDOM)
25: ** -p pathfile path database filename
26: ** -r force routing of host!address
27: ** -R reroute even explicit path!user
28: ** -l user@domain goes to local mailer
29: ** -L all mail goes local
30: ** -q number mail queueing cost threshold
31: ** -m number limit on number of uux_noqueue jobs
32: ** -u string string of flags for uux
33: ** -F address name to substitute in From: line
34: ** -a aliasfile aliases filename (not used with SENDMAIL)
35: ** -n namelist list of full names for simple aliases
36: */
37:
38: #include <stdio.h>
39: #include <ctype.h>
40: #include "defs.h"
41:
42: void close_fds();
43:
44: int exitstat = 0; /* exit status, set by resolve, deliver */
45:
46: enum edebug debug = NO; /* set by -d or -v option */
47: enum ehandle handle = HANDLE; /* which mail we can handle, see defs.h */
48: enum erouting routing = ROUTING;/* to route or not to route, see defs.h */
49:
50: char hostname[SMLBUF] = ""; /* set by -h, defaults in defs.h */
51: char hostdomain[SMLBUF] = ""; /* set by -H, defaults in defs.h */
52: char hostuucp[SMLBUF] = ""; /* built with hostname+".UUCP" */
53:
54: char *pathfile = PATHS; /* or set by -p */
55: char *uuxargs = NULL; /* or set by -u */
56:
57: char *aliasfile =
58: #ifdef ALIAS
59: ALIAS; /* or set by -a */
60: #else
61: NULL;
62: #endif
63:
64: #ifdef HOMEALIASES
65: char *homealias;
66: #endif
67:
68: char *fnlist =
69: #ifdef FULLNAME
70: FULLNAME; /* or set by -n */
71: #else
72: NULL;
73: #endif
74:
75: int queuecost = QUEUECOST; /* or set by -q */
76: char *from_addr = NULL; /* or set by -F */
77: int maxnoqueue = MAXNOQUEUE; /* or set by -m */
78:
79: int getcost =
80: #ifdef GETCOST
81: 1; /* get cost of path even if not routing */
82: #else
83: 0;
84: #endif
85:
86: char *spoolfile = NULL; /* name of the file containing letter */
87: FILE *spoolfp; /* file pointer to spoolfile */
88: int spoolmaster = 0; /* indicates 'control' of spoolfile */
89:
90: void spool();
91:
92:
93: /*
94: **
95: ** rmail/smail: mail stdin letter to argv addresses.
96: **
97: ** After processing command line options and finding our host and domain
98: ** names, we map addresses into <host,user,form,cost> sets. Then we deliver.
99: **
100: */
101:
102: main(argc, argv)
103: int argc;
104: char *argv[];
105: {
106: char *hostv[MAXARGS]; /* UUCP neighbor */
107: char *userv[MAXARGS]; /* address given to host */
108: int costv[MAXARGS]; /* cost of resolved route */
109: enum eform formv[MAXARGS]; /* invalid, local, or uucp */
110: char *p;
111: int c;
112: int printaddr = 0; /* or set by -A */
113: int nargc;
114: char **nargv, **alias();
115:
116: char *optstr = "cdvArRlLH:h:p:u:q:a:n:m:f:F:";
117: extern char *optarg;
118: extern int optind;
119:
120: /* Clean up any open file descriptors which may have been
121: dumped on us.
122: */
123: (void) close_fds();
124:
125: /*
126: ** see if we aren't invoked as rmail
127: */
128: if((p = rindex(argv[0], '/')) == NULL) {
129: p = argv[0];
130: } else {
131: p++;
132: }
133:
134: if(*p != 'r' ) {
135: handle = ALL;
136: }
137:
138: /*
139: ** Process command line arguments
140: */
141: while ((c = getopt(argc, argv, optstr)) != EOF) {
142: switch ( c ) {
143: case 'd': debug = YES; break;
144: case 'v': debug = VERBOSE; break;
145: case 'A': printaddr = 1; break;
146: case 'F': from_addr = optarg; break;
147: case 'r': routing = ALWAYS; break;
148: case 'R': routing = REROUTE; break;
149: case 'l': handle = JUSTUUCP; break;
150: case 'L': handle = NONE; break;
151: case 'f': spoolfile = optarg; break;
152: case 'p': pathfile = optarg; break;
153: case 'u': uuxargs = optarg; break;
154: case 'a': aliasfile = optarg; break;
155: case 'n': fnlist = optarg; break;
156: case 'H': (void) strcpy(hostdomain, optarg); break;
157: case 'h': (void) strcpy(hostname, optarg); break;
158: case 'm': if(isdigit(*optarg)) {
159: maxnoqueue = atoi(optarg);
160: }
161: break;
162: case 'c': getcost = 1; break;
163: case 'q': if(isdigit(*optarg)) {
164: queuecost = atoi(optarg);
165: }
166: break;
167: default:
168: error( EX_USAGE, "valid flags are %s\n", optstr);
169: }
170: }
171: if ( argc <= optind ) {
172: error( EX_USAGE, "usage: %s [flags] address...\n", argv[0] );
173: }
174:
175: /*
176: ** Get our default hostname and hostdomain.
177: */
178: getmynames();
179:
180: /*
181: ** Spool the letter in a temporary file.
182: */
183: nargc = argc - optind;
184: if(printaddr == 0) {
185: spool(nargc, &argv[optind]);
186: }
187:
188: /*
189: ** Do aliasing and fullname resolution
190: */
191: nargv = alias(&nargc, &argv[optind]);
192:
193: /*
194: ** Map argv addresses to <host, user, form, cost>.
195: */
196: map(nargc, nargv, hostv, userv, formv, costv);
197: /*
198: ** If all we want it mapped addresses, print them and exit.
199: */
200: if(printaddr) {
201: int i;
202: char abuf[SMLBUF];
203: for(i=nargc-1; i >= 0; i--) {
204: if(formv[i] == ERROR) {
205: (void) strcpy(abuf, nargv[i]);
206: } else {
207: build(hostv[i], userv[i], formv[i], abuf);
208: }
209: (void) fputs(abuf, stdout);
210: if(i != 0) (void) putchar(' ');
211: }
212: (void) putchar('\n');
213: exit(0);
214: }
215: /*
216: ** Deliver.
217: */
218: deliver(nargc, hostv, userv, formv, costv);
219: /*
220: ** Exitstat was set if any resolve or deliver failed, otherwise 0.
221: */
222: return( exitstat );
223: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.