blob: 1ff1a5989f6abbd3e729a34435b4c0fefb80c128 [file] [log] [blame]
jjako52c24142002-12-16 13:33:51 +00001/*
Harald Welte1b3e5772010-05-04 11:13:56 +02002 File autogenerated by gengetopt version 2.17
jjako52c24142002-12-16 13:33:51 +00003 generated with the following command:
jjako1a51df72004-07-20 08:30:21 +00004 gengetopt --conf-parser
jjako52c24142002-12-16 13:33:51 +00005
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
jjako52c24142002-12-16 13:33:51 +000011/* If we use autoconf. */
12#ifdef HAVE_CONFIG_H
13#include "config.h"
14#endif
jjako52c24142002-12-16 13:33:51 +000015
Harald Welte1b3e5772010-05-04 11:13:56 +020016#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19
20#include "getopt.h"
jjako52c24142002-12-16 13:33:51 +000021
22#include "cmdline.h"
23
Harald Welte1b3e5772010-05-04 11:13:56 +020024const char *gengetopt_args_info_purpose = "";
jjako52c24142002-12-16 13:33:51 +000025
Harald Weltebed35df2011-11-02 13:06:18 +010026const char *gengetopt_args_info_usage =
27 "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]...";
jjako52c24142002-12-16 13:33:51 +000028
Harald Welte1b3e5772010-05-04 11:13:56 +020029const char *gengetopt_args_info_help[] = {
Harald Weltebed35df2011-11-02 13:06:18 +010030 " -h, --help Print help and exit",
31 " -V, --version Print version and exit",
32 " -d, --debug Run in debug mode (default=off)",
33 " -c, --conf=STRING Read configuration file",
34 " --pidfile=STRING Filename of process id file (default=`./sgsnemu.pid')",
35 " --statedir=STRING Directory of nonvolatile data (default=`./')",
36 " --dns=STRING DNS Server to use",
37 " -l, --listen=STRING Local interface",
38 " -r, --remote=STRING Remote host",
39 " --contexts=INT Number of contexts (default=`1')",
40 " --timelimit=INT Exit after timelimit seconds (default=`0')",
41 " --gtpversion=INT GTP version to use (default=`1')",
42 " -a, --apn=STRING Access point name (default=`internet')",
43 " --selmode=INT Selection mode (default=`0x01')",
44 " --rattype=INT Radio Access Technology Type (optional-1to5)",
45 " --userloc=STRING User Location Information (optional-type.MCC.MNC.LAC.CIorSACorRAC)",
46 " --rai=STRING Routing Area Information (optional-MCC.MNC.LAC.RAC)",
47 " --mstz=STRING MS Time Zone (optional- sign.NbQuartersOfAnHour.DSTAdjustment)",
48 " --imeisv=STRING IMEI(SV) International Mobile Equipment Identity (and Software Version) (optional,16 digits)",
49 " -i, --imsi=STRING IMSI (default=`240010123456789')",
50 " --nsapi=INT NSAPI (default=`0')",
51 " -m, --msisdn=STRING Mobile Station ISDN number (default=`46702123456')",
52 " -q, --qos=INT Requested quality of service (default=`0x000b921f')",
53 " --qose1=INT Requested quality of service Extension 1 (example=`0x9396404074f9ffff')",
54 " --qose2=INT Requested quality of service Extension 2 (example=`0x11')",
55 " --qose3=INT Requested quality of service Extension 3 (example=`0x0101')",
56 " --qose4=INT Requested quality of service Extension 4 (example=`0x4040')",
57 " --charging=INT Charging characteristics (default=`0x0800')",
58 " -u, --uid=STRING Login user ID (default=`mig')",
59 " -p, --pwd=STRING Login password (default=`hemmelig')",
60 " --createif Create local network interface (default=off)",
61 " -n, --net=STRING Network address for local interface",
62 " --defaultroute Create default route (default=off)",
63 " --ipup=STRING Script to run after link-up",
64 " --ipdown=STRING Script to run after link-down",
65 " --pinghost=STRING Ping remote host",
66 " --pingrate=INT Number of ping req per second (default=`1')",
67 " --pingsize=INT Number of ping data bytes (default=`56')",
68 " --pingcount=INT Number of ping req to send (default=`0')",
69 " --pingquiet Do not print ping packet info (default=off)",
70 " --norecovery Do not send recovery (default=off)",
71 0
Harald Welte1b3e5772010-05-04 11:13:56 +020072};
73
74static
Harald Weltebed35df2011-11-02 13:06:18 +010075void clear_given(struct gengetopt_args_info *args_info);
Harald Welte1b3e5772010-05-04 11:13:56 +020076static
Harald Weltebed35df2011-11-02 13:06:18 +010077void clear_args(struct gengetopt_args_info *args_info);
Harald Welte1b3e5772010-05-04 11:13:56 +020078
79static int
Harald Weltebed35df2011-11-02 13:06:18 +010080cmdline_parser_internal(int argc, char *const *argv,
81 struct gengetopt_args_info *args_info, int override,
82 int initialize, int check_required,
83 const char *additional_error);
Harald Welte1b3e5772010-05-04 11:13:56 +020084
Harald Weltebed35df2011-11-02 13:06:18 +010085struct line_list {
86 char *string_arg;
87 struct line_list *next;
Harald Welte1b3e5772010-05-04 11:13:56 +020088};
89
90static struct line_list *cmd_line_list = 0;
91static struct line_list *cmd_line_list_tmp = 0;
92
Harald Weltebed35df2011-11-02 13:06:18 +010093static void free_cmd_list(void)
Harald Welte1b3e5772010-05-04 11:13:56 +020094{
Harald Weltebed35df2011-11-02 13:06:18 +010095 /* free the list of a previous call */
96 if (cmd_line_list) {
97 while (cmd_line_list) {
98 cmd_line_list_tmp = cmd_line_list;
99 cmd_line_list = cmd_line_list->next;
100 free(cmd_line_list_tmp->string_arg);
101 free(cmd_line_list_tmp);
102 }
103 }
jjako52c24142002-12-16 13:33:51 +0000104}
105
Harald Weltebed35df2011-11-02 13:06:18 +0100106static char *gengetopt_strdup(const char *s);
jjako52c24142002-12-16 13:33:51 +0000107
Harald Welte1b3e5772010-05-04 11:13:56 +0200108static
Harald Weltebed35df2011-11-02 13:06:18 +0100109void clear_given(struct gengetopt_args_info *args_info)
jjako52c24142002-12-16 13:33:51 +0000110{
Harald Weltebed35df2011-11-02 13:06:18 +0100111 args_info->help_given = 0;
112 args_info->version_given = 0;
113 args_info->debug_given = 0;
114 args_info->conf_given = 0;
115 args_info->pidfile_given = 0;
116 args_info->statedir_given = 0;
117 args_info->dns_given = 0;
118 args_info->listen_given = 0;
119 args_info->remote_given = 0;
120 args_info->contexts_given = 0;
121 args_info->timelimit_given = 0;
122 args_info->gtpversion_given = 0;
123 args_info->apn_given = 0;
124 args_info->selmode_given = 0;
125 args_info->rattype_given = 0;
126 args_info->userloc_given = 0;
127 args_info->rai_given = 0;
128 args_info->mstz_given = 0;
129 args_info->imeisv_given = 0;
130 args_info->imsi_given = 0;
131 args_info->nsapi_given = 0;
132 args_info->msisdn_given = 0;
133 args_info->qos_given = 0;
134 args_info->qose1_given = 0;
135 args_info->qose2_given = 0;
136 args_info->qose3_given = 0;
137 args_info->qose4_given = 0;
138 args_info->charging_given = 0;
139 args_info->uid_given = 0;
140 args_info->pwd_given = 0;
141 args_info->createif_given = 0;
142 args_info->net_given = 0;
143 args_info->defaultroute_given = 0;
144 args_info->ipup_given = 0;
145 args_info->ipdown_given = 0;
146 args_info->pinghost_given = 0;
147 args_info->pingrate_given = 0;
148 args_info->pingsize_given = 0;
149 args_info->pingcount_given = 0;
150 args_info->pingquiet_given = 0;
151 args_info->norecovery_given = 0;
jjako52c24142002-12-16 13:33:51 +0000152}
153
Harald Welte1b3e5772010-05-04 11:13:56 +0200154static
Harald Weltebed35df2011-11-02 13:06:18 +0100155void clear_args(struct gengetopt_args_info *args_info)
Harald Welte1b3e5772010-05-04 11:13:56 +0200156{
Harald Weltebed35df2011-11-02 13:06:18 +0100157 args_info->debug_flag = 0;
158 args_info->conf_arg = NULL;
159 args_info->conf_orig = NULL;
160 args_info->pidfile_arg = gengetopt_strdup("./sgsnemu.pid");
161 args_info->pidfile_orig = NULL;
162 args_info->statedir_arg = gengetopt_strdup("./");
163 args_info->statedir_orig = NULL;
164 args_info->dns_arg = NULL;
165 args_info->dns_orig = NULL;
166 args_info->listen_arg = NULL;
167 args_info->listen_orig = NULL;
168 args_info->remote_arg = NULL;
169 args_info->remote_orig = NULL;
170 args_info->contexts_arg = 1;
171 args_info->contexts_orig = NULL;
172 args_info->timelimit_arg = 0;
173 args_info->timelimit_orig = NULL;
174 args_info->gtpversion_arg = 1;
175 args_info->gtpversion_orig = NULL;
176 args_info->apn_arg = gengetopt_strdup("internet");
177 args_info->apn_orig = NULL;
178 args_info->selmode_arg = 0x01;
179 args_info->selmode_orig = NULL;
180 args_info->rattype_arg = "1";
181 args_info->rattype_orig = NULL;
182 args_info->userloc_arg = strdup("02509946241207");
183 args_info->userloc_orig = NULL;
184 args_info->rai_arg = strdup("02509946241207");
185 args_info->rai_orig = NULL;
186 args_info->mstz_arg = strdup("0");
187 args_info->mstz_orig = NULL;
188 args_info->imeisv_arg = strdup("2143658709214365");
189 args_info->imeisv_orig = NULL;
190 args_info->imsi_arg = gengetopt_strdup("240010123456789");
191 args_info->imsi_orig = NULL;
192 args_info->nsapi_arg = 0;
193 args_info->nsapi_orig = NULL;
194 args_info->msisdn_arg = gengetopt_strdup("46702123456");
195 args_info->msisdn_orig = NULL;
196 args_info->qos_arg = 0x000b921f;
197 args_info->qos_orig = NULL;
198 args_info->qose1_arg = 0x9396404074f9ffff;
199 args_info->qose1_orig = NULL;
200 args_info->qose2_arg = 0x11;
201 args_info->qose2_orig = NULL;
202 args_info->qose3_arg = 0x0101;
203 args_info->qose3_orig = NULL;
204 args_info->qose4_arg = 0x4040;
205 args_info->qose4_orig = NULL;
206 args_info->charging_arg = 0x0800;
207 args_info->charging_orig = NULL;
208 args_info->uid_arg = gengetopt_strdup("mig");
209 args_info->uid_orig = NULL;
210 args_info->pwd_arg = gengetopt_strdup("hemmelig");
211 args_info->pwd_orig = NULL;
212 args_info->createif_flag = 0;
213 args_info->net_arg = NULL;
214 args_info->net_orig = NULL;
215 args_info->defaultroute_flag = 0;
216 args_info->ipup_arg = NULL;
217 args_info->ipup_orig = NULL;
218 args_info->ipdown_arg = NULL;
219 args_info->ipdown_orig = NULL;
220 args_info->pinghost_arg = NULL;
221 args_info->pinghost_orig = NULL;
222 args_info->pingrate_arg = 1;
223 args_info->pingrate_orig = NULL;
224 args_info->pingsize_arg = 56;
225 args_info->pingsize_orig = NULL;
226 args_info->pingcount_arg = 0;
227 args_info->pingcount_orig = NULL;
228 args_info->pingquiet_flag = 0;
229 args_info->norecovery_flag = 0;
230
Harald Welte1b3e5772010-05-04 11:13:56 +0200231}
232
233static
234void init_args_info(struct gengetopt_args_info *args_info)
235{
Harald Weltebed35df2011-11-02 13:06:18 +0100236 args_info->help_help = gengetopt_args_info_help[0];
237 args_info->version_help = gengetopt_args_info_help[1];
238 args_info->debug_help = gengetopt_args_info_help[2];
239 args_info->conf_help = gengetopt_args_info_help[3];
240 args_info->pidfile_help = gengetopt_args_info_help[4];
241 args_info->statedir_help = gengetopt_args_info_help[5];
242 args_info->dns_help = gengetopt_args_info_help[6];
243 args_info->listen_help = gengetopt_args_info_help[7];
244 args_info->remote_help = gengetopt_args_info_help[8];
245 args_info->contexts_help = gengetopt_args_info_help[9];
246 args_info->timelimit_help = gengetopt_args_info_help[10];
247 args_info->gtpversion_help = gengetopt_args_info_help[11];
248 args_info->apn_help = gengetopt_args_info_help[12];
249 args_info->selmode_help = gengetopt_args_info_help[13];
250 args_info->imsi_help = gengetopt_args_info_help[14];
251 args_info->nsapi_help = gengetopt_args_info_help[15];
252 args_info->msisdn_help = gengetopt_args_info_help[16];
253 args_info->qos_help = gengetopt_args_info_help[17];
254 args_info->charging_help = gengetopt_args_info_help[18];
255 args_info->uid_help = gengetopt_args_info_help[19];
256 args_info->pwd_help = gengetopt_args_info_help[20];
257 args_info->createif_help = gengetopt_args_info_help[21];
258 args_info->net_help = gengetopt_args_info_help[22];
259 args_info->defaultroute_help = gengetopt_args_info_help[23];
260 args_info->ipup_help = gengetopt_args_info_help[24];
261 args_info->ipdown_help = gengetopt_args_info_help[25];
262 args_info->pinghost_help = gengetopt_args_info_help[26];
263 args_info->pingrate_help = gengetopt_args_info_help[27];
264 args_info->pingsize_help = gengetopt_args_info_help[28];
265 args_info->pingcount_help = gengetopt_args_info_help[29];
266 args_info->pingquiet_help = gengetopt_args_info_help[30];
267 args_info->norecovery_help = gengetopt_args_info_help[31];
268
Harald Welte1b3e5772010-05-04 11:13:56 +0200269}
270
Harald Weltebed35df2011-11-02 13:06:18 +0100271void cmdline_parser_print_version(void)
Harald Welte1b3e5772010-05-04 11:13:56 +0200272{
Harald Weltebed35df2011-11-02 13:06:18 +0100273 printf("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
Harald Welte1b3e5772010-05-04 11:13:56 +0200274}
275
Harald Weltebed35df2011-11-02 13:06:18 +0100276void cmdline_parser_print_help(void)
Harald Welte1b3e5772010-05-04 11:13:56 +0200277{
Harald Weltebed35df2011-11-02 13:06:18 +0100278 int i = 0;
279 cmdline_parser_print_version();
Harald Welte1b3e5772010-05-04 11:13:56 +0200280
Harald Weltebed35df2011-11-02 13:06:18 +0100281 if (strlen(gengetopt_args_info_purpose) > 0)
282 printf("\n%s\n", gengetopt_args_info_purpose);
Harald Welte1b3e5772010-05-04 11:13:56 +0200283
Harald Weltebed35df2011-11-02 13:06:18 +0100284 printf("\n%s\n\n", gengetopt_args_info_usage);
285 while (gengetopt_args_info_help[i])
286 printf("%s\n", gengetopt_args_info_help[i++]);
Harald Welte1b3e5772010-05-04 11:13:56 +0200287}
288
Harald Weltebed35df2011-11-02 13:06:18 +0100289void cmdline_parser_init(struct gengetopt_args_info *args_info)
Harald Welte1b3e5772010-05-04 11:13:56 +0200290{
Harald Weltebed35df2011-11-02 13:06:18 +0100291 clear_given(args_info);
292 clear_args(args_info);
293 init_args_info(args_info);
Harald Welte1b3e5772010-05-04 11:13:56 +0200294}
295
Harald Weltebed35df2011-11-02 13:06:18 +0100296static void cmdline_parser_release(struct gengetopt_args_info *args_info)
Harald Welte1b3e5772010-05-04 11:13:56 +0200297{
Harald Weltebed35df2011-11-02 13:06:18 +0100298
299 if (args_info->conf_arg) {
300 free(args_info->conf_arg); /* free previous argument */
301 args_info->conf_arg = 0;
302 }
303 if (args_info->conf_orig) {
304 free(args_info->conf_orig); /* free previous argument */
305 args_info->conf_orig = 0;
306 }
307 if (args_info->pidfile_arg) {
308 free(args_info->pidfile_arg); /* free previous argument */
309 args_info->pidfile_arg = 0;
310 }
311 if (args_info->pidfile_orig) {
312 free(args_info->pidfile_orig); /* free previous argument */
313 args_info->pidfile_orig = 0;
314 }
315 if (args_info->statedir_arg) {
316 free(args_info->statedir_arg); /* free previous argument */
317 args_info->statedir_arg = 0;
318 }
319 if (args_info->statedir_orig) {
320 free(args_info->statedir_orig); /* free previous argument */
321 args_info->statedir_orig = 0;
322 }
323 if (args_info->dns_arg) {
324 free(args_info->dns_arg); /* free previous argument */
325 args_info->dns_arg = 0;
326 }
327 if (args_info->dns_orig) {
328 free(args_info->dns_orig); /* free previous argument */
329 args_info->dns_orig = 0;
330 }
331 if (args_info->listen_arg) {
332 free(args_info->listen_arg); /* free previous argument */
333 args_info->listen_arg = 0;
334 }
335 if (args_info->listen_orig) {
336 free(args_info->listen_orig); /* free previous argument */
337 args_info->listen_orig = 0;
338 }
339 if (args_info->remote_arg) {
340 free(args_info->remote_arg); /* free previous argument */
341 args_info->remote_arg = 0;
342 }
343 if (args_info->remote_orig) {
344 free(args_info->remote_orig); /* free previous argument */
345 args_info->remote_orig = 0;
346 }
347 if (args_info->contexts_orig) {
348 free(args_info->contexts_orig); /* free previous argument */
349 args_info->contexts_orig = 0;
350 }
351 if (args_info->timelimit_orig) {
352 free(args_info->timelimit_orig); /* free previous argument */
353 args_info->timelimit_orig = 0;
354 }
355 if (args_info->gtpversion_orig) {
356 free(args_info->gtpversion_orig); /* free previous argument */
357 args_info->gtpversion_orig = 0;
358 }
359 if (args_info->apn_arg) {
360 free(args_info->apn_arg); /* free previous argument */
361 args_info->apn_arg = 0;
362 }
363 if (args_info->apn_orig) {
364 free(args_info->apn_orig); /* free previous argument */
365 args_info->apn_orig = 0;
366 }
367 if (args_info->selmode_orig) {
368 free(args_info->selmode_orig); /* free previous argument */
369 args_info->selmode_orig = 0;
370 }
371 if (args_info->imsi_arg) {
372 free(args_info->imsi_arg); /* free previous argument */
373 args_info->imsi_arg = 0;
374 }
375 if (args_info->imsi_orig) {
376 free(args_info->imsi_orig); /* free previous argument */
377 args_info->imsi_orig = 0;
378 }
379 if (args_info->nsapi_orig) {
380 free(args_info->nsapi_orig); /* free previous argument */
381 args_info->nsapi_orig = 0;
382 }
383 if (args_info->msisdn_arg) {
384 free(args_info->msisdn_arg); /* free previous argument */
385 args_info->msisdn_arg = 0;
386 }
387 if (args_info->msisdn_orig) {
388 free(args_info->msisdn_orig); /* free previous argument */
389 args_info->msisdn_orig = 0;
390 }
391 if (args_info->qos_orig) {
392 free(args_info->qos_orig); /* free previous argument */
393 args_info->qos_orig = 0;
394 }
395 if (args_info->charging_orig) {
396 free(args_info->charging_orig); /* free previous argument */
397 args_info->charging_orig = 0;
398 }
399 if (args_info->uid_arg) {
400 free(args_info->uid_arg); /* free previous argument */
401 args_info->uid_arg = 0;
402 }
403 if (args_info->uid_orig) {
404 free(args_info->uid_orig); /* free previous argument */
405 args_info->uid_orig = 0;
406 }
407 if (args_info->pwd_arg) {
408 free(args_info->pwd_arg); /* free previous argument */
409 args_info->pwd_arg = 0;
410 }
411 if (args_info->pwd_orig) {
412 free(args_info->pwd_orig); /* free previous argument */
413 args_info->pwd_orig = 0;
414 }
415 if (args_info->net_arg) {
416 free(args_info->net_arg); /* free previous argument */
417 args_info->net_arg = 0;
418 }
419 if (args_info->net_orig) {
420 free(args_info->net_orig); /* free previous argument */
421 args_info->net_orig = 0;
422 }
423 if (args_info->ipup_arg) {
424 free(args_info->ipup_arg); /* free previous argument */
425 args_info->ipup_arg = 0;
426 }
427 if (args_info->ipup_orig) {
428 free(args_info->ipup_orig); /* free previous argument */
429 args_info->ipup_orig = 0;
430 }
431 if (args_info->ipdown_arg) {
432 free(args_info->ipdown_arg); /* free previous argument */
433 args_info->ipdown_arg = 0;
434 }
435 if (args_info->ipdown_orig) {
436 free(args_info->ipdown_orig); /* free previous argument */
437 args_info->ipdown_orig = 0;
438 }
439 if (args_info->pinghost_arg) {
440 free(args_info->pinghost_arg); /* free previous argument */
441 args_info->pinghost_arg = 0;
442 }
443 if (args_info->pinghost_orig) {
444 free(args_info->pinghost_orig); /* free previous argument */
445 args_info->pinghost_orig = 0;
446 }
447 if (args_info->pingrate_orig) {
448 free(args_info->pingrate_orig); /* free previous argument */
449 args_info->pingrate_orig = 0;
450 }
451 if (args_info->pingsize_orig) {
452 free(args_info->pingsize_orig); /* free previous argument */
453 args_info->pingsize_orig = 0;
454 }
455 if (args_info->pingcount_orig) {
456 free(args_info->pingcount_orig); /* free previous argument */
457 args_info->pingcount_orig = 0;
458 }
459
460 clear_given(args_info);
Harald Welte1b3e5772010-05-04 11:13:56 +0200461}
462
463int
Harald Weltebed35df2011-11-02 13:06:18 +0100464cmdline_parser_file_save(const char *filename,
465 struct gengetopt_args_info *args_info)
Harald Welte1b3e5772010-05-04 11:13:56 +0200466{
Harald Weltebed35df2011-11-02 13:06:18 +0100467 FILE *outfile;
468 int i = 0;
Harald Welte1b3e5772010-05-04 11:13:56 +0200469
Harald Weltebed35df2011-11-02 13:06:18 +0100470 outfile = fopen(filename, "w");
Harald Welte1b3e5772010-05-04 11:13:56 +0200471
Harald Weltebed35df2011-11-02 13:06:18 +0100472 if (!outfile) {
473 fprintf(stderr, "%s: cannot open file for writing: %s\n",
474 CMDLINE_PARSER_PACKAGE, filename);
475 return EXIT_FAILURE;
476 }
Harald Welte1b3e5772010-05-04 11:13:56 +0200477
Harald Weltebed35df2011-11-02 13:06:18 +0100478 if (args_info->help_given) {
479 fprintf(outfile, "%s\n", "help");
480 }
481 if (args_info->version_given) {
482 fprintf(outfile, "%s\n", "version");
483 }
484 if (args_info->debug_given) {
485 fprintf(outfile, "%s\n", "debug");
486 }
487 if (args_info->conf_given) {
488 if (args_info->conf_orig) {
489 fprintf(outfile, "%s=\"%s\"\n", "conf",
490 args_info->conf_orig);
491 } else {
492 fprintf(outfile, "%s\n", "conf");
493 }
494 }
495 if (args_info->pidfile_given) {
496 if (args_info->pidfile_orig) {
497 fprintf(outfile, "%s=\"%s\"\n", "pidfile",
498 args_info->pidfile_orig);
499 } else {
500 fprintf(outfile, "%s\n", "pidfile");
501 }
502 }
503 if (args_info->statedir_given) {
504 if (args_info->statedir_orig) {
505 fprintf(outfile, "%s=\"%s\"\n", "statedir",
506 args_info->statedir_orig);
507 } else {
508 fprintf(outfile, "%s\n", "statedir");
509 }
510 }
511 if (args_info->dns_given) {
512 if (args_info->dns_orig) {
513 fprintf(outfile, "%s=\"%s\"\n", "dns",
514 args_info->dns_orig);
515 } else {
516 fprintf(outfile, "%s\n", "dns");
517 }
518 }
519 if (args_info->listen_given) {
520 if (args_info->listen_orig) {
521 fprintf(outfile, "%s=\"%s\"\n", "listen",
522 args_info->listen_orig);
523 } else {
524 fprintf(outfile, "%s\n", "listen");
525 }
526 }
527 if (args_info->remote_given) {
528 if (args_info->remote_orig) {
529 fprintf(outfile, "%s=\"%s\"\n", "remote",
530 args_info->remote_orig);
531 } else {
532 fprintf(outfile, "%s\n", "remote");
533 }
534 }
535 if (args_info->contexts_given) {
536 if (args_info->contexts_orig) {
537 fprintf(outfile, "%s=\"%s\"\n", "contexts",
538 args_info->contexts_orig);
539 } else {
540 fprintf(outfile, "%s\n", "contexts");
541 }
542 }
543 if (args_info->timelimit_given) {
544 if (args_info->timelimit_orig) {
545 fprintf(outfile, "%s=\"%s\"\n", "timelimit",
546 args_info->timelimit_orig);
547 } else {
548 fprintf(outfile, "%s\n", "timelimit");
549 }
550 }
551 if (args_info->gtpversion_given) {
552 if (args_info->gtpversion_orig) {
553 fprintf(outfile, "%s=\"%s\"\n", "gtpversion",
554 args_info->gtpversion_orig);
555 } else {
556 fprintf(outfile, "%s\n", "gtpversion");
557 }
558 }
559 if (args_info->apn_given) {
560 if (args_info->apn_orig) {
561 fprintf(outfile, "%s=\"%s\"\n", "apn",
562 args_info->apn_orig);
563 } else {
564 fprintf(outfile, "%s\n", "apn");
565 }
566 }
567 if (args_info->selmode_given) {
568 if (args_info->selmode_orig) {
569 fprintf(outfile, "%s=\"%s\"\n", "selmode",
570 args_info->selmode_orig);
571 } else {
572 fprintf(outfile, "%s\n", "selmode");
573 }
574 }
575 if (args_info->imsi_given) {
576 if (args_info->imsi_orig) {
577 fprintf(outfile, "%s=\"%s\"\n", "imsi",
578 args_info->imsi_orig);
579 } else {
580 fprintf(outfile, "%s\n", "imsi");
581 }
582 }
583 if (args_info->nsapi_given) {
584 if (args_info->nsapi_orig) {
585 fprintf(outfile, "%s=\"%s\"\n", "nsapi",
586 args_info->nsapi_orig);
587 } else {
588 fprintf(outfile, "%s\n", "nsapi");
589 }
590 }
591 if (args_info->msisdn_given) {
592 if (args_info->msisdn_orig) {
593 fprintf(outfile, "%s=\"%s\"\n", "msisdn",
594 args_info->msisdn_orig);
595 } else {
596 fprintf(outfile, "%s\n", "msisdn");
597 }
598 }
599 if (args_info->qos_given) {
600 if (args_info->qos_orig) {
601 fprintf(outfile, "%s=\"%s\"\n", "qos",
602 args_info->qos_orig);
603 } else {
604 fprintf(outfile, "%s\n", "qos");
605 }
606 }
607 if (args_info->charging_given) {
608 if (args_info->charging_orig) {
609 fprintf(outfile, "%s=\"%s\"\n", "charging",
610 args_info->charging_orig);
611 } else {
612 fprintf(outfile, "%s\n", "charging");
613 }
614 }
615 if (args_info->uid_given) {
616 if (args_info->uid_orig) {
617 fprintf(outfile, "%s=\"%s\"\n", "uid",
618 args_info->uid_orig);
619 } else {
620 fprintf(outfile, "%s\n", "uid");
621 }
622 }
623 if (args_info->pwd_given) {
624 if (args_info->pwd_orig) {
625 fprintf(outfile, "%s=\"%s\"\n", "pwd",
626 args_info->pwd_orig);
627 } else {
628 fprintf(outfile, "%s\n", "pwd");
629 }
630 }
631 if (args_info->createif_given) {
632 fprintf(outfile, "%s\n", "createif");
633 }
634 if (args_info->net_given) {
635 if (args_info->net_orig) {
636 fprintf(outfile, "%s=\"%s\"\n", "net",
637 args_info->net_orig);
638 } else {
639 fprintf(outfile, "%s\n", "net");
640 }
641 }
642 if (args_info->defaultroute_given) {
643 fprintf(outfile, "%s\n", "defaultroute");
644 }
645 if (args_info->ipup_given) {
646 if (args_info->ipup_orig) {
647 fprintf(outfile, "%s=\"%s\"\n", "ipup",
648 args_info->ipup_orig);
649 } else {
650 fprintf(outfile, "%s\n", "ipup");
651 }
652 }
653 if (args_info->ipdown_given) {
654 if (args_info->ipdown_orig) {
655 fprintf(outfile, "%s=\"%s\"\n", "ipdown",
656 args_info->ipdown_orig);
657 } else {
658 fprintf(outfile, "%s\n", "ipdown");
659 }
660 }
661 if (args_info->pinghost_given) {
662 if (args_info->pinghost_orig) {
663 fprintf(outfile, "%s=\"%s\"\n", "pinghost",
664 args_info->pinghost_orig);
665 } else {
666 fprintf(outfile, "%s\n", "pinghost");
667 }
668 }
669 if (args_info->pingrate_given) {
670 if (args_info->pingrate_orig) {
671 fprintf(outfile, "%s=\"%s\"\n", "pingrate",
672 args_info->pingrate_orig);
673 } else {
674 fprintf(outfile, "%s\n", "pingrate");
675 }
676 }
677 if (args_info->pingsize_given) {
678 if (args_info->pingsize_orig) {
679 fprintf(outfile, "%s=\"%s\"\n", "pingsize",
680 args_info->pingsize_orig);
681 } else {
682 fprintf(outfile, "%s\n", "pingsize");
683 }
684 }
685 if (args_info->pingcount_given) {
686 if (args_info->pingcount_orig) {
687 fprintf(outfile, "%s=\"%s\"\n", "pingcount",
688 args_info->pingcount_orig);
689 } else {
690 fprintf(outfile, "%s\n", "pingcount");
691 }
692 }
693 if (args_info->pingquiet_given) {
694 fprintf(outfile, "%s\n", "pingquiet");
695 }
696 if (args_info->norecovery_given) {
697 fprintf(outfile, "%s\n", "norecovery");
698 }
Harald Welte1b3e5772010-05-04 11:13:56 +0200699
Harald Weltebed35df2011-11-02 13:06:18 +0100700 fclose(outfile);
701
702 i = EXIT_SUCCESS;
703 return i;
Harald Welte1b3e5772010-05-04 11:13:56 +0200704}
705
Harald Weltebed35df2011-11-02 13:06:18 +0100706void cmdline_parser_free(struct gengetopt_args_info *args_info)
Harald Welte1b3e5772010-05-04 11:13:56 +0200707{
Harald Weltebed35df2011-11-02 13:06:18 +0100708 cmdline_parser_release(args_info);
Harald Welte1b3e5772010-05-04 11:13:56 +0200709}
710
Harald Welte1b3e5772010-05-04 11:13:56 +0200711/* gengetopt_strdup() */
712/* strdup.c replacement of strdup, which is not standard */
Harald Weltebed35df2011-11-02 13:06:18 +0100713char *gengetopt_strdup(const char *s)
Harald Welte1b3e5772010-05-04 11:13:56 +0200714{
Harald Weltebed35df2011-11-02 13:06:18 +0100715 char *result = NULL;
716 if (!s)
717 return result;
Harald Welte1b3e5772010-05-04 11:13:56 +0200718
Harald Weltebed35df2011-11-02 13:06:18 +0100719 result = (char *)malloc(strlen(s) + 1);
720 if (result == (char *)0)
721 return (char *)0;
722 strcpy(result, s);
723 return result;
Harald Welte1b3e5772010-05-04 11:13:56 +0200724}
725
726int
Harald Weltebed35df2011-11-02 13:06:18 +0100727cmdline_parser(int argc, char *const *argv,
728 struct gengetopt_args_info *args_info)
Harald Welte1b3e5772010-05-04 11:13:56 +0200729{
Harald Weltebed35df2011-11-02 13:06:18 +0100730 return cmdline_parser2(argc, argv, args_info, 0, 1, 1);
Harald Welte1b3e5772010-05-04 11:13:56 +0200731}
732
733int
Harald Weltebed35df2011-11-02 13:06:18 +0100734cmdline_parser2(int argc, char *const *argv,
735 struct gengetopt_args_info *args_info, int override,
736 int initialize, int check_required)
Harald Welte1b3e5772010-05-04 11:13:56 +0200737{
Harald Weltebed35df2011-11-02 13:06:18 +0100738 int result;
Harald Welte1b3e5772010-05-04 11:13:56 +0200739
Harald Weltebed35df2011-11-02 13:06:18 +0100740 result =
741 cmdline_parser_internal(argc, argv, args_info, override, initialize,
742 check_required, NULL);
Harald Welte1b3e5772010-05-04 11:13:56 +0200743
Harald Weltebed35df2011-11-02 13:06:18 +0100744 if (result == EXIT_FAILURE) {
745 cmdline_parser_free(args_info);
746 exit(EXIT_FAILURE);
747 }
748
749 return result;
Harald Welte1b3e5772010-05-04 11:13:56 +0200750}
751
752int
Harald Weltebed35df2011-11-02 13:06:18 +0100753cmdline_parser_required(struct gengetopt_args_info *args_info,
754 const char *prog_name)
Harald Welte1b3e5772010-05-04 11:13:56 +0200755{
Harald Weltebed35df2011-11-02 13:06:18 +0100756 return EXIT_SUCCESS;
Harald Welte1b3e5772010-05-04 11:13:56 +0200757}
758
759int
Harald Weltebed35df2011-11-02 13:06:18 +0100760cmdline_parser_internal(int argc, char *const *argv,
761 struct gengetopt_args_info *args_info, int override,
762 int initialize, int check_required,
763 const char *additional_error)
Harald Welte1b3e5772010-05-04 11:13:56 +0200764{
Harald Weltebed35df2011-11-02 13:06:18 +0100765 int c; /* Character of the parsed option. */
Harald Welte1b3e5772010-05-04 11:13:56 +0200766
Harald Weltebed35df2011-11-02 13:06:18 +0100767 int error = 0;
768 struct gengetopt_args_info local_args_info;
Harald Welte1b3e5772010-05-04 11:13:56 +0200769
Harald Weltebed35df2011-11-02 13:06:18 +0100770 if (initialize)
771 cmdline_parser_init(args_info);
Harald Welte1b3e5772010-05-04 11:13:56 +0200772
Harald Weltebed35df2011-11-02 13:06:18 +0100773 cmdline_parser_init(&local_args_info);
jjako52c24142002-12-16 13:33:51 +0000774
Harald Weltebed35df2011-11-02 13:06:18 +0100775 optarg = 0;
776 optind = 0;
777 opterr = 1;
778 optopt = '?';
jjako52c24142002-12-16 13:33:51 +0000779
Harald Weltebed35df2011-11-02 13:06:18 +0100780 while (1) {
781 int option_index = 0;
782 char *stop_char;
Harald Welte1b3e5772010-05-04 11:13:56 +0200783
Harald Weltebed35df2011-11-02 13:06:18 +0100784 static struct option long_options[] = {
785 {"help", 0, NULL, 'h'},
786 {"version", 0, NULL, 'V'},
787 {"debug", 0, NULL, 'd'},
788 {"conf", 1, NULL, 'c'},
789 {"pidfile", 1, NULL, 0},
790 {"statedir", 1, NULL, 0},
791 {"dns", 1, NULL, 0},
792 {"listen", 1, NULL, 'l'},
793 {"remote", 1, NULL, 'r'},
794 {"contexts", 1, NULL, 0},
795 {"timelimit", 1, NULL, 0},
796 {"gtpversion", 1, NULL, 0},
797 {"apn", 1, NULL, 'a'},
798 {"selmode", 1, NULL, 0},
799 {"rattype", 1, NULL, 0},
800 {"userloc", 1, NULL, 0},
801 {"rai", 1, NULL, 0},
802 {"mstz", 1, NULL, 0},
803 {"imeisv", 1, NULL, 0},
804 {"imsi", 1, NULL, 'i'},
805 {"nsapi", 1, NULL, 0},
806 {"msisdn", 1, NULL, 'm'},
807 {"qos", 1, NULL, 'q'},
808 {"qose1", 1, NULL, 0},
809 {"qose2", 1, NULL, 0},
810 {"qose3", 1, NULL, 0},
811 {"qose4", 1, NULL, 0},
812 {"charging", 1, NULL, 0},
813 {"uid", 1, NULL, 'u'},
814 {"pwd", 1, NULL, 'p'},
815 {"createif", 0, NULL, 0},
816 {"net", 1, NULL, 'n'},
817 {"defaultroute", 0, NULL, 0},
818 {"ipup", 1, NULL, 0},
819 {"ipdown", 1, NULL, 0},
820 {"pinghost", 1, NULL, 0},
821 {"pingrate", 1, NULL, 0},
822 {"pingsize", 1, NULL, 0},
823 {"pingcount", 1, NULL, 0},
824 {"pingquiet", 0, NULL, 0},
825 {"norecovery", 0, NULL, 0},
826 {NULL, 0, NULL, 0}
827 };
jjako52c24142002-12-16 13:33:51 +0000828
Harald Weltebed35df2011-11-02 13:06:18 +0100829 stop_char = 0;
830 c = getopt_long(argc, argv, "hVdc:l:r:a:i:m:q:u:p:n:",
831 long_options, &option_index);
jjako52c24142002-12-16 13:33:51 +0000832
Harald Weltebed35df2011-11-02 13:06:18 +0100833 if (c == -1)
834 break; /* Exit from `while (1)' loop. */
jjako52c24142002-12-16 13:33:51 +0000835
Harald Weltebed35df2011-11-02 13:06:18 +0100836 switch (c) {
837 case 'h': /* Print help and exit. */
838 cmdline_parser_print_help();
839 cmdline_parser_free(&local_args_info);
840 exit(EXIT_SUCCESS);
jjako52c24142002-12-16 13:33:51 +0000841
Harald Weltebed35df2011-11-02 13:06:18 +0100842 case 'V': /* Print version and exit. */
843 cmdline_parser_print_version();
844 cmdline_parser_free(&local_args_info);
845 exit(EXIT_SUCCESS);
jjako52c24142002-12-16 13:33:51 +0000846
Harald Weltebed35df2011-11-02 13:06:18 +0100847 case 'd': /* Run in debug mode. */
848 if (local_args_info.debug_given) {
849 fprintf(stderr,
850 "%s: `--debug' (`-d') option given more than once%s\n",
851 argv[0],
852 (additional_error ? additional_error :
853 ""));
854 goto failure;
855 }
856 if (args_info->debug_given && !override)
857 continue;
858 local_args_info.debug_given = 1;
859 args_info->debug_given = 1;
860 args_info->debug_flag = !(args_info->debug_flag);
861 break;
jjako52c24142002-12-16 13:33:51 +0000862
Harald Weltebed35df2011-11-02 13:06:18 +0100863 case 'c': /* Read configuration file. */
864 if (local_args_info.conf_given) {
865 fprintf(stderr,
866 "%s: `--conf' (`-c') option given more than once%s\n",
867 argv[0],
868 (additional_error ? additional_error :
869 ""));
870 goto failure;
871 }
872 if (args_info->conf_given && !override)
873 continue;
874 local_args_info.conf_given = 1;
875 args_info->conf_given = 1;
876 if (args_info->conf_arg)
877 free(args_info->conf_arg); /* free previous string */
878 args_info->conf_arg = gengetopt_strdup(optarg);
879 if (args_info->conf_orig)
880 free(args_info->conf_orig); /* free previous string */
881 args_info->conf_orig = gengetopt_strdup(optarg);
882 break;
jjako52c24142002-12-16 13:33:51 +0000883
Harald Weltebed35df2011-11-02 13:06:18 +0100884 case 'l': /* Local interface. */
885 if (local_args_info.listen_given) {
886 fprintf(stderr,
887 "%s: `--listen' (`-l') option given more than once%s\n",
888 argv[0],
889 (additional_error ? additional_error :
890 ""));
891 goto failure;
892 }
893 if (args_info->listen_given && !override)
894 continue;
895 local_args_info.listen_given = 1;
896 args_info->listen_given = 1;
897 if (args_info->listen_arg)
898 free(args_info->listen_arg); /* free previous string */
899 args_info->listen_arg = gengetopt_strdup(optarg);
900 if (args_info->listen_orig)
901 free(args_info->listen_orig); /* free previous string */
902 args_info->listen_orig = gengetopt_strdup(optarg);
903 break;
jjako52c24142002-12-16 13:33:51 +0000904
Harald Weltebed35df2011-11-02 13:06:18 +0100905 case 'r': /* Remote host. */
906 if (local_args_info.remote_given) {
907 fprintf(stderr,
908 "%s: `--remote' (`-r') option given more than once%s\n",
909 argv[0],
910 (additional_error ? additional_error :
911 ""));
912 goto failure;
913 }
914 if (args_info->remote_given && !override)
915 continue;
916 local_args_info.remote_given = 1;
917 args_info->remote_given = 1;
918 if (args_info->remote_arg)
919 free(args_info->remote_arg); /* free previous string */
920 args_info->remote_arg = gengetopt_strdup(optarg);
921 if (args_info->remote_orig)
922 free(args_info->remote_orig); /* free previous string */
923 args_info->remote_orig = gengetopt_strdup(optarg);
924 break;
jjako52c24142002-12-16 13:33:51 +0000925
Harald Weltebed35df2011-11-02 13:06:18 +0100926 case 'a': /* Access point name. */
927 if (local_args_info.apn_given) {
928 fprintf(stderr,
929 "%s: `--apn' (`-a') option given more than once%s\n",
930 argv[0],
931 (additional_error ? additional_error :
932 ""));
933 goto failure;
934 }
935 if (args_info->apn_given && !override)
936 continue;
937 local_args_info.apn_given = 1;
938 args_info->apn_given = 1;
939 if (args_info->apn_arg)
940 free(args_info->apn_arg); /* free previous string */
941 args_info->apn_arg = gengetopt_strdup(optarg);
942 if (args_info->apn_orig)
943 free(args_info->apn_orig); /* free previous string */
944 args_info->apn_orig = gengetopt_strdup(optarg);
945 break;
jjako52c24142002-12-16 13:33:51 +0000946
Harald Weltebed35df2011-11-02 13:06:18 +0100947 case 'i': /* IMSI. */
948 if (local_args_info.imsi_given) {
949 fprintf(stderr,
950 "%s: `--imsi' (`-i') option given more than once%s\n",
951 argv[0],
952 (additional_error ? additional_error :
953 ""));
954 goto failure;
955 }
956 if (args_info->imsi_given && !override)
957 continue;
958 local_args_info.imsi_given = 1;
959 args_info->imsi_given = 1;
960 if (args_info->imsi_arg)
961 free(args_info->imsi_arg); /* free previous string */
962 args_info->imsi_arg = gengetopt_strdup(optarg);
963 if (args_info->imsi_orig)
964 free(args_info->imsi_orig); /* free previous string */
965 args_info->imsi_orig = gengetopt_strdup(optarg);
966 break;
jjako52c24142002-12-16 13:33:51 +0000967
Harald Weltebed35df2011-11-02 13:06:18 +0100968 case 'm': /* Mobile Station ISDN number. */
969 if (local_args_info.msisdn_given) {
970 fprintf(stderr,
971 "%s: `--msisdn' (`-m') option given more than once%s\n",
972 argv[0],
973 (additional_error ? additional_error :
974 ""));
975 goto failure;
976 }
977 if (args_info->msisdn_given && !override)
978 continue;
979 local_args_info.msisdn_given = 1;
980 args_info->msisdn_given = 1;
981 if (args_info->msisdn_arg)
982 free(args_info->msisdn_arg); /* free previous string */
983 args_info->msisdn_arg = gengetopt_strdup(optarg);
984 if (args_info->msisdn_orig)
985 free(args_info->msisdn_orig); /* free previous string */
986 args_info->msisdn_orig = gengetopt_strdup(optarg);
987 break;
jjako52c24142002-12-16 13:33:51 +0000988
Harald Weltebed35df2011-11-02 13:06:18 +0100989 case 'q': /* Requested quality of service. */
990 if (local_args_info.qos_given) {
991 fprintf(stderr,
992 "%s: `--qos' (`-q') option given more than once%s\n",
993 argv[0],
994 (additional_error ? additional_error :
995 ""));
996 goto failure;
997 }
998 if (args_info->qos_given && !override)
999 continue;
1000 local_args_info.qos_given = 1;
1001 args_info->qos_given = 1;
1002 args_info->qos_arg = strtol(optarg, &stop_char, 0);
1003 if (!(stop_char && *stop_char == '\0')) {
1004 fprintf(stderr,
1005 "%s: invalid numeric value: %s\n",
1006 argv[0], optarg);
1007 goto failure;
1008 }
1009 if (args_info->qos_orig)
1010 free(args_info->qos_orig); /* free previous string */
1011 args_info->qos_orig = gengetopt_strdup(optarg);
1012 break;
jjako52c24142002-12-16 13:33:51 +00001013
Harald Weltebed35df2011-11-02 13:06:18 +01001014 case 'u': /* Login user ID. */
1015 if (local_args_info.uid_given) {
1016 fprintf(stderr,
1017 "%s: `--uid' (`-u') option given more than once%s\n",
1018 argv[0],
1019 (additional_error ? additional_error :
1020 ""));
1021 goto failure;
1022 }
1023 if (args_info->uid_given && !override)
1024 continue;
1025 local_args_info.uid_given = 1;
1026 args_info->uid_given = 1;
1027 if (args_info->uid_arg)
1028 free(args_info->uid_arg); /* free previous string */
1029 args_info->uid_arg = gengetopt_strdup(optarg);
1030 if (args_info->uid_orig)
1031 free(args_info->uid_orig); /* free previous string */
1032 args_info->uid_orig = gengetopt_strdup(optarg);
1033 break;
jjako52c24142002-12-16 13:33:51 +00001034
Harald Weltebed35df2011-11-02 13:06:18 +01001035 case 'p': /* Login password. */
1036 if (local_args_info.pwd_given) {
1037 fprintf(stderr,
1038 "%s: `--pwd' (`-p') option given more than once%s\n",
1039 argv[0],
1040 (additional_error ? additional_error :
1041 ""));
1042 goto failure;
1043 }
1044 if (args_info->pwd_given && !override)
1045 continue;
1046 local_args_info.pwd_given = 1;
1047 args_info->pwd_given = 1;
1048 if (args_info->pwd_arg)
1049 free(args_info->pwd_arg); /* free previous string */
1050 args_info->pwd_arg = gengetopt_strdup(optarg);
1051 if (args_info->pwd_orig)
1052 free(args_info->pwd_orig); /* free previous string */
1053 args_info->pwd_orig = gengetopt_strdup(optarg);
1054 break;
jjako52c24142002-12-16 13:33:51 +00001055
Harald Weltebed35df2011-11-02 13:06:18 +01001056 case 'n': /* Network address for local interface. */
1057 if (local_args_info.net_given) {
1058 fprintf(stderr,
1059 "%s: `--net' (`-n') option given more than once%s\n",
1060 argv[0],
1061 (additional_error ? additional_error :
1062 ""));
1063 goto failure;
1064 }
1065 if (args_info->net_given && !override)
1066 continue;
1067 local_args_info.net_given = 1;
1068 args_info->net_given = 1;
1069 if (args_info->net_arg)
1070 free(args_info->net_arg); /* free previous string */
1071 args_info->net_arg = gengetopt_strdup(optarg);
1072 if (args_info->net_orig)
1073 free(args_info->net_orig); /* free previous string */
1074 args_info->net_orig = gengetopt_strdup(optarg);
1075 break;
jjako193e8b12003-11-10 12:31:41 +00001076
Harald Weltebed35df2011-11-02 13:06:18 +01001077 case 0: /* Long option with no short option */
1078 /* Filename of process id file. */
1079 if (strcmp(long_options[option_index].name, "pidfile")
1080 == 0) {
1081 if (local_args_info.pidfile_given) {
1082 fprintf(stderr,
1083 "%s: `--pidfile' option given more than once%s\n",
1084 argv[0],
1085 (additional_error ?
1086 additional_error : ""));
1087 goto failure;
1088 }
1089 if (args_info->pidfile_given && !override)
1090 continue;
1091 local_args_info.pidfile_given = 1;
1092 args_info->pidfile_given = 1;
1093 if (args_info->pidfile_arg)
1094 free(args_info->pidfile_arg); /* free previous string */
1095 args_info->pidfile_arg =
1096 gengetopt_strdup(optarg);
1097 if (args_info->pidfile_orig)
1098 free(args_info->pidfile_orig); /* free previous string */
1099 args_info->pidfile_orig =
1100 gengetopt_strdup(optarg);
1101 }
1102 /* Directory of nonvolatile data. */
1103 else if (strcmp
1104 (long_options[option_index].name,
1105 "statedir") == 0) {
1106 if (local_args_info.statedir_given) {
1107 fprintf(stderr,
1108 "%s: `--statedir' option given more than once%s\n",
1109 argv[0],
1110 (additional_error ?
1111 additional_error : ""));
1112 goto failure;
1113 }
1114 if (args_info->statedir_given && !override)
1115 continue;
1116 local_args_info.statedir_given = 1;
1117 args_info->statedir_given = 1;
1118 if (args_info->statedir_arg)
1119 free(args_info->statedir_arg); /* free previous string */
1120 args_info->statedir_arg =
1121 gengetopt_strdup(optarg);
1122 if (args_info->statedir_orig)
1123 free(args_info->statedir_orig); /* free previous string */
1124 args_info->statedir_orig =
1125 gengetopt_strdup(optarg);
1126 }
1127 /* DNS Server to use. */
1128 else if (strcmp(long_options[option_index].name, "dns")
1129 == 0) {
1130 if (local_args_info.dns_given) {
1131 fprintf(stderr,
1132 "%s: `--dns' option given more than once%s\n",
1133 argv[0],
1134 (additional_error ?
1135 additional_error : ""));
1136 goto failure;
1137 }
1138 if (args_info->dns_given && !override)
1139 continue;
1140 local_args_info.dns_given = 1;
1141 args_info->dns_given = 1;
1142 if (args_info->dns_arg)
1143 free(args_info->dns_arg); /* free previous string */
1144 args_info->dns_arg = gengetopt_strdup(optarg);
1145 if (args_info->dns_orig)
1146 free(args_info->dns_orig); /* free previous string */
1147 args_info->dns_orig = gengetopt_strdup(optarg);
1148 }
1149 /* Number of contexts. */
1150 else if (strcmp
1151 (long_options[option_index].name,
1152 "contexts") == 0) {
1153 if (local_args_info.contexts_given) {
1154 fprintf(stderr,
1155 "%s: `--contexts' option given more than once%s\n",
1156 argv[0],
1157 (additional_error ?
1158 additional_error : ""));
1159 goto failure;
1160 }
1161 if (args_info->contexts_given && !override)
1162 continue;
1163 local_args_info.contexts_given = 1;
1164 args_info->contexts_given = 1;
1165 args_info->contexts_arg =
1166 strtol(optarg, &stop_char, 0);
1167 if (!(stop_char && *stop_char == '\0')) {
1168 fprintf(stderr,
1169 "%s: invalid numeric value: %s\n",
1170 argv[0], optarg);
1171 goto failure;
1172 }
1173 if (args_info->contexts_orig)
1174 free(args_info->contexts_orig); /* free previous string */
1175 args_info->contexts_orig =
1176 gengetopt_strdup(optarg);
1177 }
1178 /* Exit after timelimit seconds. */
1179 else if (strcmp
1180 (long_options[option_index].name,
1181 "timelimit") == 0) {
1182 if (local_args_info.timelimit_given) {
1183 fprintf(stderr,
1184 "%s: `--timelimit' option given more than once%s\n",
1185 argv[0],
1186 (additional_error ?
1187 additional_error : ""));
1188 goto failure;
1189 }
1190 if (args_info->timelimit_given && !override)
1191 continue;
1192 local_args_info.timelimit_given = 1;
1193 args_info->timelimit_given = 1;
1194 args_info->timelimit_arg =
1195 strtol(optarg, &stop_char, 0);
1196 if (!(stop_char && *stop_char == '\0')) {
1197 fprintf(stderr,
1198 "%s: invalid numeric value: %s\n",
1199 argv[0], optarg);
1200 goto failure;
1201 }
1202 if (args_info->timelimit_orig)
1203 free(args_info->timelimit_orig); /* free previous string */
1204 args_info->timelimit_orig =
1205 gengetopt_strdup(optarg);
1206 }
1207 /* GTP version to use. */
1208 else if (strcmp
1209 (long_options[option_index].name,
1210 "gtpversion") == 0) {
1211 if (local_args_info.gtpversion_given) {
1212 fprintf(stderr,
1213 "%s: `--gtpversion' option given more than once%s\n",
1214 argv[0],
1215 (additional_error ?
1216 additional_error : ""));
1217 goto failure;
1218 }
1219 if (args_info->gtpversion_given && !override)
1220 continue;
1221 local_args_info.gtpversion_given = 1;
1222 args_info->gtpversion_given = 1;
1223 args_info->gtpversion_arg =
1224 strtol(optarg, &stop_char, 0);
1225 if (!(stop_char && *stop_char == '\0')) {
1226 fprintf(stderr,
1227 "%s: invalid numeric value: %s\n",
1228 argv[0], optarg);
1229 goto failure;
1230 }
1231 if (args_info->gtpversion_orig)
1232 free(args_info->gtpversion_orig); /* free previous string */
1233 args_info->gtpversion_orig =
1234 gengetopt_strdup(optarg);
1235 }
1236 /* Selection mode. */
1237 else if (strcmp
1238 (long_options[option_index].name,
1239 "selmode") == 0) {
1240 if (local_args_info.selmode_given) {
1241 fprintf(stderr,
1242 "%s: `--selmode' option given more than once%s\n",
1243 argv[0],
1244 (additional_error ?
1245 additional_error : ""));
1246 goto failure;
1247 }
1248 if (args_info->selmode_given && !override)
1249 continue;
1250 local_args_info.selmode_given = 1;
1251 args_info->selmode_given = 1;
1252 args_info->selmode_arg =
1253 strtol(optarg, &stop_char, 0);
1254 if (!(stop_char && *stop_char == '\0')) {
1255 fprintf(stderr,
1256 "%s: invalid numeric value: %s\n",
1257 argv[0], optarg);
1258 goto failure;
1259 }
1260 if (args_info->selmode_orig)
1261 free(args_info->selmode_orig); /* free previous string */
1262 args_info->selmode_orig =
1263 gengetopt_strdup(optarg);
1264 }
1265 /* QoS Extension 1. */
1266 else if (strcmp
1267 (long_options[option_index].name,
1268 "qose1") == 0) {
1269 if (args_info->qose1_given) {
1270 fprintf(stderr,
1271 "%s: `--qose1' option given more than once\n",
1272 PACKAGE);
1273 exit(EXIT_FAILURE);
1274 }
1275 args_info->qose1_given = 1;
1276 args_info->qose1_arg =
1277 strtoull(optarg, &stop_char, 0);
1278 if (!(stop_char && *stop_char == '\0')) {
1279 fprintf(stderr,
1280 "%s: invalid numeric value: %s\n",
1281 argv[0], optarg);
1282 goto failure;
1283 }
1284 if (args_info->qose1_orig)
1285 free(args_info->qose1_orig); /* free previous string */
1286 args_info->qose1_orig =
1287 gengetopt_strdup(optarg);
1288 break;
1289 }
1290 /* QoS Extension 2. */
1291 else if (strcmp
1292 (long_options[option_index].name,
1293 "qose2") == 0) {
1294 if (args_info->qose2_given) {
1295 fprintf(stderr,
1296 "%s: `--qose2' option given more than once\n",
1297 PACKAGE);
1298 exit(EXIT_FAILURE);
1299 }
1300 args_info->qose2_given = 1;
1301 args_info->qose2_arg =
1302 strtol(optarg, &stop_char, 0);
1303 if (!(stop_char && *stop_char == '\0')) {
1304 fprintf(stderr,
1305 "%s: invalid numeric value: %s\n",
1306 argv[0], optarg);
1307 goto failure;
1308 }
1309 if (args_info->qose2_orig)
1310 free(args_info->qose2_orig); /* free previous string */
1311 args_info->qose2_orig =
1312 gengetopt_strdup(optarg);
1313 break;
1314 }
1315 /* QoS Extension 3. */
1316 else if (strcmp
1317 (long_options[option_index].name,
1318 "qose3") == 0) {
1319 if (args_info->qose3_given) {
1320 fprintf(stderr,
1321 "%s: `--qose3' option given more than once\n",
1322 PACKAGE);
1323 exit(EXIT_FAILURE);
1324 }
1325 args_info->qose3_given = 1;
1326 args_info->qose3_arg =
1327 strtol(optarg, &stop_char, 0);
1328 if (!(stop_char && *stop_char == '\0')) {
1329 fprintf(stderr,
1330 "%s: invalid numeric value: %s\n",
1331 argv[0], optarg);
1332 goto failure;
1333 }
1334 if (args_info->qose3_orig)
1335 free(args_info->qose3_orig); /* free previous string */
1336 args_info->qose3_orig =
1337 gengetopt_strdup(optarg);
1338 break;
1339 }
1340 /* QoS Extension 4. */
1341 else if (strcmp
1342 (long_options[option_index].name,
1343 "qose4") == 0) {
1344 if (args_info->qose4_given) {
1345 fprintf(stderr,
1346 "%s: `--qose4' option given more than once\n",
1347 PACKAGE);
1348 exit(EXIT_FAILURE);
1349 }
1350 args_info->qose4_given = 1;
1351 args_info->qose4_arg =
1352 strtol(optarg, &stop_char, 0);
1353 if (!(stop_char && *stop_char == '\0')) {
1354 fprintf(stderr,
1355 "%s: invalid numeric value: %s\n",
1356 argv[0], optarg);
1357 goto failure;
1358 }
1359 if (args_info->qose4_orig)
1360 free(args_info->qose4_orig); /* free previous string */
1361 args_info->qose4_orig =
1362 gengetopt_strdup(optarg);
1363 break;
1364 }
1365 /* Radio Access Technology Type. */
1366 else if (strcmp
1367 (long_options[option_index].name,
1368 "rattype") == 0) {
1369 if (args_info->rattype_given) {
1370 fprintf(stderr,
1371 "%s: `--rattype' option given more than once\n",
1372 PACKAGE);
1373 exit(EXIT_FAILURE);
1374 }
1375 args_info->rattype_given = 1;
1376 /* args_info->rattype_arg = strtol (optarg,&stop_char,0); */
1377 args_info->rattype_arg = strdup(optarg);
1378 break;
1379 }
1380 /* User Location Information. */
1381 else if (strcmp
1382 (long_options[option_index].name,
1383 "userloc") == 0) {
1384 if (args_info->userloc_given) {
1385 fprintf(stderr,
1386 "%s: `--userloc' option given more than once\n",
1387 PACKAGE);
1388 exit(EXIT_FAILURE);
1389 }
1390 args_info->userloc_given = 1;
1391 args_info->userloc_arg = strdup(optarg);
1392 break;
1393 }
1394 /* Routing Area Information. */
1395 else if (strcmp(long_options[option_index].name, "rai")
1396 == 0) {
1397 if (args_info->rai_given) {
1398 fprintf(stderr,
1399 "%s: `--rai' option given more than once\n",
1400 PACKAGE);
1401 exit(EXIT_FAILURE);
1402 }
1403 args_info->rai_given = 1;
1404 args_info->rai_arg = strdup(optarg);
1405 break;
1406 }
1407 /* MS Time Zone */
1408 else if (strcmp(long_options[option_index].name, "mstz")
1409 == 0) {
1410 if (args_info->mstz_given) {
1411 fprintf(stderr,
1412 "%s: `--mstz' option given more than once\n",
1413 PACKAGE);
1414 exit(EXIT_FAILURE);
1415 }
1416 args_info->mstz_given = 1;
1417 args_info->mstz_arg = strdup(optarg);
1418 break;
1419 }
1420 /* IMEI(SV) */
1421 else if (strcmp
1422 (long_options[option_index].name,
1423 "imeisv") == 0) {
1424 if (args_info->imeisv_given) {
1425 fprintf(stderr,
1426 "%s: `--imeisv' option given more than once\n",
1427 PACKAGE);
1428 exit(EXIT_FAILURE);
1429 }
1430 args_info->imeisv_given = 1;
1431 args_info->imeisv_arg = strdup(optarg);
1432 break;
1433 }
1434 /* NSAPI. */
1435 else if (strcmp
1436 (long_options[option_index].name,
1437 "nsapi") == 0) {
1438 if (local_args_info.nsapi_given) {
1439 fprintf(stderr,
1440 "%s: `--nsapi' option given more than once%s\n",
1441 argv[0],
1442 (additional_error ?
1443 additional_error : ""));
1444 goto failure;
1445 }
1446 if (args_info->nsapi_given && !override)
1447 continue;
1448 local_args_info.nsapi_given = 1;
1449 args_info->nsapi_given = 1;
1450 args_info->nsapi_arg =
1451 strtol(optarg, &stop_char, 0);
1452 if (!(stop_char && *stop_char == '\0')) {
1453 fprintf(stderr,
1454 "%s: invalid numeric value: %s\n",
1455 argv[0], optarg);
1456 goto failure;
1457 }
1458 if (args_info->nsapi_orig)
1459 free(args_info->nsapi_orig); /* free previous string */
1460 args_info->nsapi_orig =
1461 gengetopt_strdup(optarg);
1462 }
1463 /* Charging characteristics. */
1464 else if (strcmp
1465 (long_options[option_index].name,
1466 "charging") == 0) {
1467 if (local_args_info.charging_given) {
1468 fprintf(stderr,
1469 "%s: `--charging' option given more than once%s\n",
1470 argv[0],
1471 (additional_error ?
1472 additional_error : ""));
1473 goto failure;
1474 }
1475 if (args_info->charging_given && !override)
1476 continue;
1477 local_args_info.charging_given = 1;
1478 args_info->charging_given = 1;
1479 args_info->charging_arg =
1480 strtol(optarg, &stop_char, 0);
1481 if (!(stop_char && *stop_char == '\0')) {
1482 fprintf(stderr,
1483 "%s: invalid numeric value: %s\n",
1484 argv[0], optarg);
1485 goto failure;
1486 }
1487 if (args_info->charging_orig)
1488 free(args_info->charging_orig); /* free previous string */
1489 args_info->charging_orig =
1490 gengetopt_strdup(optarg);
1491 }
1492 /* Create local network interface. */
1493 else if (strcmp
1494 (long_options[option_index].name,
1495 "createif") == 0) {
1496 if (local_args_info.createif_given) {
1497 fprintf(stderr,
1498 "%s: `--createif' option given more than once%s\n",
1499 argv[0],
1500 (additional_error ?
1501 additional_error : ""));
1502 goto failure;
1503 }
1504 if (args_info->createif_given && !override)
1505 continue;
1506 local_args_info.createif_given = 1;
1507 args_info->createif_given = 1;
1508 args_info->createif_flag =
1509 !(args_info->createif_flag);
1510 }
1511 /* Create default route. */
1512 else if (strcmp
1513 (long_options[option_index].name,
1514 "defaultroute") == 0) {
1515 if (local_args_info.defaultroute_given) {
1516 fprintf(stderr,
1517 "%s: `--defaultroute' option given more than once%s\n",
1518 argv[0],
1519 (additional_error ?
1520 additional_error : ""));
1521 goto failure;
1522 }
1523 if (args_info->defaultroute_given && !override)
1524 continue;
1525 local_args_info.defaultroute_given = 1;
1526 args_info->defaultroute_given = 1;
1527 args_info->defaultroute_flag =
1528 !(args_info->defaultroute_flag);
1529 }
1530 /* Script to run after link-up. */
1531 else if (strcmp(long_options[option_index].name, "ipup")
1532 == 0) {
1533 if (local_args_info.ipup_given) {
1534 fprintf(stderr,
1535 "%s: `--ipup' option given more than once%s\n",
1536 argv[0],
1537 (additional_error ?
1538 additional_error : ""));
1539 goto failure;
1540 }
1541 if (args_info->ipup_given && !override)
1542 continue;
1543 local_args_info.ipup_given = 1;
1544 args_info->ipup_given = 1;
1545 if (args_info->ipup_arg)
1546 free(args_info->ipup_arg); /* free previous string */
1547 args_info->ipup_arg = gengetopt_strdup(optarg);
1548 if (args_info->ipup_orig)
1549 free(args_info->ipup_orig); /* free previous string */
1550 args_info->ipup_orig = gengetopt_strdup(optarg);
1551 }
1552 /* Script to run after link-down. */
1553 else if (strcmp
1554 (long_options[option_index].name,
1555 "ipdown") == 0) {
1556 if (local_args_info.ipdown_given) {
1557 fprintf(stderr,
1558 "%s: `--ipdown' option given more than once%s\n",
1559 argv[0],
1560 (additional_error ?
1561 additional_error : ""));
1562 goto failure;
1563 }
1564 if (args_info->ipdown_given && !override)
1565 continue;
1566 local_args_info.ipdown_given = 1;
1567 args_info->ipdown_given = 1;
1568 if (args_info->ipdown_arg)
1569 free(args_info->ipdown_arg); /* free previous string */
1570 args_info->ipdown_arg =
1571 gengetopt_strdup(optarg);
1572 if (args_info->ipdown_orig)
1573 free(args_info->ipdown_orig); /* free previous string */
1574 args_info->ipdown_orig =
1575 gengetopt_strdup(optarg);
1576 }
1577 /* Ping remote host. */
1578 else if (strcmp
1579 (long_options[option_index].name,
1580 "pinghost") == 0) {
1581 if (local_args_info.pinghost_given) {
1582 fprintf(stderr,
1583 "%s: `--pinghost' option given more than once%s\n",
1584 argv[0],
1585 (additional_error ?
1586 additional_error : ""));
1587 goto failure;
1588 }
1589 if (args_info->pinghost_given && !override)
1590 continue;
1591 local_args_info.pinghost_given = 1;
1592 args_info->pinghost_given = 1;
1593 if (args_info->pinghost_arg)
1594 free(args_info->pinghost_arg); /* free previous string */
1595 args_info->pinghost_arg =
1596 gengetopt_strdup(optarg);
1597 if (args_info->pinghost_orig)
1598 free(args_info->pinghost_orig); /* free previous string */
1599 args_info->pinghost_orig =
1600 gengetopt_strdup(optarg);
1601 }
1602 /* Number of ping req per second. */
1603 else if (strcmp
1604 (long_options[option_index].name,
1605 "pingrate") == 0) {
1606 if (local_args_info.pingrate_given) {
1607 fprintf(stderr,
1608 "%s: `--pingrate' option given more than once%s\n",
1609 argv[0],
1610 (additional_error ?
1611 additional_error : ""));
1612 goto failure;
1613 }
1614 if (args_info->pingrate_given && !override)
1615 continue;
1616 local_args_info.pingrate_given = 1;
1617 args_info->pingrate_given = 1;
1618 args_info->pingrate_arg =
1619 strtol(optarg, &stop_char, 0);
1620 if (!(stop_char && *stop_char == '\0')) {
1621 fprintf(stderr,
1622 "%s: invalid numeric value: %s\n",
1623 argv[0], optarg);
1624 goto failure;
1625 }
1626 if (args_info->pingrate_orig)
1627 free(args_info->pingrate_orig); /* free previous string */
1628 args_info->pingrate_orig =
1629 gengetopt_strdup(optarg);
1630 }
1631 /* Number of ping data bytes. */
1632 else if (strcmp
1633 (long_options[option_index].name,
1634 "pingsize") == 0) {
1635 if (local_args_info.pingsize_given) {
1636 fprintf(stderr,
1637 "%s: `--pingsize' option given more than once%s\n",
1638 argv[0],
1639 (additional_error ?
1640 additional_error : ""));
1641 goto failure;
1642 }
1643 if (args_info->pingsize_given && !override)
1644 continue;
1645 local_args_info.pingsize_given = 1;
1646 args_info->pingsize_given = 1;
1647 args_info->pingsize_arg =
1648 strtol(optarg, &stop_char, 0);
1649 if (!(stop_char && *stop_char == '\0')) {
1650 fprintf(stderr,
1651 "%s: invalid numeric value: %s\n",
1652 argv[0], optarg);
1653 goto failure;
1654 }
1655 if (args_info->pingsize_orig)
1656 free(args_info->pingsize_orig); /* free previous string */
1657 args_info->pingsize_orig =
1658 gengetopt_strdup(optarg);
1659 }
1660 /* Number of ping req to send. */
1661 else if (strcmp
1662 (long_options[option_index].name,
1663 "pingcount") == 0) {
1664 if (local_args_info.pingcount_given) {
1665 fprintf(stderr,
1666 "%s: `--pingcount' option given more than once%s\n",
1667 argv[0],
1668 (additional_error ?
1669 additional_error : ""));
1670 goto failure;
1671 }
1672 if (args_info->pingcount_given && !override)
1673 continue;
1674 local_args_info.pingcount_given = 1;
1675 args_info->pingcount_given = 1;
1676 args_info->pingcount_arg =
1677 strtol(optarg, &stop_char, 0);
1678 if (!(stop_char && *stop_char == '\0')) {
1679 fprintf(stderr,
1680 "%s: invalid numeric value: %s\n",
1681 argv[0], optarg);
1682 goto failure;
1683 }
1684 if (args_info->pingcount_orig)
1685 free(args_info->pingcount_orig); /* free previous string */
1686 args_info->pingcount_orig =
1687 gengetopt_strdup(optarg);
1688 }
1689 /* Do not print ping packet info. */
1690 else if (strcmp
1691 (long_options[option_index].name,
1692 "pingquiet") == 0) {
1693 if (local_args_info.pingquiet_given) {
1694 fprintf(stderr,
1695 "%s: `--pingquiet' option given more than once%s\n",
1696 argv[0],
1697 (additional_error ?
1698 additional_error : ""));
1699 goto failure;
1700 }
1701 if (args_info->pingquiet_given && !override)
1702 continue;
1703 local_args_info.pingquiet_given = 1;
1704 args_info->pingquiet_given = 1;
1705 args_info->pingquiet_flag =
1706 !(args_info->pingquiet_flag);
1707 }
1708 /* Do not send recovery. */
1709 else if (strcmp
1710 (long_options[option_index].name,
1711 "norecovery") == 0) {
1712 if (local_args_info.norecovery_given) {
1713 fprintf(stderr,
1714 "%s: `--norecovery' option given more than once%s\n",
1715 argv[0],
1716 (additional_error ?
1717 additional_error : ""));
1718 goto failure;
1719 }
1720 if (args_info->norecovery_given && !override)
1721 continue;
1722 local_args_info.norecovery_given = 1;
1723 args_info->norecovery_given = 1;
1724 args_info->norecovery_flag =
1725 !(args_info->norecovery_flag);
1726 }
jjako52c24142002-12-16 13:33:51 +00001727
Harald Weltebed35df2011-11-02 13:06:18 +01001728 break;
1729 case '?': /* Invalid option. */
1730 /* `getopt_long' already printed an error message. */
1731 goto failure;
jjako52c24142002-12-16 13:33:51 +00001732
Harald Weltebed35df2011-11-02 13:06:18 +01001733 default: /* bug: option not considered. */
1734 fprintf(stderr, "%s: option unknown: %c%s\n",
1735 CMDLINE_PARSER_PACKAGE, c,
1736 (additional_error ? additional_error : ""));
1737 abort();
1738 } /* switch */
1739 } /* while */
jjako52c24142002-12-16 13:33:51 +00001740
Harald Weltebed35df2011-11-02 13:06:18 +01001741 cmdline_parser_release(&local_args_info);
jjako52c24142002-12-16 13:33:51 +00001742
Harald Weltebed35df2011-11-02 13:06:18 +01001743 if (error)
1744 return (EXIT_FAILURE);
Harald Welte1b3e5772010-05-04 11:13:56 +02001745
Harald Weltebed35df2011-11-02 13:06:18 +01001746 return 0;
Harald Welte1b3e5772010-05-04 11:13:56 +02001747
1748failure:
Harald Weltebed35df2011-11-02 13:06:18 +01001749
1750 cmdline_parser_release(&local_args_info);
1751 return (EXIT_FAILURE);
jjako52c24142002-12-16 13:33:51 +00001752}
1753
Harald Welte1b3e5772010-05-04 11:13:56 +02001754#ifndef CONFIG_FILE_LINE_SIZE
1755#define CONFIG_FILE_LINE_SIZE 2048
1756#endif
1757#define ADDITIONAL_ERROR " in configuration file "
1758
1759#define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3)
1760/* 3 is for "--" and "=" */
1761
Harald Weltebed35df2011-11-02 13:06:18 +01001762char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE + 1];
jjako52c24142002-12-16 13:33:51 +00001763
1764int
Harald Weltebed35df2011-11-02 13:06:18 +01001765cmdline_parser_configfile(char *const filename,
1766 struct gengetopt_args_info *args_info, int override,
1767 int initialize, int check_required)
jjako52c24142002-12-16 13:33:51 +00001768{
Harald Weltebed35df2011-11-02 13:06:18 +01001769 FILE *file;
1770 char linebuf[CONFIG_FILE_LINE_SIZE];
1771 int line_num = 0;
1772 int i, result, equal;
1773 char *fopt, *farg;
1774 char *str_index;
1775 size_t len, next_token;
1776 char delimiter;
1777 int my_argc = 0;
1778 char **my_argv_arg;
1779 char *additional_error;
Harald Welte1b3e5772010-05-04 11:13:56 +02001780
Harald Weltebed35df2011-11-02 13:06:18 +01001781 /* store the program name */
1782 cmd_line_list_tmp =
1783 (struct line_list *)malloc(sizeof(struct line_list));
1784 cmd_line_list_tmp->next = cmd_line_list;
1785 cmd_line_list = cmd_line_list_tmp;
1786 cmd_line_list->string_arg = gengetopt_strdup(CMDLINE_PARSER_PACKAGE);
jjako52c24142002-12-16 13:33:51 +00001787
Harald Weltebed35df2011-11-02 13:06:18 +01001788 if ((file = fopen(filename, "r")) == NULL) {
1789 fprintf(stderr, "%s: Error opening configuration file '%s'\n",
1790 CMDLINE_PARSER_PACKAGE, filename);
1791 result = EXIT_FAILURE;
1792 goto conf_failure;
1793 }
jjako52c24142002-12-16 13:33:51 +00001794
Harald Weltebed35df2011-11-02 13:06:18 +01001795 while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != NULL) {
1796 ++line_num;
1797 my_argv[0] = '\0';
1798 len = strlen(linebuf);
1799 if (len > (CONFIG_FILE_LINE_BUFFER_SIZE - 1)) {
1800 fprintf(stderr,
1801 "%s:%s:%d: Line too long in configuration file\n",
1802 CMDLINE_PARSER_PACKAGE, filename, line_num);
1803 result = EXIT_FAILURE;
1804 goto conf_failure;
1805 }
jjako52c24142002-12-16 13:33:51 +00001806
Harald Weltebed35df2011-11-02 13:06:18 +01001807 /* find first non-whitespace character in the line */
1808 next_token = strspn(linebuf, " \t\r\n");
1809 str_index = linebuf + next_token;
jjako52c24142002-12-16 13:33:51 +00001810
Harald Weltebed35df2011-11-02 13:06:18 +01001811 if (str_index[0] == '\0' || str_index[0] == '#')
1812 continue; /* empty line or comment line is skipped */
Harald Welte1b3e5772010-05-04 11:13:56 +02001813
Harald Weltebed35df2011-11-02 13:06:18 +01001814 fopt = str_index;
Harald Welte1b3e5772010-05-04 11:13:56 +02001815
Harald Weltebed35df2011-11-02 13:06:18 +01001816 /* truncate fopt at the end of the first non-valid character */
1817 next_token = strcspn(fopt, " \t\r\n=");
Harald Welte1b3e5772010-05-04 11:13:56 +02001818
Harald Weltebed35df2011-11-02 13:06:18 +01001819 if (fopt[next_token] == '\0') { /* the line is over */
1820 farg = NULL;
1821 equal = 0;
1822 goto noarg;
1823 }
Harald Welte1b3e5772010-05-04 11:13:56 +02001824
Harald Weltebed35df2011-11-02 13:06:18 +01001825 /* remember if equal sign is present */
1826 equal = (fopt[next_token] == '=');
1827 fopt[next_token++] = '\0';
Harald Welte1b3e5772010-05-04 11:13:56 +02001828
Harald Weltebed35df2011-11-02 13:06:18 +01001829 /* advance pointers to the next token after the end of fopt */
1830 next_token += strspn(fopt + next_token, " \t\r\n");
1831 /* check for the presence of equal sign, and if so, skip it */
1832 if (!equal)
1833 if ((equal = (fopt[next_token] == '='))) {
1834 next_token++;
1835 next_token +=
1836 strspn(fopt + next_token, " \t\r\n");
1837 }
1838 str_index += next_token;
Harald Welte1b3e5772010-05-04 11:13:56 +02001839
Harald Weltebed35df2011-11-02 13:06:18 +01001840 /* find argument */
1841 farg = str_index;
1842 if (farg[0] == '\"' || farg[0] == '\'') { /* quoted argument */
1843 str_index = strchr(++farg, str_index[0]); /* skip opening quote */
1844 if (!str_index) {
1845 fprintf
1846 (stderr,
1847 "%s:%s:%d: unterminated string in configuration file\n",
1848 CMDLINE_PARSER_PACKAGE, filename,
1849 line_num);
1850 result = EXIT_FAILURE;
1851 goto conf_failure;
1852 }
1853 } else { /* read up the remaining part up to a delimiter */
1854 next_token = strcspn(farg, " \t\r\n#\'\"");
1855 str_index += next_token;
1856 }
Harald Welte1b3e5772010-05-04 11:13:56 +02001857
Harald Weltebed35df2011-11-02 13:06:18 +01001858 /* truncate farg at the delimiter and store it for further check */
1859 delimiter = *str_index, *str_index++ = '\0';
Harald Welte1b3e5772010-05-04 11:13:56 +02001860
Harald Weltebed35df2011-11-02 13:06:18 +01001861 /* everything but comment is illegal at the end of line */
1862 if (delimiter != '\0' && delimiter != '#') {
1863 str_index += strspn(str_index, " \t\r\n");
1864 if (*str_index != '\0' && *str_index != '#') {
1865 fprintf
1866 (stderr,
1867 "%s:%s:%d: malformed string in configuration file\n",
1868 CMDLINE_PARSER_PACKAGE, filename,
1869 line_num);
1870 result = EXIT_FAILURE;
1871 goto conf_failure;
1872 }
1873 }
Harald Welte1b3e5772010-05-04 11:13:56 +02001874
Harald Weltebed35df2011-11-02 13:06:18 +01001875noarg:
1876 ++my_argc;
1877 len = strlen(fopt);
Harald Welte1b3e5772010-05-04 11:13:56 +02001878
Harald Weltebed35df2011-11-02 13:06:18 +01001879 strcat(my_argv, len > 1 ? "--" : "-");
1880 strcat(my_argv, fopt);
1881 if (len > 1 && ((farg && *farg) || equal))
1882 strcat(my_argv, "=");
1883 if (farg && *farg)
1884 strcat(my_argv, farg);
Harald Welte1b3e5772010-05-04 11:13:56 +02001885
Harald Weltebed35df2011-11-02 13:06:18 +01001886 cmd_line_list_tmp =
1887 (struct line_list *)malloc(sizeof(struct line_list));
1888 cmd_line_list_tmp->next = cmd_line_list;
1889 cmd_line_list = cmd_line_list_tmp;
1890 cmd_line_list->string_arg = gengetopt_strdup(my_argv);
1891 } /* while */
jjako52c24142002-12-16 13:33:51 +00001892
Harald Weltebed35df2011-11-02 13:06:18 +01001893 ++my_argc; /* for program name */
1894 my_argv_arg = (char **)malloc((my_argc + 1) * sizeof(char *));
1895 cmd_line_list_tmp = cmd_line_list;
1896 for (i = my_argc - 1; i >= 0; --i) {
1897 my_argv_arg[i] = cmd_line_list_tmp->string_arg;
1898 cmd_line_list_tmp = cmd_line_list_tmp->next;
1899 }
1900 my_argv_arg[my_argc] = 0;
Harald Welte1b3e5772010-05-04 11:13:56 +02001901
Harald Weltebed35df2011-11-02 13:06:18 +01001902 additional_error =
1903 (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) + 1);
1904 strcpy(additional_error, ADDITIONAL_ERROR);
1905 strcat(additional_error, filename);
1906 result =
1907 cmdline_parser_internal(my_argc, my_argv_arg, args_info, override,
1908 initialize, check_required,
1909 additional_error);
Harald Welte1b3e5772010-05-04 11:13:56 +02001910
Harald Weltebed35df2011-11-02 13:06:18 +01001911 free(additional_error);
1912 free(my_argv_arg);
Harald Welte1b3e5772010-05-04 11:13:56 +02001913
1914conf_failure:
Harald Weltebed35df2011-11-02 13:06:18 +01001915 if (file)
1916 fclose(file);
Harald Welte1b3e5772010-05-04 11:13:56 +02001917
Harald Weltebed35df2011-11-02 13:06:18 +01001918 free_cmd_list();
1919 if (result == EXIT_FAILURE) {
1920 cmdline_parser_free(args_info);
1921 exit(EXIT_FAILURE);
1922 }
1923
1924 return result;
jjako52c24142002-12-16 13:33:51 +00001925}