main.c revision 9718
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
99718Swpaul	$Id: main.c,v 1.2 1995/05/30 03:46:28 rgrimes 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
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,
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