/* ** ** rmail/smail - UUCP mailer with automatic routing. ** ** Christopher Seiwald /+\ ** chris@cbosgd.att.com +\ ** January, 1985 \+/ ** */ /* ** Patched for MS-DOS compatibility by Stephen Trier March, April and ** May, 1990. This file is in the public domain. */ #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 #include #include "defs.h" #ifdef MSDOS #include #endif 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 *uuxargs = NULL; /* or set by -u */ #ifndef MSDOS char *pathfile = PATHS; /* or set by -p */ char *aliasfile = #ifdef ALIAS ALIAS; /* or set by -a */ #else NULL; #endif char *fnlist = #ifdef FULLNAME FULLNAME; /* or set by -n */ #else NULL; #endif #else /* MSDOS */ char *pathfile; char *aliasfile; char *fnlist; enum erouting routelevel; /* Use for retrying failed addresses */ #endif /* MSDOS */ 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(); /* ** ** rmail/smail: mail stdin letter to argv addresses. ** ** After processing command line options and finding our host and domain ** names, we map addresses into sets. Then we deliver. ** */ main(argc, argv) 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 optind; #ifdef MSDOS /* * load variables from initialization files */ config(); #endif /* ** see if we aren't invoked as rmail */ #ifndef MSDOS if((p = rindex(argv[0], '/')) == NULL) { p = argv[0]; } else { p++; } if(*p != 'r' ) { handle = ALL; } #else /* !MSDOS */ if (((p = rindex(argv[0], '/')) == NULL) && ((p = rindex(argv[0], '\\')) == NULL)) p = argv[0]; else p++; if ((*p != 'r' ) && (*p != 'R')) handle = ALL; #endif /* MSDOS */ /* ** Process command line arguments */ while ((c = 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; #ifndef MSDOS case 'r': routing = ALWAYS; break; case 'R': routing = REROUTE; break; #else case 'r': routelevel = ALWAYS; break; case 'R': routelevel = REROUTE; break; #endif 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 <= optind ) { error( EX_USAGE, "usage: %s [flags] address...\n", argv[0] ); } /* ** Get our default hostname and hostdomain. */ getmynames(); /* ** Spool the letter in a temporary file. */ nargc = argc - optind; if(printaddr == 0) { spool(nargc, &argv[optind]); } /* ** Do aliasing and fullname resolution */ nargv = alias(&nargc, &argv[optind]); #ifdef MSDOS /* * Prepare to accept a possible return to this location if a uux call fails. */ for (routing = routelevel; routing <= REROUTE; routing++) { #endif /* MSDOS */ /* ** Map argv addresses to . */ 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); #ifdef MSDOS /* * Loop back for another try at the name resolution. */ } /* * Close and delete the spool file */ (void) fclose(spoolfp); if (spoolmaster) { (void) unlink(spoolfile); } #endif /* MSDOS */ /* ** Exitstat was set if any resolve or deliver failed, otherwise 0. */ return( exitstat ); }