<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tucnak.nagano.cz/wiki/index.php?action=history&amp;feed=atom&amp;title=Ax25d-zia.c</id>
	<title>Ax25d-zia.c - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tucnak.nagano.cz/wiki/index.php?action=history&amp;feed=atom&amp;title=Ax25d-zia.c"/>
	<link rel="alternate" type="text/html" href="https://tucnak.nagano.cz/wiki/index.php?title=Ax25d-zia.c&amp;action=history"/>
	<updated>2026-04-06T14:42:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://tucnak.nagano.cz/wiki/index.php?title=Ax25d-zia.c&amp;diff=1277&amp;oldid=prev</id>
		<title>Ok1zia: Created page with &#039;/*  *  This is my version of axl.c, written for the LBBS code to make it  *    compatable with the kernel AX25 driver.  It appears to work, with  *    my setup, so it&#039;ll probably...&#039;</title>
		<link rel="alternate" type="text/html" href="https://tucnak.nagano.cz/wiki/index.php?title=Ax25d-zia.c&amp;diff=1277&amp;oldid=prev"/>
		<updated>2010-01-03T10:32:44Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;/*  *  This is my version of axl.c, written for the LBBS code to make it  *    compatable with the kernel AX25 driver.  It appears to work, with  *    my setup, so it&amp;#039;ll probably...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*&lt;br /&gt;
 *  This is my version of axl.c, written for the LBBS code to make it&lt;br /&gt;
 *    compatable with the kernel AX25 driver.  It appears to work, with&lt;br /&gt;
 *    my setup, so it&amp;#039;ll probably not work else where :-).&lt;br /&gt;
 *&lt;br /&gt;
 *  This was inspired by the example code written by Alan Cox (GW4PTS)&lt;br /&gt;
 *    axl.c in AX25USER.TGZ from sunacm.swan.ac.uk.&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 *  Copyright (C) 1995, 1996 by Darryl L. Miles, G7LED.&lt;br /&gt;
 *  Copyright (C) 1996 by Jonathan Naylor G4KLX&lt;br /&gt;
 *&lt;br /&gt;
 *   This program is free software; you can redistribute it and/or modify&lt;br /&gt;
 *   it under the terms of the GNU General Public License as published by&lt;br /&gt;
 *   the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
 *   (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 *   This program is distributed in the hope that it will be useful,&lt;br /&gt;
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 *   GNU General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 *   You should have received a copy of the GNU General Public License&lt;br /&gt;
 *   along with this program; if not, write to the Free Software&lt;br /&gt;
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 *  Just a quickie Feb 1995.&lt;br /&gt;
 *  It *was* just a quickie (at the time) but you&amp;#039;d know how these things&lt;br /&gt;
 *   just... Apr 1995.&lt;br /&gt;
 *&lt;br /&gt;
 *  If your AX25/NETROM system is relying on this code for&lt;br /&gt;
 *    securetty/firewalling then please be aware this has been coded&lt;br /&gt;
 *    with the intent on striving on through system/(mis)configuration&lt;br /&gt;
 *    errors in the hope that at worst it will run with a degraded&lt;br /&gt;
 *    service.  Rather than leave your system providing no service at&lt;br /&gt;
 *    all, if opinions require the old behavior back when let me know&lt;br /&gt;
 *    and I&amp;#039;ll #ifdef it in.&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 *  History:&lt;br /&gt;
 *&lt;br /&gt;
 *	1.0  Feb 1995	Basic AX25 listening daemon, Multi-port, Call&lt;br /&gt;
 *			  matching, etc...&lt;br /&gt;
 *&lt;br /&gt;
 *	1.1  Feb 1995	Moved entry scanning before fork().&lt;br /&gt;
 *			Added setgroups() to plug security hole.&lt;br /&gt;
 *			Minor fixes + Improved handling.&lt;br /&gt;
 *&lt;br /&gt;
 *	1.2  Apr 1995   NETROM support added from developing AX25&lt;br /&gt;
 *			  028b/029.&lt;br /&gt;
 *			Added &amp;#039;defaults&amp;#039; port setting.&lt;br /&gt;
 *			Added FLAG_NODIGIS.&lt;br /&gt;
 *&lt;br /&gt;
 *	1.3  Jul 1995	Make it a little more intelligent about what to&lt;br /&gt;
 *			  do with errors.&lt;br /&gt;
 *			Added exec and argv[0] as two different fields,&lt;br /&gt;
 *			  much like inetd uses.&lt;br /&gt;
 *&lt;br /&gt;
 *	1.4  Aug 1995	Confirmed support for AX25 030 (1.3.20 + hacks),&lt;br /&gt;
 *			  it appears to work.&lt;br /&gt;
 *			It will now bootup even if initial config errors&lt;br /&gt;
 *			  occur when setting up and binding (e.g. port(s)&lt;br /&gt;
 *			  down), it will skip the port(s) with a problem&lt;br /&gt;
 *			  and listen out on those which are left standing.&lt;br /&gt;
 *&lt;br /&gt;
 *	1.5  Aug 1995	Updated old (buggy) libax25.a function copies in axl.&lt;br /&gt;
 *			  Causing all sorts of problems.&lt;br /&gt;
 *&lt;br /&gt;
 *	1.6  Aug 1995	Reset the &amp;#039;defaults&amp;#039; entry&amp;#039;s when we start parsing&lt;br /&gt;
 *			  a new interface.&lt;br /&gt;
 *&lt;br /&gt;
 *	1.7  Dec 1995	Added BROKEN_NETROM_KERNEL define for setsockopt.	&lt;br /&gt;
 *&lt;br /&gt;
 *	1.8  Jan 1996	Added support for AX25_BIND_ANY_DEVICE, specify just&lt;br /&gt;
 *			  [CALL-X VIA *].&lt;br /&gt;
 *			Better param parsing, T1 and T2 now using the real&lt;br /&gt;
 *			  time in seconds as params, and not kernel units.&lt;br /&gt;
 *			Connection loggin added, either via it&amp;#039;s own logfile&lt;br /&gt;
 *			  or syslog.&lt;br /&gt;
 *			Modified &amp;#039;defaults&amp;#039; to &amp;#039;parameters&amp;#039;.&lt;br /&gt;
 *&lt;br /&gt;
 *	1.9  Jun 1996	Reworked config file parsing to use port names instead&lt;br /&gt;
 *			  of callsigns. Reformated source code.&lt;br /&gt;
 *&lt;br /&gt;
 *	Under alpha:&lt;br /&gt;
 *			BPQ like clever mode called for.... also a mode that&lt;br /&gt;
 *			  requires a packet to kick application open.&lt;br /&gt;
 *			A flag/mode which will cause a call to initgroups()&lt;br /&gt;
 *			  based on uid.&lt;br /&gt;
 *			Callsign validation check.&lt;br /&gt;
 *			Logging of errors.&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 *  TODO:&lt;br /&gt;
 *         The timing of the &amp;#039;accept()&amp;#039; might be changed, defered to the&lt;br /&gt;
 *           child, then that child fork() itself, to stop race conditions&lt;br /&gt;
 *           around &amp;#039;accept()&amp;#039;.&lt;br /&gt;
 *         Add a config file to allow/disallow connections/services at&lt;br /&gt;
 *           different times of the day to restrict access say.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ctype.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pwd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;grp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;syslog.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;config.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/file.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifdef HAVE_NETAX25_AX25_H&lt;br /&gt;
#include &amp;lt;netax25/ax25.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#include &amp;lt;netax25/kernel_ax25.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
#ifdef HAVE_NETROM_NETROM_H&lt;br /&gt;
#include &amp;lt;netrom/netrom.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#include &amp;lt;netax25/kernel_netrom.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
#ifdef HAVE_NETROSE_ROSE_H&lt;br /&gt;
#include &amp;lt;netrose/rose.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#include &amp;lt;netax25/kernel_rose.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;netax25/axlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netax25/axconfig.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netax25/nrconfig.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netax25/rsconfig.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netax25/daemon.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// for my local source tree&lt;br /&gt;
// #define AX25_SYSCONFDIR &amp;quot;/etc/ax25/&amp;quot;&lt;br /&gt;
// #include &amp;quot;ax25dpathnames.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// for original ax25-tools&lt;br /&gt;
#include &amp;quot;../pathnames.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* Maximum number of command line arguments for the application we run */&lt;br /&gt;
#define MAX_ARGS	32&lt;br /&gt;
&lt;br /&gt;
#define	FLAG_VALIDCALL	0x01	/* NOTUSED */&lt;br /&gt;
#define	FLAG_NOLOGGING	0x02	/* Don&amp;#039;t log this connection */&lt;br /&gt;
#define	FLAG_CHKNRN	0x04	/* Check NetRom Neighbour - NOTUSED */&lt;br /&gt;
#define	FLAG_NODIGIS	0x08	/* Disallow digipeated uplinks */&lt;br /&gt;
#define	FLAG_LOCKOUT	0x10	/* Disallow connection */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct axlist {		/* Have used same struct for quickness */&lt;br /&gt;
	struct axlist *next;	/* Port list */&lt;br /&gt;
&lt;br /&gt;
	char *port;		/* Port call, only set across the port list */&lt;br /&gt;
	int fd;			/* The listening socket fd */&lt;br /&gt;
&lt;br /&gt;
	int af_type;		/* AF_AX25, AF_NETROM or AF_ROSE port */&lt;br /&gt;
&lt;br /&gt;
	struct axlist *ents;	/* Exec line entries */&lt;br /&gt;
	char *call;		/* Call in listing entries */&lt;br /&gt;
	char *node;		/* Node call in listing entries */&lt;br /&gt;
	uid_t uid;		/* UID to run program as */&lt;br /&gt;
	gid_t gid;		/* GID to run program as */&lt;br /&gt;
	char *exec;		/* Real exec */&lt;br /&gt;
	char *shell;		/* Command line. With possible escapes. */&lt;br /&gt;
&lt;br /&gt;
	unsigned int window;	/* Set window to... */&lt;br /&gt;
	unsigned long t1;	/* Set T1 to... (Retrans timer) */&lt;br /&gt;
	unsigned long t2;	/* Set T2 to... (Ack delay) */&lt;br /&gt;
	unsigned long t3;	/* Set T3 to... (Idle Poll timer) */&lt;br /&gt;
	unsigned long idle;	/* Set T4 to... (Link Drop timer) */&lt;br /&gt;
	unsigned long n2;	/* Set N2 to... (Retries) */&lt;br /&gt;
	unsigned long flags;	/* FLAG_ values ORed... */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static struct axlist *AXL	= NULL;&lt;br /&gt;
static char *ConfigFile		= CONF_AX25D_FILE;&lt;br /&gt;
static char User[10];				/* Room for &amp;#039;GB9ZZZ-15\0&amp;#039; */&lt;br /&gt;
static char Node[11];				/* Room for &amp;#039;GB9ZZZ-15\0&amp;#039; */&lt;br /&gt;
static char *Port;&lt;br /&gt;
static sig_atomic_t Update	= TRUE;		/* Cause update on bootup */&lt;br /&gt;
static int Logging		= FALSE;&lt;br /&gt;
static int nofork       = FALSE;&lt;br /&gt;
&lt;br /&gt;
static void SignalHUP(int);&lt;br /&gt;
static void SignalTERM(int);&lt;br /&gt;
static void WorkoutArgs(int, char *, int *, char **);&lt;br /&gt;
static void SetupOptions(int, struct axlist *);&lt;br /&gt;
static int ReadConfig(void);&lt;br /&gt;
static unsigned long ParseFlags(const char *, int);&lt;br /&gt;
static struct axlist *ClearList(struct axlist *);&lt;br /&gt;
static char *stripssid(const char *);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	struct axlist *axltmp, *paxl, *raxl;&lt;br /&gt;
	union {&lt;br /&gt;
		struct full_sockaddr_ax25 ax25;&lt;br /&gt;
		struct sockaddr_rose rose;&lt;br /&gt;
	} sockaddr;&lt;br /&gt;
	struct sigaction act, oact;&lt;br /&gt;
	int maxfd = -1;&lt;br /&gt;
	fd_set fdread;&lt;br /&gt;
	int addrlen;&lt;br /&gt;
	int cnt;&lt;br /&gt;
   &lt;br /&gt;
	while ((cnt = getopt(argc, argv, &amp;quot;c:lnv&amp;quot;)) != EOF) {&lt;br /&gt;
		switch (cnt) {&lt;br /&gt;
			case &amp;#039;c&amp;#039;:&lt;br /&gt;
				ConfigFile = optarg;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;l&amp;#039;:&lt;br /&gt;
				Logging = TRUE;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
            case &amp;#039;n&amp;#039;:&lt;br /&gt;
                nofork = TRUE;&lt;br /&gt;
                break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;v&amp;#039;:&lt;br /&gt;
				printf(&amp;quot;ax25d: %s\n&amp;quot;, VERSION);&lt;br /&gt;
				return 1;&lt;br /&gt;
         &lt;br /&gt;
			default:&lt;br /&gt;
				fprintf(stderr, &amp;quot;Usage: ax25d [-v] [-c altfile] [-l]\n&amp;quot;);&lt;br /&gt;
				return 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if (ax25_config_load_ports() == 0) {&lt;br /&gt;
		fprintf(stderr, &amp;quot;ax25d: no AX.25 port data configured\n&amp;quot;);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	nr_config_load_ports();&lt;br /&gt;
&lt;br /&gt;
	rs_config_load_ports();&lt;br /&gt;
&lt;br /&gt;
    if (!nofork){&lt;br /&gt;
        if (!daemon_start(TRUE)) {&lt;br /&gt;
            fprintf(stderr, &amp;quot;ax25d: cannot become a daemon\n&amp;quot;);&lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	if (Logging) {&lt;br /&gt;
		openlog(&amp;quot;ax25d&amp;quot;, LOG_PID, LOG_DAEMON);&lt;br /&gt;
		syslog(LOG_INFO, &amp;quot;starting&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	act.sa_handler = SignalHUP;&lt;br /&gt;
	sigemptyset(&amp;amp;act.sa_mask);&lt;br /&gt;
	act.sa_flags = 0;&lt;br /&gt;
	sigaction(SIGHUP, &amp;amp;act, &amp;amp;oact);&lt;br /&gt;
&lt;br /&gt;
	act.sa_handler = SignalTERM;&lt;br /&gt;
	sigemptyset(&amp;amp;act.sa_mask);&lt;br /&gt;
	act.sa_flags = 0;&lt;br /&gt;
	sigaction(SIGTERM, &amp;amp;act, &amp;amp;oact);&lt;br /&gt;
&lt;br /&gt;
	for (;;) {&lt;br /&gt;
		if (Update) {&lt;br /&gt;
			if (ReadConfig() &amp;lt; 0) {&lt;br /&gt;
				if (AXL == NULL) {&lt;br /&gt;
					if (Logging)&lt;br /&gt;
						syslog(LOG_ERR, &amp;quot;config file reload error, exiting&amp;quot;);&lt;br /&gt;
					return 1;&lt;br /&gt;
				} else {&lt;br /&gt;
					if (Logging)&lt;br /&gt;
						syslog(LOG_INFO, &amp;quot;config file reload error, continuing with original&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				if (Logging)&lt;br /&gt;
					syslog(LOG_INFO, &amp;quot;new config file loaded successfuly&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
				&lt;br /&gt;
			Update = FALSE;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		FD_ZERO(&amp;amp;fdread);&lt;br /&gt;
&lt;br /&gt;
		for (paxl = AXL; paxl != NULL &amp;amp;&amp;amp; paxl-&amp;gt;fd &amp;gt;= 0; paxl = paxl-&amp;gt;next) {&lt;br /&gt;
			FD_SET(paxl-&amp;gt;fd, &amp;amp;fdread);&lt;br /&gt;
&lt;br /&gt;
			if (paxl-&amp;gt;fd &amp;gt; maxfd)&lt;br /&gt;
				maxfd = paxl-&amp;gt;fd;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (select(maxfd + 1, &amp;amp;fdread, NULL, NULL, NULL) &amp;lt;= 0)&lt;br /&gt;
			continue;&lt;br /&gt;
&lt;br /&gt;
		for (paxl = AXL; paxl != NULL; paxl = paxl-&amp;gt;next) {&lt;br /&gt;
			if (FD_ISSET(paxl-&amp;gt;fd, &amp;amp;fdread)) {&lt;br /&gt;
				pid_t pid;&lt;br /&gt;
				gid_t grps[2];&lt;br /&gt;
				char *argv[MAX_ARGS];&lt;br /&gt;
				int argc;&lt;br /&gt;
				int new;&lt;br /&gt;
				int i;&lt;br /&gt;
            &lt;br /&gt;
				/*&lt;br /&gt;
				 * Setting up a non-blocking accept() so is does not hang up&lt;br /&gt;
				 *  - I am not sure at this time why I didn&amp;#039;t/don&amp;#039;t assign&lt;br /&gt;
				 *  the socket non-blocking to start with.&lt;br /&gt;
				 */&lt;br /&gt;
				/*&lt;br /&gt;
				 * We really need to setup the netrom window option here so&lt;br /&gt;
				 *  that it&amp;#039;s negotiated correctly on accepting the connection.&lt;br /&gt;
				 */&lt;br /&gt;
				/*&lt;br /&gt;
				 * It would be very useful if recvmsg/sendmsg were supported&lt;br /&gt;
				 *  then we can move the call checking up here.&lt;br /&gt;
				 */&lt;br /&gt;
				i = TRUE;&lt;br /&gt;
				ioctl(paxl-&amp;gt;fd, FIONBIO, &amp;amp;i);&lt;br /&gt;
&lt;br /&gt;
				addrlen = sizeof(struct full_sockaddr_ax25);&lt;br /&gt;
				new = accept(paxl-&amp;gt;fd, (struct sockaddr *)&amp;amp;sockaddr, &amp;amp;addrlen);&lt;br /&gt;
&lt;br /&gt;
				i = FALSE;&lt;br /&gt;
				ioctl(paxl-&amp;gt;fd, FIONBIO, &amp;amp;i);&lt;br /&gt;
&lt;br /&gt;
				if (new &amp;lt; 0) {&lt;br /&gt;
					if (errno == EWOULDBLOCK)&lt;br /&gt;
						continue;	/* It&amp;#039;s gone ??? */&lt;br /&gt;
&lt;br /&gt;
					if (Logging)&lt;br /&gt;
						syslog(LOG_ERR, &amp;quot;ax25d: accept error %m, closing socket on port %s&amp;quot;, paxl-&amp;gt;port);&lt;br /&gt;
					close(paxl-&amp;gt;fd);&lt;br /&gt;
					paxl-&amp;gt;fd = -1;&lt;br /&gt;
                    if (nofork) {&lt;br /&gt;
                        syslog(LOG_ERR, &amp;quot;ax25d: exiting ax25d to be respawned again&amp;quot;);&lt;br /&gt;
                        exit(0);&lt;br /&gt;
                    }&lt;br /&gt;
					continue; &lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				switch (paxl-&amp;gt;af_type) {&lt;br /&gt;
					case AF_AX25:&lt;br /&gt;
						strcpy(User, ax25_ntoa(&amp;amp;sockaddr.ax25.fsa_ax25.sax25_call));&lt;br /&gt;
						strcpy(Node, &amp;quot;&amp;quot;);&lt;br /&gt;
						break;&lt;br /&gt;
					case AF_NETROM:&lt;br /&gt;
						strcpy(User, ax25_ntoa(&amp;amp;sockaddr.ax25.fsa_ax25.sax25_call));&lt;br /&gt;
						strcpy(Node, ax25_ntoa(&amp;amp;sockaddr.ax25.fsa_digipeater[0]));&lt;br /&gt;
						break;&lt;br /&gt;
					case AF_ROSE:&lt;br /&gt;
						strcpy(User, ax25_ntoa(&amp;amp;sockaddr.rose.srose_call));&lt;br /&gt;
						strcpy(Node, rose_ntoa(&amp;amp;sockaddr.rose.srose_addr));&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				for (raxl = paxl-&amp;gt;ents; raxl != NULL; raxl = raxl-&amp;gt;ents) {&lt;br /&gt;
					if (paxl-&amp;gt;af_type == AF_NETROM &amp;amp;&amp;amp; raxl-&amp;gt;node != NULL &amp;amp;&amp;amp; Node[0] != &amp;#039;\0&amp;#039;) {&lt;br /&gt;
						if (strchr(raxl-&amp;gt;node, &amp;#039;-&amp;#039;) == NULL) {&lt;br /&gt;
							if (strcasecmp(raxl-&amp;gt;node, stripssid(Node)) != 0)&lt;br /&gt;
								continue;	/* Found no match (for any SSID) */&lt;br /&gt;
						} else {&lt;br /&gt;
							if (strcasecmp(raxl-&amp;gt;node, Node) != 0)&lt;br /&gt;
								continue;	/* Found no match */&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					if (raxl-&amp;gt;call == NULL)	/* default */&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					if (strchr(raxl-&amp;gt;call, &amp;#039;-&amp;#039;) == NULL) {&lt;br /&gt;
						if (strcasecmp(raxl-&amp;gt;call, stripssid(User)) == 0)&lt;br /&gt;
							break;	/* Found a match (for any SSID) */&lt;br /&gt;
					} else {&lt;br /&gt;
						if (strcasecmp(raxl-&amp;gt;call, User) == 0)&lt;br /&gt;
							break;	/* Found a match */&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				addrlen = sizeof(struct full_sockaddr_ax25);&lt;br /&gt;
				getsockname(new, (struct sockaddr *)&amp;amp;sockaddr, &amp;amp;addrlen);&lt;br /&gt;
&lt;br /&gt;
				switch (paxl-&amp;gt;af_type) {&lt;br /&gt;
					case AF_AX25:&lt;br /&gt;
						Port = ax25_config_get_port(&amp;amp;sockaddr.ax25.fsa_digipeater[0]);&lt;br /&gt;
						break;&lt;br /&gt;
					case AF_NETROM:&lt;br /&gt;
						Port = nr_config_get_port(&amp;amp;sockaddr.ax25.fsa_ax25.sax25_call);&lt;br /&gt;
						break;&lt;br /&gt;
					case AF_ROSE:&lt;br /&gt;
						Port = rs_config_get_port(&amp;amp;sockaddr.rose.srose_addr);&lt;br /&gt;
						break;&lt;br /&gt;
					default:&lt;br /&gt;
						Port = &amp;quot;???&amp;quot;;&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (raxl == NULL) {&lt;br /&gt;
					/* No default */&lt;br /&gt;
					if (Logging &amp;amp;&amp;amp; !(paxl-&amp;gt;flags &amp;amp; FLAG_NOLOGGING)) {&lt;br /&gt;
						switch (paxl-&amp;gt;af_type) {&lt;br /&gt;
							case AF_AX25:&lt;br /&gt;
								syslog(LOG_INFO, &amp;quot;AX.25 %s (%s) rejected - no default&amp;quot;, User, Port);&lt;br /&gt;
								break;&lt;br /&gt;
							case AF_NETROM:&lt;br /&gt;
								syslog(LOG_INFO, &amp;quot;NET/ROM %s@%s (%s) rejected - no default&amp;quot;, User, Node, Port);&lt;br /&gt;
								break;&lt;br /&gt;
							case AF_ROSE:&lt;br /&gt;
								syslog(LOG_INFO, &amp;quot;Rose %s@%s (%s) rejected - no default&amp;quot;, User, Node, Port);&lt;br /&gt;
								break;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					close(new);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (raxl-&amp;gt;flags &amp;amp; FLAG_LOCKOUT) {&lt;br /&gt;
					/* Not allowed to connect */&lt;br /&gt;
					if (Logging &amp;amp;&amp;amp; !(paxl-&amp;gt;flags &amp;amp; FLAG_NOLOGGING)) {&lt;br /&gt;
						switch (raxl-&amp;gt;af_type) {&lt;br /&gt;
							case AF_AX25:&lt;br /&gt;
								syslog(LOG_INFO, &amp;quot;AX.25 %s (%s) rejected - port locked&amp;quot;, User, Port);&lt;br /&gt;
								break;&lt;br /&gt;
							case AF_NETROM:&lt;br /&gt;
								syslog(LOG_INFO, &amp;quot;NET/ROM %s@%s (%s) rejected - port locked&amp;quot;, User, Node, Port);&lt;br /&gt;
								break;&lt;br /&gt;
							case AF_ROSE:&lt;br /&gt;
								syslog(LOG_INFO, &amp;quot;Rose %s@%s (%s) rejected - port locked&amp;quot;, User, Node, Port);&lt;br /&gt;
								break;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					close(new);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (raxl-&amp;gt;af_type == AF_AX25 &amp;amp;&amp;amp; (raxl-&amp;gt;flags &amp;amp; FLAG_NODIGIS) &amp;amp;&amp;amp; sockaddr.ax25.fsa_ax25.sax25_ndigis != 0) {&lt;br /&gt;
					/* Not allowed to uplink via digi&amp;#039;s */&lt;br /&gt;
					if (Logging &amp;amp;&amp;amp; !(paxl-&amp;gt;flags &amp;amp; FLAG_NOLOGGING))&lt;br /&gt;
						syslog(LOG_INFO, &amp;quot;AX.25 %s (%s) rejected - digipeaters&amp;quot;, User, Port);&lt;br /&gt;
					close(new);&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				pid = fork();&lt;br /&gt;
&lt;br /&gt;
				switch (pid) {&lt;br /&gt;
					case -1:&lt;br /&gt;
						if (Logging)&lt;br /&gt;
							syslog(LOG_ERR, &amp;quot;fork error %m&amp;quot;);&lt;br /&gt;
						/*&lt;br /&gt;
						 * I don&amp;#039;t think AX25 at the moment will hold the&lt;br /&gt;
						 * connection open, if the above does not make it&lt;br /&gt;
						 * through first time.&lt;br /&gt;
						 */&lt;br /&gt;
						close(new);&lt;br /&gt;
						break;			/* Oh well... */&lt;br /&gt;
&lt;br /&gt;
					case 0:&lt;br /&gt;
						SetupOptions(new, raxl);&lt;br /&gt;
						WorkoutArgs(raxl-&amp;gt;af_type, raxl-&amp;gt;shell, &amp;amp;argc, argv);&lt;br /&gt;
&lt;br /&gt;
						if (Logging &amp;amp;&amp;amp; !(paxl-&amp;gt;flags &amp;amp; FLAG_NOLOGGING)) {&lt;br /&gt;
							switch (paxl-&amp;gt;af_type) {&lt;br /&gt;
								case AF_AX25:&lt;br /&gt;
									syslog(LOG_INFO, &amp;quot;AX.25 %s (%s) %s&amp;quot;, User, Port, argv[0]);&lt;br /&gt;
									break;&lt;br /&gt;
								case AF_NETROM:&lt;br /&gt;
									syslog(LOG_INFO, &amp;quot;NET/ROM %s@%s (%s) %s&amp;quot;, User, Node, Port, argv[0]);&lt;br /&gt;
									break;&lt;br /&gt;
								case AF_ROSE:&lt;br /&gt;
									syslog(LOG_INFO, &amp;quot;Rose %s@%s (%s) %s&amp;quot;, User, Node, Port, argv[0]);&lt;br /&gt;
									break;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						dup2(new, STDIN_FILENO);&lt;br /&gt;
						dup2(new, STDOUT_FILENO);&lt;br /&gt;
						close(new);&lt;br /&gt;
&lt;br /&gt;
						/*&lt;br /&gt;
						 * Might be more efficient if we just went down AXL,&lt;br /&gt;
						 * we cleaned up our parents left overs on bootup.&lt;br /&gt;
						 */&lt;br /&gt;
						for (axltmp = AXL; axltmp != NULL; axltmp = axltmp-&amp;gt;next)&lt;br /&gt;
							close(axltmp-&amp;gt;fd);&lt;br /&gt;
&lt;br /&gt;
						if (Logging)&lt;br /&gt;
							closelog();&lt;br /&gt;
&lt;br /&gt;
						/* Make root secure, before we exec() */&lt;br /&gt;
						setgroups(0, grps);	/* Strip any supplementary gid&amp;#039;s */&lt;br /&gt;
						setgid(raxl-&amp;gt;gid);&lt;br /&gt;
						setuid(raxl-&amp;gt;uid);&lt;br /&gt;
						execve(raxl-&amp;gt;exec, argv, NULL);&lt;br /&gt;
						return 1;&lt;br /&gt;
&lt;br /&gt;
					default:&lt;br /&gt;
						close(new);&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* NOT REACHED */&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void SignalHUP(int code)&lt;br /&gt;
{&lt;br /&gt;
	Update = TRUE;		/* Schedule an update */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void SignalTERM(int code)&lt;br /&gt;
{&lt;br /&gt;
	if (Logging) {&lt;br /&gt;
		syslog(LOG_INFO, &amp;quot;terminating on SIGTERM\n&amp;quot;);&lt;br /&gt;
		closelog();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void WorkoutArgs(int af_type, char *shell, int *argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[1024];	/* Maximum arg size */&lt;br /&gt;
	char *sp, *cp;&lt;br /&gt;
	int cnt  = 0;&lt;br /&gt;
	int args = 0;&lt;br /&gt;
   &lt;br /&gt;
	for (cp = shell; *cp != &amp;#039;\0&amp;#039;; cp++) {&lt;br /&gt;
		if (isspace(*cp) &amp;amp;&amp;amp; cnt != 0) {&lt;br /&gt;
			buffer[cnt]  = &amp;#039;\0&amp;#039;;&lt;br /&gt;
			argv[args++] = strdup(buffer);&lt;br /&gt;
			cnt          = 0;&lt;br /&gt;
&lt;br /&gt;
			if (args == MAX_ARGS - 1) {&lt;br /&gt;
				argv[args] = NULL;&lt;br /&gt;
				*argc = args;&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			continue;&lt;br /&gt;
		} else if (isspace(*cp))	/* &amp;amp;&amp;amp; !cnt */&lt;br /&gt;
			continue;&lt;br /&gt;
&lt;br /&gt;
		if (*cp == &amp;#039;%&amp;#039;) {&lt;br /&gt;
			cp++;&lt;br /&gt;
&lt;br /&gt;
			switch(*cp) {&lt;br /&gt;
				case &amp;#039;d&amp;#039;:	/* portname */&lt;br /&gt;
					for (sp = Port; *sp != &amp;#039;\0&amp;#039; &amp;amp;&amp;amp; *sp != &amp;#039;-&amp;#039;; sp++)&lt;br /&gt;
						buffer[cnt++] = *sp;&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;U&amp;#039;:	/* username in UPPER */&lt;br /&gt;
					for (sp = User; *sp != &amp;#039;\0&amp;#039; &amp;amp;&amp;amp; *sp != &amp;#039;-&amp;#039;; sp++)&lt;br /&gt;
						buffer[cnt++] = toupper(*sp);&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;u&amp;#039;:	/* USERNAME IN lower */&lt;br /&gt;
					for (sp = User; *sp != &amp;#039;\0&amp;#039; &amp;amp;&amp;amp; *sp != &amp;#039;-&amp;#039;; sp++)&lt;br /&gt;
						buffer[cnt++] = tolower(*sp);&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;S&amp;#039;:	/* username in UPPER (with SSID) */&lt;br /&gt;
					for (sp = User; *sp != &amp;#039;\0&amp;#039;; sp++)&lt;br /&gt;
						buffer[cnt++] = toupper(*sp);&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;s&amp;#039;:	/* USERNAME IN lower (with SSID) */&lt;br /&gt;
					for (sp = User; *sp != &amp;#039;\0&amp;#039;; sp++)&lt;br /&gt;
						buffer[cnt++] = tolower(*sp);&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;P&amp;#039;:	/* nodename in UPPER */&lt;br /&gt;
					if (af_type == AF_NETROM) {&lt;br /&gt;
						for (sp = Node; *sp != &amp;#039;\0&amp;#039; &amp;amp;&amp;amp; *sp != &amp;#039;-&amp;#039;; sp++)&lt;br /&gt;
							buffer[cnt++] = toupper(*sp);&lt;br /&gt;
					} else {&lt;br /&gt;
						buffer[cnt++] = &amp;#039;%&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;p&amp;#039;:	/* NODENAME IN lower */&lt;br /&gt;
					if (af_type == AF_NETROM) {&lt;br /&gt;
						for(sp = Node; *sp != &amp;#039;\0&amp;#039; &amp;amp;&amp;amp; *sp != &amp;#039;-&amp;#039;; sp++)&lt;br /&gt;
							buffer[cnt++] = tolower(*sp);&lt;br /&gt;
					} else {&lt;br /&gt;
						buffer[cnt++] = &amp;#039;%&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;R&amp;#039;:	/* nodename in UPPER (with SSID) */&lt;br /&gt;
					if (af_type == AF_NETROM) {&lt;br /&gt;
						for (sp = Node; *sp != &amp;#039;\0&amp;#039;; sp++)&lt;br /&gt;
							buffer[cnt++] = toupper(*sp);&lt;br /&gt;
					} else {&lt;br /&gt;
						buffer[cnt++] = &amp;#039;%&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;r&amp;#039;:	/* NODENAME IN lower (with SSID) */&lt;br /&gt;
					if (af_type == AF_NETROM) {&lt;br /&gt;
						for (sp = Node; *sp != &amp;#039;\0&amp;#039;; sp++)&lt;br /&gt;
							buffer[cnt++] = tolower(*sp);&lt;br /&gt;
					} else {&lt;br /&gt;
						buffer[cnt++] = &amp;#039;%&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &amp;#039;\0&amp;#039;:&lt;br /&gt;
				case &amp;#039;%&amp;#039;:&lt;br /&gt;
				default:&lt;br /&gt;
					buffer[cnt++] = &amp;#039;%&amp;#039;;&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			buffer[cnt++] = *cp;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (cnt != 0) {&lt;br /&gt;
		buffer[cnt]  = &amp;#039;\0&amp;#039;;&lt;br /&gt;
		argv[args++] = strdup(buffer);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	argv[args] = NULL;&lt;br /&gt;
	*argc      = args;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void SetupOptions(int new, struct axlist *axl)&lt;br /&gt;
{&lt;br /&gt;
	switch (axl-&amp;gt;af_type) {&lt;br /&gt;
	case AF_AX25:&lt;br /&gt;
		if (axl-&amp;gt;window != 0)&lt;br /&gt;
			setsockopt(new, SOL_AX25, AX25_WINDOW, &amp;amp;axl-&amp;gt;window, sizeof(axl-&amp;gt;window));&lt;br /&gt;
		if (axl-&amp;gt;t1 != 0)&lt;br /&gt;
			setsockopt(new, SOL_AX25, AX25_T1, &amp;amp;axl-&amp;gt;t1, sizeof(axl-&amp;gt;t1));&lt;br /&gt;
		if (axl-&amp;gt;n2 != 0)&lt;br /&gt;
			setsockopt(new, SOL_AX25, AX25_N2, &amp;amp;axl-&amp;gt;n2, sizeof(axl-&amp;gt;n2));&lt;br /&gt;
		if (axl-&amp;gt;t2 != 0)&lt;br /&gt;
			setsockopt(new, SOL_AX25, AX25_T2, &amp;amp;axl-&amp;gt;t2, sizeof(axl-&amp;gt;t2));&lt;br /&gt;
		if (axl-&amp;gt;t3 != 0)&lt;br /&gt;
			setsockopt(new, SOL_AX25, AX25_T3, &amp;amp;axl-&amp;gt;t3, sizeof(axl-&amp;gt;t3));&lt;br /&gt;
		if (axl-&amp;gt;idle != 0)&lt;br /&gt;
			setsockopt(new, SOL_AX25, AX25_IDLE, &amp;amp;axl-&amp;gt;idle, sizeof(axl-&amp;gt;idle));&lt;br /&gt;
		break;&lt;br /&gt;
	case AF_NETROM:&lt;br /&gt;
		if (axl-&amp;gt;t1 != 0)&lt;br /&gt;
			setsockopt(new, SOL_NETROM, NETROM_T1, &amp;amp;axl-&amp;gt;t1, sizeof(axl-&amp;gt;t1));&lt;br /&gt;
		if (axl-&amp;gt;n2 != 0)&lt;br /&gt;
			setsockopt(new, SOL_NETROM, NETROM_N2, &amp;amp;axl-&amp;gt;n2, sizeof(axl-&amp;gt;n2));&lt;br /&gt;
		if (axl-&amp;gt;t2 != 0)&lt;br /&gt;
			setsockopt(new, SOL_NETROM, NETROM_T2, &amp;amp;axl-&amp;gt;t2, sizeof(axl-&amp;gt;t2));&lt;br /&gt;
		break;&lt;br /&gt;
	case AF_ROSE:&lt;br /&gt;
		if (axl-&amp;gt;idle != 0)&lt;br /&gt;
			setsockopt(new, SOL_ROSE, ROSE_IDLE, &amp;amp;axl-&amp;gt;idle, sizeof(axl-&amp;gt;idle));&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**************************** CONFIGURATION STUFF ***************************/&lt;br /&gt;
&lt;br /&gt;
static int ReadConfig(void)&lt;br /&gt;
{&lt;br /&gt;
	struct axlist axl_defaults;&lt;br /&gt;
	struct axlist *axl_build = NULL;&lt;br /&gt;
	struct axlist *axl_port  = NULL;&lt;br /&gt;
	struct axlist *axl_ent, *axltmp;&lt;br /&gt;
	union {&lt;br /&gt;
		struct full_sockaddr_ax25 ax25;&lt;br /&gt;
		struct sockaddr_rose rose;&lt;br /&gt;
	} sockaddr;&lt;br /&gt;
	struct passwd *pwd;&lt;br /&gt;
	FILE *fp;&lt;br /&gt;
	char buffer[2048];&lt;br /&gt;
	char *s, *port, *call, *node, *addr = NULL;&lt;br /&gt;
	unsigned long val;&lt;br /&gt;
	int addrlen;&lt;br /&gt;
	int af_type = 0;	/* Keep GCC happy */&lt;br /&gt;
	int line = 0;&lt;br /&gt;
	int hunt = TRUE, error = FALSE;&lt;br /&gt;
	int iamdigi = FALSE;&lt;br /&gt;
	int parameters = 0;&lt;br /&gt;
&lt;br /&gt;
	memset(&amp;amp;axl_defaults, 0, sizeof(axl_defaults));&lt;br /&gt;
&lt;br /&gt;
	if ((fp = fopen(ConfigFile, &amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
		return -1;&lt;br /&gt;
&lt;br /&gt;
	while (fgets(buffer, sizeof(buffer), fp) != NULL) {&lt;br /&gt;
		line++;&lt;br /&gt;
&lt;br /&gt;
		if ((s = strchr(buffer, &amp;#039;\n&amp;#039;)) != NULL)&lt;br /&gt;
			*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
		if ((s = strchr(buffer, &amp;#039;\r&amp;#039;)) != NULL)&lt;br /&gt;
			*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		if (buffer[0] == &amp;#039;#&amp;#039;)&lt;br /&gt;
			continue;&lt;br /&gt;
         &lt;br /&gt;
		switch (buffer[0]) {&lt;br /&gt;
			case &amp;#039;[&amp;#039;:		/* AX25 port call */&lt;br /&gt;
				af_type = AF_AX25;&lt;br /&gt;
				hunt    = TRUE;&lt;br /&gt;
				error   = FALSE;&lt;br /&gt;
				iamdigi = FALSE;&lt;br /&gt;
				break;&lt;br /&gt;
   &lt;br /&gt;
			case &amp;#039;&amp;lt;&amp;#039;:		/* NETROM iface call */&lt;br /&gt;
				af_type = AF_NETROM;&lt;br /&gt;
				hunt    = TRUE;&lt;br /&gt;
				error   = FALSE;&lt;br /&gt;
				iamdigi = FALSE;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;{&amp;#039;:		/* ROSE iface call */&lt;br /&gt;
				af_type = AF_ROSE;&lt;br /&gt;
				hunt    = TRUE;&lt;br /&gt;
				error   = FALSE;&lt;br /&gt;
				iamdigi = FALSE;&lt;br /&gt;
				break;&lt;br /&gt;
   &lt;br /&gt;
			default:&lt;br /&gt;
				if (hunt &amp;amp;&amp;amp; !error)&lt;br /&gt;
					goto BadLine;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (hunt) {	/* We&amp;#039;ve found a Iface entry */&lt;br /&gt;
			/* Reset &amp;#039;defaults&amp;#039; entry on the interface */&lt;br /&gt;
			memset(&amp;amp;axl_defaults, 0, sizeof(axl_defaults));&lt;br /&gt;
&lt;br /&gt;
			switch (af_type) {&lt;br /&gt;
				case AF_AX25:&lt;br /&gt;
					if ((s = strchr(buffer, &amp;#039;]&amp;#039;)) == NULL)&lt;br /&gt;
						goto BadLine;&lt;br /&gt;
					*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
					if ((s = strtok(buffer + 1, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
						goto BadLine;&lt;br /&gt;
					port = s;&lt;br /&gt;
					call = NULL;&lt;br /&gt;
					if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) != NULL) {&lt;br /&gt;
						if (strcasecmp(s, &amp;quot;VIA&amp;quot;) == 0 || strcasecmp(s, &amp;quot;V&amp;quot;) == 0) {&lt;br /&gt;
							if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
								goto BadLine;&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						call = port;&lt;br /&gt;
						port = s;&lt;br /&gt;
&lt;br /&gt;
						if ((s = strchr(call, &amp;#039;*&amp;#039;)) != NULL) {&lt;br /&gt;
							iamdigi = TRUE;&lt;br /&gt;
							*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					if (strcmp(port, &amp;quot;*&amp;quot;) == 0 &amp;amp;&amp;amp; call == NULL) {&lt;br /&gt;
						fprintf(stderr, &amp;quot;ax25d: invalid port name\n&amp;quot;);&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
					if (strcmp(port, &amp;quot;*&amp;quot;) != 0) {&lt;br /&gt;
						if ((addr = ax25_config_get_addr(port)) == NULL) {&lt;br /&gt;
							fprintf(stderr, &amp;quot;ax25d: invalid AX.25 port &amp;#039;%s&amp;#039;\n&amp;quot;, port);&lt;br /&gt;
							continue;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					if (call == NULL) {&lt;br /&gt;
						sockaddr.ax25.fsa_ax25.sax25_family = AF_AX25;&lt;br /&gt;
						sockaddr.ax25.fsa_ax25.sax25_ndigis = 0;&lt;br /&gt;
						ax25_aton_entry(addr, sockaddr.ax25.fsa_ax25.sax25_call.ax25_call);&lt;br /&gt;
					} else {&lt;br /&gt;
						sockaddr.ax25.fsa_ax25.sax25_family = AF_AX25;&lt;br /&gt;
						sockaddr.ax25.fsa_ax25.sax25_ndigis = 1;&lt;br /&gt;
						ax25_aton_entry(call, sockaddr.ax25.fsa_ax25.sax25_call.ax25_call);&lt;br /&gt;
						if (strcmp(port, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
							ax25_aton_entry(addr, sockaddr.ax25.fsa_digipeater[0].ax25_call);&lt;br /&gt;
						else&lt;br /&gt;
							sockaddr.ax25.fsa_digipeater[0] = null_ax25_address;&lt;br /&gt;
					}&lt;br /&gt;
					addrlen = sizeof(struct full_sockaddr_ax25);&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case AF_NETROM:&lt;br /&gt;
					if ((s = strchr(buffer, &amp;#039;&amp;gt;&amp;#039;)) == NULL)&lt;br /&gt;
						goto BadLine;&lt;br /&gt;
					*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
					port = buffer + 1;&lt;br /&gt;
					if ((addr = nr_config_get_addr(port)) == NULL) {&lt;br /&gt;
						fprintf(stderr, &amp;quot;ax25d: invalid NET/ROM port &amp;#039;%s&amp;#039;\n&amp;quot;, port);&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
					sockaddr.ax25.fsa_ax25.sax25_family = AF_NETROM;&lt;br /&gt;
					sockaddr.ax25.fsa_ax25.sax25_ndigis = 0;&lt;br /&gt;
					ax25_aton_entry(addr, sockaddr.ax25.fsa_ax25.sax25_call.ax25_call);&lt;br /&gt;
					addrlen = sizeof(struct full_sockaddr_ax25);&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case AF_ROSE:&lt;br /&gt;
					if ((s = strchr(buffer, &amp;#039;}&amp;#039;)) == NULL)&lt;br /&gt;
						goto BadLine;&lt;br /&gt;
					*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
					if ((s = strtok(buffer + 1, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
						goto BadLine;&lt;br /&gt;
					call = s;&lt;br /&gt;
					if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
						goto BadLine;&lt;br /&gt;
					if (strcasecmp(s, &amp;quot;VIA&amp;quot;) == 0 || strcasecmp(s, &amp;quot;V&amp;quot;) == 0) {&lt;br /&gt;
						if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
							goto BadLine;&lt;br /&gt;
					}&lt;br /&gt;
					port = s;&lt;br /&gt;
					if ((addr = rs_config_get_addr(port)) == NULL) {&lt;br /&gt;
						fprintf(stderr, &amp;quot;ax25d: invalid Rose port &amp;#039;%s&amp;#039;\n&amp;quot;, port);&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
					if (strcmp(call, &amp;quot;*&amp;quot;) == 0) {&lt;br /&gt;
						sockaddr.rose.srose_family = AF_ROSE;&lt;br /&gt;
						sockaddr.rose.srose_ndigis = 0;&lt;br /&gt;
						rose_aton(addr, sockaddr.rose.srose_addr.rose_addr);&lt;br /&gt;
						sockaddr.rose.srose_call   = null_ax25_address;&lt;br /&gt;
					} else {&lt;br /&gt;
						sockaddr.rose.srose_family = AF_ROSE;&lt;br /&gt;
						sockaddr.rose.srose_ndigis = 0;&lt;br /&gt;
						rose_aton(addr, sockaddr.rose.srose_addr.rose_addr);&lt;br /&gt;
						ax25_aton_entry(call,   sockaddr.rose.srose_call.ax25_call);&lt;br /&gt;
					}&lt;br /&gt;
					addrlen = sizeof(struct sockaddr_rose);&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				default:&lt;br /&gt;
					fprintf(stderr, &amp;quot;ax25d: unknown af_type=%d\n&amp;quot;, af_type);&lt;br /&gt;
					exit(1);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ((axl_port = calloc(1, sizeof(*axl_port))) == NULL) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;ax25d: out of memory\n&amp;quot;);&lt;br /&gt;
				goto Error;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			axl_port-&amp;gt;port    = strdup(port);&lt;br /&gt;
			axl_port-&amp;gt;af_type = af_type;&lt;br /&gt;
&lt;br /&gt;
			if ((axl_port-&amp;gt;fd = socket(axl_port-&amp;gt;af_type, SOCK_SEQPACKET, 0)) &amp;lt; 0) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;ax25d: socket: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
				free(axl_port-&amp;gt;port);&lt;br /&gt;
				free(axl_port);&lt;br /&gt;
				error = TRUE;&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
                        /* xlz - have to nuke this as this option is gone&lt;br /&gt;
                         * what should be here?&lt;br /&gt;
			if (iamdigi) {&lt;br /&gt;
				yes = 1;&lt;br /&gt;
				setsockopt(axl_port-&amp;gt;fd, SOL_AX25, AX25_IAMDIGI, &amp;amp;yes, sizeof(yes));&lt;br /&gt;
			}&lt;br /&gt;
                        */&lt;br /&gt;
&lt;br /&gt;
			if (bind(axl_port-&amp;gt;fd, (struct sockaddr *)&amp;amp;sockaddr, addrlen) &amp;lt; 0) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;ax25d: bind: %s on port %s\n&amp;quot;, strerror(errno), axl_port-&amp;gt;port);&lt;br /&gt;
				close(axl_port-&amp;gt;fd);&lt;br /&gt;
				free(axl_port-&amp;gt;port);&lt;br /&gt;
				free(axl_port);&lt;br /&gt;
				error = TRUE;&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (listen(axl_port-&amp;gt;fd, SOMAXCONN) &amp;lt; 0) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;ax25d: listen: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
				close(axl_port-&amp;gt;fd);&lt;br /&gt;
				free(axl_port-&amp;gt;port);&lt;br /&gt;
				free(axl_port);&lt;br /&gt;
				error = TRUE;&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* Add it to the head of the list we are building */&lt;br /&gt;
			if (axl_build == NULL) {&lt;br /&gt;
				axl_build = axl_port;&lt;br /&gt;
			} else {&lt;br /&gt;
				for (axltmp = axl_build; axltmp-&amp;gt;next != NULL; axltmp = axltmp-&amp;gt;next);&lt;br /&gt;
				axltmp-&amp;gt;next = axl_port;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			hunt = FALSE;	/* Next lines will be entries */&lt;br /&gt;
		} else {		/* This is an entry */&lt;br /&gt;
			if ((axl_ent = calloc(1, sizeof(*axl_ent))) == NULL) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;ax25d: out of memory\n&amp;quot;);&lt;br /&gt;
				goto Error;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			axl_ent-&amp;gt;af_type = axl_port-&amp;gt;af_type;	/* Inherit this */&lt;br /&gt;
&lt;br /&gt;
			if ((call = strtok(buffer, &amp;quot; \t&amp;quot;)) == NULL) {&lt;br /&gt;
				free(axl_ent);&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			strupr(call);&lt;br /&gt;
&lt;br /&gt;
			if (axl_ent-&amp;gt;af_type == AF_NETROM) {&lt;br /&gt;
				if ((s = strchr(call, &amp;#039;@&amp;#039;)) != NULL) {&lt;br /&gt;
					node = s + 1;&lt;br /&gt;
					*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
					if (*node == &amp;#039;\0&amp;#039;) {&lt;br /&gt;
						free(axl_ent);&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					axl_ent-&amp;gt;node = strdup(node);&lt;br /&gt;
&lt;br /&gt;
					if (*call == &amp;#039;\0&amp;#039;)&lt;br /&gt;
						call = &amp;quot;default&amp;quot;;	/* @NODE means default@NODE */&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			parameters = FALSE;&lt;br /&gt;
&lt;br /&gt;
			if (strcasecmp(&amp;quot;parameters&amp;quot;, call) == 0)&lt;br /&gt;
				parameters = TRUE;&lt;br /&gt;
			else if (strcasecmp(&amp;quot;default&amp;quot;, call) != 0)&lt;br /&gt;
				axl_ent-&amp;gt;call = strdup(call);&lt;br /&gt;
&lt;br /&gt;
			/* Window */&lt;br /&gt;
			if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
				goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
			if (!parameters) {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_ent-&amp;gt;window = atoi(s);&lt;br /&gt;
				else&lt;br /&gt;
					axl_ent-&amp;gt;window = axl_defaults.window;&lt;br /&gt;
			} else {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_defaults.window = atoi(s);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* T1 */&lt;br /&gt;
			if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
				goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
			if (!parameters) {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0) {&lt;br /&gt;
					val = (unsigned long)(atof(s) / 0.1);&lt;br /&gt;
&lt;br /&gt;
					if (val == 0 || val &amp;gt; 65535)&lt;br /&gt;
						axl_ent-&amp;gt;t1 = axl_defaults.t1;&lt;br /&gt;
					else&lt;br /&gt;
						axl_ent-&amp;gt;t1 = val;&lt;br /&gt;
				} else {&lt;br /&gt;
					axl_ent-&amp;gt;t1 = axl_defaults.t1;&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0) {&lt;br /&gt;
					val = (unsigned long)(atof(s) / 0.1);&lt;br /&gt;
&lt;br /&gt;
					if (val &amp;gt; 0 &amp;amp;&amp;amp; val &amp;lt; 65535)&lt;br /&gt;
						axl_defaults.t1 = val;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* T2 */&lt;br /&gt;
			if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
				goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
			if (!parameters) {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0) {&lt;br /&gt;
					val = (unsigned long)(atof(s) / 0.1);&lt;br /&gt;
&lt;br /&gt;
					if (val == 0 || val &amp;gt; 65535)&lt;br /&gt;
						axl_ent-&amp;gt;t2 = axl_defaults.t2;&lt;br /&gt;
					else&lt;br /&gt;
						axl_ent-&amp;gt;t2 = val;&lt;br /&gt;
				} else {&lt;br /&gt;
					axl_ent-&amp;gt;t2 = axl_defaults.t2;&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0) {&lt;br /&gt;
					val = (unsigned long)(atof(s) / 0.1);&lt;br /&gt;
&lt;br /&gt;
					if (val &amp;gt; 0 &amp;amp;&amp;amp; val &amp;lt; 65535)&lt;br /&gt;
						axl_defaults.t2 = val;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* T3 */&lt;br /&gt;
			if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
				goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
			if (!parameters) {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_ent-&amp;gt;t3 = atoi(s);&lt;br /&gt;
				else&lt;br /&gt;
					axl_ent-&amp;gt;t3 = axl_defaults.t3;&lt;br /&gt;
			} else {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_defaults.t3 = atoi(s);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* Idle */&lt;br /&gt;
			if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
				goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
			if (!parameters) {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_ent-&amp;gt;idle = atoi(s);&lt;br /&gt;
				else&lt;br /&gt;
					axl_ent-&amp;gt;idle = axl_defaults.idle;&lt;br /&gt;
			} else {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_defaults.idle = atoi(s);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			/* N2 */&lt;br /&gt;
			if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
				goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
			if (!parameters) {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_ent-&amp;gt;n2 = atoi(s);&lt;br /&gt;
				else&lt;br /&gt;
					axl_ent-&amp;gt;n2 = axl_defaults.n2;&lt;br /&gt;
			} else {&lt;br /&gt;
				if (strcmp(s, &amp;quot;*&amp;quot;) != 0)&lt;br /&gt;
					axl_defaults.n2 = atoi(s);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (!parameters) {&lt;br /&gt;
				/* Flags */&lt;br /&gt;
				if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
					goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
				axl_ent-&amp;gt;flags = ParseFlags(s, line);&lt;br /&gt;
            &lt;br /&gt;
				if (!(axl_ent-&amp;gt;flags &amp;amp; FLAG_LOCKOUT)) {&lt;br /&gt;
					/* Get username */&lt;br /&gt;
					if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
						goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
					if ((pwd = getpwnam(s)) == NULL) {&lt;br /&gt;
						fprintf(stderr, &amp;quot;ax25d: UID for user &amp;#039;%s&amp;#039; is unknown, ignoring entry\n&amp;quot;, s);&lt;br /&gt;
						goto BadUID;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					axl_ent-&amp;gt;uid = pwd-&amp;gt;pw_uid;&lt;br /&gt;
					axl_ent-&amp;gt;gid = pwd-&amp;gt;pw_gid;&lt;br /&gt;
&lt;br /&gt;
					/* Get exec file */&lt;br /&gt;
					if ((s = strtok(NULL, &amp;quot; \t&amp;quot;)) == NULL)&lt;br /&gt;
						goto BadArgsFree;&lt;br /&gt;
&lt;br /&gt;
					axl_ent-&amp;gt;exec = strdup(s);&lt;br /&gt;
&lt;br /&gt;
					/* Get command line */&lt;br /&gt;
					if ((s = strtok(NULL, &amp;quot;&amp;quot;)) == NULL)&lt;br /&gt;
						goto BadArgsFree2;&lt;br /&gt;
&lt;br /&gt;
					axl_ent-&amp;gt;shell = strdup(s);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				axl_ent-&amp;gt;next  = NULL;&lt;br /&gt;
&lt;br /&gt;
				if (axl_port-&amp;gt;ents == NULL) {&lt;br /&gt;
					axl_port-&amp;gt;ents = axl_ent;&lt;br /&gt;
				} else {&lt;br /&gt;
					for (axltmp = axl_port-&amp;gt;ents; axltmp-&amp;gt;ents != NULL; axltmp = axltmp-&amp;gt;ents)&lt;br /&gt;
						;&lt;br /&gt;
					axltmp-&amp;gt;ents = axl_ent;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		continue;&lt;br /&gt;
&lt;br /&gt;
BadLine:&lt;br /&gt;
		fprintf(stderr, &amp;quot;ax25d: bad config entry on line %d\n&amp;quot;, line);&lt;br /&gt;
		continue;&lt;br /&gt;
&lt;br /&gt;
BadUID:&lt;br /&gt;
		if (axl_ent-&amp;gt;call != NULL)&lt;br /&gt;
			free(axl_ent-&amp;gt;call);&lt;br /&gt;
		free(axl_ent);&lt;br /&gt;
		continue;&lt;br /&gt;
&lt;br /&gt;
BadArgsFree2:&lt;br /&gt;
		if (axl_ent-&amp;gt;exec != NULL)&lt;br /&gt;
			free(axl_ent-&amp;gt;exec);&lt;br /&gt;
BadArgsFree:&lt;br /&gt;
		if (axl_ent-&amp;gt;call != NULL)&lt;br /&gt;
			free(axl_ent-&amp;gt;call);&lt;br /&gt;
		free(axl_ent);&lt;br /&gt;
&lt;br /&gt;
		/* BadArgs: */&lt;br /&gt;
		fprintf(stderr, &amp;quot;ax25d: bad config entry on line %d, not enough fields.\n&amp;quot;, line);&lt;br /&gt;
		continue;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fclose(fp);&lt;br /&gt;
&lt;br /&gt;
	AXL = ClearList(AXL);&lt;br /&gt;
	AXL = axl_build;		/* Assign our built list to AXL */&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
&lt;br /&gt;
Error:&lt;br /&gt;
	axl_build = ClearList(axl_build);&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static unsigned long ParseFlags(const char *kp, int line)&lt;br /&gt;
{&lt;br /&gt;
	unsigned long flags = 0UL;&lt;br /&gt;
&lt;br /&gt;
	for (; *kp != &amp;#039;\0&amp;#039;; kp++) {&lt;br /&gt;
		switch (*kp) {&lt;br /&gt;
			case &amp;#039;v&amp;#039;:&lt;br /&gt;
			case &amp;#039;V&amp;#039;:&lt;br /&gt;
				flags |= FLAG_VALIDCALL;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;q&amp;#039;:&lt;br /&gt;
			case &amp;#039;Q&amp;#039;:&lt;br /&gt;
				flags |= FLAG_NOLOGGING;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;n&amp;#039;:&lt;br /&gt;
			case &amp;#039;N&amp;#039;:&lt;br /&gt;
				flags |= FLAG_CHKNRN;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;d&amp;#039;:&lt;br /&gt;
			case &amp;#039;D&amp;#039;:&lt;br /&gt;
				flags |= FLAG_NODIGIS;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;l&amp;#039;:&lt;br /&gt;
			case &amp;#039;L&amp;#039;:&lt;br /&gt;
				flags |= FLAG_LOCKOUT;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &amp;#039;0&amp;#039;:&lt;br /&gt;
			case &amp;#039;*&amp;#039;:&lt;br /&gt;
			case &amp;#039;-&amp;#039;:		/* Be compatible and allow markers */&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			default:&lt;br /&gt;
				fprintf(stderr, &amp;quot;ax25d: config file line %d bad flag option &amp;#039;%c&amp;#039;.\n&amp;quot;, line, *kp);&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return flags;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static struct axlist *ClearList(struct axlist *list)&lt;br /&gt;
{&lt;br /&gt;
	struct axlist *tp1, *tp2, *tmp;&lt;br /&gt;
   &lt;br /&gt;
	for (tp1 = list; tp1 != NULL; ) {&lt;br /&gt;
		for (tp2 = tp1-&amp;gt;ents; tp2 != NULL; ) {&lt;br /&gt;
			if (tp2-&amp;gt;port != NULL)&lt;br /&gt;
				free(tp2-&amp;gt;port);&lt;br /&gt;
			if (tp2-&amp;gt;call != NULL)&lt;br /&gt;
				free(tp2-&amp;gt;call);&lt;br /&gt;
			if (tp2-&amp;gt;node != NULL)&lt;br /&gt;
				free(tp2-&amp;gt;node);&lt;br /&gt;
			if (tp2-&amp;gt;exec != NULL)&lt;br /&gt;
				free(tp2-&amp;gt;exec);&lt;br /&gt;
			if (tp2-&amp;gt;shell != NULL)&lt;br /&gt;
				free(tp2-&amp;gt;shell);&lt;br /&gt;
&lt;br /&gt;
			tmp = tp2-&amp;gt;ents;&lt;br /&gt;
			free(tp2);&lt;br /&gt;
			tp2 = tmp;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (tp1-&amp;gt;port != NULL)&lt;br /&gt;
			free(tp1-&amp;gt;port);&lt;br /&gt;
		if (tp1-&amp;gt;call != NULL)&lt;br /&gt;
			free(tp1-&amp;gt;call);&lt;br /&gt;
		if (tp1-&amp;gt;node != NULL)&lt;br /&gt;
			free(tp1-&amp;gt;node);&lt;br /&gt;
		if (tp1-&amp;gt;exec != NULL)&lt;br /&gt;
			free(tp1-&amp;gt;exec);&lt;br /&gt;
		if (tp1-&amp;gt;shell != NULL)&lt;br /&gt;
			free(tp1-&amp;gt;shell);&lt;br /&gt;
&lt;br /&gt;
		close(tp1-&amp;gt;fd);&lt;br /&gt;
&lt;br /&gt;
		tmp = tp1-&amp;gt;next;&lt;br /&gt;
		free(tp1);&lt;br /&gt;
		tp1 = tmp;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static char *stripssid(const char *call)&lt;br /&gt;
{&lt;br /&gt;
	static char newcall[10];&lt;br /&gt;
	char *s;&lt;br /&gt;
	&lt;br /&gt;
	strcpy(newcall, call);&lt;br /&gt;
&lt;br /&gt;
	if ((s = strchr(newcall, &amp;#039;-&amp;#039;)) != NULL)&lt;br /&gt;
		*s = &amp;#039;\0&amp;#039;;&lt;br /&gt;
	&lt;br /&gt;
	return newcall;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Ok1zia</name></author>
	</entry>
</feed>