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