1/*
2
3This code is not copyright, and is placed in the public domain. Feel free to
4use and modify. Please send modifications and/or suggestions + bug fixes to
5
6        Klas Heggemann <klas@nada.kth.se>
7
8*/
9
10#include <sys/cdefs.h>
11#include <ctype.h>
12#include <err.h>
13#include <netdb.h>
14#include <stdio.h>
15#include <stdlib.h>
16#include <string.h>
17#include <syslog.h>
18#include <unistd.h>
19#include <rpc/rpc.h>
20#include <rpc/pmap_clnt.h>
21#include <sys/ioctl.h>
22#include <sys/socket.h>
23#include <sys/stat.h>
24#include <sys/types.h>
25#include <netinet/in.h>
26#include <arpa/inet.h>
27#include "bootparam_prot.h"
28
29extern int debug, dolog;
30extern in_addr_t route_addr;
31extern const char *bootpfile;
32
33int debug = 0;
34int dolog = 0;
35in_addr_t route_addr = -1;
36const char *bootpfile = "/etc/bootparams";
37
38static struct sockaddr_in my_addr;
39
40static void usage(void) __dead2;
41
42int
43main(int argc, char **argv)
44{
45	SVCXPRT *transp;
46	struct hostent *he;
47	struct stat buf;
48	int c;
49
50	while ((c = getopt(argc, argv,"dsr:f:")) != -1)
51	  switch (c) {
52	  case 'd':
53	    debug = 1;
54	    break;
55	  case 'r':
56	      if (isdigit((unsigned char)*optarg)) {
57		route_addr = inet_addr(optarg);
58		break;
59	      } else {
60		he = gethostbyname(optarg);
61		if (he) {
62		   bcopy(he->h_addr, (char *)&route_addr, sizeof(route_addr));
63		   break;
64		} else {
65		   errx(1, "no such host %s", optarg);
66		}
67	      }
68	  case 'f':
69	    bootpfile = optarg;
70	    break;
71	  case 's':
72	    dolog = 1;
73#ifndef LOG_DAEMON
74	    openlog("bootparamd", 0 , 0);
75#else
76	    openlog("bootparamd", 0 , LOG_DAEMON);
77	    setlogmask(LOG_UPTO(LOG_NOTICE));
78#endif
79	    break;
80	  default:
81	    usage();
82	  }
83
84	if ( stat(bootpfile, &buf ) )
85	  err(1, "%s", bootpfile);
86
87	if (route_addr == INADDR_NONE) {
88	  get_myaddress(&my_addr);
89	  bcopy(&my_addr.sin_addr.s_addr, &route_addr, sizeof (route_addr));
90	}
91
92	if (!debug) {
93	  if (daemon(0,0))
94	    err(1, "fork");
95	}
96
97
98	(void)pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS);
99
100	transp = svcudp_create(RPC_ANYSOCK);
101	if (transp == NULL)
102		errx(1, "cannot create udp service");
103	if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS, bootparamprog_1, IPPROTO_UDP))
104		errx(1, "unable to register (BOOTPARAMPROG, BOOTPARAMVERS, udp)");
105
106	svc_run();
107	errx(1, "svc_run returned");
108}
109
110static void
111usage(void)
112{
113	fprintf(stderr,
114		"usage: bootparamd [-d] [-s] [-r router] [-f bootparmsfile]\n");
115	exit(1);
116}
117