Home | History | Annotate | Line # | Download | only in lib
      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