| /* | |
| * Copyright (C) 2006 by Darren Reed. | |
| * | |
| * See the IPFILTER.LICENCE file for details on licencing. | |
| * | |
| * $Id$ | |
| */ | |
| #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; | |
| } |