4BSD/usr/src/cmd/berknet/sendberkmail.c

Compare this file to the similar file:
Show the results in this format:

# include "defs.h"

/*
Usage:
	sendberkmail [-m mach ] [-f addrfrom] [-h hopcnt] -t addrto
	
Archaic Usage:
	sendberkmail mach:user

	Send remote mail to user on mach.
	Only one addrto allowed.

	Sendberkmail uses the network to send an mmail command
	to the remote machine.  It specifies the source, destination,
	and a hop count only.

	Sendberkmail uses the -q option of net, so only error msgs
	and non-zero return codes will be sent back.

	It is best to think of sendberkmail as a transport mechanism:
	It takes mail from one machine to another machine (specified
	using the -m option) and executes the local mail program
	there with a to-address of "addrto", and a from-address
	of "addrfrom".  If the -m option is not given, it parses the
	"addrto" field to get a berkeley network address.
	This extreme generality is necessary when destinations are on
	different networks, consider a command from the Ing70:

		sendberkmail -m csvax -f schmidt@parc -t research!chuck 

	This is clearly a forwarding function- send mail from the Arpanet
	to the Bell Net, which calls our CSVAX.
	Alternatively, executed on the CSVAX,
		sendberkmail -m ing70 -f research!chuck -t schmidt@parc
	sends mail the other way.

	There is duplication in the arguments because of
	a need to convert to labelled parameters.
	See the note in mmail.c to that effect.


	Options:
		-t addrto	mail command on remote machine will be
				fed "addrto" as address
		-f addrfrom	mail will be "From" addrfrom
		-m mach		send this mail to the "mach" machine
		-h hopcnt	if this hopcnt hits a threshold, there
				is presumed to be an infinite loop.
	
*/
main(argc,argv)
  char **argv; {
	char addrto[BUFSIZ], addrfrom[BUFSIZ], *sn;
	char mchto = 0, snto[BUFSIZ], snfrom[BUFSIZ], smchto[20], mchfrom;
	int cmdstr[BUFSIZ], hopcntstr[20];
	char rcmd[BUFSIZ];
	int hopcnt = 0;

	argc[argv] = 0;
	debugflg = DBV;
	addrfrom[0] = 0;
	addrto[0] = 0;

	while(argc > 1 && argv[1][0] == '-'){
		argc--; argv++;
		switch(argv[0][1]){
		case 'f':
			harg(addrfrom,&argc,&argv);
			break;
		case 'h':
			harg(hopcntstr,&argc,&argv);
			hopcnt = atoi(hopcntstr);
			break;
		case 'm':
			harg(smchto,&argc,&argv);
			mchto = lookup(smchto);
			break;
		case 't':
			harg(addrto,&argc,&argv);
			break;
		/* it is important to ignore unknown flags
		   for compatibility reasons */
		}
	}

	/* handle to address */
	if(argc > 1)strcpy(addrto,argv[1]);
	if(addrto[0] == 0){
		fprintf(stderr,"Usage: sendberkmail mach:user\n");
		exit(EX_USAGE);
	}
	if(mchto == 0)
		mchto = MchSFromAddr(snto,addrto);
	else
		strcpy(snto,addrto);
	if(mchto == 0){
		fprintf(stderr,"Unknown host %s\n",addrto);
		exit(EX_NOHOST);
	};
	if(mchto == local){
		fprintf(stderr,
		"Use mail to send to %s on this machine. Mail not delivered.\n",
			addrto);
		exit(EX_NOUSER);
	}
	sprintf(rcmd,"mail %s",addrto);

	/* handle from address */
	if(addrfrom[0] == 0){
		sn = SnFromUid(getuid());
		if(sn == NULL){
			fprintf(stderr,"Unknown userid\n");
			exit(EX_OSFILE);
		}
		sprintf(addrfrom,"%s:%s",longname(local),sn);
	}
	mchfrom = MchSFromAddr(snfrom,addrfrom);

	/* uses new options of mmail */
	/* X's are for compatibility with mmail */
	sprintf(cmdstr,"%s XXX XXX XXX -f '%s' -t '%s' -h %d", MMAILCMD,
		addrfrom,addrto,hopcnt);
	/* old code:
	sprintf(cmdstr,"%s '%s' %s '%s'", MMAILCMD,snfrom,
		longname(mchfrom),snto);
	*/


	mexecl(netcmd,"net","-m",longname(mchto),"-q","-l","network",
		"-","-c",rcmd,cmdstr,0);
	perror(netcmd);
	fprintf(stderr,"Network is down\n");
	exit(EX_UNAVAILABLE);
}