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