blob: 86bde8fbc95614ff9546c4972ccb99e146297632 [file] [log] [blame]
/*
**
** rmail/smail - UUCP mailer with automatic routing.
**
** Christopher Seiwald /+\
** chris@cbosgd.att.com +\
** January, 1985 \+/
**
*/
#ifndef lint
static char *sccsid="@(#)main.c 2.5 (smail) 9/15/87";
#endif
/*
**
** usage: rmail [options] address...
** smail [options] address...
** options:
** -d debug - verbose and don't invoke mailers.
** -v verbose - just verbose.
** -A print mapped addresses. don't invoke mailers.
** -h hostname set hostname
** -H hostdomain set hostdomain (default hostname.MYDOM)
** -p pathfile path database filename
** -r force routing of host!address
** -R reroute even explicit path!user
** -l user@domain goes to local mailer
** -L all mail goes local
** -q number mail queueing cost threshold
** -m number limit on number of uux_noqueue jobs
** -u string string of flags for uux
** -F address name to substitute in From: line
** -a aliasfile aliases filename (not used with SENDMAIL)
** -n namelist list of full names for simple aliases
*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include "defs.h"
int unix_smail_getopt();
int exitstat = 0; /* exit status, set by resolve, deliver */
enum edebug debug = NO; /* set by -d or -v option */
enum ehandle handle = HANDLE; /* which mail we can handle, see defs.h */
enum erouting routing = ROUTING;/* to route or not to route, see defs.h */
char hostname[SMLBUF] = ""; /* set by -h, defaults in defs.h */
char hostdomain[SMLBUF] = ""; /* set by -H, defaults in defs.h */
char hostuucp[SMLBUF] = ""; /* built with hostname+".UUCP" */
char *pathfile = PATHS; /* or set by -p */
char *uuxargs = NULL; /* or set by -u */
char *aliasfile =
#ifdef ALIAS
ALIAS; /* or set by -a */
#else
NULL;
#endif
char *fnlist =
#ifdef FULLNAME
FULLNAME; /* or set by -n */
#else
NULL;
#endif
int queuecost = QUEUECOST; /* or set by -q */
char *from_addr = NULL; /* or set by -F */
int maxnoqueue = MAXNOQUEUE; /* or set by -m */
int getcost =
#ifdef GETCOST
1; /* get cost of path even if not routing */
#else
0;
#endif
char *spoolfile = NULL; /* name of the file containing letter */
FILE *spoolfp; /* file pointer to spoolfile */
int spoolmaster = 0; /* indicates 'control' of spoolfile */
void spool();
int map();
int getmynames();
int build();
int deliver();
/*
**
** rmail/smail: mail stdin letter to argv addresses.
**
** After processing command line options and finding our host and domain
** names, we map addresses into <host,user,form,cost> sets. Then we deliver.
**
*/
int main(int argc,char *argv[])
{
char *hostv[MAXARGS]; /* UUCP neighbor */
char *userv[MAXARGS]; /* address given to host */
int costv[MAXARGS]; /* cost of resolved route */
enum eform formv[MAXARGS]; /* invalid, local, or uucp */
char *p;
int c;
int printaddr = 0; /* or set by -A */
int nargc;
char **nargv, **alias();
char *optstr = "cdvArRlLH:h:p:u:q:a:n:m:f:F:";
extern char *optarg;
extern int unix_smail_optind;
/*
** see if we aren't invoked as rmail
*/
if((p = rindex(argv[0], '/')) == NULL) {
p = argv[0];
} else {
p++;
}
if(*p != 'r' ) {
handle = ALL;
}
/*
** Process command line arguments
*/
while ((c = unix_smail_getopt(argc, argv, optstr)) != EOF) {
switch ( c ) {
case 'd': debug = YES; break;
case 'v': debug = VERBOSE; break;
case 'A': printaddr = 1; break;
case 'F': from_addr = optarg; break;
case 'r': routing = ALWAYS; break;
case 'R': routing = REROUTE; break;
case 'l': handle = JUSTUUCP; break;
case 'L': handle = NONE; break;
case 'f': spoolfile = optarg; break;
case 'p': pathfile = optarg; break;
case 'u': uuxargs = optarg; break;
case 'a': aliasfile = optarg; break;
case 'n': fnlist = optarg; break;
case 'H': (void) strcpy(hostdomain, optarg); break;
case 'h': (void) strcpy(hostname, optarg); break;
case 'm': if(isdigit(*optarg)) {
maxnoqueue = atoi(optarg);
}
break;
case 'c': getcost = 1; break;
case 'q': if(isdigit(*optarg)) {
queuecost = atoi(optarg);
}
break;
default:
error( EX_USAGE, "valid flags are %s\n", optstr);
}
}
if ( argc <= unix_smail_optind ) {
error( EX_USAGE, "usage: %s [flags] address...\n", "smail" );
}
/*
** Get our default hostname and hostdomain.
*/
getmynames();
/*
** Spool the letter in a temporary file.
*/
nargc = argc - unix_smail_optind;
if(printaddr == 0) {
spool(nargc, &argv[unix_smail_optind]);
}
/*
** Do aliasing and fullname resolution
*/
nargv = alias(&nargc, &argv[unix_smail_optind]);
/*
** Map argv addresses to <host, user, form, cost>.
*/
map(nargc, nargv, hostv, userv, formv, costv);
/*
** If all we want it mapped addresses, print them and exit.
*/
if(printaddr) {
int i;
char abuf[SMLBUF];
for(i=nargc-1; i >= 0; i--) {
if(formv[i] == ERROR) {
(void) strcpy(abuf, nargv[i]);
} else {
build(hostv[i], userv[i], formv[i], abuf);
}
(void) fputs(abuf, stdout);
if(i != 0) (void) putchar(' ');
}
(void) putchar('\n');
exit(0);
}
/*
** Deliver.
*/
deliver(nargc, hostv, userv, formv, costv);
/*
** Exitstat was set if any resolve or deliver failed, otherwise 0.
*/
return( exitstat );
}