1170263Sdarrenr/* 2255332Scy * Copyright (C) 2012 by Darren Reed. 3170263Sdarrenr * 4170263Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 5170263Sdarrenr * 6255332Scy * $Id: load_file.c,v 1.6.2.2 2012/07/22 08:04:24 darren_r Exp $ 7170263Sdarrenr */ 8170263Sdarrenr 9170263Sdarrenr#include "ipf.h" 10255332Scy#include <ctype.h> 11170263Sdarrenr 12170263Sdarrenralist_t * 13170263Sdarrenrload_file(char *filename) 14170263Sdarrenr{ 15170263Sdarrenr alist_t *a, *rtop, *rbot; 16170263Sdarrenr char *s, line[1024], *t; 17170263Sdarrenr int linenum, not; 18170263Sdarrenr FILE *fp; 19170263Sdarrenr 20170263Sdarrenr fp = fopen(filename + 7, "r"); 21170263Sdarrenr if (fp == NULL) { 22170263Sdarrenr fprintf(stderr, "load_file cannot open '%s'\n", filename); 23170263Sdarrenr return NULL; 24255332Scy } 25170263Sdarrenr 26170263Sdarrenr a = NULL; 27170263Sdarrenr rtop = NULL; 28170263Sdarrenr rbot = NULL; 29255332Scy linenum = 0; 30255332Scy 31170263Sdarrenr while (fgets(line, sizeof(line) - 1, fp)) { 32170263Sdarrenr line[sizeof(line) - 1] = '\0'; 33170263Sdarrenr linenum++; 34170263Sdarrenr /* 35170263Sdarrenr * Hunt for CR/LF. If no LF, stop processing. 36170263Sdarrenr */ 37170263Sdarrenr s = strchr(line, '\n'); 38170263Sdarrenr if (s == NULL) { 39255332Scy fprintf(stderr, "%d:%s: line too long\n", 40255332Scy linenum, filename); 41170263Sdarrenr fclose(fp); 42170263Sdarrenr alist_free(rtop); 43170263Sdarrenr return NULL; 44170263Sdarrenr } 45170263Sdarrenr 46255332Scy /* 47255332Scy * Remove trailing spaces 48255332Scy */ 49255332Scy for (; ISSPACE(*s); s--) 50255332Scy *s = '\0'; 51255332Scy 52170263Sdarrenr s = strchr(line, '\r'); 53170263Sdarrenr if (s != NULL) 54170263Sdarrenr *s = '\0'; 55255332Scy for (t = line; ISSPACE(*t); t++) 56170263Sdarrenr ; 57170263Sdarrenr if (*t == '!') { 58170263Sdarrenr not = 1; 59170263Sdarrenr t++; 60170263Sdarrenr } else 61170263Sdarrenr not = 0; 62170263Sdarrenr 63170263Sdarrenr /* 64170263Sdarrenr * Remove comment markers 65170263Sdarrenr */ 66255332Scy s = strchr(t, '#'); 67255332Scy if (s != NULL) { 68255332Scy *s = '\0'; 69255332Scy if (s == t) 70255332Scy continue; 71170263Sdarrenr } 72255332Scy 73170263Sdarrenr /* 74170263Sdarrenr * Trim off tailing white spaces 75170263Sdarrenr */ 76170263Sdarrenr s = strlen(t) + t - 1; 77255332Scy while (ISSPACE(*s)) 78170263Sdarrenr *s-- = '\0'; 79170263Sdarrenr 80255332Scy a = alist_new(AF_UNSPEC, t); 81255332Scy if (a != NULL) { 82170263Sdarrenr a->al_not = not; 83170263Sdarrenr if (rbot != NULL) 84170263Sdarrenr rbot->al_next = a; 85170263Sdarrenr else 86170263Sdarrenr rtop = a; 87170263Sdarrenr rbot = a; 88170263Sdarrenr } else { 89255332Scy fprintf(stderr, "%s:%d unrecognised content :%s\n", 90255332Scy filename, linenum, t); 91170263Sdarrenr } 92170263Sdarrenr } 93170263Sdarrenr fclose(fp); 94170263Sdarrenr 95170263Sdarrenr return rtop; 96170263Sdarrenr} 97