blob: 5436480085a227002dd5a14f01805655247c9016 [file] [log] [blame] [raw]
/*
* Copyright (C) 2006-2009 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
* $Id$
*/
#include "ipf.h"
#include <ctype.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);
if (a != NULL) {
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;
}