NetBSD/libexec/identd/config.c

91 lines
2.0 KiB
C

/* $NetBSD: config.c,v 1.6 2000/07/03 03:34:26 matt Exp $ */
/*
** config.c This file handles the config file
**
** This program is in the public domain and may be used freely by anyone
** who wants to.
**
** Last update: 6 Dec 1992
**
** Please send bug fixes/bug reports to: Peter Eriksson <pen@lysator.liu.se>
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "error.h"
#include "identd.h"
#include "paths.h"
#define MAXLINE 1024
#define MAXNETS 1024
u_long localnet[MAXNETS], localmask[MAXNETS];
int netcnt;
int parse_config(path, silent_flag)
char *path;
int silent_flag;
{
FILE *fp;
char *start, buf[MAXLINE];
if (!path)
path = PATH_CONFIG;
fp = fopen(path, "r");
if (!fp)
{
if (silent_flag)
return 0;
ERROR1("error opening %s", path);
}
netcnt = 0;
while ((start = fgets(buf, sizeof buf, fp)) != NULL) {
char *net, *mask;
char *cmd = strtok(buf, " \t");
if (cmd) {
if (!strcmp("trusted-net:", cmd)) {
if (netcnt >= MAXNETS) {
if (!silent_flag)
ERROR1("too many networks defined in %s", path);
return 0;
}
net = strtok(NULL, " \t");
if (net) {
localnet[netcnt] = inet_network(net);
mask = strtok(NULL, " \t");
if (mask) {
localmask[netcnt] = inet_network(mask);
} else {
localmask[netcnt] = 0xFFFFFFFFL;
}
if ((localnet[netcnt] & localmask[netcnt]) == localnet[netcnt]) {
netcnt++;
} else if (!silent_flag) {
ERROR1("netmask does not match network %s", net);
}
} else {
if (!silent_flag)
ERROR2("format error in %s cmd %s", path, cmd);
}
} else if (*cmd != '#') {
ERROR2("unknown config statement %s in file %s", cmd, path);
}
}
}
fclose(fp);
return 0;
}