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