main.c revision 8857
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 98857Srgrimes $Id: main.c,v 1.1.1.1 1995/02/26 23:40:52 wpaul Exp $ 106751Swpaul 116751Swpaul*/ 126751Swpaul 136751Swpaul#include <syslog.h> 146751Swpaul#include <stdio.h> 156751Swpaul#include <sys/ioctl.h> 166751Swpaul#include <rpc/rpc.h> 176751Swpaul#include "bootparam_prot.h" 186751Swpaul#include <sys/types.h> 196751Swpaul#include <sys/stat.h> 206751Swpaul#include <sys/socket.h> 216751Swpaul#include <netdb.h> 226751Swpaul#include <ctype.h> 236751Swpaul 246751Swpaulint debug = 0; 256751Swpaulint dolog = 0; 266751Swpaulunsigned long route_addr = -1, inet_addr(); 276751Swpaulstruct sockaddr_in my_addr; 286751Swpaulchar *progname; 296751Swpaulchar *bootpfile = "/etc/bootparams"; 306751Swpaul 316751Swpaulextern void bootparamprog_1(); 326751Swpaul 336751Swpaulextern char *optarg; 346751Swpaulextern int optind; 356751Swpaul 366751Swpaulmain(argc, argv) 376751Swpaulint argc; 386751Swpaulchar **argv; 396751Swpaul{ 406751Swpaul SVCXPRT *transp; 416751Swpaul int i,s, pid; 426751Swpaul char *rindex(); 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 526751Swpaul while ((c = getopt(argc, argv,"dsr:f:")) != EOF) 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, 856751Swpaul "Usage: %s [-d ] [ -s ] [ -r router ] [ -f bootparmsfile ]\n"); 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) { 1026751Swpaul pid = fork(); 1036751Swpaul if ( pid < 0) { 1046751Swpaul perror("bootparamd: fork"); 1056751Swpaul exit(1); 1066751Swpaul } 1076751Swpaul if (pid) exit(0); /* parent */ 1086751Swpaul 1096751Swpaul /* child */ 1106751Swpaul for ( s = 0; s < 20 ; s++) close(s); 1116751Swpaul open("/", 0); 1126751Swpaul dup2(0, 1); 1136751Swpaul dup2(0, 2); 1146751Swpaul s = open("/dev/tty",2); 1156751Swpaul if ( s >= 0 ) { 1166751Swpaul ioctl(s, TIOCNOTTY, 0); 1176751Swpaul close(s); 1186751Swpaul } 1196751Swpaul } 1206751Swpaul 1218857Srgrimes 1226751Swpaul (void)pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS); 1236751Swpaul 1246751Swpaul transp = svcudp_create(RPC_ANYSOCK); 1256751Swpaul if (transp == NULL) { 1266751Swpaul (void)fprintf(stderr, "cannot create udp service.\n"); 1276751Swpaul exit(1); 1286751Swpaul } 1296751Swpaul if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS, bootparamprog_1, IPPROTO_UDP)) { 1306751Swpaul (void)fprintf(stderr, "unable to register (BOOTPARAMPROG, BOOTPARAMVERS, udp).\n"); 1316751Swpaul exit(1); 1326751Swpaul } 1336751Swpaul 1346751Swpaul svc_run(); 1356751Swpaul (void)fprintf(stderr, "svc_run returned\n"); 1366751Swpaul exit(1); 1376751Swpaul} 1386751Swpaul 1396751Swpaul 140