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