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