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 * 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