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