Annotation of embedaddon/coova-chilli/src/cmdline.c, revision 1.1.1.1
1.1 misho 1: /*
2: File autogenerated by gengetopt version 2.22
3: generated with the following command:
4: gengetopt -C --no-handle-help --no-handle-version
5:
6: The developers of gengetopt consider the fixed text that goes in all
7: gengetopt output files to be in the public domain:
8: we make no copyright claims on it.
9: */
10:
11: /* If we use autoconf. */
12: #ifdef HAVE_CONFIG_H
13: #include "config.h"
14: #endif
15:
16: #include <stdio.h>
17: #include <stdlib.h>
18: #include <string.h>
19:
20: #include "getopt.h"
21:
22: #include "cmdline.h"
23:
24: const char *gengetopt_args_info_purpose = "";
25:
26: const char *gengetopt_args_info_usage = "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]...";
27:
28: const char *gengetopt_args_info_description = "";
29:
30: const char *gengetopt_args_info_help[] = {
31: " -h, --help Print help and exit",
32: " -V, --version Print version and exit",
33: " -f, --fg Run in foreground (default=off)",
34: " -d, --debug Run in debug mode (default=off)",
35: " --debugfacility=INT Which modules to print debug messages for \n (default=`1')",
36: " --logfacility=INT Syslog facility to be used for logging \n (default=`-1')",
37: " -c, --conf=STRING Read configuration file",
38: " --interval=INT Re-read configuration file at this interval \n (default=`3600')",
39: " --pidfile=STRING Filename of process id file",
40: " --statedir=STRING Directory of nonvolatile data",
41: " -n, --net=STRING Network (default=`192.168.182.0/24')",
42: " --dhcpstart=INT Network DHCP Starting IP (default=`0')",
43: " --dhcpend=INT Network DHCP Ending IP (default=`0')",
44: " --dynip=STRING Dynamic IP address pool",
45: " --nodynip No Dynamic IP assignment (default=off)",
46: " --statip=STRING Static IP address pool",
47: " --dns1=STRING Primary DNS server IP address",
48: " --dns2=STRING Secondary DNS server IP address",
49: " --domain=STRING Domain to use for DNS lookups \n (default=`coova.org')",
50: " --ipup=STRING Script to run after link-up",
51: " --ipdown=STRING Script to run after link-down",
52: " --conup=STRING Script to run after user logon",
53: " --condown=STRING Script to run after user logoff",
54: " --txqlen=INT TX Queue length for tun interface (linux only) \n (default=`100')",
55: " --tundev=STRING TUN/TAP Device, as in tun0 or tap1",
56: " --radiuslisten=STRING IP address to send from",
57: " --radiusserver1=STRING IP address of radius server 1 \n (default=`rad01.coova.org')",
58: " --radiusserver2=STRING IP address of radius server 2 \n (default=`rad01.coova.org')",
59: " --radiusauthport=INT Authentication UDP port of radius server \n (default=`1812')",
60: " --radiusacctport=INT Accounting UDP port of radius server \n (default=`1813')",
61: " --radiussecret=STRING Radius shared secret \n (default=`coova-anonymous')",
62: " --radiustimeout=INT Retry timeout in seconds (default=`30')",
63: " --radiusretry=INT Total number of retries (default=`6')",
64: " --radiusretrysec=INT Number of retries before using secondary \n (default=`3')",
65: " --radiusnasid=STRING Radius NAS-Identifier (default=`nas01')",
66: " --radiuslocationid=STRING WISPr Location ID",
67: " --radiuslocationname=STRING\n WISPr Location Name",
68: " --locationname=STRING Location Name",
69: " --radiusnasporttype=INT Radius NAS-Port-Type (default=`19')",
70: " --coaport=INT Radius disconnect port to listen to \n (default=`0')",
71: " --coanoipcheck Allow radius disconnect from any IP \n (default=off)",
72: " --proxylisten=STRING IP address to listen to",
73: " --proxyport=INT UDP port to listen to (default=`0')",
74: " --proxyclient=STRING IP address of proxy client(s)",
75: " --proxysecret=STRING Radius proxy shared secret",
76: " --dhcpif=STRING Local Ethernet interface",
77: " --dhcpmac=STRING Interface MAC address",
78: " --dhcpradius Map certain DHCP options to RADIUS attributes \n (default=off)",
79: " --dhcpgateway=STRING DHCP gateway addresss for relay",
80: " --dhcpgatewayport=INT DHCP gateway port for relay (default=`67')",
81: " --dhcprelayagent=STRING DHCP relay agent IP addresss (default \n uamlisten)",
82: " --lease=INT Lease time to allocate to clients \n (default=`600')",
83: " --eapolenable Enable IEEE 802.1x authentication \n (default=off)",
84: " --uamserver=STRING URL of authentication web server",
85: " --uamhomepage=STRING URL of homepage to redirect unauthenticated \n users to",
86: " --uamsecret=STRING Shared secret between uamserver and chilli",
87: " --uamlisten=STRING IP address to listen to for authentication \n requests",
88: " --uamport=INT TCP port to bind to for authentication requests \n (default=`3990')",
89: " --uamuiport=INT TCP port to bind to for UAM UI requests \n (default=`3991')",
90: " --uamallowed=STRING Domain names exempt from access check ",
91: " --uamdomain=STRING Domain name allowed (active dns filtering; one \n per line!) ",
92: " --uamanydns Allow client to use any DNS server \n (default=off)",
93: " --uamanyip Allow client to use any IP Address \n (default=off)",
94: " --wisprlogin=STRING A specific WISPr login url to be used",
95: " --nouamsuccess Do not return to the UAM server on success, \n original url instead (default=off)",
96: " --nouamwispr Do not send WISPr XML from ChilliSpot, assume \n back-end does (default=off)",
97: " --uamlogoutip=STRING HTTP Auto-Logout IP Address \n (default=`1.1.1.1')",
98: " --defsessiontimeout=LONG Default session-timeout if not returned by \n RADIUS (default=`0')",
99: " --defidletimeout=INT Default idle-timeout if not returned by RADIUS \n (default=`0')",
100: " --defbandwidthmaxdown=LONG\n Default WISPr-Bandwidth-Max-Down if not \n returned by RADIUS (default=`0')",
101: " --defbandwidthmaxup=LONG Default WISPr-Bandwidth-Max-Up if not returned \n by RADIUS (default=`0')",
102: " --definteriminterval=INT Default interim-interval for accounting if not \n returned by RADIUS (default=`300')",
103: " --macauth Authenticate based on MAC address \n (default=off)",
104: " --macauthdeny Deny access (even UAM) to MAC addresses given \n Access-Reject (default=off)",
105: " --macallowed=STRING List of allowed MAC addresses",
106: " --macsuffix=STRING Suffix to add to the MAC address",
107: " --macpasswd=STRING Password used when performing MAC \n authentication",
108: " --macallowlocal Do not use RADIUS for authenticating the \n macallowed (default=off)",
109: " --wwwdir=STRING Local content served by chilli (for splash \n page, etc)",
110: " --wwwbin=STRING Script binary (such as haserl) for simple web \n programming",
111: " --uamui=STRING Program in inetd style to handle all uam \n requests",
112: " --adminuser=STRING RADIUS administrative user login username \n (default=`chillispot')",
113: " --adminpasswd=STRING RADIUS administrative user login password \n (default=`chillispot')",
114: " --nasmac=STRING Unique MAC address of the NAS \n (called-station-id)",
115: " --nasip=STRING Unique IP address of the NAS (nas-ip-address)",
116: " --ssid=STRING SSID of the session",
117: " --vlan=STRING VLAN of the session",
118: " --cmdsocket=STRING path to the command unix socket",
119: " --radiusoriginalurl Turn on the sending of ChilliSpot-OriginalURL \n in Access-Request (default=off)",
120: " --swapoctets Swap the meaning of input/output octets/packets \n (default=off)",
121: " --usestatusfile Use the status file to keep track of sessions \n (default=off)",
122: " --localusers=STRING File keep 'Local' usernames and passwords",
123: " --postauthproxy=STRING IP of an upstream transparent proxy",
124: " --postauthproxyport=INT Port of an upstream transparent proxy \n (default=`0')",
125: " --wpaguests Allow WPA 'Guest' access (default=off)",
126: " --openidauth Allow OpenID authentication (default=off)",
127: " --papalwaysok Always allow 'PAP' authentication (depreciated; \n always on) (default=off)",
128: " --chillixml Use ChilliSpot XML in WISPr blocks \n (default=off)",
129: " --acctupdate Allow updating of session attributes in \n Accounting-Response (default=off)",
130: " --dnsparanoia Inspect DNS packets and drop responses with any \n non- A, CNAME, SOA, or MX records (to prevent \n dns tunnels) (default=off)",
131: " --usetap Use a TAP instead of TUN (linux only) \n (default=off)",
132: " --routeif=STRING Interface to use as default route; turns on \n 'manual' routing",
133: 0
134: };
135:
136: typedef enum {ARG_NO
137: , ARG_FLAG
138: , ARG_STRING
139: , ARG_INT
140: , ARG_LONG
141: } cmdline_parser_arg_type;
142:
143: static
144: void clear_given (struct gengetopt_args_info *args_info);
145: static
146: void clear_args (struct gengetopt_args_info *args_info);
147:
148: static int
149: cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info,
150: struct cmdline_parser_params *params, const char *additional_error);
151:
152: static int
153: cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error);
154: struct line_list
155: {
156: char * string_arg;
157: struct line_list * next;
158: };
159:
160: static struct line_list *cmd_line_list = 0;
161: static struct line_list *cmd_line_list_tmp = 0;
162:
163: static void
164: free_cmd_list(void)
165: {
166: /* free the list of a previous call */
167: if (cmd_line_list)
168: {
169: while (cmd_line_list) {
170: cmd_line_list_tmp = cmd_line_list;
171: cmd_line_list = cmd_line_list->next;
172: free (cmd_line_list_tmp->string_arg);
173: free (cmd_line_list_tmp);
174: }
175: }
176: }
177:
178:
179: static char *
180: gengetopt_strdup (const char *s);
181:
182: static
183: void clear_given (struct gengetopt_args_info *args_info)
184: {
185: args_info->help_given = 0 ;
186: args_info->version_given = 0 ;
187: args_info->fg_given = 0 ;
188: args_info->debug_given = 0 ;
189: args_info->debugfacility_given = 0 ;
190: args_info->logfacility_given = 0 ;
191: args_info->conf_given = 0 ;
192: args_info->interval_given = 0 ;
193: args_info->pidfile_given = 0 ;
194: args_info->statedir_given = 0 ;
195: args_info->net_given = 0 ;
196: args_info->dhcpstart_given = 0 ;
197: args_info->dhcpend_given = 0 ;
198: args_info->dynip_given = 0 ;
199: args_info->nodynip_given = 0 ;
200: args_info->statip_given = 0 ;
201: args_info->dns1_given = 0 ;
202: args_info->dns2_given = 0 ;
203: args_info->domain_given = 0 ;
204: args_info->ipup_given = 0 ;
205: args_info->ipdown_given = 0 ;
206: args_info->conup_given = 0 ;
207: args_info->condown_given = 0 ;
208: args_info->txqlen_given = 0 ;
209: args_info->tundev_given = 0 ;
210: args_info->radiuslisten_given = 0 ;
211: args_info->radiusserver1_given = 0 ;
212: args_info->radiusserver2_given = 0 ;
213: args_info->radiusauthport_given = 0 ;
214: args_info->radiusacctport_given = 0 ;
215: args_info->radiussecret_given = 0 ;
216: args_info->radiustimeout_given = 0 ;
217: args_info->radiusretry_given = 0 ;
218: args_info->radiusretrysec_given = 0 ;
219: args_info->radiusnasid_given = 0 ;
220: args_info->radiuslocationid_given = 0 ;
221: args_info->radiuslocationname_given = 0 ;
222: args_info->locationname_given = 0 ;
223: args_info->radiusnasporttype_given = 0 ;
224: args_info->coaport_given = 0 ;
225: args_info->coanoipcheck_given = 0 ;
226: args_info->proxylisten_given = 0 ;
227: args_info->proxyport_given = 0 ;
228: args_info->proxyclient_given = 0 ;
229: args_info->proxysecret_given = 0 ;
230: args_info->dhcpif_given = 0 ;
231: args_info->dhcpmac_given = 0 ;
232: args_info->dhcpradius_given = 0 ;
233: args_info->dhcpgateway_given = 0 ;
234: args_info->dhcpgatewayport_given = 0 ;
235: args_info->dhcprelayagent_given = 0 ;
236: args_info->lease_given = 0 ;
237: args_info->eapolenable_given = 0 ;
238: args_info->uamserver_given = 0 ;
239: args_info->uamhomepage_given = 0 ;
240: args_info->uamsecret_given = 0 ;
241: args_info->uamlisten_given = 0 ;
242: args_info->uamport_given = 0 ;
243: args_info->uamuiport_given = 0 ;
244: args_info->uamallowed_given = 0 ;
245: args_info->uamdomain_given = 0 ;
246: args_info->uamanydns_given = 0 ;
247: args_info->uamanyip_given = 0 ;
248: args_info->wisprlogin_given = 0 ;
249: args_info->nouamsuccess_given = 0 ;
250: args_info->nouamwispr_given = 0 ;
251: args_info->uamlogoutip_given = 0 ;
252: args_info->defsessiontimeout_given = 0 ;
253: args_info->defidletimeout_given = 0 ;
254: args_info->defbandwidthmaxdown_given = 0 ;
255: args_info->defbandwidthmaxup_given = 0 ;
256: args_info->definteriminterval_given = 0 ;
257: args_info->macauth_given = 0 ;
258: args_info->macauthdeny_given = 0 ;
259: args_info->macallowed_given = 0 ;
260: args_info->macsuffix_given = 0 ;
261: args_info->macpasswd_given = 0 ;
262: args_info->macallowlocal_given = 0 ;
263: args_info->wwwdir_given = 0 ;
264: args_info->wwwbin_given = 0 ;
265: args_info->uamui_given = 0 ;
266: args_info->adminuser_given = 0 ;
267: args_info->adminpasswd_given = 0 ;
268: args_info->nasmac_given = 0 ;
269: args_info->nasip_given = 0 ;
270: args_info->ssid_given = 0 ;
271: args_info->vlan_given = 0 ;
272: args_info->cmdsocket_given = 0 ;
273: args_info->radiusoriginalurl_given = 0 ;
274: args_info->swapoctets_given = 0 ;
275: args_info->usestatusfile_given = 0 ;
276: args_info->localusers_given = 0 ;
277: args_info->postauthproxy_given = 0 ;
278: args_info->postauthproxyport_given = 0 ;
279: args_info->wpaguests_given = 0 ;
280: args_info->openidauth_given = 0 ;
281: args_info->papalwaysok_given = 0 ;
282: args_info->chillixml_given = 0 ;
283: args_info->acctupdate_given = 0 ;
284: args_info->dnsparanoia_given = 0 ;
285: args_info->usetap_given = 0 ;
286: args_info->routeif_given = 0 ;
287: }
288:
289: static
290: void clear_args (struct gengetopt_args_info *args_info)
291: {
292: args_info->fg_flag = 0;
293: args_info->debug_flag = 0;
294: args_info->debugfacility_arg = 1;
295: args_info->debugfacility_orig = NULL;
296: args_info->logfacility_arg = -1;
297: args_info->logfacility_orig = NULL;
298: args_info->conf_arg = NULL;
299: args_info->conf_orig = NULL;
300: args_info->interval_arg = 3600;
301: args_info->interval_orig = NULL;
302: args_info->pidfile_arg = NULL;
303: args_info->pidfile_orig = NULL;
304: args_info->statedir_arg = NULL;
305: args_info->statedir_orig = NULL;
306: args_info->net_arg = gengetopt_strdup ("192.168.182.0/24");
307: args_info->net_orig = NULL;
308: args_info->dhcpstart_arg = 0;
309: args_info->dhcpstart_orig = NULL;
310: args_info->dhcpend_arg = 0;
311: args_info->dhcpend_orig = NULL;
312: args_info->dynip_arg = NULL;
313: args_info->dynip_orig = NULL;
314: args_info->nodynip_flag = 0;
315: args_info->statip_arg = NULL;
316: args_info->statip_orig = NULL;
317: args_info->dns1_arg = NULL;
318: args_info->dns1_orig = NULL;
319: args_info->dns2_arg = NULL;
320: args_info->dns2_orig = NULL;
321: args_info->domain_arg = gengetopt_strdup ("coova.org");
322: args_info->domain_orig = NULL;
323: args_info->ipup_arg = NULL;
324: args_info->ipup_orig = NULL;
325: args_info->ipdown_arg = NULL;
326: args_info->ipdown_orig = NULL;
327: args_info->conup_arg = NULL;
328: args_info->conup_orig = NULL;
329: args_info->condown_arg = NULL;
330: args_info->condown_orig = NULL;
331: args_info->txqlen_arg = 100;
332: args_info->txqlen_orig = NULL;
333: args_info->tundev_arg = NULL;
334: args_info->tundev_orig = NULL;
335: args_info->radiuslisten_arg = NULL;
336: args_info->radiuslisten_orig = NULL;
337: args_info->radiusserver1_arg = gengetopt_strdup ("rad01.coova.org");
338: args_info->radiusserver1_orig = NULL;
339: args_info->radiusserver2_arg = gengetopt_strdup ("rad01.coova.org");
340: args_info->radiusserver2_orig = NULL;
341: args_info->radiusauthport_arg = 1812;
342: args_info->radiusauthport_orig = NULL;
343: args_info->radiusacctport_arg = 1813;
344: args_info->radiusacctport_orig = NULL;
345: args_info->radiussecret_arg = gengetopt_strdup ("coova-anonymous");
346: args_info->radiussecret_orig = NULL;
347: args_info->radiustimeout_arg = 30;
348: args_info->radiustimeout_orig = NULL;
349: args_info->radiusretry_arg = 6;
350: args_info->radiusretry_orig = NULL;
351: args_info->radiusretrysec_arg = 3;
352: args_info->radiusretrysec_orig = NULL;
353: args_info->radiusnasid_arg = gengetopt_strdup ("nas01");
354: args_info->radiusnasid_orig = NULL;
355: args_info->radiuslocationid_arg = NULL;
356: args_info->radiuslocationid_orig = NULL;
357: args_info->radiuslocationname_arg = NULL;
358: args_info->radiuslocationname_orig = NULL;
359: args_info->locationname_arg = NULL;
360: args_info->locationname_orig = NULL;
361: args_info->radiusnasporttype_arg = 19;
362: args_info->radiusnasporttype_orig = NULL;
363: args_info->coaport_arg = 0;
364: args_info->coaport_orig = NULL;
365: args_info->coanoipcheck_flag = 0;
366: args_info->proxylisten_arg = NULL;
367: args_info->proxylisten_orig = NULL;
368: args_info->proxyport_arg = 0;
369: args_info->proxyport_orig = NULL;
370: args_info->proxyclient_arg = NULL;
371: args_info->proxyclient_orig = NULL;
372: args_info->proxysecret_arg = NULL;
373: args_info->proxysecret_orig = NULL;
374: args_info->dhcpif_arg = NULL;
375: args_info->dhcpif_orig = NULL;
376: args_info->dhcpmac_arg = NULL;
377: args_info->dhcpmac_orig = NULL;
378: args_info->dhcpradius_flag = 0;
379: args_info->dhcpgateway_arg = NULL;
380: args_info->dhcpgateway_orig = NULL;
381: args_info->dhcpgatewayport_arg = 67;
382: args_info->dhcpgatewayport_orig = NULL;
383: args_info->dhcprelayagent_arg = NULL;
384: args_info->dhcprelayagent_orig = NULL;
385: args_info->lease_arg = 600;
386: args_info->lease_orig = NULL;
387: args_info->eapolenable_flag = 0;
388: args_info->uamserver_arg = NULL;
389: args_info->uamserver_orig = NULL;
390: args_info->uamhomepage_arg = NULL;
391: args_info->uamhomepage_orig = NULL;
392: args_info->uamsecret_arg = NULL;
393: args_info->uamsecret_orig = NULL;
394: args_info->uamlisten_arg = NULL;
395: args_info->uamlisten_orig = NULL;
396: args_info->uamport_arg = 3990;
397: args_info->uamport_orig = NULL;
398: args_info->uamuiport_arg = 3991;
399: args_info->uamuiport_orig = NULL;
400: args_info->uamallowed_arg = NULL;
401: args_info->uamallowed_orig = NULL;
402: args_info->uamdomain_arg = NULL;
403: args_info->uamdomain_orig = NULL;
404: args_info->uamanydns_flag = 0;
405: args_info->uamanyip_flag = 0;
406: args_info->wisprlogin_arg = NULL;
407: args_info->wisprlogin_orig = NULL;
408: args_info->nouamsuccess_flag = 0;
409: args_info->nouamwispr_flag = 0;
410: args_info->uamlogoutip_arg = gengetopt_strdup ("1.1.1.1");
411: args_info->uamlogoutip_orig = NULL;
412: args_info->defsessiontimeout_arg = 0;
413: args_info->defsessiontimeout_orig = NULL;
414: args_info->defidletimeout_arg = 0;
415: args_info->defidletimeout_orig = NULL;
416: args_info->defbandwidthmaxdown_arg = 0;
417: args_info->defbandwidthmaxdown_orig = NULL;
418: args_info->defbandwidthmaxup_arg = 0;
419: args_info->defbandwidthmaxup_orig = NULL;
420: args_info->definteriminterval_arg = 300;
421: args_info->definteriminterval_orig = NULL;
422: args_info->macauth_flag = 0;
423: args_info->macauthdeny_flag = 0;
424: args_info->macallowed_arg = NULL;
425: args_info->macallowed_orig = NULL;
426: args_info->macsuffix_arg = NULL;
427: args_info->macsuffix_orig = NULL;
428: args_info->macpasswd_arg = NULL;
429: args_info->macpasswd_orig = NULL;
430: args_info->macallowlocal_flag = 0;
431: args_info->wwwdir_arg = NULL;
432: args_info->wwwdir_orig = NULL;
433: args_info->wwwbin_arg = NULL;
434: args_info->wwwbin_orig = NULL;
435: args_info->uamui_arg = NULL;
436: args_info->uamui_orig = NULL;
437: args_info->adminuser_arg = gengetopt_strdup ("chillispot");
438: args_info->adminuser_orig = NULL;
439: args_info->adminpasswd_arg = gengetopt_strdup ("chillispot");
440: args_info->adminpasswd_orig = NULL;
441: args_info->nasmac_arg = NULL;
442: args_info->nasmac_orig = NULL;
443: args_info->nasip_arg = NULL;
444: args_info->nasip_orig = NULL;
445: args_info->ssid_arg = NULL;
446: args_info->ssid_orig = NULL;
447: args_info->vlan_arg = NULL;
448: args_info->vlan_orig = NULL;
449: args_info->cmdsocket_arg = NULL;
450: args_info->cmdsocket_orig = NULL;
451: args_info->radiusoriginalurl_flag = 0;
452: args_info->swapoctets_flag = 0;
453: args_info->usestatusfile_flag = 0;
454: args_info->localusers_arg = NULL;
455: args_info->localusers_orig = NULL;
456: args_info->postauthproxy_arg = NULL;
457: args_info->postauthproxy_orig = NULL;
458: args_info->postauthproxyport_arg = 0;
459: args_info->postauthproxyport_orig = NULL;
460: args_info->wpaguests_flag = 0;
461: args_info->openidauth_flag = 0;
462: args_info->papalwaysok_flag = 0;
463: args_info->chillixml_flag = 0;
464: args_info->acctupdate_flag = 0;
465: args_info->dnsparanoia_flag = 0;
466: args_info->usetap_flag = 0;
467: args_info->routeif_arg = NULL;
468: args_info->routeif_orig = NULL;
469:
470: }
471:
472: static
473: void init_args_info(struct gengetopt_args_info *args_info)
474: {
475:
476:
477: args_info->help_help = gengetopt_args_info_help[0] ;
478: args_info->version_help = gengetopt_args_info_help[1] ;
479: args_info->fg_help = gengetopt_args_info_help[2] ;
480: args_info->debug_help = gengetopt_args_info_help[3] ;
481: args_info->debugfacility_help = gengetopt_args_info_help[4] ;
482: args_info->logfacility_help = gengetopt_args_info_help[5] ;
483: args_info->conf_help = gengetopt_args_info_help[6] ;
484: args_info->interval_help = gengetopt_args_info_help[7] ;
485: args_info->pidfile_help = gengetopt_args_info_help[8] ;
486: args_info->statedir_help = gengetopt_args_info_help[9] ;
487: args_info->net_help = gengetopt_args_info_help[10] ;
488: args_info->dhcpstart_help = gengetopt_args_info_help[11] ;
489: args_info->dhcpend_help = gengetopt_args_info_help[12] ;
490: args_info->dynip_help = gengetopt_args_info_help[13] ;
491: args_info->nodynip_help = gengetopt_args_info_help[14] ;
492: args_info->statip_help = gengetopt_args_info_help[15] ;
493: args_info->dns1_help = gengetopt_args_info_help[16] ;
494: args_info->dns2_help = gengetopt_args_info_help[17] ;
495: args_info->domain_help = gengetopt_args_info_help[18] ;
496: args_info->ipup_help = gengetopt_args_info_help[19] ;
497: args_info->ipdown_help = gengetopt_args_info_help[20] ;
498: args_info->conup_help = gengetopt_args_info_help[21] ;
499: args_info->condown_help = gengetopt_args_info_help[22] ;
500: args_info->txqlen_help = gengetopt_args_info_help[23] ;
501: args_info->tundev_help = gengetopt_args_info_help[24] ;
502: args_info->radiuslisten_help = gengetopt_args_info_help[25] ;
503: args_info->radiusserver1_help = gengetopt_args_info_help[26] ;
504: args_info->radiusserver2_help = gengetopt_args_info_help[27] ;
505: args_info->radiusauthport_help = gengetopt_args_info_help[28] ;
506: args_info->radiusacctport_help = gengetopt_args_info_help[29] ;
507: args_info->radiussecret_help = gengetopt_args_info_help[30] ;
508: args_info->radiustimeout_help = gengetopt_args_info_help[31] ;
509: args_info->radiusretry_help = gengetopt_args_info_help[32] ;
510: args_info->radiusretrysec_help = gengetopt_args_info_help[33] ;
511: args_info->radiusnasid_help = gengetopt_args_info_help[34] ;
512: args_info->radiuslocationid_help = gengetopt_args_info_help[35] ;
513: args_info->radiuslocationname_help = gengetopt_args_info_help[36] ;
514: args_info->locationname_help = gengetopt_args_info_help[37] ;
515: args_info->radiusnasporttype_help = gengetopt_args_info_help[38] ;
516: args_info->coaport_help = gengetopt_args_info_help[39] ;
517: args_info->coanoipcheck_help = gengetopt_args_info_help[40] ;
518: args_info->proxylisten_help = gengetopt_args_info_help[41] ;
519: args_info->proxyport_help = gengetopt_args_info_help[42] ;
520: args_info->proxyclient_help = gengetopt_args_info_help[43] ;
521: args_info->proxysecret_help = gengetopt_args_info_help[44] ;
522: args_info->dhcpif_help = gengetopt_args_info_help[45] ;
523: args_info->dhcpmac_help = gengetopt_args_info_help[46] ;
524: args_info->dhcpradius_help = gengetopt_args_info_help[47] ;
525: args_info->dhcpgateway_help = gengetopt_args_info_help[48] ;
526: args_info->dhcpgatewayport_help = gengetopt_args_info_help[49] ;
527: args_info->dhcprelayagent_help = gengetopt_args_info_help[50] ;
528: args_info->lease_help = gengetopt_args_info_help[51] ;
529: args_info->eapolenable_help = gengetopt_args_info_help[52] ;
530: args_info->uamserver_help = gengetopt_args_info_help[53] ;
531: args_info->uamhomepage_help = gengetopt_args_info_help[54] ;
532: args_info->uamsecret_help = gengetopt_args_info_help[55] ;
533: args_info->uamlisten_help = gengetopt_args_info_help[56] ;
534: args_info->uamport_help = gengetopt_args_info_help[57] ;
535: args_info->uamuiport_help = gengetopt_args_info_help[58] ;
536: args_info->uamallowed_help = gengetopt_args_info_help[59] ;
537: args_info->uamallowed_min = -1;
538: args_info->uamallowed_max = -1;
539: args_info->uamdomain_help = gengetopt_args_info_help[60] ;
540: args_info->uamdomain_min = -1;
541: args_info->uamdomain_max = -1;
542: args_info->uamanydns_help = gengetopt_args_info_help[61] ;
543: args_info->uamanyip_help = gengetopt_args_info_help[62] ;
544: args_info->wisprlogin_help = gengetopt_args_info_help[63] ;
545: args_info->nouamsuccess_help = gengetopt_args_info_help[64] ;
546: args_info->nouamwispr_help = gengetopt_args_info_help[65] ;
547: args_info->uamlogoutip_help = gengetopt_args_info_help[66] ;
548: args_info->defsessiontimeout_help = gengetopt_args_info_help[67] ;
549: args_info->defidletimeout_help = gengetopt_args_info_help[68] ;
550: args_info->defbandwidthmaxdown_help = gengetopt_args_info_help[69] ;
551: args_info->defbandwidthmaxup_help = gengetopt_args_info_help[70] ;
552: args_info->definteriminterval_help = gengetopt_args_info_help[71] ;
553: args_info->macauth_help = gengetopt_args_info_help[72] ;
554: args_info->macauthdeny_help = gengetopt_args_info_help[73] ;
555: args_info->macallowed_help = gengetopt_args_info_help[74] ;
556: args_info->macallowed_min = -1;
557: args_info->macallowed_max = -1;
558: args_info->macsuffix_help = gengetopt_args_info_help[75] ;
559: args_info->macpasswd_help = gengetopt_args_info_help[76] ;
560: args_info->macallowlocal_help = gengetopt_args_info_help[77] ;
561: args_info->wwwdir_help = gengetopt_args_info_help[78] ;
562: args_info->wwwbin_help = gengetopt_args_info_help[79] ;
563: args_info->uamui_help = gengetopt_args_info_help[80] ;
564: args_info->adminuser_help = gengetopt_args_info_help[81] ;
565: args_info->adminpasswd_help = gengetopt_args_info_help[82] ;
566: args_info->nasmac_help = gengetopt_args_info_help[83] ;
567: args_info->nasip_help = gengetopt_args_info_help[84] ;
568: args_info->ssid_help = gengetopt_args_info_help[85] ;
569: args_info->vlan_help = gengetopt_args_info_help[86] ;
570: args_info->cmdsocket_help = gengetopt_args_info_help[87] ;
571: args_info->radiusoriginalurl_help = gengetopt_args_info_help[88] ;
572: args_info->swapoctets_help = gengetopt_args_info_help[89] ;
573: args_info->usestatusfile_help = gengetopt_args_info_help[90] ;
574: args_info->localusers_help = gengetopt_args_info_help[91] ;
575: args_info->postauthproxy_help = gengetopt_args_info_help[92] ;
576: args_info->postauthproxyport_help = gengetopt_args_info_help[93] ;
577: args_info->wpaguests_help = gengetopt_args_info_help[94] ;
578: args_info->openidauth_help = gengetopt_args_info_help[95] ;
579: args_info->papalwaysok_help = gengetopt_args_info_help[96] ;
580: args_info->chillixml_help = gengetopt_args_info_help[97] ;
581: args_info->acctupdate_help = gengetopt_args_info_help[98] ;
582: args_info->dnsparanoia_help = gengetopt_args_info_help[99] ;
583: args_info->usetap_help = gengetopt_args_info_help[100] ;
584: args_info->routeif_help = gengetopt_args_info_help[101] ;
585:
586: }
587:
588: void
589: cmdline_parser_print_version (void)
590: {
591: printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
592: }
593:
594: static void print_help_common(void) {
595: cmdline_parser_print_version ();
596:
597: if (strlen(gengetopt_args_info_purpose) > 0)
598: printf("\n%s\n", gengetopt_args_info_purpose);
599:
600: if (strlen(gengetopt_args_info_usage) > 0)
601: printf("\n%s\n", gengetopt_args_info_usage);
602:
603: printf("\n");
604:
605: if (strlen(gengetopt_args_info_description) > 0)
606: printf("%s\n", gengetopt_args_info_description);
607: }
608:
609: void
610: cmdline_parser_print_help (void)
611: {
612: int i = 0;
613: print_help_common();
614: while (gengetopt_args_info_help[i])
615: printf("%s\n", gengetopt_args_info_help[i++]);
616: }
617:
618: void
619: cmdline_parser_init (struct gengetopt_args_info *args_info)
620: {
621: clear_given (args_info);
622: clear_args (args_info);
623: init_args_info (args_info);
624: }
625:
626: void
627: cmdline_parser_params_init(struct cmdline_parser_params *params)
628: {
629: if (params)
630: {
631: params->override = 0;
632: params->initialize = 1;
633: params->check_required = 1;
634: params->check_ambiguity = 0;
635: params->print_errors = 1;
636: }
637: }
638:
639: struct cmdline_parser_params *
640: cmdline_parser_params_create(void)
641: {
642: struct cmdline_parser_params *params =
643: (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params));
644: cmdline_parser_params_init(params);
645: return params;
646: }
647:
648: static void
649: free_string_field (char **s)
650: {
651: if (*s)
652: {
653: free (*s);
654: *s = 0;
655: }
656: }
657:
658: /** @brief generic value variable */
659: union generic_value {
660: int int_arg;
661: long long_arg;
662: char *string_arg;
663: };
664:
665: /** @brief holds temporary values for multiple options */
666: struct generic_list
667: {
668: union generic_value arg;
669: char *orig;
670: struct generic_list *next;
671: };
672:
673: /**
674: * @brief add a node at the head of the list
675: */
676: static void add_node(struct generic_list **list) {
677: struct generic_list *new_node = (struct generic_list *) malloc (sizeof (struct generic_list));
678: new_node->next = *list;
679: *list = new_node;
680: new_node->arg.string_arg = NULL;
681: new_node->orig = NULL;
682: }
683:
684:
685: static void
686: free_multiple_string_field(unsigned int len, char ***arg, char ***orig)
687: {
688: unsigned int i;
689: if (*arg) {
690: for (i = 0; i < len; ++i)
691: {
692: free_string_field(&((*arg)[i]));
693: free_string_field(&((*orig)[i]));
694: }
695: free_string_field(&((*arg)[0])); /* free default string */
696:
697: free (*arg);
698: *arg = 0;
699: free (*orig);
700: *orig = 0;
701: }
702: }
703:
704: static void
705: cmdline_parser_release (struct gengetopt_args_info *args_info)
706: {
707:
708: free_string_field (&(args_info->debugfacility_orig));
709: free_string_field (&(args_info->logfacility_orig));
710: free_string_field (&(args_info->conf_arg));
711: free_string_field (&(args_info->conf_orig));
712: free_string_field (&(args_info->interval_orig));
713: free_string_field (&(args_info->pidfile_arg));
714: free_string_field (&(args_info->pidfile_orig));
715: free_string_field (&(args_info->statedir_arg));
716: free_string_field (&(args_info->statedir_orig));
717: free_string_field (&(args_info->net_arg));
718: free_string_field (&(args_info->net_orig));
719: free_string_field (&(args_info->dhcpstart_orig));
720: free_string_field (&(args_info->dhcpend_orig));
721: free_string_field (&(args_info->dynip_arg));
722: free_string_field (&(args_info->dynip_orig));
723: free_string_field (&(args_info->statip_arg));
724: free_string_field (&(args_info->statip_orig));
725: free_string_field (&(args_info->dns1_arg));
726: free_string_field (&(args_info->dns1_orig));
727: free_string_field (&(args_info->dns2_arg));
728: free_string_field (&(args_info->dns2_orig));
729: free_string_field (&(args_info->domain_arg));
730: free_string_field (&(args_info->domain_orig));
731: free_string_field (&(args_info->ipup_arg));
732: free_string_field (&(args_info->ipup_orig));
733: free_string_field (&(args_info->ipdown_arg));
734: free_string_field (&(args_info->ipdown_orig));
735: free_string_field (&(args_info->conup_arg));
736: free_string_field (&(args_info->conup_orig));
737: free_string_field (&(args_info->condown_arg));
738: free_string_field (&(args_info->condown_orig));
739: free_string_field (&(args_info->txqlen_orig));
740: free_string_field (&(args_info->tundev_arg));
741: free_string_field (&(args_info->tundev_orig));
742: free_string_field (&(args_info->radiuslisten_arg));
743: free_string_field (&(args_info->radiuslisten_orig));
744: free_string_field (&(args_info->radiusserver1_arg));
745: free_string_field (&(args_info->radiusserver1_orig));
746: free_string_field (&(args_info->radiusserver2_arg));
747: free_string_field (&(args_info->radiusserver2_orig));
748: free_string_field (&(args_info->radiusauthport_orig));
749: free_string_field (&(args_info->radiusacctport_orig));
750: free_string_field (&(args_info->radiussecret_arg));
751: free_string_field (&(args_info->radiussecret_orig));
752: free_string_field (&(args_info->radiustimeout_orig));
753: free_string_field (&(args_info->radiusretry_orig));
754: free_string_field (&(args_info->radiusretrysec_orig));
755: free_string_field (&(args_info->radiusnasid_arg));
756: free_string_field (&(args_info->radiusnasid_orig));
757: free_string_field (&(args_info->radiuslocationid_arg));
758: free_string_field (&(args_info->radiuslocationid_orig));
759: free_string_field (&(args_info->radiuslocationname_arg));
760: free_string_field (&(args_info->radiuslocationname_orig));
761: free_string_field (&(args_info->locationname_arg));
762: free_string_field (&(args_info->locationname_orig));
763: free_string_field (&(args_info->radiusnasporttype_orig));
764: free_string_field (&(args_info->coaport_orig));
765: free_string_field (&(args_info->proxylisten_arg));
766: free_string_field (&(args_info->proxylisten_orig));
767: free_string_field (&(args_info->proxyport_orig));
768: free_string_field (&(args_info->proxyclient_arg));
769: free_string_field (&(args_info->proxyclient_orig));
770: free_string_field (&(args_info->proxysecret_arg));
771: free_string_field (&(args_info->proxysecret_orig));
772: free_string_field (&(args_info->dhcpif_arg));
773: free_string_field (&(args_info->dhcpif_orig));
774: free_string_field (&(args_info->dhcpmac_arg));
775: free_string_field (&(args_info->dhcpmac_orig));
776: free_string_field (&(args_info->dhcpgateway_arg));
777: free_string_field (&(args_info->dhcpgateway_orig));
778: free_string_field (&(args_info->dhcpgatewayport_orig));
779: free_string_field (&(args_info->dhcprelayagent_arg));
780: free_string_field (&(args_info->dhcprelayagent_orig));
781: free_string_field (&(args_info->lease_orig));
782: free_string_field (&(args_info->uamserver_arg));
783: free_string_field (&(args_info->uamserver_orig));
784: free_string_field (&(args_info->uamhomepage_arg));
785: free_string_field (&(args_info->uamhomepage_orig));
786: free_string_field (&(args_info->uamsecret_arg));
787: free_string_field (&(args_info->uamsecret_orig));
788: free_string_field (&(args_info->uamlisten_arg));
789: free_string_field (&(args_info->uamlisten_orig));
790: free_string_field (&(args_info->uamport_orig));
791: free_string_field (&(args_info->uamuiport_orig));
792: free_multiple_string_field (args_info->uamallowed_given, &(args_info->uamallowed_arg), &(args_info->uamallowed_orig));
793: free_multiple_string_field (args_info->uamdomain_given, &(args_info->uamdomain_arg), &(args_info->uamdomain_orig));
794: free_string_field (&(args_info->wisprlogin_arg));
795: free_string_field (&(args_info->wisprlogin_orig));
796: free_string_field (&(args_info->uamlogoutip_arg));
797: free_string_field (&(args_info->uamlogoutip_orig));
798: free_string_field (&(args_info->defsessiontimeout_orig));
799: free_string_field (&(args_info->defidletimeout_orig));
800: free_string_field (&(args_info->defbandwidthmaxdown_orig));
801: free_string_field (&(args_info->defbandwidthmaxup_orig));
802: free_string_field (&(args_info->definteriminterval_orig));
803: free_multiple_string_field (args_info->macallowed_given, &(args_info->macallowed_arg), &(args_info->macallowed_orig));
804: free_string_field (&(args_info->macsuffix_arg));
805: free_string_field (&(args_info->macsuffix_orig));
806: free_string_field (&(args_info->macpasswd_arg));
807: free_string_field (&(args_info->macpasswd_orig));
808: free_string_field (&(args_info->wwwdir_arg));
809: free_string_field (&(args_info->wwwdir_orig));
810: free_string_field (&(args_info->wwwbin_arg));
811: free_string_field (&(args_info->wwwbin_orig));
812: free_string_field (&(args_info->uamui_arg));
813: free_string_field (&(args_info->uamui_orig));
814: free_string_field (&(args_info->adminuser_arg));
815: free_string_field (&(args_info->adminuser_orig));
816: free_string_field (&(args_info->adminpasswd_arg));
817: free_string_field (&(args_info->adminpasswd_orig));
818: free_string_field (&(args_info->nasmac_arg));
819: free_string_field (&(args_info->nasmac_orig));
820: free_string_field (&(args_info->nasip_arg));
821: free_string_field (&(args_info->nasip_orig));
822: free_string_field (&(args_info->ssid_arg));
823: free_string_field (&(args_info->ssid_orig));
824: free_string_field (&(args_info->vlan_arg));
825: free_string_field (&(args_info->vlan_orig));
826: free_string_field (&(args_info->cmdsocket_arg));
827: free_string_field (&(args_info->cmdsocket_orig));
828: free_string_field (&(args_info->localusers_arg));
829: free_string_field (&(args_info->localusers_orig));
830: free_string_field (&(args_info->postauthproxy_arg));
831: free_string_field (&(args_info->postauthproxy_orig));
832: free_string_field (&(args_info->postauthproxyport_orig));
833: free_string_field (&(args_info->routeif_arg));
834: free_string_field (&(args_info->routeif_orig));
835:
836:
837:
838: clear_given (args_info);
839: }
840:
841:
842: static void
843: write_into_file(FILE *outfile, const char *opt, const char *arg, char *values[])
844: {
845: if (arg) {
846: fprintf(outfile, "%s=\"%s\"\n", opt, arg);
847: } else {
848: fprintf(outfile, "%s\n", opt);
849: }
850: }
851:
852: static void
853: write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, char *values[])
854: {
855: int i;
856:
857: for (i = 0; i < len; ++i)
858: write_into_file(outfile, opt, (arg ? arg[i] : 0), values);
859: }
860:
861: int
862: cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
863: {
864: int i = 0;
865:
866: if (!outfile)
867: {
868: fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE);
869: return EXIT_FAILURE;
870: }
871:
872: if (args_info->help_given)
873: write_into_file(outfile, "help", 0, 0 );
874: if (args_info->version_given)
875: write_into_file(outfile, "version", 0, 0 );
876: if (args_info->fg_given)
877: write_into_file(outfile, "fg", 0, 0 );
878: if (args_info->debug_given)
879: write_into_file(outfile, "debug", 0, 0 );
880: if (args_info->debugfacility_given)
881: write_into_file(outfile, "debugfacility", args_info->debugfacility_orig, 0);
882: if (args_info->logfacility_given)
883: write_into_file(outfile, "logfacility", args_info->logfacility_orig, 0);
884: if (args_info->conf_given)
885: write_into_file(outfile, "conf", args_info->conf_orig, 0);
886: if (args_info->interval_given)
887: write_into_file(outfile, "interval", args_info->interval_orig, 0);
888: if (args_info->pidfile_given)
889: write_into_file(outfile, "pidfile", args_info->pidfile_orig, 0);
890: if (args_info->statedir_given)
891: write_into_file(outfile, "statedir", args_info->statedir_orig, 0);
892: if (args_info->net_given)
893: write_into_file(outfile, "net", args_info->net_orig, 0);
894: if (args_info->dhcpstart_given)
895: write_into_file(outfile, "dhcpstart", args_info->dhcpstart_orig, 0);
896: if (args_info->dhcpend_given)
897: write_into_file(outfile, "dhcpend", args_info->dhcpend_orig, 0);
898: if (args_info->dynip_given)
899: write_into_file(outfile, "dynip", args_info->dynip_orig, 0);
900: if (args_info->nodynip_given)
901: write_into_file(outfile, "nodynip", 0, 0 );
902: if (args_info->statip_given)
903: write_into_file(outfile, "statip", args_info->statip_orig, 0);
904: if (args_info->dns1_given)
905: write_into_file(outfile, "dns1", args_info->dns1_orig, 0);
906: if (args_info->dns2_given)
907: write_into_file(outfile, "dns2", args_info->dns2_orig, 0);
908: if (args_info->domain_given)
909: write_into_file(outfile, "domain", args_info->domain_orig, 0);
910: if (args_info->ipup_given)
911: write_into_file(outfile, "ipup", args_info->ipup_orig, 0);
912: if (args_info->ipdown_given)
913: write_into_file(outfile, "ipdown", args_info->ipdown_orig, 0);
914: if (args_info->conup_given)
915: write_into_file(outfile, "conup", args_info->conup_orig, 0);
916: if (args_info->condown_given)
917: write_into_file(outfile, "condown", args_info->condown_orig, 0);
918: if (args_info->txqlen_given)
919: write_into_file(outfile, "txqlen", args_info->txqlen_orig, 0);
920: if (args_info->tundev_given)
921: write_into_file(outfile, "tundev", args_info->tundev_orig, 0);
922: if (args_info->radiuslisten_given)
923: write_into_file(outfile, "radiuslisten", args_info->radiuslisten_orig, 0);
924: if (args_info->radiusserver1_given)
925: write_into_file(outfile, "radiusserver1", args_info->radiusserver1_orig, 0);
926: if (args_info->radiusserver2_given)
927: write_into_file(outfile, "radiusserver2", args_info->radiusserver2_orig, 0);
928: if (args_info->radiusauthport_given)
929: write_into_file(outfile, "radiusauthport", args_info->radiusauthport_orig, 0);
930: if (args_info->radiusacctport_given)
931: write_into_file(outfile, "radiusacctport", args_info->radiusacctport_orig, 0);
932: if (args_info->radiussecret_given)
933: write_into_file(outfile, "radiussecret", args_info->radiussecret_orig, 0);
934: if (args_info->radiustimeout_given)
935: write_into_file(outfile, "radiustimeout", args_info->radiustimeout_orig, 0);
936: if (args_info->radiusretry_given)
937: write_into_file(outfile, "radiusretry", args_info->radiusretry_orig, 0);
938: if (args_info->radiusretrysec_given)
939: write_into_file(outfile, "radiusretrysec", args_info->radiusretrysec_orig, 0);
940: if (args_info->radiusnasid_given)
941: write_into_file(outfile, "radiusnasid", args_info->radiusnasid_orig, 0);
942: if (args_info->radiuslocationid_given)
943: write_into_file(outfile, "radiuslocationid", args_info->radiuslocationid_orig, 0);
944: if (args_info->radiuslocationname_given)
945: write_into_file(outfile, "radiuslocationname", args_info->radiuslocationname_orig, 0);
946: if (args_info->locationname_given)
947: write_into_file(outfile, "locationname", args_info->locationname_orig, 0);
948: if (args_info->radiusnasporttype_given)
949: write_into_file(outfile, "radiusnasporttype", args_info->radiusnasporttype_orig, 0);
950: if (args_info->coaport_given)
951: write_into_file(outfile, "coaport", args_info->coaport_orig, 0);
952: if (args_info->coanoipcheck_given)
953: write_into_file(outfile, "coanoipcheck", 0, 0 );
954: if (args_info->proxylisten_given)
955: write_into_file(outfile, "proxylisten", args_info->proxylisten_orig, 0);
956: if (args_info->proxyport_given)
957: write_into_file(outfile, "proxyport", args_info->proxyport_orig, 0);
958: if (args_info->proxyclient_given)
959: write_into_file(outfile, "proxyclient", args_info->proxyclient_orig, 0);
960: if (args_info->proxysecret_given)
961: write_into_file(outfile, "proxysecret", args_info->proxysecret_orig, 0);
962: if (args_info->dhcpif_given)
963: write_into_file(outfile, "dhcpif", args_info->dhcpif_orig, 0);
964: if (args_info->dhcpmac_given)
965: write_into_file(outfile, "dhcpmac", args_info->dhcpmac_orig, 0);
966: if (args_info->dhcpradius_given)
967: write_into_file(outfile, "dhcpradius", 0, 0 );
968: if (args_info->dhcpgateway_given)
969: write_into_file(outfile, "dhcpgateway", args_info->dhcpgateway_orig, 0);
970: if (args_info->dhcpgatewayport_given)
971: write_into_file(outfile, "dhcpgatewayport", args_info->dhcpgatewayport_orig, 0);
972: if (args_info->dhcprelayagent_given)
973: write_into_file(outfile, "dhcprelayagent", args_info->dhcprelayagent_orig, 0);
974: if (args_info->lease_given)
975: write_into_file(outfile, "lease", args_info->lease_orig, 0);
976: if (args_info->eapolenable_given)
977: write_into_file(outfile, "eapolenable", 0, 0 );
978: if (args_info->uamserver_given)
979: write_into_file(outfile, "uamserver", args_info->uamserver_orig, 0);
980: if (args_info->uamhomepage_given)
981: write_into_file(outfile, "uamhomepage", args_info->uamhomepage_orig, 0);
982: if (args_info->uamsecret_given)
983: write_into_file(outfile, "uamsecret", args_info->uamsecret_orig, 0);
984: if (args_info->uamlisten_given)
985: write_into_file(outfile, "uamlisten", args_info->uamlisten_orig, 0);
986: if (args_info->uamport_given)
987: write_into_file(outfile, "uamport", args_info->uamport_orig, 0);
988: if (args_info->uamuiport_given)
989: write_into_file(outfile, "uamuiport", args_info->uamuiport_orig, 0);
990: write_multiple_into_file(outfile, args_info->uamallowed_given, "uamallowed", args_info->uamallowed_orig, 0);
991: write_multiple_into_file(outfile, args_info->uamdomain_given, "uamdomain", args_info->uamdomain_orig, 0);
992: if (args_info->uamanydns_given)
993: write_into_file(outfile, "uamanydns", 0, 0 );
994: if (args_info->uamanyip_given)
995: write_into_file(outfile, "uamanyip", 0, 0 );
996: if (args_info->wisprlogin_given)
997: write_into_file(outfile, "wisprlogin", args_info->wisprlogin_orig, 0);
998: if (args_info->nouamsuccess_given)
999: write_into_file(outfile, "nouamsuccess", 0, 0 );
1000: if (args_info->nouamwispr_given)
1001: write_into_file(outfile, "nouamwispr", 0, 0 );
1002: if (args_info->uamlogoutip_given)
1003: write_into_file(outfile, "uamlogoutip", args_info->uamlogoutip_orig, 0);
1004: if (args_info->defsessiontimeout_given)
1005: write_into_file(outfile, "defsessiontimeout", args_info->defsessiontimeout_orig, 0);
1006: if (args_info->defidletimeout_given)
1007: write_into_file(outfile, "defidletimeout", args_info->defidletimeout_orig, 0);
1008: if (args_info->defbandwidthmaxdown_given)
1009: write_into_file(outfile, "defbandwidthmaxdown", args_info->defbandwidthmaxdown_orig, 0);
1010: if (args_info->defbandwidthmaxup_given)
1011: write_into_file(outfile, "defbandwidthmaxup", args_info->defbandwidthmaxup_orig, 0);
1012: if (args_info->definteriminterval_given)
1013: write_into_file(outfile, "definteriminterval", args_info->definteriminterval_orig, 0);
1014: if (args_info->macauth_given)
1015: write_into_file(outfile, "macauth", 0, 0 );
1016: if (args_info->macauthdeny_given)
1017: write_into_file(outfile, "macauthdeny", 0, 0 );
1018: write_multiple_into_file(outfile, args_info->macallowed_given, "macallowed", args_info->macallowed_orig, 0);
1019: if (args_info->macsuffix_given)
1020: write_into_file(outfile, "macsuffix", args_info->macsuffix_orig, 0);
1021: if (args_info->macpasswd_given)
1022: write_into_file(outfile, "macpasswd", args_info->macpasswd_orig, 0);
1023: if (args_info->macallowlocal_given)
1024: write_into_file(outfile, "macallowlocal", 0, 0 );
1025: if (args_info->wwwdir_given)
1026: write_into_file(outfile, "wwwdir", args_info->wwwdir_orig, 0);
1027: if (args_info->wwwbin_given)
1028: write_into_file(outfile, "wwwbin", args_info->wwwbin_orig, 0);
1029: if (args_info->uamui_given)
1030: write_into_file(outfile, "uamui", args_info->uamui_orig, 0);
1031: if (args_info->adminuser_given)
1032: write_into_file(outfile, "adminuser", args_info->adminuser_orig, 0);
1033: if (args_info->adminpasswd_given)
1034: write_into_file(outfile, "adminpasswd", args_info->adminpasswd_orig, 0);
1035: if (args_info->nasmac_given)
1036: write_into_file(outfile, "nasmac", args_info->nasmac_orig, 0);
1037: if (args_info->nasip_given)
1038: write_into_file(outfile, "nasip", args_info->nasip_orig, 0);
1039: if (args_info->ssid_given)
1040: write_into_file(outfile, "ssid", args_info->ssid_orig, 0);
1041: if (args_info->vlan_given)
1042: write_into_file(outfile, "vlan", args_info->vlan_orig, 0);
1043: if (args_info->cmdsocket_given)
1044: write_into_file(outfile, "cmdsocket", args_info->cmdsocket_orig, 0);
1045: if (args_info->radiusoriginalurl_given)
1046: write_into_file(outfile, "radiusoriginalurl", 0, 0 );
1047: if (args_info->swapoctets_given)
1048: write_into_file(outfile, "swapoctets", 0, 0 );
1049: if (args_info->usestatusfile_given)
1050: write_into_file(outfile, "usestatusfile", 0, 0 );
1051: if (args_info->localusers_given)
1052: write_into_file(outfile, "localusers", args_info->localusers_orig, 0);
1053: if (args_info->postauthproxy_given)
1054: write_into_file(outfile, "postauthproxy", args_info->postauthproxy_orig, 0);
1055: if (args_info->postauthproxyport_given)
1056: write_into_file(outfile, "postauthproxyport", args_info->postauthproxyport_orig, 0);
1057: if (args_info->wpaguests_given)
1058: write_into_file(outfile, "wpaguests", 0, 0 );
1059: if (args_info->openidauth_given)
1060: write_into_file(outfile, "openidauth", 0, 0 );
1061: if (args_info->papalwaysok_given)
1062: write_into_file(outfile, "papalwaysok", 0, 0 );
1063: if (args_info->chillixml_given)
1064: write_into_file(outfile, "chillixml", 0, 0 );
1065: if (args_info->acctupdate_given)
1066: write_into_file(outfile, "acctupdate", 0, 0 );
1067: if (args_info->dnsparanoia_given)
1068: write_into_file(outfile, "dnsparanoia", 0, 0 );
1069: if (args_info->usetap_given)
1070: write_into_file(outfile, "usetap", 0, 0 );
1071: if (args_info->routeif_given)
1072: write_into_file(outfile, "routeif", args_info->routeif_orig, 0);
1073:
1074:
1075: i = EXIT_SUCCESS;
1076: return i;
1077: }
1078:
1079: int
1080: cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
1081: {
1082: FILE *outfile;
1083: int i = 0;
1084:
1085: outfile = fopen(filename, "w");
1086:
1087: if (!outfile)
1088: {
1089: fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename);
1090: return EXIT_FAILURE;
1091: }
1092:
1093: i = cmdline_parser_dump(outfile, args_info);
1094: fclose (outfile);
1095:
1096: return i;
1097: }
1098:
1099: void
1100: cmdline_parser_free (struct gengetopt_args_info *args_info)
1101: {
1102: cmdline_parser_release (args_info);
1103: }
1104:
1105: /** @brief replacement of strdup, which is not standard */
1106: char *
1107: gengetopt_strdup (const char *s)
1108: {
1109: char *result = NULL;
1110: if (!s)
1111: return result;
1112:
1113: result = (char*)malloc(strlen(s) + 1);
1114: if (result == (char*)0)
1115: return (char*)0;
1116: strcpy(result, s);
1117: return result;
1118: }
1119:
1120: static char *
1121: get_multiple_arg_token(const char *arg)
1122: {
1123: char *tok, *ret;
1124: size_t len, num_of_escape, i, j;
1125:
1126: if (!arg)
1127: return NULL;
1128:
1129: tok = strchr (arg, ',');
1130: num_of_escape = 0;
1131:
1132: /* make sure it is not escaped */
1133: while (tok)
1134: {
1135: if (*(tok-1) == '\\')
1136: {
1137: /* find the next one */
1138: tok = strchr (tok+1, ',');
1139: ++num_of_escape;
1140: }
1141: else
1142: break;
1143: }
1144:
1145: if (tok)
1146: len = (size_t)(tok - arg + 1);
1147: else
1148: len = strlen (arg) + 1;
1149:
1150: len -= num_of_escape;
1151:
1152: ret = (char *) malloc (len);
1153:
1154: i = 0;
1155: j = 0;
1156: while (arg[i] && (j < len-1))
1157: {
1158: if (arg[i] == '\\' &&
1159: arg[ i + 1 ] &&
1160: arg[ i + 1 ] == ',')
1161: ++i;
1162:
1163: ret[j++] = arg[i++];
1164: }
1165:
1166: ret[len-1] = '\0';
1167:
1168: return ret;
1169: }
1170:
1171: static char *
1172: get_multiple_arg_token_next(const char *arg)
1173: {
1174: char *tok;
1175:
1176: if (!arg)
1177: return NULL;
1178:
1179: tok = strchr (arg, ',');
1180:
1181: /* make sure it is not escaped */
1182: while (tok)
1183: {
1184: if (*(tok-1) == '\\')
1185: {
1186: /* find the next one */
1187: tok = strchr (tok+1, ',');
1188: }
1189: else
1190: break;
1191: }
1192:
1193: if (! tok || strlen(tok) == 1)
1194: return 0;
1195:
1196: return tok+1;
1197: }
1198:
1199: static int
1200: check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, int min, int max, const char *option_desc);
1201:
1202: int
1203: check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, int min, int max, const char *option_desc)
1204: {
1205: int error = 0;
1206:
1207: if (option_given && ! (min < 0 && max < 0))
1208: {
1209: if (min >= 0 && max >= 0)
1210: {
1211: if (min == max)
1212: {
1213: /* specific occurrences */
1214: if (option_given != min)
1215: {
1216: fprintf (stderr, "%s: %s option occurrences must be %d\n",
1217: prog_name, option_desc, min);
1218: error = 1;
1219: }
1220: }
1221: else if (option_given < min
1222: || option_given > max)
1223: {
1224: /* range occurrences */
1225: fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n",
1226: prog_name, option_desc, min, max);
1227: error = 1;
1228: }
1229: }
1230: else if (min >= 0)
1231: {
1232: /* at least check */
1233: if (option_given < min)
1234: {
1235: fprintf (stderr, "%s: %s option occurrences must be at least %d\n",
1236: prog_name, option_desc, min);
1237: error = 1;
1238: }
1239: }
1240: else if (max >= 0)
1241: {
1242: /* at most check */
1243: if (option_given > max)
1244: {
1245: fprintf (stderr, "%s: %s option occurrences must be at most %d\n",
1246: prog_name, option_desc, max);
1247: error = 1;
1248: }
1249: }
1250: }
1251:
1252: return error;
1253: }
1254: int
1255: cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info)
1256: {
1257: return cmdline_parser2 (argc, argv, args_info, 0, 1, 1);
1258: }
1259:
1260: int
1261: cmdline_parser_ext (int argc, char * const *argv, struct gengetopt_args_info *args_info,
1262: struct cmdline_parser_params *params)
1263: {
1264: int result;
1265: result = cmdline_parser_internal (argc, argv, args_info, params, NULL);
1266:
1267: if (result == EXIT_FAILURE)
1268: {
1269: cmdline_parser_free (args_info);
1270: exit (EXIT_FAILURE);
1271: }
1272:
1273: return result;
1274: }
1275:
1276: int
1277: cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required)
1278: {
1279: int result;
1280: struct cmdline_parser_params params;
1281:
1282: params.override = override;
1283: params.initialize = initialize;
1284: params.check_required = check_required;
1285: params.check_ambiguity = 0;
1286: params.print_errors = 1;
1287:
1288: result = cmdline_parser_internal (argc, argv, args_info, ¶ms, NULL);
1289:
1290: if (result == EXIT_FAILURE)
1291: {
1292: cmdline_parser_free (args_info);
1293: exit (EXIT_FAILURE);
1294: }
1295:
1296: return result;
1297: }
1298:
1299: int
1300: cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name)
1301: {
1302: int result = EXIT_SUCCESS;
1303:
1304: if (cmdline_parser_required2(args_info, prog_name, NULL) > 0)
1305: result = EXIT_FAILURE;
1306:
1307: if (result == EXIT_FAILURE)
1308: {
1309: cmdline_parser_free (args_info);
1310: exit (EXIT_FAILURE);
1311: }
1312:
1313: return result;
1314: }
1315:
1316: int
1317: cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error)
1318: {
1319: int error = 0;
1320:
1321: /* checks for required options */
1322: if (check_multiple_option_occurrences(prog_name, args_info->uamallowed_given, args_info->uamallowed_min, args_info->uamallowed_max, "'--uamallowed'"))
1323: error = 1;
1324:
1325: if (check_multiple_option_occurrences(prog_name, args_info->uamdomain_given, args_info->uamdomain_min, args_info->uamdomain_max, "'--uamdomain'"))
1326: error = 1;
1327:
1328: if (check_multiple_option_occurrences(prog_name, args_info->macallowed_given, args_info->macallowed_min, args_info->macallowed_max, "'--macallowed'"))
1329: error = 1;
1330:
1331:
1332: /* checks for dependences among options */
1333:
1334: return error;
1335: }
1336:
1337:
1338: static char *package_name = 0;
1339:
1340: /**
1341: * @brief updates an option
1342: * @param field the generic pointer to the field to update
1343: * @param orig_field the pointer to the orig field
1344: * @param field_given the pointer to the number of occurrence of this option
1345: * @param prev_given the pointer to the number of occurrence already seen
1346: * @param value the argument for this option (if null no arg was specified)
1347: * @param possible_values the possible values for this option (if specified)
1348: * @param default_value the default value (in case the option only accepts fixed values)
1349: * @param arg_type the type of this option
1350: * @param check_ambiguity @see cmdline_parser_params.check_ambiguity
1351: * @param override @see cmdline_parser_params.override
1352: * @param no_free whether to free a possible previous value
1353: * @param multiple_option whether this is a multiple option
1354: * @param long_opt the corresponding long option
1355: * @param short_opt the corresponding short option (or '-' if none)
1356: * @param additional_error possible further error specification
1357: */
1358: static
1359: int update_arg(void *field, char **orig_field,
1360: unsigned int *field_given, unsigned int *prev_given,
1361: char *value, char *possible_values[], const char *default_value,
1362: cmdline_parser_arg_type arg_type,
1363: int check_ambiguity, int override,
1364: int no_free, int multiple_option,
1365: const char *long_opt, char short_opt,
1366: const char *additional_error)
1367: {
1368: char *stop_char = 0;
1369: const char *val = value;
1370: int found;
1371: char **string_field;
1372:
1373: stop_char = 0;
1374: found = 0;
1375:
1376: if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given)))
1377: {
1378: if (short_opt != '-')
1379: fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n",
1380: package_name, long_opt, short_opt,
1381: (additional_error ? additional_error : ""));
1382: else
1383: fprintf (stderr, "%s: `--%s' option given more than once%s\n",
1384: package_name, long_opt,
1385: (additional_error ? additional_error : ""));
1386: return 1; /* failure */
1387: }
1388:
1389:
1390: if (field_given && *field_given && ! override)
1391: return 0;
1392: if (prev_given)
1393: (*prev_given)++;
1394: if (field_given)
1395: (*field_given)++;
1396: if (possible_values)
1397: val = possible_values[found];
1398:
1399: switch(arg_type) {
1400: case ARG_FLAG:
1401: *((int *)field) = !*((int *)field);
1402: break;
1403: case ARG_INT:
1404: if (val) *((int *)field) = strtol (val, &stop_char, 0);
1405: break;
1406: case ARG_LONG:
1407: if (val) *((long *)field) = (long)strtol (val, &stop_char, 0);
1408: break;
1409: case ARG_STRING:
1410: if (val) {
1411: string_field = (char **)field;
1412: if (!no_free && *string_field)
1413: free (*string_field); /* free previous string */
1414: *string_field = gengetopt_strdup (val);
1415: }
1416: break;
1417: default:
1418: break;
1419: };
1420:
1421: /* check numeric conversion */
1422: switch(arg_type) {
1423: case ARG_INT:
1424: case ARG_LONG:
1425: if (val && !(stop_char && *stop_char == '\0')) {
1426: fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val);
1427: return 1; /* failure */
1428: }
1429: break;
1430: default:
1431: ;
1432: };
1433:
1434: /* store the original value */
1435: switch(arg_type) {
1436: case ARG_NO:
1437: case ARG_FLAG:
1438: break;
1439: default:
1440: if (value && orig_field) {
1441: if (no_free) {
1442: *orig_field = value;
1443: } else {
1444: if (*orig_field)
1445: free (*orig_field); /* free previous string */
1446: *orig_field = gengetopt_strdup (value);
1447: }
1448: }
1449: };
1450:
1451: return 0; /* OK */
1452: }
1453:
1454: /**
1455: * @brief store information about a multiple option in a temporary list
1456: * @param list where to (temporarily) store multiple options
1457: */
1458: static
1459: int update_multiple_arg_temp(struct generic_list **list,
1460: unsigned int *prev_given, const char *val,
1461: char *possible_values[], const char *default_value,
1462: cmdline_parser_arg_type arg_type,
1463: const char *long_opt, char short_opt,
1464: const char *additional_error)
1465: {
1466: char *multi_token, *multi_next; /* store single arguments */
1467:
1468: if (arg_type == ARG_NO) {
1469: (*prev_given)++;
1470: return 0; /* OK */
1471: }
1472:
1473: multi_token = get_multiple_arg_token(val);
1474: multi_next = get_multiple_arg_token_next (val);
1475:
1476: while (1)
1477: {
1478: add_node (list);
1479: if (update_arg((void *)&((*list)->arg), &((*list)->orig), 0,
1480: prev_given, multi_token, possible_values, default_value,
1481: arg_type, 0, 1, 1, 1, long_opt, short_opt, additional_error)) {
1482: if (multi_token) free(multi_token);
1483: return 1; /* failure */
1484: }
1485:
1486: if (multi_next)
1487: {
1488: multi_token = get_multiple_arg_token(multi_next);
1489: multi_next = get_multiple_arg_token_next (multi_next);
1490: }
1491: else
1492: break;
1493: }
1494:
1495: return 0; /* OK */
1496: }
1497:
1498: /**
1499: * @brief free the passed list (including possible string argument)
1500: */
1501: static
1502: void free_list(struct generic_list *list, short string_arg)
1503: {
1504: if (list) {
1505: struct generic_list *tmp;
1506: while (list)
1507: {
1508: tmp = list;
1509: if (string_arg && list->arg.string_arg)
1510: free (list->arg.string_arg);
1511: if (list->orig)
1512: free (list->orig);
1513: list = list->next;
1514: free (tmp);
1515: }
1516: }
1517: }
1518:
1519: /**
1520: * @brief updates a multiple option starting from the passed list
1521: */
1522: static
1523: void update_multiple_arg(void *field, char ***orig_field,
1524: unsigned int field_given, unsigned int prev_given, union generic_value *default_value,
1525: cmdline_parser_arg_type arg_type,
1526: struct generic_list *list)
1527: {
1528: int i;
1529: struct generic_list *tmp;
1530:
1531: if (prev_given && list) {
1532: *orig_field = (char **) realloc (*orig_field, (field_given + prev_given) * sizeof (char *));
1533:
1534: switch(arg_type) {
1535: case ARG_INT:
1536: *((int **)field) = (int *)realloc (*((int **)field), (field_given + prev_given) * sizeof (int)); break;
1537: case ARG_LONG:
1538: *((long **)field) = (long *)realloc (*((long **)field), (field_given + prev_given) * sizeof (long)); break;
1539: case ARG_STRING:
1540: *((char ***)field) = (char **)realloc (*((char ***)field), (field_given + prev_given) * sizeof (char *)); break;
1541: default:
1542: break;
1543: };
1544:
1545: for (i = (prev_given - 1); i >= 0; --i)
1546: {
1547: tmp = list;
1548:
1549: switch(arg_type) {
1550: case ARG_INT:
1551: (*((int **)field))[i + field_given] = tmp->arg.int_arg; break;
1552: case ARG_LONG:
1553: (*((long **)field))[i + field_given] = tmp->arg.long_arg; break;
1554: case ARG_STRING:
1555: (*((char ***)field))[i + field_given] = tmp->arg.string_arg; break;
1556: default:
1557: break;
1558: }
1559: (*orig_field) [i + field_given] = list->orig;
1560: list = list->next;
1561: free (tmp);
1562: }
1563: } else { /* set the default value */
1564: if (default_value && ! field_given) {
1565: switch(arg_type) {
1566: case ARG_INT:
1567: if (! *((int **)field)) {
1568: *((int **)field) = (int *)malloc (sizeof (int));
1569: (*((int **)field))[0] = default_value->int_arg;
1570: }
1571: break;
1572: case ARG_LONG:
1573: if (! *((long **)field)) {
1574: *((long **)field) = (long *)malloc (sizeof (long));
1575: (*((long **)field))[0] = default_value->long_arg;
1576: }
1577: break;
1578: case ARG_STRING:
1579: if (! *((char ***)field)) {
1580: *((char ***)field) = (char **)malloc (sizeof (char *));
1581: (*((char ***)field))[0] = gengetopt_strdup(default_value->string_arg);
1582: }
1583: break;
1584: default: break;
1585: }
1586: if (!(*orig_field)) {
1587: *orig_field = (char **) malloc (sizeof (char *));
1588: (*orig_field)[0] = NULL;
1589: }
1590: }
1591: }
1592: }
1593:
1594: int
1595: cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info,
1596: struct cmdline_parser_params *params, const char *additional_error)
1597: {
1598: int c; /* Character of the parsed option. */
1599:
1600: struct generic_list * uamallowed_list = NULL;
1601: struct generic_list * uamdomain_list = NULL;
1602: struct generic_list * macallowed_list = NULL;
1603: int error = 0;
1604: struct gengetopt_args_info local_args_info;
1605:
1606: int override;
1607: int initialize;
1608: int check_required;
1609: int check_ambiguity;
1610:
1611: package_name = argv[0];
1612:
1613: override = params->override;
1614: initialize = params->initialize;
1615: check_required = params->check_required;
1616: check_ambiguity = params->check_ambiguity;
1617:
1618: if (initialize)
1619: cmdline_parser_init (args_info);
1620:
1621: cmdline_parser_init (&local_args_info);
1622:
1623: optarg = 0;
1624: optind = 0;
1625: opterr = params->print_errors;
1626: optopt = '?';
1627:
1628: while (1)
1629: {
1630: int option_index = 0;
1631:
1632: static struct option long_options[] = {
1633: { "help", 0, NULL, 'h' },
1634: { "version", 0, NULL, 'V' },
1635: { "fg", 0, NULL, 'f' },
1636: { "debug", 0, NULL, 'd' },
1637: { "debugfacility", 1, NULL, 0 },
1638: { "logfacility", 1, NULL, 0 },
1639: { "conf", 1, NULL, 'c' },
1640: { "interval", 1, NULL, 0 },
1641: { "pidfile", 1, NULL, 0 },
1642: { "statedir", 1, NULL, 0 },
1643: { "net", 1, NULL, 'n' },
1644: { "dhcpstart", 1, NULL, 0 },
1645: { "dhcpend", 1, NULL, 0 },
1646: { "dynip", 1, NULL, 0 },
1647: { "nodynip", 0, NULL, 0 },
1648: { "statip", 1, NULL, 0 },
1649: { "dns1", 1, NULL, 0 },
1650: { "dns2", 1, NULL, 0 },
1651: { "domain", 1, NULL, 0 },
1652: { "ipup", 1, NULL, 0 },
1653: { "ipdown", 1, NULL, 0 },
1654: { "conup", 1, NULL, 0 },
1655: { "condown", 1, NULL, 0 },
1656: { "txqlen", 1, NULL, 0 },
1657: { "tundev", 1, NULL, 0 },
1658: { "radiuslisten", 1, NULL, 0 },
1659: { "radiusserver1", 1, NULL, 0 },
1660: { "radiusserver2", 1, NULL, 0 },
1661: { "radiusauthport", 1, NULL, 0 },
1662: { "radiusacctport", 1, NULL, 0 },
1663: { "radiussecret", 1, NULL, 0 },
1664: { "radiustimeout", 1, NULL, 0 },
1665: { "radiusretry", 1, NULL, 0 },
1666: { "radiusretrysec", 1, NULL, 0 },
1667: { "radiusnasid", 1, NULL, 0 },
1668: { "radiuslocationid", 1, NULL, 0 },
1669: { "radiuslocationname", 1, NULL, 0 },
1670: { "locationname", 1, NULL, 0 },
1671: { "radiusnasporttype", 1, NULL, 0 },
1672: { "coaport", 1, NULL, 0 },
1673: { "coanoipcheck", 0, NULL, 0 },
1674: { "proxylisten", 1, NULL, 0 },
1675: { "proxyport", 1, NULL, 0 },
1676: { "proxyclient", 1, NULL, 0 },
1677: { "proxysecret", 1, NULL, 0 },
1678: { "dhcpif", 1, NULL, 0 },
1679: { "dhcpmac", 1, NULL, 0 },
1680: { "dhcpradius", 0, NULL, 0 },
1681: { "dhcpgateway", 1, NULL, 0 },
1682: { "dhcpgatewayport", 1, NULL, 0 },
1683: { "dhcprelayagent", 1, NULL, 0 },
1684: { "lease", 1, NULL, 0 },
1685: { "eapolenable", 0, NULL, 0 },
1686: { "uamserver", 1, NULL, 0 },
1687: { "uamhomepage", 1, NULL, 0 },
1688: { "uamsecret", 1, NULL, 0 },
1689: { "uamlisten", 1, NULL, 0 },
1690: { "uamport", 1, NULL, 0 },
1691: { "uamuiport", 1, NULL, 0 },
1692: { "uamallowed", 1, NULL, 0 },
1693: { "uamdomain", 1, NULL, 0 },
1694: { "uamanydns", 0, NULL, 0 },
1695: { "uamanyip", 0, NULL, 0 },
1696: { "wisprlogin", 1, NULL, 0 },
1697: { "nouamsuccess", 0, NULL, 0 },
1698: { "nouamwispr", 0, NULL, 0 },
1699: { "uamlogoutip", 1, NULL, 0 },
1700: { "defsessiontimeout", 1, NULL, 0 },
1701: { "defidletimeout", 1, NULL, 0 },
1702: { "defbandwidthmaxdown", 1, NULL, 0 },
1703: { "defbandwidthmaxup", 1, NULL, 0 },
1704: { "definteriminterval", 1, NULL, 0 },
1705: { "macauth", 0, NULL, 0 },
1706: { "macauthdeny", 0, NULL, 0 },
1707: { "macallowed", 1, NULL, 0 },
1708: { "macsuffix", 1, NULL, 0 },
1709: { "macpasswd", 1, NULL, 0 },
1710: { "macallowlocal", 0, NULL, 0 },
1711: { "wwwdir", 1, NULL, 0 },
1712: { "wwwbin", 1, NULL, 0 },
1713: { "uamui", 1, NULL, 0 },
1714: { "adminuser", 1, NULL, 0 },
1715: { "adminpasswd", 1, NULL, 0 },
1716: { "nasmac", 1, NULL, 0 },
1717: { "nasip", 1, NULL, 0 },
1718: { "ssid", 1, NULL, 0 },
1719: { "vlan", 1, NULL, 0 },
1720: { "cmdsocket", 1, NULL, 0 },
1721: { "radiusoriginalurl", 0, NULL, 0 },
1722: { "swapoctets", 0, NULL, 0 },
1723: { "usestatusfile", 0, NULL, 0 },
1724: { "localusers", 1, NULL, 0 },
1725: { "postauthproxy", 1, NULL, 0 },
1726: { "postauthproxyport", 1, NULL, 0 },
1727: { "wpaguests", 0, NULL, 0 },
1728: { "openidauth", 0, NULL, 0 },
1729: { "papalwaysok", 0, NULL, 0 },
1730: { "chillixml", 0, NULL, 0 },
1731: { "acctupdate", 0, NULL, 0 },
1732: { "dnsparanoia", 0, NULL, 0 },
1733: { "usetap", 0, NULL, 0 },
1734: { "routeif", 1, NULL, 0 },
1735: { NULL, 0, NULL, 0 }
1736: };
1737:
1738: c = getopt_long (argc, argv, "hVfdc:n:", long_options, &option_index);
1739:
1740: if (c == -1) break; /* Exit from `while (1)' loop. */
1741:
1742: switch (c)
1743: {
1744: case 'h': /* Print help and exit. */
1745:
1746:
1747: if (update_arg( 0 ,
1748: 0 , &(args_info->help_given),
1749: &(local_args_info.help_given), optarg, 0, 0, ARG_NO,
1750: check_ambiguity, override, 0, 0,
1751: "help", 'h',
1752: additional_error))
1753: goto failure;
1754: cmdline_parser_free (&local_args_info);
1755: return 0;
1756:
1757: break;
1758: case 'V': /* Print version and exit. */
1759:
1760:
1761: if (update_arg( 0 ,
1762: 0 , &(args_info->version_given),
1763: &(local_args_info.version_given), optarg, 0, 0, ARG_NO,
1764: check_ambiguity, override, 0, 0,
1765: "version", 'V',
1766: additional_error))
1767: goto failure;
1768: cmdline_parser_free (&local_args_info);
1769: return 0;
1770:
1771: break;
1772: case 'f': /* Run in foreground. */
1773:
1774:
1775: if (update_arg((void *)&(args_info->fg_flag), 0, &(args_info->fg_given),
1776: &(local_args_info.fg_given), optarg, 0, 0, ARG_FLAG,
1777: check_ambiguity, override, 1, 0, "fg", 'f',
1778: additional_error))
1779: goto failure;
1780:
1781: break;
1782: case 'd': /* Run in debug mode. */
1783:
1784:
1785: if (update_arg((void *)&(args_info->debug_flag), 0, &(args_info->debug_given),
1786: &(local_args_info.debug_given), optarg, 0, 0, ARG_FLAG,
1787: check_ambiguity, override, 1, 0, "debug", 'd',
1788: additional_error))
1789: goto failure;
1790:
1791: break;
1792: case 'c': /* Read configuration file. */
1793:
1794:
1795: if (update_arg( (void *)&(args_info->conf_arg),
1796: &(args_info->conf_orig), &(args_info->conf_given),
1797: &(local_args_info.conf_given), optarg, 0, 0, ARG_STRING,
1798: check_ambiguity, override, 0, 0,
1799: "conf", 'c',
1800: additional_error))
1801: goto failure;
1802:
1803: break;
1804: case 'n': /* Network. */
1805:
1806:
1807: if (update_arg( (void *)&(args_info->net_arg),
1808: &(args_info->net_orig), &(args_info->net_given),
1809: &(local_args_info.net_given), optarg, 0, "192.168.182.0/24", ARG_STRING,
1810: check_ambiguity, override, 0, 0,
1811: "net", 'n',
1812: additional_error))
1813: goto failure;
1814:
1815: break;
1816:
1817: case 0: /* Long option with no short option */
1818: /* Which modules to print debug messages for. */
1819: if (strcmp (long_options[option_index].name, "debugfacility") == 0)
1820: {
1821:
1822:
1823: if (update_arg( (void *)&(args_info->debugfacility_arg),
1824: &(args_info->debugfacility_orig), &(args_info->debugfacility_given),
1825: &(local_args_info.debugfacility_given), optarg, 0, "1", ARG_INT,
1826: check_ambiguity, override, 0, 0,
1827: "debugfacility", '-',
1828: additional_error))
1829: goto failure;
1830:
1831: }
1832: /* Syslog facility to be used for logging. */
1833: else if (strcmp (long_options[option_index].name, "logfacility") == 0)
1834: {
1835:
1836:
1837: if (update_arg( (void *)&(args_info->logfacility_arg),
1838: &(args_info->logfacility_orig), &(args_info->logfacility_given),
1839: &(local_args_info.logfacility_given), optarg, 0, "-1", ARG_INT,
1840: check_ambiguity, override, 0, 0,
1841: "logfacility", '-',
1842: additional_error))
1843: goto failure;
1844:
1845: }
1846: /* Re-read configuration file at this interval. */
1847: else if (strcmp (long_options[option_index].name, "interval") == 0)
1848: {
1849:
1850:
1851: if (update_arg( (void *)&(args_info->interval_arg),
1852: &(args_info->interval_orig), &(args_info->interval_given),
1853: &(local_args_info.interval_given), optarg, 0, "3600", ARG_INT,
1854: check_ambiguity, override, 0, 0,
1855: "interval", '-',
1856: additional_error))
1857: goto failure;
1858:
1859: }
1860: /* Filename of process id file. */
1861: else if (strcmp (long_options[option_index].name, "pidfile") == 0)
1862: {
1863:
1864:
1865: if (update_arg( (void *)&(args_info->pidfile_arg),
1866: &(args_info->pidfile_orig), &(args_info->pidfile_given),
1867: &(local_args_info.pidfile_given), optarg, 0, 0, ARG_STRING,
1868: check_ambiguity, override, 0, 0,
1869: "pidfile", '-',
1870: additional_error))
1871: goto failure;
1872:
1873: }
1874: /* Directory of nonvolatile data. */
1875: else if (strcmp (long_options[option_index].name, "statedir") == 0)
1876: {
1877:
1878:
1879: if (update_arg( (void *)&(args_info->statedir_arg),
1880: &(args_info->statedir_orig), &(args_info->statedir_given),
1881: &(local_args_info.statedir_given), optarg, 0, 0, ARG_STRING,
1882: check_ambiguity, override, 0, 0,
1883: "statedir", '-',
1884: additional_error))
1885: goto failure;
1886:
1887: }
1888: /* Network DHCP Starting IP. */
1889: else if (strcmp (long_options[option_index].name, "dhcpstart") == 0)
1890: {
1891:
1892:
1893: if (update_arg( (void *)&(args_info->dhcpstart_arg),
1894: &(args_info->dhcpstart_orig), &(args_info->dhcpstart_given),
1895: &(local_args_info.dhcpstart_given), optarg, 0, "0", ARG_INT,
1896: check_ambiguity, override, 0, 0,
1897: "dhcpstart", '-',
1898: additional_error))
1899: goto failure;
1900:
1901: }
1902: /* Network DHCP Ending IP. */
1903: else if (strcmp (long_options[option_index].name, "dhcpend") == 0)
1904: {
1905:
1906:
1907: if (update_arg( (void *)&(args_info->dhcpend_arg),
1908: &(args_info->dhcpend_orig), &(args_info->dhcpend_given),
1909: &(local_args_info.dhcpend_given), optarg, 0, "0", ARG_INT,
1910: check_ambiguity, override, 0, 0,
1911: "dhcpend", '-',
1912: additional_error))
1913: goto failure;
1914:
1915: }
1916: /* Dynamic IP address pool. */
1917: else if (strcmp (long_options[option_index].name, "dynip") == 0)
1918: {
1919:
1920:
1921: if (update_arg( (void *)&(args_info->dynip_arg),
1922: &(args_info->dynip_orig), &(args_info->dynip_given),
1923: &(local_args_info.dynip_given), optarg, 0, 0, ARG_STRING,
1924: check_ambiguity, override, 0, 0,
1925: "dynip", '-',
1926: additional_error))
1927: goto failure;
1928:
1929: }
1930: /* No Dynamic IP assignment. */
1931: else if (strcmp (long_options[option_index].name, "nodynip") == 0)
1932: {
1933:
1934:
1935: if (update_arg((void *)&(args_info->nodynip_flag), 0, &(args_info->nodynip_given),
1936: &(local_args_info.nodynip_given), optarg, 0, 0, ARG_FLAG,
1937: check_ambiguity, override, 1, 0, "nodynip", '-',
1938: additional_error))
1939: goto failure;
1940:
1941: }
1942: /* Static IP address pool. */
1943: else if (strcmp (long_options[option_index].name, "statip") == 0)
1944: {
1945:
1946:
1947: if (update_arg( (void *)&(args_info->statip_arg),
1948: &(args_info->statip_orig), &(args_info->statip_given),
1949: &(local_args_info.statip_given), optarg, 0, 0, ARG_STRING,
1950: check_ambiguity, override, 0, 0,
1951: "statip", '-',
1952: additional_error))
1953: goto failure;
1954:
1955: }
1956: /* Primary DNS server IP address. */
1957: else if (strcmp (long_options[option_index].name, "dns1") == 0)
1958: {
1959:
1960:
1961: if (update_arg( (void *)&(args_info->dns1_arg),
1962: &(args_info->dns1_orig), &(args_info->dns1_given),
1963: &(local_args_info.dns1_given), optarg, 0, 0, ARG_STRING,
1964: check_ambiguity, override, 0, 0,
1965: "dns1", '-',
1966: additional_error))
1967: goto failure;
1968:
1969: }
1970: /* Secondary DNS server IP address. */
1971: else if (strcmp (long_options[option_index].name, "dns2") == 0)
1972: {
1973:
1974:
1975: if (update_arg( (void *)&(args_info->dns2_arg),
1976: &(args_info->dns2_orig), &(args_info->dns2_given),
1977: &(local_args_info.dns2_given), optarg, 0, 0, ARG_STRING,
1978: check_ambiguity, override, 0, 0,
1979: "dns2", '-',
1980: additional_error))
1981: goto failure;
1982:
1983: }
1984: /* Domain to use for DNS lookups. */
1985: else if (strcmp (long_options[option_index].name, "domain") == 0)
1986: {
1987:
1988:
1989: if (update_arg( (void *)&(args_info->domain_arg),
1990: &(args_info->domain_orig), &(args_info->domain_given),
1991: &(local_args_info.domain_given), optarg, 0, "coova.org", ARG_STRING,
1992: check_ambiguity, override, 0, 0,
1993: "domain", '-',
1994: additional_error))
1995: goto failure;
1996:
1997: }
1998: /* Script to run after link-up. */
1999: else if (strcmp (long_options[option_index].name, "ipup") == 0)
2000: {
2001:
2002:
2003: if (update_arg( (void *)&(args_info->ipup_arg),
2004: &(args_info->ipup_orig), &(args_info->ipup_given),
2005: &(local_args_info.ipup_given), optarg, 0, 0, ARG_STRING,
2006: check_ambiguity, override, 0, 0,
2007: "ipup", '-',
2008: additional_error))
2009: goto failure;
2010:
2011: }
2012: /* Script to run after link-down. */
2013: else if (strcmp (long_options[option_index].name, "ipdown") == 0)
2014: {
2015:
2016:
2017: if (update_arg( (void *)&(args_info->ipdown_arg),
2018: &(args_info->ipdown_orig), &(args_info->ipdown_given),
2019: &(local_args_info.ipdown_given), optarg, 0, 0, ARG_STRING,
2020: check_ambiguity, override, 0, 0,
2021: "ipdown", '-',
2022: additional_error))
2023: goto failure;
2024:
2025: }
2026: /* Script to run after user logon. */
2027: else if (strcmp (long_options[option_index].name, "conup") == 0)
2028: {
2029:
2030:
2031: if (update_arg( (void *)&(args_info->conup_arg),
2032: &(args_info->conup_orig), &(args_info->conup_given),
2033: &(local_args_info.conup_given), optarg, 0, 0, ARG_STRING,
2034: check_ambiguity, override, 0, 0,
2035: "conup", '-',
2036: additional_error))
2037: goto failure;
2038:
2039: }
2040: /* Script to run after user logoff. */
2041: else if (strcmp (long_options[option_index].name, "condown") == 0)
2042: {
2043:
2044:
2045: if (update_arg( (void *)&(args_info->condown_arg),
2046: &(args_info->condown_orig), &(args_info->condown_given),
2047: &(local_args_info.condown_given), optarg, 0, 0, ARG_STRING,
2048: check_ambiguity, override, 0, 0,
2049: "condown", '-',
2050: additional_error))
2051: goto failure;
2052:
2053: }
2054: /* TX Queue length for tun interface (linux only). */
2055: else if (strcmp (long_options[option_index].name, "txqlen") == 0)
2056: {
2057:
2058:
2059: if (update_arg( (void *)&(args_info->txqlen_arg),
2060: &(args_info->txqlen_orig), &(args_info->txqlen_given),
2061: &(local_args_info.txqlen_given), optarg, 0, "100", ARG_INT,
2062: check_ambiguity, override, 0, 0,
2063: "txqlen", '-',
2064: additional_error))
2065: goto failure;
2066:
2067: }
2068: /* TUN/TAP Device, as in tun0 or tap1. */
2069: else if (strcmp (long_options[option_index].name, "tundev") == 0)
2070: {
2071:
2072:
2073: if (update_arg( (void *)&(args_info->tundev_arg),
2074: &(args_info->tundev_orig), &(args_info->tundev_given),
2075: &(local_args_info.tundev_given), optarg, 0, 0, ARG_STRING,
2076: check_ambiguity, override, 0, 0,
2077: "tundev", '-',
2078: additional_error))
2079: goto failure;
2080:
2081: }
2082: /* IP address to send from. */
2083: else if (strcmp (long_options[option_index].name, "radiuslisten") == 0)
2084: {
2085:
2086:
2087: if (update_arg( (void *)&(args_info->radiuslisten_arg),
2088: &(args_info->radiuslisten_orig), &(args_info->radiuslisten_given),
2089: &(local_args_info.radiuslisten_given), optarg, 0, 0, ARG_STRING,
2090: check_ambiguity, override, 0, 0,
2091: "radiuslisten", '-',
2092: additional_error))
2093: goto failure;
2094:
2095: }
2096: /* IP address of radius server 1. */
2097: else if (strcmp (long_options[option_index].name, "radiusserver1") == 0)
2098: {
2099:
2100:
2101: if (update_arg( (void *)&(args_info->radiusserver1_arg),
2102: &(args_info->radiusserver1_orig), &(args_info->radiusserver1_given),
2103: &(local_args_info.radiusserver1_given), optarg, 0, "rad01.coova.org", ARG_STRING,
2104: check_ambiguity, override, 0, 0,
2105: "radiusserver1", '-',
2106: additional_error))
2107: goto failure;
2108:
2109: }
2110: /* IP address of radius server 2. */
2111: else if (strcmp (long_options[option_index].name, "radiusserver2") == 0)
2112: {
2113:
2114:
2115: if (update_arg( (void *)&(args_info->radiusserver2_arg),
2116: &(args_info->radiusserver2_orig), &(args_info->radiusserver2_given),
2117: &(local_args_info.radiusserver2_given), optarg, 0, "rad01.coova.org", ARG_STRING,
2118: check_ambiguity, override, 0, 0,
2119: "radiusserver2", '-',
2120: additional_error))
2121: goto failure;
2122:
2123: }
2124: /* Authentication UDP port of radius server. */
2125: else if (strcmp (long_options[option_index].name, "radiusauthport") == 0)
2126: {
2127:
2128:
2129: if (update_arg( (void *)&(args_info->radiusauthport_arg),
2130: &(args_info->radiusauthport_orig), &(args_info->radiusauthport_given),
2131: &(local_args_info.radiusauthport_given), optarg, 0, "1812", ARG_INT,
2132: check_ambiguity, override, 0, 0,
2133: "radiusauthport", '-',
2134: additional_error))
2135: goto failure;
2136:
2137: }
2138: /* Accounting UDP port of radius server. */
2139: else if (strcmp (long_options[option_index].name, "radiusacctport") == 0)
2140: {
2141:
2142:
2143: if (update_arg( (void *)&(args_info->radiusacctport_arg),
2144: &(args_info->radiusacctport_orig), &(args_info->radiusacctport_given),
2145: &(local_args_info.radiusacctport_given), optarg, 0, "1813", ARG_INT,
2146: check_ambiguity, override, 0, 0,
2147: "radiusacctport", '-',
2148: additional_error))
2149: goto failure;
2150:
2151: }
2152: /* Radius shared secret. */
2153: else if (strcmp (long_options[option_index].name, "radiussecret") == 0)
2154: {
2155:
2156:
2157: if (update_arg( (void *)&(args_info->radiussecret_arg),
2158: &(args_info->radiussecret_orig), &(args_info->radiussecret_given),
2159: &(local_args_info.radiussecret_given), optarg, 0, "coova-anonymous", ARG_STRING,
2160: check_ambiguity, override, 0, 0,
2161: "radiussecret", '-',
2162: additional_error))
2163: goto failure;
2164:
2165: }
2166: /* Retry timeout in seconds. */
2167: else if (strcmp (long_options[option_index].name, "radiustimeout") == 0)
2168: {
2169:
2170:
2171: if (update_arg( (void *)&(args_info->radiustimeout_arg),
2172: &(args_info->radiustimeout_orig), &(args_info->radiustimeout_given),
2173: &(local_args_info.radiustimeout_given), optarg, 0, "30", ARG_INT,
2174: check_ambiguity, override, 0, 0,
2175: "radiustimeout", '-',
2176: additional_error))
2177: goto failure;
2178:
2179: }
2180: /* Total number of retries. */
2181: else if (strcmp (long_options[option_index].name, "radiusretry") == 0)
2182: {
2183:
2184:
2185: if (update_arg( (void *)&(args_info->radiusretry_arg),
2186: &(args_info->radiusretry_orig), &(args_info->radiusretry_given),
2187: &(local_args_info.radiusretry_given), optarg, 0, "6", ARG_INT,
2188: check_ambiguity, override, 0, 0,
2189: "radiusretry", '-',
2190: additional_error))
2191: goto failure;
2192:
2193: }
2194: /* Number of retries before using secondary. */
2195: else if (strcmp (long_options[option_index].name, "radiusretrysec") == 0)
2196: {
2197:
2198:
2199: if (update_arg( (void *)&(args_info->radiusretrysec_arg),
2200: &(args_info->radiusretrysec_orig), &(args_info->radiusretrysec_given),
2201: &(local_args_info.radiusretrysec_given), optarg, 0, "3", ARG_INT,
2202: check_ambiguity, override, 0, 0,
2203: "radiusretrysec", '-',
2204: additional_error))
2205: goto failure;
2206:
2207: }
2208: /* Radius NAS-Identifier. */
2209: else if (strcmp (long_options[option_index].name, "radiusnasid") == 0)
2210: {
2211:
2212:
2213: if (update_arg( (void *)&(args_info->radiusnasid_arg),
2214: &(args_info->radiusnasid_orig), &(args_info->radiusnasid_given),
2215: &(local_args_info.radiusnasid_given), optarg, 0, "nas01", ARG_STRING,
2216: check_ambiguity, override, 0, 0,
2217: "radiusnasid", '-',
2218: additional_error))
2219: goto failure;
2220:
2221: }
2222: /* WISPr Location ID. */
2223: else if (strcmp (long_options[option_index].name, "radiuslocationid") == 0)
2224: {
2225:
2226:
2227: if (update_arg( (void *)&(args_info->radiuslocationid_arg),
2228: &(args_info->radiuslocationid_orig), &(args_info->radiuslocationid_given),
2229: &(local_args_info.radiuslocationid_given), optarg, 0, 0, ARG_STRING,
2230: check_ambiguity, override, 0, 0,
2231: "radiuslocationid", '-',
2232: additional_error))
2233: goto failure;
2234:
2235: }
2236: /* WISPr Location Name. */
2237: else if (strcmp (long_options[option_index].name, "radiuslocationname") == 0)
2238: {
2239:
2240:
2241: if (update_arg( (void *)&(args_info->radiuslocationname_arg),
2242: &(args_info->radiuslocationname_orig), &(args_info->radiuslocationname_given),
2243: &(local_args_info.radiuslocationname_given), optarg, 0, 0, ARG_STRING,
2244: check_ambiguity, override, 0, 0,
2245: "radiuslocationname", '-',
2246: additional_error))
2247: goto failure;
2248:
2249: }
2250: /* Location Name. */
2251: else if (strcmp (long_options[option_index].name, "locationname") == 0)
2252: {
2253:
2254:
2255: if (update_arg( (void *)&(args_info->locationname_arg),
2256: &(args_info->locationname_orig), &(args_info->locationname_given),
2257: &(local_args_info.locationname_given), optarg, 0, 0, ARG_STRING,
2258: check_ambiguity, override, 0, 0,
2259: "locationname", '-',
2260: additional_error))
2261: goto failure;
2262:
2263: }
2264: /* Radius NAS-Port-Type. */
2265: else if (strcmp (long_options[option_index].name, "radiusnasporttype") == 0)
2266: {
2267:
2268:
2269: if (update_arg( (void *)&(args_info->radiusnasporttype_arg),
2270: &(args_info->radiusnasporttype_orig), &(args_info->radiusnasporttype_given),
2271: &(local_args_info.radiusnasporttype_given), optarg, 0, "19", ARG_INT,
2272: check_ambiguity, override, 0, 0,
2273: "radiusnasporttype", '-',
2274: additional_error))
2275: goto failure;
2276:
2277: }
2278: /* Radius disconnect port to listen to. */
2279: else if (strcmp (long_options[option_index].name, "coaport") == 0)
2280: {
2281:
2282:
2283: if (update_arg( (void *)&(args_info->coaport_arg),
2284: &(args_info->coaport_orig), &(args_info->coaport_given),
2285: &(local_args_info.coaport_given), optarg, 0, "0", ARG_INT,
2286: check_ambiguity, override, 0, 0,
2287: "coaport", '-',
2288: additional_error))
2289: goto failure;
2290:
2291: }
2292: /* Allow radius disconnect from any IP. */
2293: else if (strcmp (long_options[option_index].name, "coanoipcheck") == 0)
2294: {
2295:
2296:
2297: if (update_arg((void *)&(args_info->coanoipcheck_flag), 0, &(args_info->coanoipcheck_given),
2298: &(local_args_info.coanoipcheck_given), optarg, 0, 0, ARG_FLAG,
2299: check_ambiguity, override, 1, 0, "coanoipcheck", '-',
2300: additional_error))
2301: goto failure;
2302:
2303: }
2304: /* IP address to listen to. */
2305: else if (strcmp (long_options[option_index].name, "proxylisten") == 0)
2306: {
2307:
2308:
2309: if (update_arg( (void *)&(args_info->proxylisten_arg),
2310: &(args_info->proxylisten_orig), &(args_info->proxylisten_given),
2311: &(local_args_info.proxylisten_given), optarg, 0, 0, ARG_STRING,
2312: check_ambiguity, override, 0, 0,
2313: "proxylisten", '-',
2314: additional_error))
2315: goto failure;
2316:
2317: }
2318: /* UDP port to listen to. */
2319: else if (strcmp (long_options[option_index].name, "proxyport") == 0)
2320: {
2321:
2322:
2323: if (update_arg( (void *)&(args_info->proxyport_arg),
2324: &(args_info->proxyport_orig), &(args_info->proxyport_given),
2325: &(local_args_info.proxyport_given), optarg, 0, "0", ARG_INT,
2326: check_ambiguity, override, 0, 0,
2327: "proxyport", '-',
2328: additional_error))
2329: goto failure;
2330:
2331: }
2332: /* IP address of proxy client(s). */
2333: else if (strcmp (long_options[option_index].name, "proxyclient") == 0)
2334: {
2335:
2336:
2337: if (update_arg( (void *)&(args_info->proxyclient_arg),
2338: &(args_info->proxyclient_orig), &(args_info->proxyclient_given),
2339: &(local_args_info.proxyclient_given), optarg, 0, 0, ARG_STRING,
2340: check_ambiguity, override, 0, 0,
2341: "proxyclient", '-',
2342: additional_error))
2343: goto failure;
2344:
2345: }
2346: /* Radius proxy shared secret. */
2347: else if (strcmp (long_options[option_index].name, "proxysecret") == 0)
2348: {
2349:
2350:
2351: if (update_arg( (void *)&(args_info->proxysecret_arg),
2352: &(args_info->proxysecret_orig), &(args_info->proxysecret_given),
2353: &(local_args_info.proxysecret_given), optarg, 0, 0, ARG_STRING,
2354: check_ambiguity, override, 0, 0,
2355: "proxysecret", '-',
2356: additional_error))
2357: goto failure;
2358:
2359: }
2360: /* Local Ethernet interface. */
2361: else if (strcmp (long_options[option_index].name, "dhcpif") == 0)
2362: {
2363:
2364:
2365: if (update_arg( (void *)&(args_info->dhcpif_arg),
2366: &(args_info->dhcpif_orig), &(args_info->dhcpif_given),
2367: &(local_args_info.dhcpif_given), optarg, 0, 0, ARG_STRING,
2368: check_ambiguity, override, 0, 0,
2369: "dhcpif", '-',
2370: additional_error))
2371: goto failure;
2372:
2373: }
2374: /* Interface MAC address. */
2375: else if (strcmp (long_options[option_index].name, "dhcpmac") == 0)
2376: {
2377:
2378:
2379: if (update_arg( (void *)&(args_info->dhcpmac_arg),
2380: &(args_info->dhcpmac_orig), &(args_info->dhcpmac_given),
2381: &(local_args_info.dhcpmac_given), optarg, 0, 0, ARG_STRING,
2382: check_ambiguity, override, 0, 0,
2383: "dhcpmac", '-',
2384: additional_error))
2385: goto failure;
2386:
2387: }
2388: /* Map certain DHCP options to RADIUS attributes. */
2389: else if (strcmp (long_options[option_index].name, "dhcpradius") == 0)
2390: {
2391:
2392:
2393: if (update_arg((void *)&(args_info->dhcpradius_flag), 0, &(args_info->dhcpradius_given),
2394: &(local_args_info.dhcpradius_given), optarg, 0, 0, ARG_FLAG,
2395: check_ambiguity, override, 1, 0, "dhcpradius", '-',
2396: additional_error))
2397: goto failure;
2398:
2399: }
2400: /* DHCP gateway addresss for relay. */
2401: else if (strcmp (long_options[option_index].name, "dhcpgateway") == 0)
2402: {
2403:
2404:
2405: if (update_arg( (void *)&(args_info->dhcpgateway_arg),
2406: &(args_info->dhcpgateway_orig), &(args_info->dhcpgateway_given),
2407: &(local_args_info.dhcpgateway_given), optarg, 0, 0, ARG_STRING,
2408: check_ambiguity, override, 0, 0,
2409: "dhcpgateway", '-',
2410: additional_error))
2411: goto failure;
2412:
2413: }
2414: /* DHCP gateway port for relay. */
2415: else if (strcmp (long_options[option_index].name, "dhcpgatewayport") == 0)
2416: {
2417:
2418:
2419: if (update_arg( (void *)&(args_info->dhcpgatewayport_arg),
2420: &(args_info->dhcpgatewayport_orig), &(args_info->dhcpgatewayport_given),
2421: &(local_args_info.dhcpgatewayport_given), optarg, 0, "67", ARG_INT,
2422: check_ambiguity, override, 0, 0,
2423: "dhcpgatewayport", '-',
2424: additional_error))
2425: goto failure;
2426:
2427: }
2428: /* DHCP relay agent IP addresss (default uamlisten). */
2429: else if (strcmp (long_options[option_index].name, "dhcprelayagent") == 0)
2430: {
2431:
2432:
2433: if (update_arg( (void *)&(args_info->dhcprelayagent_arg),
2434: &(args_info->dhcprelayagent_orig), &(args_info->dhcprelayagent_given),
2435: &(local_args_info.dhcprelayagent_given), optarg, 0, 0, ARG_STRING,
2436: check_ambiguity, override, 0, 0,
2437: "dhcprelayagent", '-',
2438: additional_error))
2439: goto failure;
2440:
2441: }
2442: /* Lease time to allocate to clients. */
2443: else if (strcmp (long_options[option_index].name, "lease") == 0)
2444: {
2445:
2446:
2447: if (update_arg( (void *)&(args_info->lease_arg),
2448: &(args_info->lease_orig), &(args_info->lease_given),
2449: &(local_args_info.lease_given), optarg, 0, "600", ARG_INT,
2450: check_ambiguity, override, 0, 0,
2451: "lease", '-',
2452: additional_error))
2453: goto failure;
2454:
2455: }
2456: /* Enable IEEE 802.1x authentication. */
2457: else if (strcmp (long_options[option_index].name, "eapolenable") == 0)
2458: {
2459:
2460:
2461: if (update_arg((void *)&(args_info->eapolenable_flag), 0, &(args_info->eapolenable_given),
2462: &(local_args_info.eapolenable_given), optarg, 0, 0, ARG_FLAG,
2463: check_ambiguity, override, 1, 0, "eapolenable", '-',
2464: additional_error))
2465: goto failure;
2466:
2467: }
2468: /* URL of authentication web server. */
2469: else if (strcmp (long_options[option_index].name, "uamserver") == 0)
2470: {
2471:
2472:
2473: if (update_arg( (void *)&(args_info->uamserver_arg),
2474: &(args_info->uamserver_orig), &(args_info->uamserver_given),
2475: &(local_args_info.uamserver_given), optarg, 0, 0, ARG_STRING,
2476: check_ambiguity, override, 0, 0,
2477: "uamserver", '-',
2478: additional_error))
2479: goto failure;
2480:
2481: }
2482: /* URL of homepage to redirect unauthenticated users to. */
2483: else if (strcmp (long_options[option_index].name, "uamhomepage") == 0)
2484: {
2485:
2486:
2487: if (update_arg( (void *)&(args_info->uamhomepage_arg),
2488: &(args_info->uamhomepage_orig), &(args_info->uamhomepage_given),
2489: &(local_args_info.uamhomepage_given), optarg, 0, 0, ARG_STRING,
2490: check_ambiguity, override, 0, 0,
2491: "uamhomepage", '-',
2492: additional_error))
2493: goto failure;
2494:
2495: }
2496: /* Shared secret between uamserver and chilli. */
2497: else if (strcmp (long_options[option_index].name, "uamsecret") == 0)
2498: {
2499:
2500:
2501: if (update_arg( (void *)&(args_info->uamsecret_arg),
2502: &(args_info->uamsecret_orig), &(args_info->uamsecret_given),
2503: &(local_args_info.uamsecret_given), optarg, 0, 0, ARG_STRING,
2504: check_ambiguity, override, 0, 0,
2505: "uamsecret", '-',
2506: additional_error))
2507: goto failure;
2508:
2509: }
2510: /* IP address to listen to for authentication requests. */
2511: else if (strcmp (long_options[option_index].name, "uamlisten") == 0)
2512: {
2513:
2514:
2515: if (update_arg( (void *)&(args_info->uamlisten_arg),
2516: &(args_info->uamlisten_orig), &(args_info->uamlisten_given),
2517: &(local_args_info.uamlisten_given), optarg, 0, 0, ARG_STRING,
2518: check_ambiguity, override, 0, 0,
2519: "uamlisten", '-',
2520: additional_error))
2521: goto failure;
2522:
2523: }
2524: /* TCP port to bind to for authentication requests. */
2525: else if (strcmp (long_options[option_index].name, "uamport") == 0)
2526: {
2527:
2528:
2529: if (update_arg( (void *)&(args_info->uamport_arg),
2530: &(args_info->uamport_orig), &(args_info->uamport_given),
2531: &(local_args_info.uamport_given), optarg, 0, "3990", ARG_INT,
2532: check_ambiguity, override, 0, 0,
2533: "uamport", '-',
2534: additional_error))
2535: goto failure;
2536:
2537: }
2538: /* TCP port to bind to for UAM UI requests. */
2539: else if (strcmp (long_options[option_index].name, "uamuiport") == 0)
2540: {
2541:
2542:
2543: if (update_arg( (void *)&(args_info->uamuiport_arg),
2544: &(args_info->uamuiport_orig), &(args_info->uamuiport_given),
2545: &(local_args_info.uamuiport_given), optarg, 0, "3991", ARG_INT,
2546: check_ambiguity, override, 0, 0,
2547: "uamuiport", '-',
2548: additional_error))
2549: goto failure;
2550:
2551: }
2552: /* Domain names exempt from access check . */
2553: else if (strcmp (long_options[option_index].name, "uamallowed") == 0)
2554: {
2555:
2556: if (update_multiple_arg_temp(&uamallowed_list,
2557: &(local_args_info.uamallowed_given), optarg, 0, 0, ARG_STRING,
2558: "uamallowed", '-',
2559: additional_error))
2560: goto failure;
2561:
2562: }
2563: /* Domain name allowed (active dns filtering; one per line!) . */
2564: else if (strcmp (long_options[option_index].name, "uamdomain") == 0)
2565: {
2566:
2567: if (update_multiple_arg_temp(&uamdomain_list,
2568: &(local_args_info.uamdomain_given), optarg, 0, 0, ARG_STRING,
2569: "uamdomain", '-',
2570: additional_error))
2571: goto failure;
2572:
2573: }
2574: /* Allow client to use any DNS server. */
2575: else if (strcmp (long_options[option_index].name, "uamanydns") == 0)
2576: {
2577:
2578:
2579: if (update_arg((void *)&(args_info->uamanydns_flag), 0, &(args_info->uamanydns_given),
2580: &(local_args_info.uamanydns_given), optarg, 0, 0, ARG_FLAG,
2581: check_ambiguity, override, 1, 0, "uamanydns", '-',
2582: additional_error))
2583: goto failure;
2584:
2585: }
2586: /* Allow client to use any IP Address. */
2587: else if (strcmp (long_options[option_index].name, "uamanyip") == 0)
2588: {
2589:
2590:
2591: if (update_arg((void *)&(args_info->uamanyip_flag), 0, &(args_info->uamanyip_given),
2592: &(local_args_info.uamanyip_given), optarg, 0, 0, ARG_FLAG,
2593: check_ambiguity, override, 1, 0, "uamanyip", '-',
2594: additional_error))
2595: goto failure;
2596:
2597: }
2598: /* A specific WISPr login url to be used. */
2599: else if (strcmp (long_options[option_index].name, "wisprlogin") == 0)
2600: {
2601:
2602:
2603: if (update_arg( (void *)&(args_info->wisprlogin_arg),
2604: &(args_info->wisprlogin_orig), &(args_info->wisprlogin_given),
2605: &(local_args_info.wisprlogin_given), optarg, 0, 0, ARG_STRING,
2606: check_ambiguity, override, 0, 0,
2607: "wisprlogin", '-',
2608: additional_error))
2609: goto failure;
2610:
2611: }
2612: /* Do not return to the UAM server on success, original url instead. */
2613: else if (strcmp (long_options[option_index].name, "nouamsuccess") == 0)
2614: {
2615:
2616:
2617: if (update_arg((void *)&(args_info->nouamsuccess_flag), 0, &(args_info->nouamsuccess_given),
2618: &(local_args_info.nouamsuccess_given), optarg, 0, 0, ARG_FLAG,
2619: check_ambiguity, override, 1, 0, "nouamsuccess", '-',
2620: additional_error))
2621: goto failure;
2622:
2623: }
2624: /* Do not send WISPr XML from ChilliSpot, assume back-end does. */
2625: else if (strcmp (long_options[option_index].name, "nouamwispr") == 0)
2626: {
2627:
2628:
2629: if (update_arg((void *)&(args_info->nouamwispr_flag), 0, &(args_info->nouamwispr_given),
2630: &(local_args_info.nouamwispr_given), optarg, 0, 0, ARG_FLAG,
2631: check_ambiguity, override, 1, 0, "nouamwispr", '-',
2632: additional_error))
2633: goto failure;
2634:
2635: }
2636: /* HTTP Auto-Logout IP Address. */
2637: else if (strcmp (long_options[option_index].name, "uamlogoutip") == 0)
2638: {
2639:
2640:
2641: if (update_arg( (void *)&(args_info->uamlogoutip_arg),
2642: &(args_info->uamlogoutip_orig), &(args_info->uamlogoutip_given),
2643: &(local_args_info.uamlogoutip_given), optarg, 0, "1.1.1.1", ARG_STRING,
2644: check_ambiguity, override, 0, 0,
2645: "uamlogoutip", '-',
2646: additional_error))
2647: goto failure;
2648:
2649: }
2650: /* Default session-timeout if not returned by RADIUS. */
2651: else if (strcmp (long_options[option_index].name, "defsessiontimeout") == 0)
2652: {
2653:
2654:
2655: if (update_arg( (void *)&(args_info->defsessiontimeout_arg),
2656: &(args_info->defsessiontimeout_orig), &(args_info->defsessiontimeout_given),
2657: &(local_args_info.defsessiontimeout_given), optarg, 0, "0", ARG_LONG,
2658: check_ambiguity, override, 0, 0,
2659: "defsessiontimeout", '-',
2660: additional_error))
2661: goto failure;
2662:
2663: }
2664: /* Default idle-timeout if not returned by RADIUS. */
2665: else if (strcmp (long_options[option_index].name, "defidletimeout") == 0)
2666: {
2667:
2668:
2669: if (update_arg( (void *)&(args_info->defidletimeout_arg),
2670: &(args_info->defidletimeout_orig), &(args_info->defidletimeout_given),
2671: &(local_args_info.defidletimeout_given), optarg, 0, "0", ARG_INT,
2672: check_ambiguity, override, 0, 0,
2673: "defidletimeout", '-',
2674: additional_error))
2675: goto failure;
2676:
2677: }
2678: /* Default WISPr-Bandwidth-Max-Down if not returned by RADIUS. */
2679: else if (strcmp (long_options[option_index].name, "defbandwidthmaxdown") == 0)
2680: {
2681:
2682:
2683: if (update_arg( (void *)&(args_info->defbandwidthmaxdown_arg),
2684: &(args_info->defbandwidthmaxdown_orig), &(args_info->defbandwidthmaxdown_given),
2685: &(local_args_info.defbandwidthmaxdown_given), optarg, 0, "0", ARG_LONG,
2686: check_ambiguity, override, 0, 0,
2687: "defbandwidthmaxdown", '-',
2688: additional_error))
2689: goto failure;
2690:
2691: }
2692: /* Default WISPr-Bandwidth-Max-Up if not returned by RADIUS. */
2693: else if (strcmp (long_options[option_index].name, "defbandwidthmaxup") == 0)
2694: {
2695:
2696:
2697: if (update_arg( (void *)&(args_info->defbandwidthmaxup_arg),
2698: &(args_info->defbandwidthmaxup_orig), &(args_info->defbandwidthmaxup_given),
2699: &(local_args_info.defbandwidthmaxup_given), optarg, 0, "0", ARG_LONG,
2700: check_ambiguity, override, 0, 0,
2701: "defbandwidthmaxup", '-',
2702: additional_error))
2703: goto failure;
2704:
2705: }
2706: /* Default interim-interval for accounting if not returned by RADIUS. */
2707: else if (strcmp (long_options[option_index].name, "definteriminterval") == 0)
2708: {
2709:
2710:
2711: if (update_arg( (void *)&(args_info->definteriminterval_arg),
2712: &(args_info->definteriminterval_orig), &(args_info->definteriminterval_given),
2713: &(local_args_info.definteriminterval_given), optarg, 0, "300", ARG_INT,
2714: check_ambiguity, override, 0, 0,
2715: "definteriminterval", '-',
2716: additional_error))
2717: goto failure;
2718:
2719: }
2720: /* Authenticate based on MAC address. */
2721: else if (strcmp (long_options[option_index].name, "macauth") == 0)
2722: {
2723:
2724:
2725: if (update_arg((void *)&(args_info->macauth_flag), 0, &(args_info->macauth_given),
2726: &(local_args_info.macauth_given), optarg, 0, 0, ARG_FLAG,
2727: check_ambiguity, override, 1, 0, "macauth", '-',
2728: additional_error))
2729: goto failure;
2730:
2731: }
2732: /* Deny access (even UAM) to MAC addresses given Access-Reject. */
2733: else if (strcmp (long_options[option_index].name, "macauthdeny") == 0)
2734: {
2735:
2736:
2737: if (update_arg((void *)&(args_info->macauthdeny_flag), 0, &(args_info->macauthdeny_given),
2738: &(local_args_info.macauthdeny_given), optarg, 0, 0, ARG_FLAG,
2739: check_ambiguity, override, 1, 0, "macauthdeny", '-',
2740: additional_error))
2741: goto failure;
2742:
2743: }
2744: /* List of allowed MAC addresses. */
2745: else if (strcmp (long_options[option_index].name, "macallowed") == 0)
2746: {
2747:
2748: if (update_multiple_arg_temp(&macallowed_list,
2749: &(local_args_info.macallowed_given), optarg, 0, 0, ARG_STRING,
2750: "macallowed", '-',
2751: additional_error))
2752: goto failure;
2753:
2754: }
2755: /* Suffix to add to the MAC address. */
2756: else if (strcmp (long_options[option_index].name, "macsuffix") == 0)
2757: {
2758:
2759:
2760: if (update_arg( (void *)&(args_info->macsuffix_arg),
2761: &(args_info->macsuffix_orig), &(args_info->macsuffix_given),
2762: &(local_args_info.macsuffix_given), optarg, 0, 0, ARG_STRING,
2763: check_ambiguity, override, 0, 0,
2764: "macsuffix", '-',
2765: additional_error))
2766: goto failure;
2767:
2768: }
2769: /* Password used when performing MAC authentication. */
2770: else if (strcmp (long_options[option_index].name, "macpasswd") == 0)
2771: {
2772:
2773:
2774: if (update_arg( (void *)&(args_info->macpasswd_arg),
2775: &(args_info->macpasswd_orig), &(args_info->macpasswd_given),
2776: &(local_args_info.macpasswd_given), optarg, 0, 0, ARG_STRING,
2777: check_ambiguity, override, 0, 0,
2778: "macpasswd", '-',
2779: additional_error))
2780: goto failure;
2781:
2782: }
2783: /* Do not use RADIUS for authenticating the macallowed. */
2784: else if (strcmp (long_options[option_index].name, "macallowlocal") == 0)
2785: {
2786:
2787:
2788: if (update_arg((void *)&(args_info->macallowlocal_flag), 0, &(args_info->macallowlocal_given),
2789: &(local_args_info.macallowlocal_given), optarg, 0, 0, ARG_FLAG,
2790: check_ambiguity, override, 1, 0, "macallowlocal", '-',
2791: additional_error))
2792: goto failure;
2793:
2794: }
2795: /* Local content served by chilli (for splash page, etc). */
2796: else if (strcmp (long_options[option_index].name, "wwwdir") == 0)
2797: {
2798:
2799:
2800: if (update_arg( (void *)&(args_info->wwwdir_arg),
2801: &(args_info->wwwdir_orig), &(args_info->wwwdir_given),
2802: &(local_args_info.wwwdir_given), optarg, 0, 0, ARG_STRING,
2803: check_ambiguity, override, 0, 0,
2804: "wwwdir", '-',
2805: additional_error))
2806: goto failure;
2807:
2808: }
2809: /* Script binary (such as haserl) for simple web programming. */
2810: else if (strcmp (long_options[option_index].name, "wwwbin") == 0)
2811: {
2812:
2813:
2814: if (update_arg( (void *)&(args_info->wwwbin_arg),
2815: &(args_info->wwwbin_orig), &(args_info->wwwbin_given),
2816: &(local_args_info.wwwbin_given), optarg, 0, 0, ARG_STRING,
2817: check_ambiguity, override, 0, 0,
2818: "wwwbin", '-',
2819: additional_error))
2820: goto failure;
2821:
2822: }
2823: /* Program in inetd style to handle all uam requests. */
2824: else if (strcmp (long_options[option_index].name, "uamui") == 0)
2825: {
2826:
2827:
2828: if (update_arg( (void *)&(args_info->uamui_arg),
2829: &(args_info->uamui_orig), &(args_info->uamui_given),
2830: &(local_args_info.uamui_given), optarg, 0, 0, ARG_STRING,
2831: check_ambiguity, override, 0, 0,
2832: "uamui", '-',
2833: additional_error))
2834: goto failure;
2835:
2836: }
2837: /* RADIUS administrative user login username. */
2838: else if (strcmp (long_options[option_index].name, "adminuser") == 0)
2839: {
2840:
2841:
2842: if (update_arg( (void *)&(args_info->adminuser_arg),
2843: &(args_info->adminuser_orig), &(args_info->adminuser_given),
2844: &(local_args_info.adminuser_given), optarg, 0, "chillispot", ARG_STRING,
2845: check_ambiguity, override, 0, 0,
2846: "adminuser", '-',
2847: additional_error))
2848: goto failure;
2849:
2850: }
2851: /* RADIUS administrative user login password. */
2852: else if (strcmp (long_options[option_index].name, "adminpasswd") == 0)
2853: {
2854:
2855:
2856: if (update_arg( (void *)&(args_info->adminpasswd_arg),
2857: &(args_info->adminpasswd_orig), &(args_info->adminpasswd_given),
2858: &(local_args_info.adminpasswd_given), optarg, 0, "chillispot", ARG_STRING,
2859: check_ambiguity, override, 0, 0,
2860: "adminpasswd", '-',
2861: additional_error))
2862: goto failure;
2863:
2864: }
2865: /* Unique MAC address of the NAS (called-station-id). */
2866: else if (strcmp (long_options[option_index].name, "nasmac") == 0)
2867: {
2868:
2869:
2870: if (update_arg( (void *)&(args_info->nasmac_arg),
2871: &(args_info->nasmac_orig), &(args_info->nasmac_given),
2872: &(local_args_info.nasmac_given), optarg, 0, 0, ARG_STRING,
2873: check_ambiguity, override, 0, 0,
2874: "nasmac", '-',
2875: additional_error))
2876: goto failure;
2877:
2878: }
2879: /* Unique IP address of the NAS (nas-ip-address). */
2880: else if (strcmp (long_options[option_index].name, "nasip") == 0)
2881: {
2882:
2883:
2884: if (update_arg( (void *)&(args_info->nasip_arg),
2885: &(args_info->nasip_orig), &(args_info->nasip_given),
2886: &(local_args_info.nasip_given), optarg, 0, 0, ARG_STRING,
2887: check_ambiguity, override, 0, 0,
2888: "nasip", '-',
2889: additional_error))
2890: goto failure;
2891:
2892: }
2893: /* SSID of the session. */
2894: else if (strcmp (long_options[option_index].name, "ssid") == 0)
2895: {
2896:
2897:
2898: if (update_arg( (void *)&(args_info->ssid_arg),
2899: &(args_info->ssid_orig), &(args_info->ssid_given),
2900: &(local_args_info.ssid_given), optarg, 0, 0, ARG_STRING,
2901: check_ambiguity, override, 0, 0,
2902: "ssid", '-',
2903: additional_error))
2904: goto failure;
2905:
2906: }
2907: /* VLAN of the session. */
2908: else if (strcmp (long_options[option_index].name, "vlan") == 0)
2909: {
2910:
2911:
2912: if (update_arg( (void *)&(args_info->vlan_arg),
2913: &(args_info->vlan_orig), &(args_info->vlan_given),
2914: &(local_args_info.vlan_given), optarg, 0, 0, ARG_STRING,
2915: check_ambiguity, override, 0, 0,
2916: "vlan", '-',
2917: additional_error))
2918: goto failure;
2919:
2920: }
2921: /* path to the command unix socket. */
2922: else if (strcmp (long_options[option_index].name, "cmdsocket") == 0)
2923: {
2924:
2925:
2926: if (update_arg( (void *)&(args_info->cmdsocket_arg),
2927: &(args_info->cmdsocket_orig), &(args_info->cmdsocket_given),
2928: &(local_args_info.cmdsocket_given), optarg, 0, 0, ARG_STRING,
2929: check_ambiguity, override, 0, 0,
2930: "cmdsocket", '-',
2931: additional_error))
2932: goto failure;
2933:
2934: }
2935: /* Turn on the sending of ChilliSpot-OriginalURL in Access-Request. */
2936: else if (strcmp (long_options[option_index].name, "radiusoriginalurl") == 0)
2937: {
2938:
2939:
2940: if (update_arg((void *)&(args_info->radiusoriginalurl_flag), 0, &(args_info->radiusoriginalurl_given),
2941: &(local_args_info.radiusoriginalurl_given), optarg, 0, 0, ARG_FLAG,
2942: check_ambiguity, override, 1, 0, "radiusoriginalurl", '-',
2943: additional_error))
2944: goto failure;
2945:
2946: }
2947: /* Swap the meaning of input/output octets/packets. */
2948: else if (strcmp (long_options[option_index].name, "swapoctets") == 0)
2949: {
2950:
2951:
2952: if (update_arg((void *)&(args_info->swapoctets_flag), 0, &(args_info->swapoctets_given),
2953: &(local_args_info.swapoctets_given), optarg, 0, 0, ARG_FLAG,
2954: check_ambiguity, override, 1, 0, "swapoctets", '-',
2955: additional_error))
2956: goto failure;
2957:
2958: }
2959: /* Use the status file to keep track of sessions. */
2960: else if (strcmp (long_options[option_index].name, "usestatusfile") == 0)
2961: {
2962:
2963:
2964: if (update_arg((void *)&(args_info->usestatusfile_flag), 0, &(args_info->usestatusfile_given),
2965: &(local_args_info.usestatusfile_given), optarg, 0, 0, ARG_FLAG,
2966: check_ambiguity, override, 1, 0, "usestatusfile", '-',
2967: additional_error))
2968: goto failure;
2969:
2970: }
2971: /* File keep 'Local' usernames and passwords. */
2972: else if (strcmp (long_options[option_index].name, "localusers") == 0)
2973: {
2974:
2975:
2976: if (update_arg( (void *)&(args_info->localusers_arg),
2977: &(args_info->localusers_orig), &(args_info->localusers_given),
2978: &(local_args_info.localusers_given), optarg, 0, 0, ARG_STRING,
2979: check_ambiguity, override, 0, 0,
2980: "localusers", '-',
2981: additional_error))
2982: goto failure;
2983:
2984: }
2985: /* IP of an upstream transparent proxy. */
2986: else if (strcmp (long_options[option_index].name, "postauthproxy") == 0)
2987: {
2988:
2989:
2990: if (update_arg( (void *)&(args_info->postauthproxy_arg),
2991: &(args_info->postauthproxy_orig), &(args_info->postauthproxy_given),
2992: &(local_args_info.postauthproxy_given), optarg, 0, 0, ARG_STRING,
2993: check_ambiguity, override, 0, 0,
2994: "postauthproxy", '-',
2995: additional_error))
2996: goto failure;
2997:
2998: }
2999: /* Port of an upstream transparent proxy. */
3000: else if (strcmp (long_options[option_index].name, "postauthproxyport") == 0)
3001: {
3002:
3003:
3004: if (update_arg( (void *)&(args_info->postauthproxyport_arg),
3005: &(args_info->postauthproxyport_orig), &(args_info->postauthproxyport_given),
3006: &(local_args_info.postauthproxyport_given), optarg, 0, "0", ARG_INT,
3007: check_ambiguity, override, 0, 0,
3008: "postauthproxyport", '-',
3009: additional_error))
3010: goto failure;
3011:
3012: }
3013: /* Allow WPA 'Guest' access. */
3014: else if (strcmp (long_options[option_index].name, "wpaguests") == 0)
3015: {
3016:
3017:
3018: if (update_arg((void *)&(args_info->wpaguests_flag), 0, &(args_info->wpaguests_given),
3019: &(local_args_info.wpaguests_given), optarg, 0, 0, ARG_FLAG,
3020: check_ambiguity, override, 1, 0, "wpaguests", '-',
3021: additional_error))
3022: goto failure;
3023:
3024: }
3025: /* Allow OpenID authentication. */
3026: else if (strcmp (long_options[option_index].name, "openidauth") == 0)
3027: {
3028:
3029:
3030: if (update_arg((void *)&(args_info->openidauth_flag), 0, &(args_info->openidauth_given),
3031: &(local_args_info.openidauth_given), optarg, 0, 0, ARG_FLAG,
3032: check_ambiguity, override, 1, 0, "openidauth", '-',
3033: additional_error))
3034: goto failure;
3035:
3036: }
3037: /* Always allow 'PAP' authentication (depreciated; always on). */
3038: else if (strcmp (long_options[option_index].name, "papalwaysok") == 0)
3039: {
3040:
3041:
3042: if (update_arg((void *)&(args_info->papalwaysok_flag), 0, &(args_info->papalwaysok_given),
3043: &(local_args_info.papalwaysok_given), optarg, 0, 0, ARG_FLAG,
3044: check_ambiguity, override, 1, 0, "papalwaysok", '-',
3045: additional_error))
3046: goto failure;
3047:
3048: }
3049: /* Use ChilliSpot XML in WISPr blocks. */
3050: else if (strcmp (long_options[option_index].name, "chillixml") == 0)
3051: {
3052:
3053:
3054: if (update_arg((void *)&(args_info->chillixml_flag), 0, &(args_info->chillixml_given),
3055: &(local_args_info.chillixml_given), optarg, 0, 0, ARG_FLAG,
3056: check_ambiguity, override, 1, 0, "chillixml", '-',
3057: additional_error))
3058: goto failure;
3059:
3060: }
3061: /* Allow updating of session attributes in Accounting-Response. */
3062: else if (strcmp (long_options[option_index].name, "acctupdate") == 0)
3063: {
3064:
3065:
3066: if (update_arg((void *)&(args_info->acctupdate_flag), 0, &(args_info->acctupdate_given),
3067: &(local_args_info.acctupdate_given), optarg, 0, 0, ARG_FLAG,
3068: check_ambiguity, override, 1, 0, "acctupdate", '-',
3069: additional_error))
3070: goto failure;
3071:
3072: }
3073: /* Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX records (to prevent dns tunnels). */
3074: else if (strcmp (long_options[option_index].name, "dnsparanoia") == 0)
3075: {
3076:
3077:
3078: if (update_arg((void *)&(args_info->dnsparanoia_flag), 0, &(args_info->dnsparanoia_given),
3079: &(local_args_info.dnsparanoia_given), optarg, 0, 0, ARG_FLAG,
3080: check_ambiguity, override, 1, 0, "dnsparanoia", '-',
3081: additional_error))
3082: goto failure;
3083:
3084: }
3085: /* Use a TAP instead of TUN (linux only). */
3086: else if (strcmp (long_options[option_index].name, "usetap") == 0)
3087: {
3088:
3089:
3090: if (update_arg((void *)&(args_info->usetap_flag), 0, &(args_info->usetap_given),
3091: &(local_args_info.usetap_given), optarg, 0, 0, ARG_FLAG,
3092: check_ambiguity, override, 1, 0, "usetap", '-',
3093: additional_error))
3094: goto failure;
3095:
3096: }
3097: /* Interface to use as default route; turns on 'manual' routing. */
3098: else if (strcmp (long_options[option_index].name, "routeif") == 0)
3099: {
3100:
3101:
3102: if (update_arg( (void *)&(args_info->routeif_arg),
3103: &(args_info->routeif_orig), &(args_info->routeif_given),
3104: &(local_args_info.routeif_given), optarg, 0, 0, ARG_STRING,
3105: check_ambiguity, override, 0, 0,
3106: "routeif", '-',
3107: additional_error))
3108: goto failure;
3109:
3110: }
3111:
3112: break;
3113: case '?': /* Invalid option. */
3114: /* `getopt_long' already printed an error message. */
3115: goto failure;
3116:
3117: default: /* bug: option not considered. */
3118: fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : ""));
3119: abort ();
3120: } /* switch */
3121: } /* while */
3122:
3123:
3124: update_multiple_arg((void *)&(args_info->uamallowed_arg),
3125: &(args_info->uamallowed_orig), args_info->uamallowed_given,
3126: local_args_info.uamallowed_given, 0 ,
3127: ARG_STRING, uamallowed_list);
3128: update_multiple_arg((void *)&(args_info->uamdomain_arg),
3129: &(args_info->uamdomain_orig), args_info->uamdomain_given,
3130: local_args_info.uamdomain_given, 0 ,
3131: ARG_STRING, uamdomain_list);
3132: update_multiple_arg((void *)&(args_info->macallowed_arg),
3133: &(args_info->macallowed_orig), args_info->macallowed_given,
3134: local_args_info.macallowed_given, 0 ,
3135: ARG_STRING, macallowed_list);
3136:
3137: args_info->uamallowed_given += local_args_info.uamallowed_given;
3138: local_args_info.uamallowed_given = 0;
3139: args_info->uamdomain_given += local_args_info.uamdomain_given;
3140: local_args_info.uamdomain_given = 0;
3141: args_info->macallowed_given += local_args_info.macallowed_given;
3142: local_args_info.macallowed_given = 0;
3143:
3144: if (check_required)
3145: {
3146: error += cmdline_parser_required2 (args_info, argv[0], additional_error);
3147: }
3148:
3149: cmdline_parser_release (&local_args_info);
3150:
3151: if ( error )
3152: return (EXIT_FAILURE);
3153:
3154: return 0;
3155:
3156: failure:
3157: free_list (uamallowed_list, 1 );
3158: free_list (uamdomain_list, 1 );
3159: free_list (macallowed_list, 1 );
3160:
3161: cmdline_parser_release (&local_args_info);
3162: return (EXIT_FAILURE);
3163: }
3164:
3165: #ifndef CONFIG_FILE_LINE_SIZE
3166: #define CONFIG_FILE_LINE_SIZE 2048
3167: #endif
3168: #define ADDITIONAL_ERROR " in configuration file "
3169:
3170: #define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3)
3171: /* 3 is for "--" and "=" */
3172:
3173: static int
3174: _cmdline_parser_configfile (char * const filename, int *my_argc)
3175: {
3176: FILE* file;
3177: char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE+1];
3178: char linebuf[CONFIG_FILE_LINE_SIZE];
3179: int line_num = 0;
3180: int result = 0, equal;
3181: char *fopt, *farg;
3182: char *str_index;
3183: size_t len, next_token;
3184: char delimiter;
3185:
3186: if ((file = fopen(filename, "r")) == NULL)
3187: {
3188: fprintf (stderr, "%s: Error opening configuration file '%s'\n",
3189: CMDLINE_PARSER_PACKAGE, filename);
3190: return EXIT_FAILURE;
3191: }
3192:
3193: while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != NULL)
3194: {
3195: ++line_num;
3196: my_argv[0] = '\0';
3197: len = strlen(linebuf);
3198: if (len > (CONFIG_FILE_LINE_BUFFER_SIZE-1))
3199: {
3200: fprintf (stderr, "%s:%s:%d: Line too long in configuration file\n",
3201: CMDLINE_PARSER_PACKAGE, filename, line_num);
3202: result = EXIT_FAILURE;
3203: break;
3204: }
3205:
3206: /* find first non-whitespace character in the line */
3207: next_token = strspn (linebuf, " \t\r\n");
3208: str_index = linebuf + next_token;
3209:
3210: if ( str_index[0] == '\0' || str_index[0] == '#')
3211: continue; /* empty line or comment line is skipped */
3212:
3213: fopt = str_index;
3214:
3215: /* truncate fopt at the end of the first non-valid character */
3216: next_token = strcspn (fopt, " \t\r\n=");
3217:
3218: if (fopt[next_token] == '\0') /* the line is over */
3219: {
3220: farg = NULL;
3221: equal = 0;
3222: goto noarg;
3223: }
3224:
3225: /* remember if equal sign is present */
3226: equal = (fopt[next_token] == '=');
3227: fopt[next_token++] = '\0';
3228:
3229: /* advance pointers to the next token after the end of fopt */
3230: next_token += strspn (fopt + next_token, " \t\r\n");
3231:
3232: /* check for the presence of equal sign, and if so, skip it */
3233: if ( !equal )
3234: if ((equal = (fopt[next_token] == '=')))
3235: {
3236: next_token++;
3237: next_token += strspn (fopt + next_token, " \t\r\n");
3238: }
3239: str_index += next_token;
3240:
3241: /* find argument */
3242: farg = str_index;
3243: if ( farg[0] == '\"' || farg[0] == '\'' )
3244: { /* quoted argument */
3245: str_index = strchr (++farg, str_index[0] ); /* skip opening quote */
3246: if (! str_index)
3247: {
3248: fprintf
3249: (stderr,
3250: "%s:%s:%d: unterminated string in configuration file\n",
3251: CMDLINE_PARSER_PACKAGE, filename, line_num);
3252: result = EXIT_FAILURE;
3253: break;
3254: }
3255: }
3256: else
3257: { /* read up the remaining part up to a delimiter */
3258: next_token = strcspn (farg, " \t\r\n#\'\"");
3259: str_index += next_token;
3260: }
3261:
3262: /* truncate farg at the delimiter and store it for further check */
3263: delimiter = *str_index, *str_index++ = '\0';
3264:
3265: /* everything but comment is illegal at the end of line */
3266: if (delimiter != '\0' && delimiter != '#')
3267: {
3268: str_index += strspn(str_index, " \t\r\n");
3269: if (*str_index != '\0' && *str_index != '#')
3270: {
3271: fprintf
3272: (stderr,
3273: "%s:%s:%d: malformed string in configuration file\n",
3274: CMDLINE_PARSER_PACKAGE, filename, line_num);
3275: result = EXIT_FAILURE;
3276: break;
3277: }
3278: }
3279:
3280: noarg:
3281: if (!strcmp(fopt,"include")) {
3282: if (farg && *farg) {
3283: result = _cmdline_parser_configfile(farg, my_argc);
3284: } else {
3285: fprintf(stderr, "%s:%s:%d: include requires a filename argument.\n",
3286: CMDLINE_PARSER_PACKAGE, filename, line_num);
3287: }
3288: continue;
3289: }
3290: len = strlen(fopt);
3291: strcat (my_argv, len > 1 ? "--" : "-");
3292: strcat (my_argv, fopt);
3293: if (len > 1 && ((farg && *farg) || equal))
3294: strcat (my_argv, "=");
3295: if (farg && *farg)
3296: strcat (my_argv, farg);
3297: ++(*my_argc);
3298:
3299: cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));
3300: cmd_line_list_tmp->next = cmd_line_list;
3301: cmd_line_list = cmd_line_list_tmp;
3302: cmd_line_list->string_arg = gengetopt_strdup(my_argv);
3303: } /* while */
3304:
3305: if (file)
3306: fclose(file);
3307: return result;
3308: }
3309:
3310: int
3311: cmdline_parser_configfile (char * const filename,
3312: struct gengetopt_args_info *args_info,
3313: int override, int initialize, int check_required)
3314: {
3315: struct cmdline_parser_params params;
3316:
3317: params.override = override;
3318: params.initialize = initialize;
3319: params.check_required = check_required;
3320: params.check_ambiguity = 0;
3321: params.print_errors = 1;
3322:
3323: return cmdline_parser_config_file (filename, args_info, ¶ms);
3324: }
3325:
3326: int
3327: cmdline_parser_config_file (char * const filename,
3328: struct gengetopt_args_info *args_info,
3329: struct cmdline_parser_params *params)
3330: {
3331: int i, result;
3332: int my_argc = 1;
3333: char **my_argv_arg;
3334: char *additional_error;
3335:
3336: /* store the program name */
3337: cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list));
3338: cmd_line_list_tmp->next = cmd_line_list;
3339: cmd_line_list = cmd_line_list_tmp;
3340: cmd_line_list->string_arg = gengetopt_strdup (CMDLINE_PARSER_PACKAGE);
3341:
3342: result = _cmdline_parser_configfile(filename, &my_argc);
3343:
3344: if (result != EXIT_FAILURE) {
3345: my_argv_arg = (char **) malloc((my_argc+1) * sizeof(char *));
3346: cmd_line_list_tmp = cmd_line_list;
3347:
3348: for (i = my_argc - 1; i >= 0; --i) {
3349: my_argv_arg[i] = cmd_line_list_tmp->string_arg;
3350: cmd_line_list_tmp = cmd_line_list_tmp->next;
3351: }
3352:
3353: my_argv_arg[my_argc] = 0;
3354:
3355: additional_error = (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) + 1);
3356: strcpy (additional_error, ADDITIONAL_ERROR);
3357: strcat (additional_error, filename);
3358: result =
3359: cmdline_parser_internal (my_argc, my_argv_arg, args_info,
3360: params,
3361: additional_error);
3362:
3363: free (additional_error);
3364: free (my_argv_arg);
3365: }
3366:
3367: free_cmd_list();
3368: if (result == EXIT_FAILURE)
3369: {
3370: cmdline_parser_free (args_info);
3371: exit (EXIT_FAILURE);
3372: }
3373:
3374: return result;
3375: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>