main.c revision 24428
16751Swpaul/* 26751Swpaul 38857SrgrimesThis code is not copyright, and is placed in the public domain. Feel free to 46751Swpauluse and modify. Please send modifications and/or suggestions + bug fixes to 56751Swpaul 66751Swpaul Klas Heggemann <klas@nada.kth.se> 76751Swpaul 86751Swpaul 924428Simp $Id: main.c,v 1.5 1997/02/22 16:04:24 peter Exp $ 106751Swpaul 116751Swpaul*/ 126751Swpaul 139718Swpaul#include <stdio.h> 149718Swpaul#include <string.h> 156751Swpaul#include <syslog.h> 166751Swpaul#include <sys/ioctl.h> 176751Swpaul#include <rpc/rpc.h> 186751Swpaul#include "bootparam_prot.h" 196751Swpaul#include <sys/types.h> 206751Swpaul#include <sys/stat.h> 216751Swpaul#include <sys/socket.h> 226751Swpaul#include <netdb.h> 236751Swpaul#include <ctype.h> 246751Swpaul 256751Swpaulint debug = 0; 266751Swpaulint dolog = 0; 276751Swpaulunsigned long route_addr = -1, inet_addr(); 286751Swpaulstruct sockaddr_in my_addr; 296751Swpaulchar *progname; 306751Swpaulchar *bootpfile = "/etc/bootparams"; 316751Swpaul 326751Swpaulextern void bootparamprog_1(); 336751Swpaul 346751Swpaulextern char *optarg; 356751Swpaulextern int optind; 366751Swpaul 376751Swpaulmain(argc, argv) 386751Swpaulint argc; 396751Swpaulchar **argv; 406751Swpaul{ 416751Swpaul SVCXPRT *transp; 429718Swpaul int i; 436751Swpaul struct hostent *he; 446751Swpaul struct stat buf; 456751Swpaul char *optstring; 466751Swpaul char c; 476751Swpaul 486751Swpaul progname = rindex(argv[0],'/'); 496751Swpaul if ( progname ) progname++; 506751Swpaul else progname = argv[0]; 516751Swpaul 5224428Simp while ((c = getopt(argc, argv,"dsr:f:")) != -1) 536751Swpaul switch (c) { 546751Swpaul case 'd': 556751Swpaul debug = 1; 566751Swpaul break; 576751Swpaul case 'r': 586751Swpaul if ( isdigit( *optarg)) { 596751Swpaul route_addr = inet_addr(optarg); 606751Swpaul break; 616751Swpaul } else { 626751Swpaul he = gethostbyname(optarg); 636751Swpaul if (he) { 646751Swpaul bcopy(he->h_addr, (char *)&route_addr, sizeof(route_addr)); 656751Swpaul break; 666751Swpaul } else { 676751Swpaul fprintf(stderr,"%s: No such host %s\n", progname, argv[i]); 686751Swpaul exit(1); 696751Swpaul } 706751Swpaul } 716751Swpaul case 'f': 726751Swpaul bootpfile = optarg; 736751Swpaul break; 746751Swpaul case 's': 756751Swpaul dolog = 1; 768857Srgrimes#ifndef LOG_DAEMON 776751Swpaul openlog(progname, 0 , 0); 786751Swpaul#else 796751Swpaul openlog(progname, 0 , LOG_DAEMON); 806751Swpaul setlogmask(LOG_UPTO(LOG_NOTICE)); 816751Swpaul#endif 826751Swpaul break; 836751Swpaul default: 848857Srgrimes fprintf(stderr, 859718Swpaul "Usage: %s [-d ] [ -s ] [ -r router ] [ -f bootparmsfile ]\n", progname); 866751Swpaul exit(1); 876751Swpaul } 886751Swpaul 896751Swpaul if ( stat(bootpfile, &buf ) ) { 906751Swpaul fprintf(stderr,"%s: ", progname); 916751Swpaul perror(bootpfile); 926751Swpaul exit(1); 936751Swpaul } 946751Swpaul 956751Swpaul 966751Swpaul if (route_addr == -1) { 976751Swpaul get_myaddress(&my_addr); 986751Swpaul bcopy(&my_addr.sin_addr.s_addr, &route_addr, sizeof (route_addr)); 996751Swpaul } 1006751Swpaul 1016751Swpaul if (!debug) { 1029718Swpaul if (daemon(0,0)) { 1036751Swpaul perror("bootparamd: fork"); 1046751Swpaul exit(1); 1056751Swpaul } 1066751Swpaul } 1076751Swpaul 1088857Srgrimes 1096751Swpaul (void)pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS); 1106751Swpaul 1116751Swpaul transp = svcudp_create(RPC_ANYSOCK); 1126751Swpaul if (transp == NULL) { 1136751Swpaul (void)fprintf(stderr, "cannot create udp service.\n"); 1146751Swpaul exit(1); 1156751Swpaul } 1166751Swpaul if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS, bootparamprog_1, IPPROTO_UDP)) { 1176751Swpaul (void)fprintf(stderr, "unable to register (BOOTPARAMPROG, BOOTPARAMVERS, udp).\n"); 1186751Swpaul exit(1); 1196751Swpaul } 1206751Swpaul 1216751Swpaul svc_run(); 1226751Swpaul (void)fprintf(stderr, "svc_run returned\n"); 1236751Swpaul exit(1); 1246751Swpaul} 1256751Swpaul 1266751Swpaul 127