Home | History | Annotate | Line # | Download | only in rbootd
rbootd.c revision 1.1
      1  1.1  brezak /*
      2  1.1  brezak  * Copyright (c) 1988, 1992 The University of Utah and the Center
      3  1.1  brezak  *	for Software Science (CSS).
      4  1.1  brezak  * Copyright (c) 1992, 1993
      5  1.1  brezak  *	The Regents of the University of California.  All rights reserved.
      6  1.1  brezak  *
      7  1.1  brezak  * This code is derived from software contributed to Berkeley by
      8  1.1  brezak  * the Center for Software Science of the University of Utah Computer
      9  1.1  brezak  * Science Department.  CSS requests users of this software to return
     10  1.1  brezak  * to css-dist (at) cs.utah.edu any improvements that they make and grant
     11  1.1  brezak  * CSS redistribution rights.
     12  1.1  brezak  *
     13  1.1  brezak  * Redistribution and use in source and binary forms, with or without
     14  1.1  brezak  * modification, are permitted provided that the following conditions
     15  1.1  brezak  * are met:
     16  1.1  brezak  * 1. Redistributions of source code must retain the above copyright
     17  1.1  brezak  *    notice, this list of conditions and the following disclaimer.
     18  1.1  brezak  * 2. Redistributions in binary form must reproduce the above copyright
     19  1.1  brezak  *    notice, this list of conditions and the following disclaimer in the
     20  1.1  brezak  *    documentation and/or other materials provided with the distribution.
     21  1.1  brezak  * 3. All advertising materials mentioning features or use of this software
     22  1.1  brezak  *    must display the following acknowledgement:
     23  1.1  brezak  *	This product includes software developed by the University of
     24  1.1  brezak  *	California, Berkeley and its contributors.
     25  1.1  brezak  * 4. Neither the name of the University nor the names of its contributors
     26  1.1  brezak  *    may be used to endorse or promote products derived from this software
     27  1.1  brezak  *    without specific prior written permission.
     28  1.1  brezak  *
     29  1.1  brezak  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     30  1.1  brezak  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     31  1.1  brezak  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     32  1.1  brezak  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     33  1.1  brezak  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     34  1.1  brezak  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     35  1.1  brezak  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     36  1.1  brezak  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     37  1.1  brezak  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     38  1.1  brezak  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     39  1.1  brezak  * SUCH DAMAGE.
     40  1.1  brezak  *
     41  1.1  brezak  *	@(#)rbootd.c	8.1 (Berkeley) 6/4/93
     42  1.1  brezak  *
     43  1.1  brezak  * Utah $Hdr: rbootd.c 3.1 92/07/06$
     44  1.1  brezak  * Author: Jeff Forys, University of Utah CSS
     45  1.1  brezak  */
     46  1.1  brezak 
     47  1.1  brezak #ifndef lint
     48  1.1  brezak static char copyright[] =
     49  1.1  brezak "@(#) Copyright (c) 1992, 1993\n\
     50  1.1  brezak 	The Regents of the University of California.  All rights reserved.\n";
     51  1.1  brezak #endif /* not lint */
     52  1.1  brezak 
     53  1.1  brezak #ifndef lint
     54  1.1  brezak static char sccsid[] = "@(#)rbootd.c	8.1 (Berkeley) 6/4/93";
     55  1.1  brezak #endif /* not lint */
     56  1.1  brezak 
     57  1.1  brezak #include <sys/param.h>
     58  1.1  brezak #include <sys/ioctl.h>
     59  1.1  brezak 
     60  1.1  brezak #include <ctype.h>
     61  1.1  brezak #include <errno.h>
     62  1.1  brezak #include <fcntl.h>
     63  1.1  brezak #include <signal.h>
     64  1.1  brezak #include <stdio.h>
     65  1.1  brezak #include <stdlib.h>
     66  1.1  brezak #include <string.h>
     67  1.1  brezak #include <syslog.h>
     68  1.1  brezak #include <unistd.h>
     69  1.1  brezak #include "defs.h"
     70  1.1  brezak 
     71  1.1  brezak 
     72  1.1  brezak /* fd mask macros (backward compatibility with 4.2BSD) */
     73  1.1  brezak #ifndef	FD_SET
     74  1.1  brezak #ifdef	notdef
     75  1.1  brezak typedef	struct fd_set {		/* this should already be in 4.2 */
     76  1.1  brezak 	int fds_bits[1];
     77  1.1  brezak } fd_set;
     78  1.1  brezak #endif
     79  1.1  brezak #define	FD_ZERO(p)	((p)->fds_bits[0] = 0)
     80  1.1  brezak #define	FD_SET(n, p)	((p)->fds_bits[0] |= (1 << (n)))
     81  1.1  brezak #define	FD_CLR(n, p)	((p)->fds_bits[0] &= ~(1 << (n)))
     82  1.1  brezak #define	FD_ISSET(n, p)	((p)->fds_bits[0] & (1 << (n)))
     83  1.1  brezak #endif
     84  1.1  brezak 
     85  1.1  brezak int
     86  1.1  brezak main(argc, argv)
     87  1.1  brezak 	int argc;
     88  1.1  brezak 	char *argv[];
     89  1.1  brezak {
     90  1.1  brezak 	int c, fd, omask, maxfds;
     91  1.1  brezak 	fd_set rset;
     92  1.1  brezak 
     93  1.1  brezak 	/*
     94  1.1  brezak 	 *  Find what name we are running under.
     95  1.1  brezak 	 */
     96  1.1  brezak 	ProgName = (ProgName = rindex(argv[0],'/')) ? ++ProgName : *argv;
     97  1.1  brezak 
     98  1.1  brezak 	/*
     99  1.1  brezak 	 *  Close any open file descriptors.
    100  1.1  brezak 	 *  Temporarily leave stdin & stdout open for `-d',
    101  1.1  brezak 	 *  and stderr open for any pre-syslog error messages.
    102  1.1  brezak 	 */
    103  1.1  brezak 	{
    104  1.1  brezak 		int i, nfds = getdtablesize();
    105  1.1  brezak 
    106  1.1  brezak 		for (i = 0; i < nfds; i++)
    107  1.1  brezak 			if (i != fileno(stdin) && i != fileno(stdout) &&
    108  1.1  brezak 			    i != fileno(stderr))
    109  1.1  brezak 				(void) close(i);
    110  1.1  brezak 	}
    111  1.1  brezak 
    112  1.1  brezak 	/*
    113  1.1  brezak 	 *  Parse any arguments.
    114  1.1  brezak 	 */
    115  1.1  brezak 	while ((c = getopt(argc, argv, "adi:")) != EOF)
    116  1.1  brezak 		switch(c) {
    117  1.1  brezak 		    case 'a':
    118  1.1  brezak 			BootAny++;
    119  1.1  brezak 			break;
    120  1.1  brezak 		    case 'd':
    121  1.1  brezak 			DebugFlg++;
    122  1.1  brezak 			break;
    123  1.1  brezak 		    case 'i':
    124  1.1  brezak 			IntfName = optarg;
    125  1.1  brezak 			break;
    126  1.1  brezak 		}
    127  1.1  brezak 	for (; optind < argc; optind++) {
    128  1.1  brezak 		if (ConfigFile == NULL)
    129  1.1  brezak 			ConfigFile = argv[optind];
    130  1.1  brezak 		else {
    131  1.1  brezak 			fprintf(stderr,
    132  1.1  brezak 			        "%s: too many config files (`%s' ignored)\n",
    133  1.1  brezak 			        ProgName, argv[optind]);
    134  1.1  brezak 		}
    135  1.1  brezak 	}
    136  1.1  brezak 
    137  1.1  brezak 	if (ConfigFile == NULL)			/* use default config file */
    138  1.1  brezak 		ConfigFile = DfltConfig;
    139  1.1  brezak 
    140  1.1  brezak 	if (DebugFlg) {
    141  1.1  brezak 		DbgFp = stdout;				/* output to stdout */
    142  1.1  brezak 
    143  1.1  brezak 		(void) signal(SIGUSR1, SIG_IGN);	/* dont muck w/DbgFp */
    144  1.1  brezak 		(void) signal(SIGUSR2, SIG_IGN);
    145  1.1  brezak 	} else {
    146  1.1  brezak 		(void) fclose(stdin);			/* dont need these */
    147  1.1  brezak 		(void) fclose(stdout);
    148  1.1  brezak 
    149  1.1  brezak 		/*
    150  1.1  brezak 		 *  Fork off a child to do the work & exit.
    151  1.1  brezak 		 */
    152  1.1  brezak 		switch(fork()) {
    153  1.1  brezak 			case -1:	/* fork failed */
    154  1.1  brezak 				fprintf(stderr, "%s: ", ProgName);
    155  1.1  brezak 				perror("fork");
    156  1.1  brezak 				Exit(0);
    157  1.1  brezak 			case 0:		/* this is the CHILD */
    158  1.1  brezak 				break;
    159  1.1  brezak 			default:	/* this is the PARENT */
    160  1.1  brezak 				_exit(0);
    161  1.1  brezak 		}
    162  1.1  brezak 
    163  1.1  brezak 		/*
    164  1.1  brezak 		 *  Try to disassociate from the current tty.
    165  1.1  brezak 		 */
    166  1.1  brezak 		{
    167  1.1  brezak 			char *devtty = "/dev/tty";
    168  1.1  brezak 			int i;
    169  1.1  brezak 
    170  1.1  brezak 			if ((i = open(devtty, O_RDWR)) < 0) {
    171  1.1  brezak 				/* probably already disassociated */
    172  1.1  brezak 				if (setpgrp(0, 0) < 0) {
    173  1.1  brezak 					fprintf(stderr, "%s: ", ProgName);
    174  1.1  brezak 					perror("setpgrp");
    175  1.1  brezak 				}
    176  1.1  brezak 			} else {
    177  1.1  brezak 				if (ioctl(i, (u_long)TIOCNOTTY, (char *)0) < 0){
    178  1.1  brezak 					fprintf(stderr, "%s: ", ProgName);
    179  1.1  brezak 					perror("ioctl");
    180  1.1  brezak 				}
    181  1.1  brezak 				(void) close(i);
    182  1.1  brezak 			}
    183  1.1  brezak 		}
    184  1.1  brezak 
    185  1.1  brezak 		(void) signal(SIGUSR1, DebugOn);
    186  1.1  brezak 		(void) signal(SIGUSR2, DebugOff);
    187  1.1  brezak 	}
    188  1.1  brezak 
    189  1.1  brezak 	(void) fclose(stderr);		/* finished with it */
    190  1.1  brezak 
    191  1.1  brezak #ifdef SYSLOG4_2
    192  1.1  brezak 	openlog(ProgName, LOG_PID);
    193  1.1  brezak #else
    194  1.1  brezak 	openlog(ProgName, LOG_PID, LOG_DAEMON);
    195  1.1  brezak #endif
    196  1.1  brezak 
    197  1.1  brezak 	/*
    198  1.1  brezak 	 *  If no interface was specified, get one now.
    199  1.1  brezak 	 *
    200  1.1  brezak 	 *  This is convoluted because we want to get the default interface
    201  1.1  brezak 	 *  name for the syslog("restarted") message.  If BpfGetIntfName()
    202  1.1  brezak 	 *  runs into an error, it will return a syslog-able error message
    203  1.1  brezak 	 *  (in `errmsg') which will be displayed here.
    204  1.1  brezak 	 */
    205  1.1  brezak 	if (IntfName == NULL) {
    206  1.1  brezak 		char *errmsg;
    207  1.1  brezak 
    208  1.1  brezak 		if ((IntfName = BpfGetIntfName(&errmsg)) == NULL) {
    209  1.1  brezak 			syslog(LOG_NOTICE, "restarted (??)");
    210  1.1  brezak 			syslog(LOG_ERR, errmsg);
    211  1.1  brezak 			Exit(0);
    212  1.1  brezak 		}
    213  1.1  brezak 	}
    214  1.1  brezak 
    215  1.1  brezak 	syslog(LOG_NOTICE, "restarted (%s)", IntfName);
    216  1.1  brezak 
    217  1.1  brezak 	(void) signal(SIGHUP, ReConfig);
    218  1.1  brezak 	(void) signal(SIGINT, Exit);
    219  1.1  brezak 	(void) signal(SIGTERM, Exit);
    220  1.1  brezak 
    221  1.1  brezak 	/*
    222  1.1  brezak 	 *  Grab our host name and pid.
    223  1.1  brezak 	 */
    224  1.1  brezak 	if (gethostname(MyHost, MAXHOSTNAMELEN) < 0) {
    225  1.1  brezak 		syslog(LOG_ERR, "gethostname: %m");
    226  1.1  brezak 		Exit(0);
    227  1.1  brezak 	}
    228  1.1  brezak 	MyHost[MAXHOSTNAMELEN] = '\0';
    229  1.1  brezak 
    230  1.1  brezak 	MyPid = getpid();
    231  1.1  brezak 
    232  1.1  brezak 	/*
    233  1.1  brezak 	 *  Write proc's pid to a file.
    234  1.1  brezak 	 */
    235  1.1  brezak 	{
    236  1.1  brezak 		FILE *fp;
    237  1.1  brezak 
    238  1.1  brezak 		if ((fp = fopen(PidFile, "w")) != NULL) {
    239  1.1  brezak 			(void) fprintf(fp, "%d\n", MyPid);
    240  1.1  brezak 			(void) fclose(fp);
    241  1.1  brezak 		} else {
    242  1.1  brezak 			syslog(LOG_WARNING, "fopen: failed (%s)", PidFile);
    243  1.1  brezak 		}
    244  1.1  brezak 	}
    245  1.1  brezak 
    246  1.1  brezak 	/*
    247  1.1  brezak 	 *  All boot files are relative to the boot directory, we might
    248  1.1  brezak 	 *  as well chdir() there to make life easier.
    249  1.1  brezak 	 */
    250  1.1  brezak 	if (chdir(BootDir) < 0) {
    251  1.1  brezak 		syslog(LOG_ERR, "chdir: %m (%s)", BootDir);
    252  1.1  brezak 		Exit(0);
    253  1.1  brezak 	}
    254  1.1  brezak 
    255  1.1  brezak 	/*
    256  1.1  brezak 	 *  Initial configuration.
    257  1.1  brezak 	 */
    258  1.1  brezak 	omask = sigblock(sigmask(SIGHUP));	/* prevent reconfig's */
    259  1.1  brezak 	if (GetBootFiles() == 0)		/* get list of boot files */
    260  1.1  brezak 		Exit(0);
    261  1.1  brezak 	if (ParseConfig() == 0)			/* parse config file */
    262  1.1  brezak 		Exit(0);
    263  1.1  brezak 
    264  1.1  brezak 	/*
    265  1.1  brezak 	 *  Open and initialize a BPF device for the appropriate interface.
    266  1.1  brezak 	 *  If an error is encountered, a message is displayed and Exit()
    267  1.1  brezak 	 *  is called.
    268  1.1  brezak 	 */
    269  1.1  brezak 	fd = BpfOpen();
    270  1.1  brezak 
    271  1.1  brezak 	(void) sigsetmask(omask);		/* allow reconfig's */
    272  1.1  brezak 
    273  1.1  brezak 	/*
    274  1.1  brezak 	 *  Main loop: receive a packet, determine where it came from,
    275  1.1  brezak 	 *  and if we service this host, call routine to handle request.
    276  1.1  brezak 	 */
    277  1.1  brezak 	maxfds = fd + 1;
    278  1.1  brezak 	FD_ZERO(&rset);
    279  1.1  brezak 	FD_SET(fd, &rset);
    280  1.1  brezak 	for (;;) {
    281  1.1  brezak 		struct timeval timeout;
    282  1.1  brezak 		fd_set r;
    283  1.1  brezak 		int nsel;
    284  1.1  brezak 
    285  1.1  brezak 		r = rset;
    286  1.1  brezak 
    287  1.1  brezak 		if (RmpConns == NULL) {		/* timeout isnt necessary */
    288  1.1  brezak 			nsel = select(maxfds, &r, (fd_set *)0, (fd_set *)0,
    289  1.1  brezak 			              (struct timeval *)0);
    290  1.1  brezak 		} else {
    291  1.1  brezak 			timeout.tv_sec = RMP_TIMEOUT;
    292  1.1  brezak 			timeout.tv_usec = 0;
    293  1.1  brezak 			nsel = select(maxfds, &r, (fd_set *)0, (fd_set *)0,
    294  1.1  brezak 			              &timeout);
    295  1.1  brezak 		}
    296  1.1  brezak 
    297  1.1  brezak 		if (nsel < 0) {
    298  1.1  brezak 			if (errno == EINTR)
    299  1.1  brezak 				continue;
    300  1.1  brezak 			syslog(LOG_ERR, "select: %m");
    301  1.1  brezak 			Exit(0);
    302  1.1  brezak 		} else if (nsel == 0) {		/* timeout */
    303  1.1  brezak 			DoTimeout();			/* clear stale conns */
    304  1.1  brezak 			continue;
    305  1.1  brezak 		}
    306  1.1  brezak 
    307  1.1  brezak 		if (FD_ISSET(fd, &r)) {
    308  1.1  brezak 			RMPCONN rconn;
    309  1.1  brezak 			CLIENT *client, *FindClient();
    310  1.1  brezak 			int doread = 1;
    311  1.1  brezak 
    312  1.1  brezak 			while (BpfRead(&rconn, doread)) {
    313  1.1  brezak 				doread = 0;
    314  1.1  brezak 
    315  1.1  brezak 				if (DbgFp != NULL)	/* display packet */
    316  1.1  brezak 					DispPkt(&rconn,DIR_RCVD);
    317  1.1  brezak 
    318  1.1  brezak 				omask = sigblock(sigmask(SIGHUP));
    319  1.1  brezak 
    320  1.1  brezak 				/*
    321  1.1  brezak 				 *  If we do not restrict service, set the
    322  1.1  brezak 				 *  client to NULL (ProcessPacket() handles
    323  1.1  brezak 				 *  this).  Otherwise, check that we can
    324  1.1  brezak 				 *  service this host; if not, log a message
    325  1.1  brezak 				 *  and ignore the packet.
    326  1.1  brezak 				 */
    327  1.1  brezak 				if (BootAny) {
    328  1.1  brezak 					client = NULL;
    329  1.1  brezak 				} else if ((client=FindClient(&rconn))==NULL) {
    330  1.1  brezak 					syslog(LOG_INFO,
    331  1.1  brezak 					       "%s: boot packet ignored",
    332  1.1  brezak 					       EnetStr(&rconn));
    333  1.1  brezak 					(void) sigsetmask(omask);
    334  1.1  brezak 					continue;
    335  1.1  brezak 				}
    336  1.1  brezak 
    337  1.1  brezak 				ProcessPacket(&rconn,client);
    338  1.1  brezak 
    339  1.1  brezak 				(void) sigsetmask(omask);
    340  1.1  brezak 			}
    341  1.1  brezak 		}
    342  1.1  brezak 	}
    343  1.1  brezak }
    344  1.1  brezak 
    345  1.1  brezak /*
    346  1.1  brezak **  DoTimeout -- Free any connections that have timed out.
    347  1.1  brezak **
    348  1.1  brezak **	Parameters:
    349  1.1  brezak **		None.
    350  1.1  brezak **
    351  1.1  brezak **	Returns:
    352  1.1  brezak **		Nothing.
    353  1.1  brezak **
    354  1.1  brezak **	Side Effects:
    355  1.1  brezak **		- Timed out connections in `RmpConns' will be freed.
    356  1.1  brezak */
    357  1.1  brezak void
    358  1.1  brezak DoTimeout()
    359  1.1  brezak {
    360  1.1  brezak 	register RMPCONN *rtmp;
    361  1.1  brezak 	struct timeval now;
    362  1.1  brezak 
    363  1.1  brezak 	(void) gettimeofday(&now, (struct timezone *)0);
    364  1.1  brezak 
    365  1.1  brezak 	/*
    366  1.1  brezak 	 *  For each active connection, if RMP_TIMEOUT seconds have passed
    367  1.1  brezak 	 *  since the last packet was sent, delete the connection.
    368  1.1  brezak 	 */
    369  1.1  brezak 	for (rtmp = RmpConns; rtmp != NULL; rtmp = rtmp->next)
    370  1.1  brezak 		if ((rtmp->tstamp.tv_sec + RMP_TIMEOUT) < now.tv_sec) {
    371  1.1  brezak 			syslog(LOG_WARNING, "%s: connection timed out (%u)",
    372  1.1  brezak 			       EnetStr(rtmp), rtmp->rmp.r_type);
    373  1.1  brezak 			RemoveConn(rtmp);
    374  1.1  brezak 		}
    375  1.1  brezak }
    376  1.1  brezak 
    377  1.1  brezak /*
    378  1.1  brezak **  FindClient -- Find client associated with a packet.
    379  1.1  brezak **
    380  1.1  brezak **	Parameters:
    381  1.1  brezak **		rconn - the new packet.
    382  1.1  brezak **
    383  1.1  brezak **	Returns:
    384  1.1  brezak **		Pointer to client info if found, NULL otherwise.
    385  1.1  brezak **
    386  1.1  brezak **	Side Effects:
    387  1.1  brezak **		None.
    388  1.1  brezak **
    389  1.1  brezak **	Warnings:
    390  1.1  brezak **		- This routine must be called with SIGHUP blocked since
    391  1.1  brezak **		  a reconfigure can invalidate the information returned.
    392  1.1  brezak */
    393  1.1  brezak 
    394  1.1  brezak CLIENT *
    395  1.1  brezak FindClient(rconn)
    396  1.1  brezak 	register RMPCONN *rconn;
    397  1.1  brezak {
    398  1.1  brezak 	register CLIENT *ctmp;
    399  1.1  brezak 
    400  1.1  brezak 	for (ctmp = Clients; ctmp != NULL; ctmp = ctmp->next)
    401  1.1  brezak 		if (bcmp((char *)&rconn->rmp.hp_hdr.saddr[0],
    402  1.1  brezak 		         (char *)&ctmp->addr[0], RMP_ADDRLEN) == 0)
    403  1.1  brezak 			break;
    404  1.1  brezak 
    405  1.1  brezak 	return(ctmp);
    406  1.1  brezak }
    407  1.1  brezak 
    408  1.1  brezak /*
    409  1.1  brezak **  Exit -- Log an error message and exit.
    410  1.1  brezak **
    411  1.1  brezak **	Parameters:
    412  1.1  brezak **		sig - caught signal (or zero if not dying on a signal).
    413  1.1  brezak **
    414  1.1  brezak **	Returns:
    415  1.1  brezak **		Does not return.
    416  1.1  brezak **
    417  1.1  brezak **	Side Effects:
    418  1.1  brezak **		- This process ceases to exist.
    419  1.1  brezak */
    420  1.1  brezak void
    421  1.1  brezak Exit(sig)
    422  1.1  brezak 	int sig;
    423  1.1  brezak {
    424  1.1  brezak 	if (sig > 0)
    425  1.1  brezak 		syslog(LOG_ERR, "going down on signal %d", sig);
    426  1.1  brezak 	else
    427  1.1  brezak 		syslog(LOG_ERR, "going down with fatal error");
    428  1.1  brezak 	BpfClose();
    429  1.1  brezak 	exit(1);
    430  1.1  brezak }
    431  1.1  brezak 
    432  1.1  brezak /*
    433  1.1  brezak **  ReConfig -- Get new list of boot files and reread config files.
    434  1.1  brezak **
    435  1.1  brezak **	Parameters:
    436  1.1  brezak **		None.
    437  1.1  brezak **
    438  1.1  brezak **	Returns:
    439  1.1  brezak **		Nothing.
    440  1.1  brezak **
    441  1.1  brezak **	Side Effects:
    442  1.1  brezak **		- All active connections are dropped.
    443  1.1  brezak **		- List of boot-able files is changed.
    444  1.1  brezak **		- List of clients is changed.
    445  1.1  brezak **
    446  1.1  brezak **	Warnings:
    447  1.1  brezak **		- This routine must be called with SIGHUP blocked.
    448  1.1  brezak */
    449  1.1  brezak void
    450  1.1  brezak ReConfig(signo)
    451  1.1  brezak 	int signo;
    452  1.1  brezak {
    453  1.1  brezak 	syslog(LOG_NOTICE, "reconfiguring boot server");
    454  1.1  brezak 
    455  1.1  brezak 	FreeConns();
    456  1.1  brezak 
    457  1.1  brezak 	if (GetBootFiles() == 0)
    458  1.1  brezak 		Exit(0);
    459  1.1  brezak 
    460  1.1  brezak 	if (ParseConfig() == 0)
    461  1.1  brezak 		Exit(0);
    462  1.1  brezak }
    463  1.1  brezak 
    464  1.1  brezak /*
    465  1.1  brezak **  DebugOff -- Turn off debugging.
    466  1.1  brezak **
    467  1.1  brezak **	Parameters:
    468  1.1  brezak **		None.
    469  1.1  brezak **
    470  1.1  brezak **	Returns:
    471  1.1  brezak **		Nothing.
    472  1.1  brezak **
    473  1.1  brezak **	Side Effects:
    474  1.1  brezak **		- Debug file is closed.
    475  1.1  brezak */
    476  1.1  brezak void
    477  1.1  brezak DebugOff(signo)
    478  1.1  brezak 	int signo;
    479  1.1  brezak {
    480  1.1  brezak 	if (DbgFp != NULL)
    481  1.1  brezak 		(void) fclose(DbgFp);
    482  1.1  brezak 
    483  1.1  brezak 	DbgFp = NULL;
    484  1.1  brezak }
    485  1.1  brezak 
    486  1.1  brezak /*
    487  1.1  brezak **  DebugOn -- Turn on debugging.
    488  1.1  brezak **
    489  1.1  brezak **	Parameters:
    490  1.1  brezak **		None.
    491  1.1  brezak **
    492  1.1  brezak **	Returns:
    493  1.1  brezak **		Nothing.
    494  1.1  brezak **
    495  1.1  brezak **	Side Effects:
    496  1.1  brezak **		- Debug file is opened/truncated if not already opened,
    497  1.1  brezak **		  otherwise do nothing.
    498  1.1  brezak */
    499  1.1  brezak void
    500  1.1  brezak DebugOn(signo)
    501  1.1  brezak 	int signo;
    502  1.1  brezak {
    503  1.1  brezak 	if (DbgFp == NULL) {
    504  1.1  brezak 		if ((DbgFp = fopen(DbgFile, "w")) == NULL)
    505  1.1  brezak 			syslog(LOG_ERR, "can't open debug file (%s)", DbgFile);
    506  1.1  brezak 	}
    507  1.1  brezak }
    508