xref: /original-bsd/old/berknet/sendberkmail.c (revision 62734ea8)
1 static char sccsid[] = "@(#)sendberkmail.c	4.1	(Berkeley)	09/12/82";
2 
3 # include "defs.h"
4 
5 /*
6 Usage:
7 	sendberkmail [-m mach ] [-f addrfrom] [-h hopcnt] -t addrto
8 
9 Archaic Usage:
10 	sendberkmail mach:user
11 
12 	Send remote mail to user on mach.
13 	Only one addrto allowed.
14 
15 	Sendberkmail uses the network to send an mmail command
16 	to the remote machine.  It specifies the source, destination,
17 	and a hop count only.
18 
19 	Sendberkmail uses the -q option of net, so only error msgs
20 	and non-zero return codes will be sent back.
21 
22 	It is best to think of sendberkmail as a transport mechanism:
23 	It takes mail from one machine to another machine (specified
24 	using the -m option) and executes the local mail program
25 	there with a to-address of "addrto", and a from-address
26 	of "addrfrom".  If the -m option is not given, it parses the
27 	"addrto" field to get a berkeley network address.
28 	This extreme generality is necessary when destinations are on
29 	different networks, consider a command from the Ing70:
30 
31 		sendberkmail -m csvax -f schmidt@parc -t research!chuck
32 
33 	This is clearly a forwarding function- send mail from the Arpanet
34 	to the Bell Net, which calls our CSVAX.
35 	Alternatively, executed on the CSVAX,
36 		sendberkmail -m ing70 -f research!chuck -t schmidt@parc
37 	sends mail the other way.
38 
39 	There is duplication in the arguments because of
40 	a need to convert to labelled parameters.
41 	See the note in mmail.c to that effect.
42 
43 
44 	Options:
45 		-t addrto	mail command on remote machine will be
46 				fed "addrto" as address
47 		-f addrfrom	mail will be "From" addrfrom
48 		-m mach		send this mail to the "mach" machine
49 		-h hopcnt	if this hopcnt hits a threshold, there
50 				is presumed to be an infinite loop.
51 
52 */
53 main(argc,argv)
54   char **argv; {
55 	char addrto[BUFSIZ], addrfrom[BUFSIZ], *sn;
56 	char mchto = 0, snto[BUFSIZ], snfrom[BUFSIZ], smchto[20], mchfrom;
57 	int cmdstr[BUFSIZ], hopcntstr[20];
58 	char rcmd[BUFSIZ];
59 	int hopcnt = 0;
60 
61 	argc[argv] = 0;
62 	debugflg = DBV;
63 	addrfrom[0] = 0;
64 	addrto[0] = 0;
65 
66 	while(argc > 1 && argv[1][0] == '-'){
67 		argc--; argv++;
68 		switch(argv[0][1]){
69 		case 'f':
70 			harg(addrfrom);
71 			break;
72 		case 'h':
73 			harg(hopcntstr);
74 			hopcnt = atoi(hopcntstr);
75 			break;
76 		case 'm':
77 			harg(smchto);
78 			mchto = lookup(smchto);
79 			break;
80 		case 't':
81 			harg(addrto);
82 			break;
83 		/* it is important to ignore unknown flags
84 		   for compatibility reasons */
85 		}
86 	}
87 
88 	/* handle to address */
89 	if(argc > 1)strcpy(addrto,argv[1]);
90 	if(addrto[0] == 0){
91 		fprintf(stderr,"Usage: sendberkmail mach:user\n");
92 		exit(EX_USAGE);
93 	}
94 	if(mchto == 0)
95 		mchto = MchSFromAddr(snto,addrto);
96 	else
97 		strcpy(snto,addrto);
98 	if(mchto == 0){
99 		fprintf(stderr,"Unknown host %s\n",addrto);
100 		exit(EX_NOHOST);
101 	};
102 	if(mchto == local){
103 		fprintf(stderr,
104 		"Use mail to send to %s on this machine. Mail not delivered.\n",
105 			addrto);
106 		exit(EX_NOUSER);
107 	}
108 	sprintf(rcmd,"mail %s",addrto);
109 
110 	/* handle from address */
111 	if(addrfrom[0] == 0){
112 		char name[100];
113 		SnCurrent(name);
114 		sprintf(addrfrom,"%s:%s",longname(local),name);
115 	}
116 	mchfrom = MchSFromAddr(snfrom,addrfrom);
117 
118 	/* uses new options of mmail */
119 	/* X's are for compatibility with mmail */
120 	sprintf(cmdstr,"%s XXX XXX XXX -f '%s' -t '%s' -h %d", MMAILCMD,
121 		addrfrom,addrto,hopcnt);
122 	/* old code:
123 	sprintf(cmdstr,"%s '%s' %s '%s'", MMAILCMD,snfrom,
124 		longname(mchfrom),snto);
125 	*/
126 
127 
128 	mexecl(netcmd,"net","-m",longname(mchto),"-q","-l","network",
129 		"-","-c",rcmd,cmdstr,0);
130 	perror(netcmd);
131 	fprintf(stderr,"Network is down\n");
132 	exit(EX_UNAVAILABLE);
133 }
134 
135 SnCurrent(name)
136   char *name;
137 	{
138 	char *sn;
139 	sn = getlogin();
140 	if(sn == NULL || *sn == 0 || *sn == ' '){
141 		struct passwd *pwd;
142 		pwd = getpwuid(getuid());	/* will read passwd file */
143 		if(pwd != NULL) sn = pwd->pw_name;
144 		if(sn == NULL){
145 			fprintf(stderr,"Who are you?\n");
146 			exit(EX_OSERR);
147 		}
148 	}
149 	strcpy(name, sn);
150 }
151