Annotation of embedaddon/miniupnpd/options.c, revision 1.1.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>