91 lines
1.5 KiB
C
91 lines
1.5 KiB
C
|
/* $NetBSD: load_file.c,v 1.1.1.1 2007/04/14 20:17:31 martin Exp $ */
|
||
|
|
||
|
/*
|
||
|
* Copyright (C) 2006 by Darren Reed.
|
||
|
*
|
||
|
* See the IPFILTER.LICENCE file for details on licencing.
|
||
|
*
|
||
|
* Id: load_file.c,v 1.1.2.1 2006/08/25 21:13:04 darrenr Exp
|
||
|
*/
|
||
|
|
||
|
#include "ipf.h"
|
||
|
|
||
|
alist_t *
|
||
|
load_file(char *filename)
|
||
|
{
|
||
|
alist_t *a, *rtop, *rbot;
|
||
|
char *s, line[1024], *t;
|
||
|
int linenum, not;
|
||
|
FILE *fp;
|
||
|
|
||
|
fp = fopen(filename + 7, "r");
|
||
|
if (fp == NULL) {
|
||
|
fprintf(stderr, "load_file cannot open '%s'\n", filename);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
a = NULL;
|
||
|
rtop = NULL;
|
||
|
rbot = NULL;
|
||
|
linenum = 0;
|
||
|
|
||
|
while (fgets(line, sizeof(line) - 1, fp)) {
|
||
|
line[sizeof(line) - 1] = '\0';
|
||
|
linenum++;
|
||
|
/*
|
||
|
* Hunt for CR/LF. If no LF, stop processing.
|
||
|
*/
|
||
|
s = strchr(line, '\n');
|
||
|
if (s == NULL) {
|
||
|
fprintf(stderr, "%d:%s: line too long\n", linenum, filename);
|
||
|
fclose(fp);
|
||
|
alist_free(rtop);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
*s = '\0';
|
||
|
s = strchr(line, '\r');
|
||
|
if (s != NULL)
|
||
|
*s = '\0';
|
||
|
for (t = line; isspace(*t); t++)
|
||
|
;
|
||
|
if (*t == '!') {
|
||
|
not = 1;
|
||
|
t++;
|
||
|
} else
|
||
|
not = 0;
|
||
|
|
||
|
/*
|
||
|
* Remove comment markers
|
||
|
*/
|
||
|
for (s = t; *s; s++) {
|
||
|
if (*s == '#')
|
||
|
*s = '\0';
|
||
|
}
|
||
|
if (!*t)
|
||
|
continue;
|
||
|
/*
|
||
|
* Trim off tailing white spaces
|
||
|
*/
|
||
|
s = strlen(t) + t - 1;
|
||
|
while (isspace(*s))
|
||
|
*s-- = '\0';
|
||
|
|
||
|
if (isdigit(*t)) {
|
||
|
a = alist_new(4, t);
|
||
|
a->al_not = not;
|
||
|
if (rbot != NULL)
|
||
|
rbot->al_next = a;
|
||
|
else
|
||
|
rtop = a;
|
||
|
rbot = a;
|
||
|
} else {
|
||
|
fprintf(stderr, "%s: unrecognised content line %d\n",
|
||
|
filename, linenum);
|
||
|
}
|
||
|
}
|
||
|
fclose(fp);
|
||
|
|
||
|
return rtop;
|
||
|
}
|