Blame rpcapd/fileconf.c

Packit 209cc3
/*
Packit 209cc3
 * Copyright (c) 1987, 1993, 1994
Packit 209cc3
 *      The Regents of the University of California.  All rights reserved.
Packit 209cc3
 *
Packit 209cc3
 * Redistribution and use in source and binary forms, with or without
Packit 209cc3
 * modification, are permitted provided that the following conditions
Packit 209cc3
 * are met:
Packit 209cc3
 * 1. Redistributions of source code must retain the above copyright
Packit 209cc3
 *    notice, this list of conditions and the following disclaimer.
Packit 209cc3
 * 2. Redistributions in binary form must reproduce the above copyright
Packit 209cc3
 *    notice, this list of conditions and the following disclaimer in the
Packit 209cc3
 *    documentation and/or other materials provided with the distribution.
Packit 209cc3
 * 3. All advertising materials mentioning features or use of this software
Packit 209cc3
 *    must display the following acknowledgement:
Packit 209cc3
 *      This product includes software developed by the University of
Packit 209cc3
 *      California, Berkeley and its contributors.
Packit 209cc3
 * 4. Neither the name of the University nor the names of its contributors
Packit 209cc3
 *    may be used to endorse or promote products derived from this software
Packit 209cc3
 *    without specific prior written permission.
Packit 209cc3
 *
Packit 209cc3
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
Packit 209cc3
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit 209cc3
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit 209cc3
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Packit 209cc3
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit 209cc3
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit 209cc3
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit 209cc3
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit 209cc3
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit 209cc3
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit 209cc3
 * SUCH DAMAGE.
Packit 209cc3
 */
Packit 209cc3
Packit 209cc3
#ifdef HAVE_CONFIG_H
Packit 209cc3
#include <config.h>
Packit 209cc3
#endif
Packit 209cc3
Packit 209cc3
#include "ftmacros.h"
Packit 209cc3
Packit 209cc3
#include <stdio.h>
Packit 209cc3
#include <string.h>
Packit 209cc3
#include <ctype.h>
Packit 209cc3
#include <signal.h>
Packit 209cc3
#include <pcap.h>		// for PCAP_ERRBUF_SIZE
Packit 209cc3
Packit 209cc3
#include "portability.h"
Packit 209cc3
#include "rpcapd.h"
Packit 209cc3
#include "config_params.h"	// configuration file parameters
Packit 209cc3
#include "fileconf.h"
Packit 209cc3
#include "rpcap-protocol.h"
Packit 209cc3
#include "log.h"
Packit 209cc3
Packit 209cc3
//
Packit 209cc3
// Parameter names.
Packit 209cc3
//
Packit 209cc3
#define PARAM_ACTIVECLIENT	"ActiveClient"
Packit 209cc3
#define PARAM_PASSIVECLIENT	"PassiveClient"
Packit 209cc3
#define PARAM_NULLAUTHPERMIT	"NullAuthPermit"
Packit 209cc3
Packit 209cc3
static char *skipws(char *ptr);
Packit 209cc3
Packit 209cc3
void fileconf_read(void)
Packit 209cc3
{
Packit 209cc3
	FILE *fp;
Packit 209cc3
	unsigned int num_active_clients;
Packit 209cc3
Packit 209cc3
	if ((fp = fopen(loadfile, "r")) != NULL)
Packit 209cc3
	{
Packit 209cc3
		char line[MAX_LINE + 1];
Packit 209cc3
		unsigned int lineno;
Packit 209cc3
Packit 209cc3
		hostlist[0] = 0;
Packit 209cc3
		num_active_clients = 0;
Packit 209cc3
		lineno = 0;
Packit 209cc3
Packit 209cc3
		while (fgets(line, MAX_LINE, fp) != NULL)
Packit 209cc3
		{
Packit 209cc3
			size_t linelen;
Packit 209cc3
			char *ptr;
Packit 209cc3
			char *param;
Packit 209cc3
			size_t result;
Packit 209cc3
			size_t toklen;
Packit 209cc3
Packit 209cc3
			lineno++;
Packit 209cc3
Packit 209cc3
			linelen = strlen(line);
Packit 209cc3
			if (line[linelen - 1] != '\n')
Packit 209cc3
			{
Packit 209cc3
				int c;
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Either the line doesn't fit in
Packit 209cc3
				// the buffer, or we got an EOF
Packit 209cc3
				// before the EOL.  Assume it's the
Packit 209cc3
				// former.
Packit 209cc3
				//
Packit 209cc3
				rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
				    "%s, line %u is longer than %u characters",
Packit 209cc3
				    loadfile, lineno, MAX_LINE);
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Eat characters until we get an NL.
Packit 209cc3
				//
Packit 209cc3
				while ((c = getc(fp)) != '\n')
Packit 209cc3
				{
Packit 209cc3
					if (c == EOF)
Packit 209cc3
						goto done;
Packit 209cc3
				}
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Try the next line.
Packit 209cc3
				//
Packit 209cc3
				continue;
Packit 209cc3
			}
Packit 209cc3
			ptr = line;
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// Skip leading white space, if any.
Packit 209cc3
			//
Packit 209cc3
			ptr = skipws(ptr);
Packit 209cc3
			if (ptr == NULL)
Packit 209cc3
			{
Packit 209cc3
				// Blank line.
Packit 209cc3
				continue;
Packit 209cc3
			}
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// Is the next character a "#"?  If so, this
Packit 209cc3
			// line is a comment; skip to the next line.
Packit 209cc3
			//
Packit 209cc3
			if (*ptr == '#')
Packit 209cc3
				continue;
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// Is the next character alphabetic?  If not,
Packit 209cc3
			// this isn't a valid parameter name.
Packit 209cc3
			//
Packit 209cc3
			if (!isascii((unsigned char)*ptr) ||
Packit 209cc3
			    !isalpha((unsigned char)*ptr))
Packit 209cc3
			{
Packit 209cc3
				rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
				    "%s, line %u doesn't have a valid parameter name",
Packit 209cc3
				    loadfile, lineno);
Packit 209cc3
				continue;
Packit 209cc3
			}
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// Grab the first token, which is made of
Packit 209cc3
			// alphanumerics, underscores, and hyphens.
Packit 209cc3
			// That's the name of the parameter being set.
Packit 209cc3
			//
Packit 209cc3
			param = ptr;
Packit 209cc3
			while (isascii((unsigned char)*ptr) &&
Packit 209cc3
			    (isalnum((unsigned char)*ptr) || *ptr == '-' || *ptr == '_'))
Packit 209cc3
				ptr++;
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// Skip over white space, if any.
Packit 209cc3
			//
Packit 209cc3
			ptr = skipws(ptr);
Packit 209cc3
			if (ptr == NULL || *ptr != '=')
Packit 209cc3
			{
Packit 209cc3
				//
Packit 209cc3
				// We hit the end of the line before
Packit 209cc3
				// finding a non-white space character,
Packit 209cc3
				// or we found one but it's not an "=".
Packit 209cc3
				// That means there's no "=", so this
Packit 209cc3
				// line is invalid.  Complain and skip
Packit 209cc3
				// this line.
Packit 209cc3
				//
Packit 209cc3
				rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
				    "%s, line %u has a parameter but no =",
Packit 209cc3
				    loadfile, lineno);
Packit 209cc3
				continue;
Packit 209cc3
			}
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// We found the '='; set it to '\0', and skip
Packit 209cc3
			// past it.
Packit 209cc3
			//
Packit 209cc3
			*ptr++ = '\0';
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// Skip past any white space after the "=".
Packit 209cc3
			//
Packit 209cc3
			ptr = skipws(ptr);
Packit 209cc3
			if (ptr == NULL)
Packit 209cc3
			{
Packit 209cc3
				//
Packit 209cc3
				// The value is empty.
Packit 209cc3
				//
Packit 209cc3
				rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
				    "%s, line %u has a parameter but no value",
Packit 209cc3
				    loadfile, lineno);
Packit 209cc3
				continue;
Packit 209cc3
			}
Packit 209cc3
Packit 209cc3
			//
Packit 209cc3
			// OK, what parameter is this?
Packit 209cc3
			//
Packit 209cc3
			if (strcmp(param, PARAM_ACTIVECLIENT) == 0) {
Packit 209cc3
				//
Packit 209cc3
				// Add this to the list of active clients.
Packit 209cc3
				//
Packit 209cc3
				char *address, *port;
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// We can't have more than MAX_ACTIVE_LIST
Packit 209cc3
				// active clients.
Packit 209cc3
				//
Packit 209cc3
				if (num_active_clients >= MAX_ACTIVE_LIST)
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// Too many entries for the active
Packit 209cc3
					// client list.  Complain and
Packit 209cc3
					// ignore it.
Packit 209cc3
					//
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has an %s parameter, but we already have %u active clients",
Packit 209cc3
					    loadfile, lineno, PARAM_ACTIVECLIENT,
Packit 209cc3
					    MAX_ACTIVE_LIST);
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Get the address.
Packit 209cc3
				// It's terminated by a host list separator
Packit 209cc3
				// *or* a #; there *shouldn't* be a #, as
Packit 209cc3
				// that starts a comment, and that would
Packit 209cc3
				// mean that we have no port.
Packit 209cc3
				//
Packit 209cc3
				address = ptr;
Packit 209cc3
				toklen = strcspn(ptr, RPCAP_HOSTLIST_SEP "#");
Packit 209cc3
				ptr += toklen;	// skip to the terminator
Packit 209cc3
				if (toklen == 0)
Packit 209cc3
				{
Packit 209cc3
					if (isascii((unsigned char)*ptr) &&
Packit 209cc3
					    (isspace((unsigned char)*ptr) || *ptr == '#' || *ptr == '\0'))
Packit 209cc3
					{
Packit 209cc3
						//
Packit 209cc3
						// The first character it saw
Packit 209cc3
						// was a whitespace character
Packit 209cc3
						// or a comment character.
Packit 209cc3
						// This means that there's
Packit 209cc3
						// no value.
Packit 209cc3
						//
Packit 209cc3
						rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
						    "%s, line %u has a parameter but no value",
Packit 209cc3
						    loadfile, lineno);
Packit 209cc3
					}
Packit 209cc3
					else
Packit 209cc3
					{
Packit 209cc3
						//
Packit 209cc3
						// This means that the first
Packit 209cc3
						// character it saw was a
Packit 209cc3
						// separator.  This means that
Packit 209cc3
						// there's no address in the
Packit 209cc3
						// value, just a port.
Packit 209cc3
						//
Packit 209cc3
						rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
						    "%s, line %u has an %s parameter with a value containing no address",
Packit 209cc3
						    loadfile, lineno, PARAM_ACTIVECLIENT);
Packit 209cc3
					}
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Null-terminate the address, and skip past
Packit 209cc3
				// it.
Packit 209cc3
				//
Packit 209cc3
				*ptr++ = '\0';
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Skip any white space following the
Packit 209cc3
				// separating character.
Packit 209cc3
				//
Packit 209cc3
				ptr = skipws(ptr);
Packit 209cc3
				if (ptr == NULL)
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// The value is empty, so there's
Packit 209cc3
					// no port in the value.
Packit 209cc3
					//
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has an %s parameter with a value containing no port",
Packit 209cc3
					    loadfile, lineno, PARAM_ACTIVECLIENT);
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Get the port.
Packit 209cc3
				// We look for a white space character
Packit 209cc3
				// or a # as a terminator; the # introduces
Packit 209cc3
				// a comment that runs to the end of the
Packit 209cc3
				// line.
Packit 209cc3
				//
Packit 209cc3
				port = ptr;
Packit 209cc3
				toklen = strcspn(ptr, " \t#\r\n");
Packit 209cc3
				ptr += toklen;
Packit 209cc3
				if (toklen == 0)
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// The value is empty, so there's
Packit 209cc3
					// no port in the value.
Packit 209cc3
					//
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has an %s parameter with a value containing no port",
Packit 209cc3
					    loadfile, lineno, PARAM_ACTIVECLIENT);
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Null-terminate the port, and skip past
Packit 209cc3
				// it.
Packit 209cc3
				//
Packit 209cc3
				*ptr++ = '\0';
Packit 209cc3
				result = pcap_strlcpy(activelist[num_active_clients].address, address, sizeof(activelist[num_active_clients].address));
Packit 209cc3
				if (result >= sizeof(activelist[num_active_clients].address))
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// It didn't fit.
Packit 209cc3
					//
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has an %s parameter with an address with more than %u characters",
Packit 209cc3
					    loadfile, lineno, PARAM_ACTIVECLIENT,
Packit 209cc3
					    (unsigned int)(sizeof(activelist[num_active_clients].address) - 1));
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
				if (strcmp(port, "DEFAULT") == 0) // the user choose a custom port
Packit 209cc3
					result = pcap_strlcpy(activelist[num_active_clients].port, RPCAP_DEFAULT_NETPORT_ACTIVE, sizeof(activelist[num_active_clients].port));
Packit 209cc3
				else
Packit 209cc3
					result = pcap_strlcpy(activelist[num_active_clients].port, port, sizeof(activelist[num_active_clients].port));
Packit 209cc3
				if (result >= sizeof(activelist[num_active_clients].address))
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// It didn't fit.
Packit 209cc3
					//
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has an %s parameter with an port with more than %u characters",
Packit 209cc3
					    loadfile, lineno, PARAM_ACTIVECLIENT,
Packit 209cc3
					    (unsigned int)(sizeof(activelist[num_active_clients].port) - 1));
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
Packit 209cc3
				num_active_clients++;
Packit 209cc3
			}
Packit 209cc3
			else if (strcmp(param, PARAM_PASSIVECLIENT) == 0)
Packit 209cc3
			{
Packit 209cc3
				char *eos;
Packit 209cc3
				char *host;
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Get the host.
Packit 209cc3
				// We look for a white space character
Packit 209cc3
				// or a # as a terminator; the # introduces
Packit 209cc3
				// a comment that runs to the end of the
Packit 209cc3
				// line.
Packit 209cc3
				//
Packit 209cc3
				host = ptr;
Packit 209cc3
				toklen = strcspn(ptr, " \t#\r\n");
Packit 209cc3
				if (toklen == 0)
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// The first character it saw
Packit 209cc3
					// was a whitespace character
Packit 209cc3
					// or a comment character.
Packit 209cc3
					// This means that there's
Packit 209cc3
					// no value.
Packit 209cc3
					//
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has a parameter but no value",
Packit 209cc3
					    loadfile, lineno);
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
				ptr += toklen;
Packit 209cc3
				*ptr++ = '\0';
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Append this to the host list.
Packit 209cc3
				// Save the curren end-of-string for the
Packit 209cc3
				// host list, in case the new host doesn't
Packit 209cc3
				// fit, so that we can discard the partially-
Packit 209cc3
				// copied host name.
Packit 209cc3
				//
Packit 209cc3
				eos = hostlist + strlen(hostlist);
Packit 209cc3
				if (eos != hostlist)
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// The list is not empty, so prepend
Packit 209cc3
					// a comma before adding this host.
Packit 209cc3
					//
Packit 209cc3
					result = pcap_strlcat(hostlist, ",", sizeof(hostlist));
Packit 209cc3
					if (result >= sizeof(hostlist))
Packit 209cc3
					{
Packit 209cc3
						//
Packit 209cc3
						// It didn't fit.  Discard
Packit 209cc3
						// the comma (which wasn't
Packit 209cc3
						// added, but...), complain,
Packit 209cc3
						// and ignore this line.
Packit 209cc3
						//
Packit 209cc3
						*eos = '\0';
Packit 209cc3
						rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
						    "%s, line %u has a %s parameter with a host name that doesn't fit",
Packit 209cc3
						    loadfile, lineno, PARAM_PASSIVECLIENT);
Packit 209cc3
						continue;
Packit 209cc3
					}
Packit 209cc3
				}
Packit 209cc3
				result = pcap_strlcat(hostlist, host, sizeof(hostlist));
Packit 209cc3
				if (result >= sizeof(hostlist))
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// It didn't fit.  Discard the comma,
Packit 209cc3
					// complain, and ignore this line.
Packit 209cc3
					//
Packit 209cc3
					*eos = '\0';
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has a %s parameter with a host name that doesn't fit",
Packit 209cc3
					    loadfile, lineno, PARAM_PASSIVECLIENT);
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
			}
Packit 209cc3
			else if (strcmp(param, PARAM_NULLAUTHPERMIT) == 0)
Packit 209cc3
			{
Packit 209cc3
				char *setting;
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// Get the setting.
Packit 209cc3
				// We look for a white space character
Packit 209cc3
				// or a # as a terminator; the # introduces
Packit 209cc3
				// a comment that runs to the end of the
Packit 209cc3
				// line.
Packit 209cc3
				//
Packit 209cc3
				setting = ptr;
Packit 209cc3
				toklen = strcspn(ptr, " \t#\r\n");
Packit 209cc3
				ptr += toklen;
Packit 209cc3
				if (toklen == 0)
Packit 209cc3
				{
Packit 209cc3
					//
Packit 209cc3
					// The first character it saw
Packit 209cc3
					// was a whitespace character
Packit 209cc3
					// or a comment character.
Packit 209cc3
					// This means that there's
Packit 209cc3
					// no value.
Packit 209cc3
					//
Packit 209cc3
					rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
					    "%s, line %u has a parameter but no value",
Packit 209cc3
					    loadfile, lineno);
Packit 209cc3
					continue;
Packit 209cc3
				}
Packit 209cc3
				*ptr++ = '\0';
Packit 209cc3
Packit 209cc3
				//
Packit 209cc3
				// XXX - should we complain if it's
Packit 209cc3
				// neither "yes" nor "no"?
Packit 209cc3
				//
Packit 209cc3
				if (strcmp(setting, "YES") == 0)
Packit 209cc3
					nullAuthAllowed = 1;
Packit 209cc3
				else
Packit 209cc3
					nullAuthAllowed = 0;
Packit 209cc3
			}
Packit 209cc3
			else
Packit 209cc3
			{
Packit 209cc3
				rpcapd_log(LOGPRIO_ERROR,
Packit 209cc3
				    "%s, line %u has an unknown parameter %s",
Packit 209cc3
				    loadfile, lineno, param);
Packit 209cc3
				continue;
Packit 209cc3
			}
Packit 209cc3
		}
Packit 209cc3
Packit 209cc3
done:
Packit 209cc3
		// clear the remaining fields of the active list
Packit 209cc3
		for (int i = num_active_clients; i < MAX_ACTIVE_LIST; i++)
Packit 209cc3
		{
Packit 209cc3
			activelist[i].address[0] = 0;
Packit 209cc3
			activelist[i].port[0] = 0;
Packit 209cc3
			num_active_clients++;
Packit 209cc3
		}
Packit 209cc3
Packit 209cc3
		rpcapd_log(LOGPRIO_DEBUG, "New passive host list: %s", hostlist);
Packit 209cc3
		fclose(fp);
Packit 209cc3
	}
Packit 209cc3
}
Packit 209cc3
Packit 209cc3
int fileconf_save(const char *savefile)
Packit 209cc3
{
Packit 209cc3
	FILE *fp;
Packit 209cc3
Packit 209cc3
	if ((fp = fopen(savefile, "w")) != NULL)
Packit 209cc3
	{
Packit 209cc3
		char *token; /*, *port;*/					// temp, needed to separate items into the hostlist
Packit 209cc3
		char temphostlist[MAX_HOST_LIST + 1];
Packit 209cc3
		int i = 0;
Packit 209cc3
		char *lasts;
Packit 209cc3
Packit 209cc3
		fprintf(fp, "# Configuration file help.\n\n");
Packit 209cc3
Packit 209cc3
		// Save list of clients which are allowed to connect to us in passive mode
Packit 209cc3
		fprintf(fp, "# Hosts which are allowed to connect to this server (passive mode)\n");
Packit 209cc3
		fprintf(fp, "# Format: PassiveClient = <name or address>\n\n");
Packit 209cc3
Packit 209cc3
		strncpy(temphostlist, hostlist, MAX_HOST_LIST);
Packit 209cc3
		temphostlist[MAX_HOST_LIST] = 0;
Packit 209cc3
Packit 209cc3
		token = pcap_strtok_r(temphostlist, RPCAP_HOSTLIST_SEP, &lasts);
Packit 209cc3
		while(token != NULL)
Packit 209cc3
		{
Packit 209cc3
			fprintf(fp, "%s = %s\n", PARAM_PASSIVECLIENT, token);
Packit 209cc3
			token = pcap_strtok_r(NULL, RPCAP_HOSTLIST_SEP, &lasts);
Packit 209cc3
		}
Packit 209cc3
Packit 209cc3
Packit 209cc3
		// Save list of clients which are allowed to connect to us in active mode
Packit 209cc3
		fprintf(fp, "\n\n");
Packit 209cc3
		fprintf(fp, "# Hosts to which this server is trying to connect to (active mode)\n");
Packit 209cc3
		fprintf(fp, "# Format: ActiveClient = <name or address>, <port | DEFAULT>\n\n");
Packit 209cc3
Packit 209cc3
Packit 209cc3
		while ((i < MAX_ACTIVE_LIST) && (activelist[i].address[0] != 0))
Packit 209cc3
		{
Packit 209cc3
			fprintf(fp, "%s = %s, %s\n", PARAM_ACTIVECLIENT,
Packit 209cc3
			    activelist[i].address, activelist[i].port);
Packit 209cc3
			i++;
Packit 209cc3
		}
Packit 209cc3
Packit 209cc3
		// Save if we want to permit NULL authentication
Packit 209cc3
		fprintf(fp, "\n\n");
Packit 209cc3
		fprintf(fp, "# Permit NULL authentication: YES or NO\n\n");
Packit 209cc3
Packit 209cc3
		fprintf(fp, "%s = %s\n", PARAM_NULLAUTHPERMIT,
Packit 209cc3
		    nullAuthAllowed ? "YES" : "NO");
Packit 209cc3
Packit 209cc3
		fclose(fp);
Packit 209cc3
		return 0;
Packit 209cc3
	}
Packit 209cc3
	else
Packit 209cc3
	{
Packit 209cc3
		return -1;
Packit 209cc3
	}
Packit 209cc3
Packit 209cc3
}
Packit 209cc3
Packit 209cc3
//
Packit 209cc3
// Skip over white space.
Packit 209cc3
// If we hit a CR or LF, return NULL, otherwise return a pointer to
Packit 209cc3
// the first non-white space character.  Replace white space characters
Packit 209cc3
// other than CR or LF with '\0', so that, if we're skipping white space
Packit 209cc3
// after a token, the token is null-terminated.
Packit 209cc3
//
Packit 209cc3
static char *skipws(char *ptr)
Packit 209cc3
{
Packit 209cc3
	while (isascii((unsigned char)*ptr) && isspace((unsigned char)*ptr)) {
Packit 209cc3
		if (*ptr == '\r' || *ptr == '\n')
Packit 209cc3
			return NULL;
Packit 209cc3
		*ptr++ = '\0';
Packit 209cc3
	}
Packit 209cc3
	return ptr;
Packit 209cc3
}