/*

#ident "@(#)smail/pd/binmail:RELEASE-3_2_0_121:binmail.c,v 1.7 2004/06/25 17:42:08 woods Exp"
 */

/* This program will be used in place of /bin/mail on System V sites.
 * It looks at the arguments and decides whether to call
 * SMAIL for sending mail, or LMAIL for reading mail.
 *
 * Modified extensively from /bin/mail distributed with smail1.1.
 *
 * before installing as /bin/mail, move the stock /bin/mail to /bin/lmail
 *
 * This program works with SVR3 and SVR4 distributions from AT&T.
 */

#include "defs.h"

#include <sys/types.h>
#include <stdio.h>

#ifndef LMAIL
#define LMAIL "/bin/lmail"
#endif

#ifndef SMAIL
#define SMAIL "/usr/lib/sendmail"
#endif

#define TRUE 1
#define FALSE 0

char *program;

extern void perror(), exit();
extern int getopt();
static void usage();

extern int optind;
extern char *optarg;

main(argc, argv)
int argc;
char *argv[];
{
	int i, j, c;		/* indexes */
	int reading = FALSE;	/* TRUE => user read mail, run LMAIL */
	int sending = FALSE;	/* TRUE => sending mail, call Smail directly */
	int F_flag = FALSE;	/* TRUE => -F flag specified, run LMAIL */
	char *debug = NULL;	/* non-NULL => debugging level */
	char *T_arg = NULL;	/* non-NULL => configuration file */

	/*
	 * parse args
	 */
	program = argv[0];
	while((c = getopt(argc, argv, "ehpPqrf:F:toswm:T:x:")) != EOF) {
		switch(c) {
		case 'e':
		case 'h':
		case 'p':
		case 'P':
		case 'q':
		case 'r':
		case 'f':
			reading = TRUE;
			break;

		case 'F':
			F_flag = TRUE;
			reading = TRUE;
			break;

		case 't':
		case 'o':
		case 's':
		case 'w':
		case 'm':
			sending = TRUE;
			break;

		case 'T':
			T_arg = optarg;
			sending = TRUE;

		case 'x':
			debug = optarg;
			break;

		default:
			usage();
			exit(1);
		}
	}
	/* any arguments left over -> sending */
	if(argc > optind && F_flag == FALSE) {
		sending = TRUE;
	}
	if((reading == TRUE) && (sending == TRUE)) {
		usage();
		exit(1);
	}

	/*
	 * form arguments
	 */
	if(sending == TRUE) {
		argv[0] = SMAIL;
		i = 1;
		if (T_arg) {
			argv[i++] = "-C";
			argv[i++] = T_arg;
		}
		if (debug) {
			argv[i++] = "-d";
			argv[i++] = debug;
		}
		for(j = optind; i < argc; i++, j++) {
			argv[i] = argv[j];
		}
		argv[i] = NULL;
	} else {
		argv[0] = LMAIL;
	}

	/*
	 * exec our real program
	 */
	(void) execvp(argv[0], argv);
	(void) fprintf(stderr, "%s: cannot exec %s: ", program, argv[0]);
	perror("");
	exit(1);
	/* NOTREACHED */
}

static void
usage()
{
	int i;
	static char *usage_text[] = {
	"Usage:	%s [-ehpPqr] [-f file] [-x debug]",
	"	%s [-tosw] [-m message_type] [-T file] [-x debug] addr ...",
	"	%s [-x debuglevel] -F addr ..."
	};

	for (i = 0; i < sizeof(usage_text) / sizeof(*usage_text); i++) {
		fprintf(stderr, usage_text[i], program);
		putc('\n', stderr);
	}
}


syntax highlighted by Code2HTML, v. 0.9.1