main.c revision 6751
12061Sjkh/* 228728Sbde 32061SjkhThis code is not copyright, and is placed in the public domain. Feel free to 42061Sjkhuse and modify. Please send modifications and/or suggestions + bug fixes to 515603Smarkm 63197Scsgr Klas Heggemann <klas@nada.kth.se> 720710Sasami 820710Sasami 93197Scsgr $Id$ 102061Sjkh 1112483Speter*/ 122160Scsgr 132834Swollman#include <syslog.h> 142061Sjkh#include <stdio.h> 152061Sjkh#include <sys/ioctl.h> 162160Scsgr#include <rpc/rpc.h> 1717308Speter#include "bootparam_prot.h" 1819320Sadam#include <sys/types.h> 1927788Sasami#include <sys/stat.h> 2027788Sasami#include <sys/socket.h> 2125980Sasami#include <netdb.h> 221594Srgrimes#include <ctype.h> 2317308Speter 2417308Speterint debug = 0; 2527910Sasamiint dolog = 0; 2627910Sasamiunsigned long route_addr = -1, inet_addr(); 2727910Sasamistruct sockaddr_in my_addr; 2817308Speterchar *progname; 2917308Speterchar *bootpfile = "/etc/bootparams"; 3017308Speter 3119175Sbdeextern void bootparamprog_1(); 3219175Sbde 3319175Sbdeextern char *optarg; 3419175Sbdeextern int optind; 3517308Speter 3627910Sasamimain(argc, argv) 3725647Sbdeint argc; 3827910Sasamichar **argv; 3917308Speter{ 402061Sjkh SVCXPRT *transp; 412061Sjkh int i,s, pid; 421594Srgrimes char *rindex(); 4328531Sbde struct hostent *he; 4428531Sbde struct stat buf; 4528531Sbde char *optstring; 4628531Sbde char c; 4728531Sbde 4828531Sbde progname = rindex(argv[0],'/'); 4928531Sbde if ( progname ) progname++; 5028531Sbde else progname = argv[0]; 517407Srgrimes 527108Sphk while ((c = getopt(argc, argv,"dsr:f:")) != EOF) 537108Sphk switch (c) { 547108Sphk case 'd': 557407Srgrimes debug = 1; 567407Srgrimes break; 577407Srgrimes case 'r': 587108Sphk if ( isdigit( *optarg)) { 592061Sjkh route_addr = inet_addr(optarg); 602061Sjkh break; 612061Sjkh } else { 6217308Speter he = gethostbyname(optarg); 632061Sjkh if (he) { 642061Sjkh bcopy(he->h_addr, (char *)&route_addr, sizeof(route_addr)); 652061Sjkh break; 662061Sjkh } else { 672061Sjkh fprintf(stderr,"%s: No such host %s\n", progname, argv[i]); 683197Scsgr exit(1); 692626Scsgr } 702626Scsgr } 712061Sjkh case 'f': 722061Sjkh bootpfile = optarg; 732061Sjkh break; 742061Sjkh case 's': 752061Sjkh dolog = 1; 762061Sjkh#ifndef LOG_DAEMON 7719320Sadam openlog(progname, 0 , 0); 782061Sjkh#else 792061Sjkh openlog(progname, 0 , LOG_DAEMON); 802061Sjkh setlogmask(LOG_UPTO(LOG_NOTICE)); 812061Sjkh#endif 822061Sjkh break; 832061Sjkh default: 842061Sjkh fprintf(stderr, 852061Sjkh "Usage: %s [-d ] [ -s ] [ -r router ] [ -f bootparmsfile ]\n"); 862061Sjkh exit(1); 872061Sjkh } 882061Sjkh 892834Swollman if ( stat(bootpfile, &buf ) ) { 902834Swollman fprintf(stderr,"%s: ", progname); 912834Swollman perror(bootpfile); 922834Swollman exit(1); 932834Swollman } 942834Swollman 951594Srgrimes 964486Sphk if (route_addr == -1) { 974486Sphk get_myaddress(&my_addr); 984486Sphk bcopy(&my_addr.sin_addr.s_addr, &route_addr, sizeof (route_addr)); 994486Sphk } 1004486Sphk 1012061Sjkh if (!debug) { 1022061Sjkh pid = fork(); 10325979Sjkh if ( pid < 0) { 10425979Sjkh perror("bootparamd: fork"); 10525979Sjkh exit(1); 10625979Sjkh } 1072061Sjkh if (pid) exit(0); /* parent */ 10825979Sjkh 1092061Sjkh /* child */ 1102061Sjkh for ( s = 0; s < 20 ; s++) close(s); 11117308Speter open("/", 0); 1122061Sjkh dup2(0, 1); 1132061Sjkh dup2(0, 2); 1142061Sjkh s = open("/dev/tty",2); 1152061Sjkh if ( s >= 0 ) { 1162061Sjkh ioctl(s, TIOCNOTTY, 0); 11712483Speter close(s); 11812483Speter } 11912483Speter } 12012483Speter 1212061Sjkh 1222061Sjkh (void)pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS); 1238854Srgrimes 1242061Sjkh transp = svcudp_create(RPC_ANYSOCK); 1252061Sjkh if (transp == NULL) { 12612483Speter (void)fprintf(stderr, "cannot create udp service.\n"); 1272061Sjkh exit(1); 12827910Sasami } 12927910Sasami if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS, bootparamprog_1, IPPROTO_UDP)) { 13018714Sache (void)fprintf(stderr, "unable to register (BOOTPARAMPROG, BOOTPARAMVERS, udp).\n"); 13117308Speter exit(1); 13217308Speter } 13317308Speter 13417308Speter svc_run(); 13521536Sjmacd (void)fprintf(stderr, "svc_run returned\n"); 13615603Smarkm exit(1); 13717308Speter} 13817308Speter 13917308Speter 14017308Speter