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