1170263Sdarrenr/*
2255332Scy * Copyright (C) 2012 by Darren Reed.
3170263Sdarrenr *
4170263Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
5170263Sdarrenr *
6255332Scy * $Id: load_file.c,v 1.6.2.2 2012/07/22 08:04:24 darren_r Exp $
7170263Sdarrenr */
8170263Sdarrenr
9170263Sdarrenr#include "ipf.h"
10255332Scy#include <ctype.h>
11170263Sdarrenr
12170263Sdarrenralist_t *
13170263Sdarrenrload_file(char *filename)
14170263Sdarrenr{
15170263Sdarrenr	alist_t *a, *rtop, *rbot;
16170263Sdarrenr	char *s, line[1024], *t;
17170263Sdarrenr	int linenum, not;
18170263Sdarrenr	FILE *fp;
19170263Sdarrenr
20170263Sdarrenr	fp = fopen(filename + 7, "r");
21170263Sdarrenr	if (fp == NULL) {
22170263Sdarrenr		fprintf(stderr, "load_file cannot open '%s'\n", filename);
23170263Sdarrenr		return NULL;
24255332Scy	}
25170263Sdarrenr
26170263Sdarrenr	a = NULL;
27170263Sdarrenr	rtop = NULL;
28170263Sdarrenr	rbot = NULL;
29255332Scy	linenum = 0;
30255332Scy
31170263Sdarrenr	while (fgets(line, sizeof(line) - 1, fp)) {
32170263Sdarrenr		line[sizeof(line) - 1] = '\0';
33170263Sdarrenr		linenum++;
34170263Sdarrenr		/*
35170263Sdarrenr		 * Hunt for CR/LF.  If no LF, stop processing.
36170263Sdarrenr		 */
37170263Sdarrenr		s = strchr(line, '\n');
38170263Sdarrenr		if (s == NULL) {
39255332Scy			fprintf(stderr, "%d:%s: line too long\n",
40255332Scy				linenum, filename);
41170263Sdarrenr			fclose(fp);
42170263Sdarrenr			alist_free(rtop);
43170263Sdarrenr			return NULL;
44170263Sdarrenr		}
45170263Sdarrenr
46255332Scy		/*
47255332Scy		 * Remove trailing spaces
48255332Scy		 */
49255332Scy		for (; ISSPACE(*s); s--)
50255332Scy			*s = '\0';
51255332Scy
52170263Sdarrenr		s = strchr(line, '\r');
53170263Sdarrenr		if (s != NULL)
54170263Sdarrenr			*s = '\0';
55255332Scy		for (t = line; ISSPACE(*t); t++)
56170263Sdarrenr			;
57170263Sdarrenr		if (*t == '!') {
58170263Sdarrenr			not = 1;
59170263Sdarrenr			t++;
60170263Sdarrenr		} else
61170263Sdarrenr			not = 0;
62170263Sdarrenr
63170263Sdarrenr		/*
64170263Sdarrenr		 * Remove comment markers
65170263Sdarrenr		 */
66255332Scy		s = strchr(t, '#');
67255332Scy		if (s != NULL) {
68255332Scy			*s = '\0';
69255332Scy			if (s == t)
70255332Scy				continue;
71170263Sdarrenr		}
72255332Scy
73170263Sdarrenr		/*
74170263Sdarrenr		 * Trim off tailing white spaces
75170263Sdarrenr		 */
76170263Sdarrenr		s = strlen(t) + t - 1;
77255332Scy		while (ISSPACE(*s))
78170263Sdarrenr			*s-- = '\0';
79170263Sdarrenr
80255332Scy		a = alist_new(AF_UNSPEC, t);
81255332Scy		if (a != NULL) {
82170263Sdarrenr			a->al_not = not;
83170263Sdarrenr			if (rbot != NULL)
84170263Sdarrenr				rbot->al_next = a;
85170263Sdarrenr			else
86170263Sdarrenr				rtop = a;
87170263Sdarrenr			rbot = a;
88170263Sdarrenr		} else {
89255332Scy			fprintf(stderr, "%s:%d unrecognised content :%s\n",
90255332Scy				filename, linenum, t);
91170263Sdarrenr		}
92170263Sdarrenr	}
93170263Sdarrenr	fclose(fp);
94170263Sdarrenr
95170263Sdarrenr	return rtop;
96170263Sdarrenr}
97