Annotation of embedaddon/miniupnpd/options.c, revision 1.1
1.1 ! misho 1: /* $Id: options.c,v 1.20 2008/10/06 13:22:02 nanard Exp $ */
! 2: /* MiniUPnP project
! 3: * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
! 4: * author: Ryan Wagoner
! 5: * (c) 2006 Thomas Bernard
! 6: * This software is subject to the conditions detailed
! 7: * in the LICENCE file provided within the distribution */
! 8:
! 9: #include <stdio.h>
! 10: #include <string.h>
! 11: #include <stdlib.h>
! 12: #include <ctype.h>
! 13: #include <syslog.h>
! 14: #include "options.h"
! 15: #include "upnppermissions.h"
! 16: #include "upnpglobalvars.h"
! 17:
! 18: struct option * ary_options = NULL;
! 19: int num_options = 0;
! 20:
! 21: static const struct {
! 22: enum upnpconfigoptions id;
! 23: const char * name;
! 24: } optionids[] = {
! 25: { UPNPEXT_IFNAME, "ext_ifname" },
! 26: { UPNPEXT_IP, "ext_ip" },
! 27: { UPNPLISTENING_IP, "listening_ip" },
! 28: { UPNPPORT, "port" },
! 29: { UPNPBITRATE_UP, "bitrate_up" },
! 30: { UPNPBITRATE_DOWN, "bitrate_down" },
! 31: { UPNPPRESENTATIONURL, "presentation_url" },
! 32: { UPNPNOTIFY_INTERVAL, "notify_interval" },
! 33: { UPNPSYSTEM_UPTIME, "system_uptime" },
! 34: { UPNPPACKET_LOG, "packet_log" },
! 35: { UPNPUUID, "uuid"},
! 36: { UPNPSERIAL, "serial"},
! 37: { UPNPMODEL_NUMBER, "model_number"},
! 38: { UPNPCLEANTHRESHOLD, "clean_ruleset_threshold"},
! 39: { UPNPCLEANINTERVAL, "clean_ruleset_interval"},
! 40: #ifdef USE_NETFILTER
! 41: { UPNPFORWARDCHAIN, "upnp_forward_chain"},
! 42: { UPNPNATCHAIN, "upnp_nat_chain"},
! 43: #endif
! 44: #ifdef ENABLE_NATPMP
! 45: { UPNPENABLENATPMP, "enable_natpmp"},
! 46: #endif
! 47: { UPNPENABLE, "enable_upnp"},
! 48: #ifdef USE_PF
! 49: { UPNPQUEUE, "queue"},
! 50: { UPNPTAG, "tag"},
! 51: #endif
! 52: #ifdef PF_ENABLE_FILTER_RULES
! 53: { UPNPQUICKRULES, "quickrules" },
! 54: #endif
! 55: #ifdef ENABLE_LEASEFILE
! 56: { UPNPLEASEFILE, "lease_file"},
! 57: #endif
! 58: { UPNPMINISSDPDSOCKET, "minissdpdsocket"},
! 59: { UPNPSECUREMODE, "secure_mode"}
! 60: };
! 61:
! 62: int
! 63: readoptionsfile(const char * fname)
! 64: {
! 65: FILE *hfile = NULL;
! 66: char buffer[1024];
! 67: char *equals;
! 68: char *name;
! 69: char *value;
! 70: char *t;
! 71: int linenum = 0;
! 72: int i;
! 73: enum upnpconfigoptions id;
! 74:
! 75: if(!fname || (strlen(fname) == 0))
! 76: return -1;
! 77:
! 78: memset(buffer, 0, sizeof(buffer));
! 79:
! 80: #ifdef DEBUG
! 81: printf("Reading configuration from file %s\n", fname);
! 82: #endif
! 83:
! 84: if(!(hfile = fopen(fname, "r")))
! 85: return -1;
! 86:
! 87: if(ary_options != NULL)
! 88: {
! 89: free(ary_options);
! 90: num_options = 0;
! 91: }
! 92:
! 93: while(fgets(buffer, sizeof(buffer), hfile))
! 94: {
! 95: linenum++;
! 96: t = strchr(buffer, '\n');
! 97: if(t)
! 98: {
! 99: *t = '\0';
! 100: t--;
! 101: while((t >= buffer) && isspace(*t))
! 102: {
! 103: *t = '\0';
! 104: t--;
! 105: }
! 106: }
! 107:
! 108: /* skip leading whitespaces */
! 109: name = buffer;
! 110: while(isspace(*name))
! 111: name++;
! 112:
! 113: /* check for comments or empty lines */
! 114: if(name[0] == '#' || name[0] == '\0') continue;
! 115:
! 116: /* check for UPnP permissions rule */
! 117: if(0 == memcmp(name, "allow", 5) || 0 == memcmp(name, "deny", 4))
! 118: {
! 119: upnppermlist = realloc(upnppermlist,
! 120: sizeof(struct upnpperm) * (num_upnpperm+1));
! 121: /* parse the rule */
! 122: if(read_permission_line(upnppermlist + num_upnpperm, name) >= 0)
! 123: {
! 124: num_upnpperm++;
! 125: }
! 126: else
! 127: {
! 128: fprintf(stderr, "parsing error file %s line %d : %s\n",
! 129: fname, linenum, name);
! 130: }
! 131: continue;
! 132: }
! 133: if(!(equals = strchr(name, '=')))
! 134: {
! 135: fprintf(stderr, "parsing error file %s line %d : %s\n",
! 136: fname, linenum, name);
! 137: continue;
! 138: }
! 139:
! 140: /* remove ending whitespaces */
! 141: for(t=equals-1; t>name && isspace(*t); t--)
! 142: *t = '\0';
! 143:
! 144: *equals = '\0';
! 145: value = equals+1;
! 146:
! 147: /* skip leading whitespaces */
! 148: while(isspace(*value))
! 149: value++;
! 150:
! 151: id = UPNP_INVALID;
! 152: for(i=0; i<sizeof(optionids)/sizeof(optionids[0]); i++)
! 153: {
! 154: /*printf("%2d %2d %s %s\n", i, optionids[i].id, name,
! 155: optionids[i].name); */
! 156:
! 157: if(0 == strcmp(name, optionids[i].name))
! 158: {
! 159: id = optionids[i].id;
! 160: break;
! 161: }
! 162: }
! 163:
! 164: if(id == UPNP_INVALID)
! 165: {
! 166: fprintf(stderr, "parsing error file %s line %d : %s=%s\n",
! 167: fname, linenum, name, value);
! 168: }
! 169: else
! 170: {
! 171: num_options += 1;
! 172: ary_options = (struct option *) realloc(ary_options, num_options * sizeof(struct option));
! 173:
! 174: ary_options[num_options-1].id = id;
! 175: strncpy(ary_options[num_options-1].value, value, MAX_OPTION_VALUE_LEN);
! 176: }
! 177:
! 178: }
! 179:
! 180: fclose(hfile);
! 181:
! 182: return 0;
! 183: }
! 184:
! 185: void
! 186: freeoptions(void)
! 187: {
! 188: if(ary_options)
! 189: {
! 190: free(ary_options);
! 191: ary_options = NULL;
! 192: num_options = 0;
! 193: }
! 194: }
! 195:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>