1 /* $NetBSD: load_file.c,v 1.2 2012/07/22 14:27:36 darrenr Exp $ */
2
3 /*
4 * Copyright (C) 2012 by Darren Reed.
5 *
6 * See the IPFILTER.LICENCE file for details on licencing.
7 *
8 * Id: load_file.c,v 1.1.1.2 2012/07/22 13:44:39 darrenr Exp $
9 */
10
11 #include "ipf.h"
12 #include <ctype.h>
13
14 alist_t *
load_file(char * filename)15 load_file(char *filename)
16 {
17 alist_t *a, *rtop, *rbot;
18 char *s, line[1024], *t;
19 int linenum, not;
20 FILE *fp;
21
22 fp = fopen(filename + 7, "r");
23 if (fp == NULL) {
24 fprintf(stderr, "load_file cannot open '%s'\n", filename);
25 return NULL;
26 }
27
28 a = NULL;
29 rtop = NULL;
30 rbot = NULL;
31 linenum = 0;
32
33 while (fgets(line, sizeof(line) - 1, fp)) {
34 line[sizeof(line) - 1] = '\0';
35 linenum++;
36 /*
37 * Hunt for CR/LF. If no LF, stop processing.
38 */
39 s = strchr(line, '\n');
40 if (s == NULL) {
41 fprintf(stderr, "%d:%s: line too long\n",
42 linenum, filename);
43 fclose(fp);
44 alist_free(rtop);
45 return NULL;
46 }
47
48 /*
49 * Remove trailing spaces
50 */
51 for (; ISSPACE(*s); s--)
52 *s = '\0';
53
54 s = strchr(line, '\r');
55 if (s != NULL)
56 *s = '\0';
57 for (t = line; ISSPACE(*t); t++)
58 ;
59 if (*t == '!') {
60 not = 1;
61 t++;
62 } else
63 not = 0;
64
65 /*
66 * Remove comment markers
67 */
68 s = strchr(t, '#');
69 if (s != NULL) {
70 *s = '\0';
71 if (s == t)
72 continue;
73 }
74
75 /*
76 * Trim off tailing white spaces
77 */
78 s = strlen(t) + t - 1;
79 while (ISSPACE(*s))
80 *s-- = '\0';
81
82 a = alist_new(AF_UNSPEC, t);
83 if (a != NULL) {
84 a->al_not = not;
85 if (rbot != NULL)
86 rbot->al_next = a;
87 else
88 rtop = a;
89 rbot = a;
90 } else {
91 fprintf(stderr, "%s:%d unrecognised content :%s\n",
92 filename, linenum, t);
93 }
94 }
95 fclose(fp);
96
97 return rtop;
98 }
99