1*ae99bc57Sderaadt /*
2*ae99bc57Sderaadt  * This code is not copyright, and is placed in the public domain.
3*ae99bc57Sderaadt  * Feel free to use and modify. Please send modifications and/or
4*ae99bc57Sderaadt  * suggestions + bug fixes to Klas Heggemann <klas@nada.kth.se>
5*ae99bc57Sderaadt  *
6*ae99bc57Sderaadt  * Various small changes by Theo de Raadt <deraadt@fsa.ca>
7*ae99bc57Sderaadt  *
8*ae99bc57Sderaadt  * $Id: bootparamd.c,v 1.1 1994/01/08 13:22:04 deraadt Exp $
9*ae99bc57Sderaadt  */
10*ae99bc57Sderaadt 
11*ae99bc57Sderaadt #include <sys/types.h>
12*ae99bc57Sderaadt #include <sys/ioctl.h>
13*ae99bc57Sderaadt #include <sys/stat.h>
14*ae99bc57Sderaadt #include <sys/socket.h>
15*ae99bc57Sderaadt #include <rpc/rpc.h>
16*ae99bc57Sderaadt #include <rpcsvc/bootparam_prot.h>
17*ae99bc57Sderaadt #include <stdio.h>
18*ae99bc57Sderaadt #include <netdb.h>
19*ae99bc57Sderaadt #include <ctype.h>
20*ae99bc57Sderaadt #include <syslog.h>
21*ae99bc57Sderaadt 
22*ae99bc57Sderaadt #define MAXLEN 800
23*ae99bc57Sderaadt 
24*ae99bc57Sderaadt struct hostent *he;
25*ae99bc57Sderaadt static char buffer[MAXLEN];
26*ae99bc57Sderaadt static char hostname[MAX_MACHINE_NAME];
27*ae99bc57Sderaadt static char askname[MAX_MACHINE_NAME];
28*ae99bc57Sderaadt static char path[MAX_PATH_LEN];
29*ae99bc57Sderaadt static char domain_name[MAX_MACHINE_NAME];
30*ae99bc57Sderaadt 
31*ae99bc57Sderaadt extern void bootparamprog_1();
32*ae99bc57Sderaadt 
33*ae99bc57Sderaadt int     debug = 0;
34*ae99bc57Sderaadt int     dolog = 0;
35*ae99bc57Sderaadt unsigned long route_addr, inet_addr();
36*ae99bc57Sderaadt struct sockaddr_in my_addr;
37*ae99bc57Sderaadt char   *progname;
38*ae99bc57Sderaadt char   *bootpfile = "/etc/bootparams";
39*ae99bc57Sderaadt 
40*ae99bc57Sderaadt extern char *optarg;
41*ae99bc57Sderaadt extern int optind;
42*ae99bc57Sderaadt 
43*ae99bc57Sderaadt void
44*ae99bc57Sderaadt usage()
45*ae99bc57Sderaadt {
46*ae99bc57Sderaadt 	fprintf(stderr,
47*ae99bc57Sderaadt 		"usage: rpc.bootparamd [-d] [-s] [-r router] [-f bootparmsfile]\n");
48*ae99bc57Sderaadt }
49*ae99bc57Sderaadt 
50*ae99bc57Sderaadt 
51*ae99bc57Sderaadt /*
52*ae99bc57Sderaadt  * ever familiar
53*ae99bc57Sderaadt  */
54*ae99bc57Sderaadt int
55*ae99bc57Sderaadt main(argc, argv)
56*ae99bc57Sderaadt 	int     argc;
57*ae99bc57Sderaadt 	char  **argv;
58*ae99bc57Sderaadt {
59*ae99bc57Sderaadt 	SVCXPRT *transp;
60*ae99bc57Sderaadt 	int     i, s, pid;
61*ae99bc57Sderaadt 	char   *rindex();
62*ae99bc57Sderaadt 	struct hostent *he;
63*ae99bc57Sderaadt 	struct stat buf;
64*ae99bc57Sderaadt 	char   *optstring;
65*ae99bc57Sderaadt 	char    c;
66*ae99bc57Sderaadt 
67*ae99bc57Sderaadt 	progname = rindex(argv[0], '/');
68*ae99bc57Sderaadt 	if (progname)
69*ae99bc57Sderaadt 		progname++;
70*ae99bc57Sderaadt 	else
71*ae99bc57Sderaadt 		progname = argv[0];
72*ae99bc57Sderaadt 
73*ae99bc57Sderaadt 	while ((c = getopt(argc, argv, "dsr:f:")) != EOF)
74*ae99bc57Sderaadt 		switch (c) {
75*ae99bc57Sderaadt 		case 'd':
76*ae99bc57Sderaadt 			debug = 1;
77*ae99bc57Sderaadt 			break;
78*ae99bc57Sderaadt 		case 'r':
79*ae99bc57Sderaadt 			if (isdigit(*optarg)) {
80*ae99bc57Sderaadt 				route_addr = inet_addr(optarg);
81*ae99bc57Sderaadt 				break;
82*ae99bc57Sderaadt 			}
83*ae99bc57Sderaadt 			he = gethostbyname(optarg);
84*ae99bc57Sderaadt 			if (!he) {
85*ae99bc57Sderaadt 				fprintf(stderr, "%s: No such host %s\n",
86*ae99bc57Sderaadt 				    progname, optarg);
87*ae99bc57Sderaadt 				usage();
88*ae99bc57Sderaadt 				exit(1);
89*ae99bc57Sderaadt 			}
90*ae99bc57Sderaadt 			bcopy(he->h_addr, (char *) &route_addr, sizeof(route_addr));
91*ae99bc57Sderaadt 			break;
92*ae99bc57Sderaadt 		case 'f':
93*ae99bc57Sderaadt 			bootpfile = optarg;
94*ae99bc57Sderaadt 			break;
95*ae99bc57Sderaadt 		case 's':
96*ae99bc57Sderaadt 			dolog = 1;
97*ae99bc57Sderaadt #ifndef LOG_DAEMON
98*ae99bc57Sderaadt 			openlog(progname, 0, 0);
99*ae99bc57Sderaadt #else
100*ae99bc57Sderaadt 			openlog(progname, 0, LOG_DAEMON);
101*ae99bc57Sderaadt 			setlogmask(LOG_UPTO(LOG_NOTICE));
102*ae99bc57Sderaadt #endif
103*ae99bc57Sderaadt 			break;
104*ae99bc57Sderaadt 		default:
105*ae99bc57Sderaadt 			usage();
106*ae99bc57Sderaadt 			exit(1);
107*ae99bc57Sderaadt 		}
108*ae99bc57Sderaadt 
109*ae99bc57Sderaadt 	if (stat(bootpfile, &buf)) {
110*ae99bc57Sderaadt 		fprintf(stderr, "%s: ", progname);
111*ae99bc57Sderaadt 		perror(bootpfile);
112*ae99bc57Sderaadt 		exit(1);
113*ae99bc57Sderaadt 	}
114*ae99bc57Sderaadt 	if (!route_addr) {
115*ae99bc57Sderaadt 		get_myaddress(&my_addr);
116*ae99bc57Sderaadt 		bcopy(&my_addr.sin_addr.s_addr, &route_addr, sizeof(route_addr));
117*ae99bc57Sderaadt 	}
118*ae99bc57Sderaadt 	if (!debug)
119*ae99bc57Sderaadt 		daemon();
120*ae99bc57Sderaadt 
121*ae99bc57Sderaadt 	(void) pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS);
122*ae99bc57Sderaadt 
123*ae99bc57Sderaadt 	transp = svcudp_create(RPC_ANYSOCK);
124*ae99bc57Sderaadt 	if (transp == NULL) {
125*ae99bc57Sderaadt 		fprintf(stderr, "cannot create udp service.\n");
126*ae99bc57Sderaadt 		exit(1);
127*ae99bc57Sderaadt 	}
128*ae99bc57Sderaadt 	if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS,
129*ae99bc57Sderaadt 		bootparamprog_1, IPPROTO_UDP)) {
130*ae99bc57Sderaadt 		fprintf(stderr,
131*ae99bc57Sderaadt 		    "bootparamd: unable to register BOOTPARAMPROG version %d, udp)\n",
132*ae99bc57Sderaadt 		    BOOTPARAMVERS);
133*ae99bc57Sderaadt 		exit(1);
134*ae99bc57Sderaadt 	}
135*ae99bc57Sderaadt 	svc_run();
136*ae99bc57Sderaadt 	fprintf(stderr, "svc_run returned\n");
137*ae99bc57Sderaadt 	exit(1);
138*ae99bc57Sderaadt }
139*ae99bc57Sderaadt 
140*ae99bc57Sderaadt bp_whoami_res *
141*ae99bc57Sderaadt bootparamproc_whoami_1(whoami)
142*ae99bc57Sderaadt 	bp_whoami_arg *whoami;
143*ae99bc57Sderaadt {
144*ae99bc57Sderaadt 	long    haddr;
145*ae99bc57Sderaadt 	static bp_whoami_res res;
146*ae99bc57Sderaadt 	if (debug)
147*ae99bc57Sderaadt 		fprintf(stderr, "whoami got question for %d.%d.%d.%d\n",
148*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.net,
149*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.host,
150*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.lh,
151*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.impno);
152*ae99bc57Sderaadt 	if (dolog)
153*ae99bc57Sderaadt 		syslog(LOG_NOTICE, "whoami got question for %d.%d.%d.%d\n",
154*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.net,
155*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.host,
156*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.lh,
157*ae99bc57Sderaadt 		    255 & whoami->client_address.bp_address_u.ip_addr.impno);
158*ae99bc57Sderaadt 
159*ae99bc57Sderaadt 	bcopy((char *) &whoami->client_address.bp_address_u.ip_addr, (char *) &haddr,
160*ae99bc57Sderaadt 	    sizeof(haddr));
161*ae99bc57Sderaadt 	he = gethostbyaddr((char *) &haddr, sizeof(haddr), AF_INET);
162*ae99bc57Sderaadt 	if (!he)
163*ae99bc57Sderaadt 		goto failed;
164*ae99bc57Sderaadt 
165*ae99bc57Sderaadt 	if (debug)
166*ae99bc57Sderaadt 		fprintf(stderr, "This is host %s\n", he->h_name);
167*ae99bc57Sderaadt 	if (dolog)
168*ae99bc57Sderaadt 		syslog(LOG_NOTICE, "This is host %s\n", he->h_name);
169*ae99bc57Sderaadt 
170*ae99bc57Sderaadt 	strcpy(askname, he->h_name);
171*ae99bc57Sderaadt 	if (checkhost(askname, hostname)) {
172*ae99bc57Sderaadt 		res.client_name = hostname;
173*ae99bc57Sderaadt 		getdomainname(domain_name, MAX_MACHINE_NAME);
174*ae99bc57Sderaadt 		res.domain_name = domain_name;
175*ae99bc57Sderaadt 
176*ae99bc57Sderaadt 		if (res.router_address.address_type != IP_ADDR_TYPE) {
177*ae99bc57Sderaadt 			res.router_address.address_type = IP_ADDR_TYPE;
178*ae99bc57Sderaadt 			bcopy(&route_addr, &res.router_address.bp_address_u.ip_addr, 4);
179*ae99bc57Sderaadt 		}
180*ae99bc57Sderaadt 		if (debug)
181*ae99bc57Sderaadt 			fprintf(stderr, "Returning %s   %s    %d.%d.%d.%d\n",
182*ae99bc57Sderaadt 			    res.client_name, res.domain_name,
183*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.net,
184*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.host,
185*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.lh,
186*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.impno);
187*ae99bc57Sderaadt 		if (dolog)
188*ae99bc57Sderaadt 			syslog(LOG_NOTICE, "Returning %s   %s    %d.%d.%d.%d\n",
189*ae99bc57Sderaadt 			    res.client_name, res.domain_name,
190*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.net,
191*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.host,
192*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.lh,
193*ae99bc57Sderaadt 			    255 & res.router_address.bp_address_u.ip_addr.impno);
194*ae99bc57Sderaadt 
195*ae99bc57Sderaadt 		return (&res);
196*ae99bc57Sderaadt 	}
197*ae99bc57Sderaadt failed:
198*ae99bc57Sderaadt 	if (debug)
199*ae99bc57Sderaadt 		fprintf(stderr, "whoami failed\n");
200*ae99bc57Sderaadt 	if (dolog)
201*ae99bc57Sderaadt 		syslog(LOG_NOTICE, "whoami failed\n");
202*ae99bc57Sderaadt 	return (NULL);
203*ae99bc57Sderaadt }
204*ae99bc57Sderaadt 
205*ae99bc57Sderaadt 
206*ae99bc57Sderaadt bp_getfile_res *
207*ae99bc57Sderaadt bootparamproc_getfile_1(getfile)
208*ae99bc57Sderaadt 	bp_getfile_arg *getfile;
209*ae99bc57Sderaadt {
210*ae99bc57Sderaadt 	char   *where, *index();
211*ae99bc57Sderaadt 	static bp_getfile_res res;
212*ae99bc57Sderaadt 
213*ae99bc57Sderaadt 	if (debug)
214*ae99bc57Sderaadt 		fprintf(stderr, "getfile got question for \"%s\" and file \"%s\"\n",
215*ae99bc57Sderaadt 		    getfile->client_name, getfile->file_id);
216*ae99bc57Sderaadt 
217*ae99bc57Sderaadt 	if (dolog)
218*ae99bc57Sderaadt 		syslog(LOG_NOTICE, "getfile got question for \"%s\" and file \"%s\"\n",
219*ae99bc57Sderaadt 		    getfile->client_name, getfile->file_id);
220*ae99bc57Sderaadt 
221*ae99bc57Sderaadt 	he = NULL;
222*ae99bc57Sderaadt 	he = gethostbyname(getfile->client_name);
223*ae99bc57Sderaadt 	if (!he)
224*ae99bc57Sderaadt 		goto failed;
225*ae99bc57Sderaadt 
226*ae99bc57Sderaadt 	strcpy(askname, he->h_name);
227*ae99bc57Sderaadt 	if (getthefile(askname, getfile->file_id, buffer)) {
228*ae99bc57Sderaadt 		if (where = index(buffer, ':')) {
229*ae99bc57Sderaadt 			/* buffer is re-written to contain the name of the
230*ae99bc57Sderaadt 			 * info of file */
231*ae99bc57Sderaadt 			strncpy(hostname, buffer, where - buffer);
232*ae99bc57Sderaadt 			hostname[where - buffer] = '\0';
233*ae99bc57Sderaadt 			where++;
234*ae99bc57Sderaadt 			strcpy(path, where);
235*ae99bc57Sderaadt 			he = gethostbyname(hostname);
236*ae99bc57Sderaadt 			if (!he)
237*ae99bc57Sderaadt 				goto failed;
238*ae99bc57Sderaadt 			bcopy(he->h_addr, &res.server_address.bp_address_u.ip_addr, 4);
239*ae99bc57Sderaadt 			res.server_name = hostname;
240*ae99bc57Sderaadt 			res.server_path = path;
241*ae99bc57Sderaadt 			res.server_address.address_type = IP_ADDR_TYPE;
242*ae99bc57Sderaadt 		} else {	/* special for dump, answer with null strings */
243*ae99bc57Sderaadt 			if (!strcmp(getfile->file_id, "dump")) {
244*ae99bc57Sderaadt 				res.server_name[0] = '\0';
245*ae99bc57Sderaadt 				res.server_path[0] = '\0';
246*ae99bc57Sderaadt 				bzero(&res.server_address.bp_address_u.ip_addr, 4);
247*ae99bc57Sderaadt 			} else
248*ae99bc57Sderaadt 				goto failed;
249*ae99bc57Sderaadt 		}
250*ae99bc57Sderaadt 		if (debug)
251*ae99bc57Sderaadt 			fprintf(stderr,
252*ae99bc57Sderaadt 			    "returning server:%s path:%s address: %d.%d.%d.%d\n",
253*ae99bc57Sderaadt 			    res.server_name, res.server_path,
254*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.net,
255*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.host,
256*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.lh,
257*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.impno);
258*ae99bc57Sderaadt 		if (dolog)
259*ae99bc57Sderaadt 			syslog(LOG_NOTICE,
260*ae99bc57Sderaadt 			    "returning server:%s path:%s address: %d.%d.%d.%d\n",
261*ae99bc57Sderaadt 			    res.server_name, res.server_path,
262*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.net,
263*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.host,
264*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.lh,
265*ae99bc57Sderaadt 			    255 & res.server_address.bp_address_u.ip_addr.impno);
266*ae99bc57Sderaadt 		return (&res);
267*ae99bc57Sderaadt 	}
268*ae99bc57Sderaadt failed:
269*ae99bc57Sderaadt 	if (debug)
270*ae99bc57Sderaadt 		fprintf(stderr, "getfile failed for %s\n", getfile->client_name);
271*ae99bc57Sderaadt 	if (dolog)
272*ae99bc57Sderaadt 		syslog(LOG_NOTICE,
273*ae99bc57Sderaadt 		    "getfile failed for %s\n", getfile->client_name);
274*ae99bc57Sderaadt 	return (NULL);
275*ae99bc57Sderaadt }
276*ae99bc57Sderaadt 
277*ae99bc57Sderaadt 
278*ae99bc57Sderaadt /*
279*ae99bc57Sderaadt  * getthefile return 1 and fills the buffer with the information
280*ae99bc57Sderaadt  * of the file, e g "host:/export/root/client" if it can be found.
281*ae99bc57Sderaadt  * If the host is in the database, but the file is not, the buffer
282*ae99bc57Sderaadt  * will be empty. (This makes it possible to give the special
283*ae99bc57Sderaadt  * empty answer for the file "dump")
284*ae99bc57Sderaadt  */
285*ae99bc57Sderaadt getthefile(askname, fileid, buffer)
286*ae99bc57Sderaadt 	char   *askname;
287*ae99bc57Sderaadt 	char   *fileid, *buffer;
288*ae99bc57Sderaadt {
289*ae99bc57Sderaadt 	FILE   *bpf;
290*ae99bc57Sderaadt 	char   *where;
291*ae99bc57Sderaadt 
292*ae99bc57Sderaadt 	int     ch, pch, fid_len, res = 0;
293*ae99bc57Sderaadt 	int     match = 0;
294*ae99bc57Sderaadt 	char    info[MAX_FILEID + MAX_PATH_LEN + MAX_MACHINE_NAME + 3];
295*ae99bc57Sderaadt 
296*ae99bc57Sderaadt 	bpf = fopen(bootpfile, "r");
297*ae99bc57Sderaadt 	if (!bpf) {
298*ae99bc57Sderaadt 		fprintf(stderr, "No %s\n", bootpfile);
299*ae99bc57Sderaadt 		exit(1);
300*ae99bc57Sderaadt 	}
301*ae99bc57Sderaadt 	while (fscanf(bpf, "%s", hostname) > 0 && !match) {
302*ae99bc57Sderaadt 		if (*hostname != '#') {	/* comment */
303*ae99bc57Sderaadt 			if (!strcmp(hostname, askname)) {
304*ae99bc57Sderaadt 				match = 1;
305*ae99bc57Sderaadt 			} else {
306*ae99bc57Sderaadt 				he = gethostbyname(hostname);
307*ae99bc57Sderaadt 				if (he && !strcmp(he->h_name, askname))
308*ae99bc57Sderaadt 					match = 1;
309*ae99bc57Sderaadt 			}
310*ae99bc57Sderaadt 		}
311*ae99bc57Sderaadt 		/* skip to next entry */
312*ae99bc57Sderaadt 		if (match)
313*ae99bc57Sderaadt 			break;
314*ae99bc57Sderaadt 		pch = ch = getc(bpf);
315*ae99bc57Sderaadt 		while (!(ch == '\n' && pch != '\\') && ch != EOF) {
316*ae99bc57Sderaadt 			pch = ch;
317*ae99bc57Sderaadt 			ch = getc(bpf);
318*ae99bc57Sderaadt 		}
319*ae99bc57Sderaadt 	}
320*ae99bc57Sderaadt 
321*ae99bc57Sderaadt 	/* if match is true we read the rest of the line to get the info of
322*ae99bc57Sderaadt 	 * the file */
323*ae99bc57Sderaadt 
324*ae99bc57Sderaadt 	if (match) {
325*ae99bc57Sderaadt 		fid_len = strlen(fileid);
326*ae99bc57Sderaadt 		while (!res && (fscanf(bpf, "%s", info)) > 0) {	/* read a string */
327*ae99bc57Sderaadt 			ch = getc(bpf);	/* and a character */
328*ae99bc57Sderaadt 			if (*info != '#') {	/* Comment ? */
329*ae99bc57Sderaadt 				if (!strncmp(info, fileid, fid_len) &&
330*ae99bc57Sderaadt 				    *(info + fid_len) == '=') {
331*ae99bc57Sderaadt 					where = info + fid_len + 1;
332*ae99bc57Sderaadt 					if (isprint(*where)) {
333*ae99bc57Sderaadt 						strcpy(buffer, where);
334*ae99bc57Sderaadt 						res = 1;
335*ae99bc57Sderaadt 						break;
336*ae99bc57Sderaadt 					}
337*ae99bc57Sderaadt 				} else {
338*ae99bc57Sderaadt 					while (isspace(ch) && ch != '\n')
339*ae99bc57Sderaadt 						ch = getc(bpf);
340*ae99bc57Sderaadt 					if (ch == '\n') {
341*ae99bc57Sderaadt 						res = -1;
342*ae99bc57Sderaadt 						break;
343*ae99bc57Sderaadt 					}
344*ae99bc57Sderaadt 					if (ch == '\\') {
345*ae99bc57Sderaadt 						ch = getc(bpf);
346*ae99bc57Sderaadt 						if (ch == '\n')
347*ae99bc57Sderaadt 							continue;
348*ae99bc57Sderaadt 						ungetc(ch, bpf);
349*ae99bc57Sderaadt 						ungetc('\\', bpf);
350*ae99bc57Sderaadt 					} else
351*ae99bc57Sderaadt 						ungetc(ch, bpf);
352*ae99bc57Sderaadt 				}
353*ae99bc57Sderaadt 			} else
354*ae99bc57Sderaadt 				break;
355*ae99bc57Sderaadt 		}
356*ae99bc57Sderaadt 	}
357*ae99bc57Sderaadt 	if (fclose(bpf)) {
358*ae99bc57Sderaadt 		fprintf(stderr, "Could not close %s\n", bootpfile);
359*ae99bc57Sderaadt 	}
360*ae99bc57Sderaadt 	if (res == -1)
361*ae99bc57Sderaadt 		buffer[0] = '\0';	/* host found, file not */
362*ae99bc57Sderaadt 	return (match);
363*ae99bc57Sderaadt }
364*ae99bc57Sderaadt 
365*ae99bc57Sderaadt 
366*ae99bc57Sderaadt /*
367*ae99bc57Sderaadt  * checkhost puts the hostname found in the database file in
368*ae99bc57Sderaadt  * the hostname-variable and returns 1, if askname is a valid
369*ae99bc57Sderaadt  * name for a host in the database
370*ae99bc57Sderaadt  */
371*ae99bc57Sderaadt checkhost(askname, hostname)
372*ae99bc57Sderaadt 	char   *askname;
373*ae99bc57Sderaadt 	char   *hostname;
374*ae99bc57Sderaadt {
375*ae99bc57Sderaadt 	int     ch, pch;
376*ae99bc57Sderaadt 	FILE   *bpf;
377*ae99bc57Sderaadt 	int     res = 0;
378*ae99bc57Sderaadt 
379*ae99bc57Sderaadt 	bpf = fopen(bootpfile, "r");
380*ae99bc57Sderaadt 	if (!bpf) {
381*ae99bc57Sderaadt 		fprintf(stderr, "No %s\n", bootpfile);
382*ae99bc57Sderaadt 		exit(1);
383*ae99bc57Sderaadt 	}
384*ae99bc57Sderaadt 	while (fscanf(bpf, "%s", hostname) > 0) {
385*ae99bc57Sderaadt 		if (!strcmp(hostname, askname)) {
386*ae99bc57Sderaadt 			/* return true for match of hostname */
387*ae99bc57Sderaadt 			res = 1;
388*ae99bc57Sderaadt 			break;
389*ae99bc57Sderaadt 		} else {
390*ae99bc57Sderaadt 			/* check the alias list */
391*ae99bc57Sderaadt 			he = NULL;
392*ae99bc57Sderaadt 			he = gethostbyname(hostname);
393*ae99bc57Sderaadt 			if (he && !strcmp(askname, he->h_name)) {
394*ae99bc57Sderaadt 				res = 1;
395*ae99bc57Sderaadt 				break;
396*ae99bc57Sderaadt 			}
397*ae99bc57Sderaadt 		}
398*ae99bc57Sderaadt 		/* skip to next entry */
399*ae99bc57Sderaadt 		pch = ch = getc(bpf);
400*ae99bc57Sderaadt 		while (!(ch == '\n' && pch != '\\') && ch != EOF) {
401*ae99bc57Sderaadt 			pch = ch;
402*ae99bc57Sderaadt 			ch = getc(bpf);
403*ae99bc57Sderaadt 		}
404*ae99bc57Sderaadt 	}
405*ae99bc57Sderaadt 	fclose(bpf);
406*ae99bc57Sderaadt 	return (res);
407*ae99bc57Sderaadt }
408