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