Added --alarm
[untie.git] / cmdline.c
blob8727c2cd4fde4f92ec1689ef2b2d13062a92790b
1 /*
2 File autogenerated by gengetopt version 2.19.1
3 generated with the following command:
4 gengetopt -uCOMMAND --set-version=0.3
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 */
11 /* If we use autoconf. */
12 #ifdef HAVE_CONFIG_H
13 #include "config.h"
14 #endif
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
20 #include "getopt.h"
22 #include "cmdline.h"
24 const char *gengetopt_args_info_purpose = "";
26 const char *gengetopt_args_info_usage = "Usage: untie [OPTIONS]... [COMMAND]...";
28 const char *gengetopt_args_info_description = "";
30 const char *gengetopt_args_info_help[] = {
31 " -h, --help Print help and exit",
32 " -V, --version Print version and exit",
33 " --mount New mount namespace (default=off)",
34 " --uname New uname (default=off)",
35 " --ipc New IPC context (default=off)",
36 " --mask=MASK Pass user defined flag",
37 " --chroot=DIRECTORY Chroot in the specified directory",
38 " --uid=UID Change to the specified UID",
39 " --username=USERNAME Change to the specified username",
40 " --gid=GID Add the specified GID",
41 " --groupname=GROUP Add the specified group",
42 " --daemonize Run as daemon (default=off)",
43 " --alarm=SECONDS Set an alarm after the specified delay",
47 static
48 void clear_given (struct gengetopt_args_info *args_info);
49 static
50 void clear_args (struct gengetopt_args_info *args_info);
52 static int
53 cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required, const char *additional_error);
55 static int
56 cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error);
58 struct int_list
60 int arg;
61 char *orig;
62 struct int_list * next;
65 struct string_list
67 char * arg;
68 char *orig;
69 struct string_list * next;
72 static char *
73 gengetopt_strdup (const char *s);
75 static
76 void clear_given (struct gengetopt_args_info *args_info)
78 args_info->help_given = 0 ;
79 args_info->version_given = 0 ;
80 args_info->mount_given = 0 ;
81 args_info->uname_given = 0 ;
82 args_info->ipc_given = 0 ;
83 args_info->mask_given = 0 ;
84 args_info->chroot_given = 0 ;
85 args_info->uid_given = 0 ;
86 args_info->username_given = 0 ;
87 args_info->gid_given = 0 ;
88 args_info->groupname_given = 0 ;
89 args_info->daemonize_given = 0 ;
90 args_info->alarm_given = 0 ;
93 static
94 void clear_args (struct gengetopt_args_info *args_info)
96 args_info->mount_flag = 0;
97 args_info->uname_flag = 0;
98 args_info->ipc_flag = 0;
99 args_info->mask_arg = NULL;
100 args_info->mask_orig = NULL;
101 args_info->chroot_arg = NULL;
102 args_info->chroot_orig = NULL;
103 args_info->uid_orig = NULL;
104 args_info->username_arg = NULL;
105 args_info->username_orig = NULL;
106 args_info->gid_arg = NULL;
107 args_info->gid_orig = NULL;
108 args_info->groupname_arg = NULL;
109 args_info->groupname_orig = NULL;
110 args_info->daemonize_flag = 0;
111 args_info->alarm_orig = NULL;
115 static
116 void init_args_info(struct gengetopt_args_info *args_info)
118 args_info->help_help = gengetopt_args_info_help[0] ;
119 args_info->version_help = gengetopt_args_info_help[1] ;
120 args_info->mount_help = gengetopt_args_info_help[2] ;
121 args_info->uname_help = gengetopt_args_info_help[3] ;
122 args_info->ipc_help = gengetopt_args_info_help[4] ;
123 args_info->mask_help = gengetopt_args_info_help[5] ;
124 args_info->mask_min = -1;
125 args_info->mask_max = -1;
126 args_info->chroot_help = gengetopt_args_info_help[6] ;
127 args_info->uid_help = gengetopt_args_info_help[7] ;
128 args_info->username_help = gengetopt_args_info_help[8] ;
129 args_info->gid_help = gengetopt_args_info_help[9] ;
130 args_info->gid_min = -1;
131 args_info->gid_max = -1;
132 args_info->groupname_help = gengetopt_args_info_help[10] ;
133 args_info->groupname_min = -1;
134 args_info->groupname_max = -1;
135 args_info->daemonize_help = gengetopt_args_info_help[11] ;
136 args_info->alarm_help = gengetopt_args_info_help[12] ;
140 void
141 cmdline_parser_print_version (void)
143 printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
146 void
147 cmdline_parser_print_help (void)
149 int i = 0;
150 cmdline_parser_print_version ();
152 if (strlen(gengetopt_args_info_purpose) > 0)
153 printf("\n%s\n", gengetopt_args_info_purpose);
155 printf("\n%s\n\n", gengetopt_args_info_usage);
157 if (strlen(gengetopt_args_info_description) > 0)
158 printf("%s\n", gengetopt_args_info_description);
160 while (gengetopt_args_info_help[i])
161 printf("%s\n", gengetopt_args_info_help[i++]);
164 void
165 cmdline_parser_init (struct gengetopt_args_info *args_info)
167 clear_given (args_info);
168 clear_args (args_info);
169 init_args_info (args_info);
171 args_info->inputs = NULL;
172 args_info->inputs_num = 0;
175 static void
176 cmdline_parser_release (struct gengetopt_args_info *args_info)
179 unsigned int i;
180 if (args_info->mask_arg)
182 for (i = 0; i < args_info->mask_given; ++i)
184 if (args_info->mask_orig [i])
186 free (args_info->mask_orig [i]); /* free previous argument */
187 args_info->mask_orig [i] = 0;
190 free (args_info->mask_arg); /* free previous argument */
191 args_info->mask_arg = 0;
192 free (args_info->mask_orig); /* free previous argument */
193 args_info->mask_orig = 0;
195 if (args_info->chroot_arg)
197 free (args_info->chroot_arg); /* free previous argument */
198 args_info->chroot_arg = 0;
200 if (args_info->chroot_orig)
202 free (args_info->chroot_orig); /* free previous argument */
203 args_info->chroot_orig = 0;
205 if (args_info->uid_orig)
207 free (args_info->uid_orig); /* free previous argument */
208 args_info->uid_orig = 0;
210 if (args_info->username_arg)
212 free (args_info->username_arg); /* free previous argument */
213 args_info->username_arg = 0;
215 if (args_info->username_orig)
217 free (args_info->username_orig); /* free previous argument */
218 args_info->username_orig = 0;
220 if (args_info->gid_arg)
222 for (i = 0; i < args_info->gid_given; ++i)
224 if (args_info->gid_orig [i])
226 free (args_info->gid_orig [i]); /* free previous argument */
227 args_info->gid_orig [i] = 0;
230 free (args_info->gid_arg); /* free previous argument */
231 args_info->gid_arg = 0;
232 free (args_info->gid_orig); /* free previous argument */
233 args_info->gid_orig = 0;
235 if (args_info->groupname_arg)
237 for (i = 0; i < args_info->groupname_given; ++i)
239 if (args_info->groupname_arg [i])
241 free (args_info->groupname_arg [i]); /* free previous argument */
242 args_info->groupname_arg [i] = 0;
244 if (args_info->groupname_orig [i])
246 free (args_info->groupname_orig [i]); /* free previous argument */
247 args_info->groupname_orig [i] = 0;
250 if (args_info->groupname_arg [0])
251 free (args_info->groupname_arg [0]); /* free default string */
252 free (args_info->groupname_arg); /* free previous argument */
253 args_info->groupname_arg = 0;
254 free (args_info->groupname_orig); /* free previous argument */
255 args_info->groupname_orig = 0;
257 if (args_info->alarm_orig)
259 free (args_info->alarm_orig); /* free previous argument */
260 args_info->alarm_orig = 0;
263 for (i = 0; i < args_info->inputs_num; ++i)
264 free (args_info->inputs [i]);
266 if (args_info->inputs_num)
267 free (args_info->inputs);
269 clear_given (args_info);
273 cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
275 FILE *outfile;
276 int i = 0;
278 outfile = fopen(filename, "w");
280 if (!outfile)
282 fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename);
283 return EXIT_FAILURE;
286 if (args_info->help_given) {
287 fprintf(outfile, "%s\n", "help");
289 if (args_info->version_given) {
290 fprintf(outfile, "%s\n", "version");
292 if (args_info->mount_given) {
293 fprintf(outfile, "%s\n", "mount");
295 if (args_info->uname_given) {
296 fprintf(outfile, "%s\n", "uname");
298 if (args_info->ipc_given) {
299 fprintf(outfile, "%s\n", "ipc");
301 if (args_info->mask_orig)
303 for (i = 0; i < args_info->mask_given; ++i)
305 if (args_info->mask_orig [i])
307 fprintf(outfile, "%s=\"%s\"\n", "mask", args_info->mask_orig [i]);
311 if (args_info->chroot_given) {
312 if (args_info->chroot_orig) {
313 fprintf(outfile, "%s=\"%s\"\n", "chroot", args_info->chroot_orig);
314 } else {
315 fprintf(outfile, "%s\n", "chroot");
318 if (args_info->uid_given) {
319 if (args_info->uid_orig) {
320 fprintf(outfile, "%s=\"%s\"\n", "uid", args_info->uid_orig);
321 } else {
322 fprintf(outfile, "%s\n", "uid");
325 if (args_info->username_given) {
326 if (args_info->username_orig) {
327 fprintf(outfile, "%s=\"%s\"\n", "username", args_info->username_orig);
328 } else {
329 fprintf(outfile, "%s\n", "username");
332 if (args_info->gid_orig)
334 for (i = 0; i < args_info->gid_given; ++i)
336 if (args_info->gid_orig [i])
338 fprintf(outfile, "%s=\"%s\"\n", "gid", args_info->gid_orig [i]);
342 if (args_info->groupname_orig)
344 for (i = 0; i < args_info->groupname_given; ++i)
346 if (args_info->groupname_orig [i])
348 fprintf(outfile, "%s=\"%s\"\n", "groupname", args_info->groupname_orig [i]);
352 if (args_info->daemonize_given) {
353 fprintf(outfile, "%s\n", "daemonize");
355 if (args_info->alarm_given) {
356 if (args_info->alarm_orig) {
357 fprintf(outfile, "%s=\"%s\"\n", "alarm", args_info->alarm_orig);
358 } else {
359 fprintf(outfile, "%s\n", "alarm");
363 fclose (outfile);
365 i = EXIT_SUCCESS;
366 return i;
369 void
370 cmdline_parser_free (struct gengetopt_args_info *args_info)
372 cmdline_parser_release (args_info);
376 /* gengetopt_strdup() */
377 /* strdup.c replacement of strdup, which is not standard */
378 char *
379 gengetopt_strdup (const char *s)
381 char *result = NULL;
382 if (!s)
383 return result;
385 result = (char*)malloc(strlen(s) + 1);
386 if (result == (char*)0)
387 return (char*)0;
388 strcpy(result, s);
389 return result;
392 static char *
393 get_multiple_arg_token(const char *arg)
395 char *tok, *ret;
396 size_t len, num_of_escape;
397 int i, j;
399 if (!arg)
400 return NULL;
402 tok = strchr (arg, ',');
403 num_of_escape = 0;
405 /* make sure it is not escaped */
406 while (tok)
408 if (*(tok-1) == '\\')
410 /* find the next one */
411 tok = strchr (tok+1, ',');
412 ++num_of_escape;
414 else
415 break;
418 if (tok)
419 len = (size_t)(tok - arg + 1);
420 else
421 len = strlen (arg) + 1;
423 len -= num_of_escape;
425 ret = (char *) malloc (len);
427 i = 0;
428 j = 0;
429 while (arg[i] && (j < len-1))
431 if (arg[i] == '\\')
432 ++i;
434 ret[j++] = arg[i++];
437 ret[len-1] = '\0';
439 return ret;
442 static char *
443 get_multiple_arg_token_next(const char *arg)
445 char *tok;
447 if (!arg)
448 return NULL;
450 tok = strchr (arg, ',');
452 /* make sure it is not escaped */
453 while (tok)
455 if (*(tok-1) == '\\')
457 /* find the next one */
458 tok = strchr (tok+1, ',');
460 else
461 break;
464 if (! tok || strlen(tok) == 1)
465 return 0;
467 return tok+1;
470 static int
471 check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, int min, int max, const char *option_desc);
474 check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, int min, int max, const char *option_desc)
476 int error = 0;
478 if (option_given && ! (min < 0 && max < 0))
480 if (min >= 0 && max >= 0)
482 if (min == max)
484 /* specific occurrences */
485 if (option_given != min)
487 fprintf (stderr, "%s: %s option occurrences must be %d\n",
488 prog_name, option_desc, min);
489 error = 1;
492 else if (option_given < min
493 || option_given > max)
495 /* range occurrences */
496 fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n",
497 prog_name, option_desc, min, max);
498 error = 1;
501 else if (min >= 0)
503 /* at least check */
504 if (option_given < min)
506 fprintf (stderr, "%s: %s option occurrences must be at least %d\n",
507 prog_name, option_desc, min);
508 error = 1;
511 else if (max >= 0)
513 /* at most check */
514 if (option_given > max)
516 fprintf (stderr, "%s: %s option occurrences must be at most %d\n",
517 prog_name, option_desc, max);
518 error = 1;
523 return error;
526 cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info)
528 return cmdline_parser2 (argc, argv, args_info, 0, 1, 1);
532 cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required)
534 int result;
536 result = cmdline_parser_internal (argc, argv, args_info, override, initialize, check_required, NULL);
538 if (result == EXIT_FAILURE)
540 cmdline_parser_free (args_info);
541 exit (EXIT_FAILURE);
544 return result;
548 cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name)
550 int result = EXIT_SUCCESS;
552 if (cmdline_parser_required2(args_info, prog_name, NULL) > 0)
553 result = EXIT_FAILURE;
555 if (result == EXIT_FAILURE)
557 cmdline_parser_free (args_info);
558 exit (EXIT_FAILURE);
561 return result;
565 cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error)
567 int error = 0;
569 /* checks for required options */
570 if (check_multiple_option_occurrences(prog_name, args_info->mask_given, args_info->mask_min, args_info->mask_max, "'--mask'"))
571 error = 1;
573 if (check_multiple_option_occurrences(prog_name, args_info->gid_given, args_info->gid_min, args_info->gid_max, "'--gid'"))
574 error = 1;
576 if (check_multiple_option_occurrences(prog_name, args_info->groupname_given, args_info->groupname_min, args_info->groupname_max, "'--groupname'"))
577 error = 1;
580 /* checks for dependences among options */
582 return error;
586 cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required, const char *additional_error)
588 int c; /* Character of the parsed option. */
589 char *multi_token, *multi_next; /* for multiple options */
591 int i; /* Counter */
593 struct int_list * mask_list = NULL,* mask_new = NULL;
594 struct int_list * gid_list = NULL,* gid_new = NULL;
595 struct string_list * groupname_list = NULL,* groupname_new = NULL;
596 int error = 0;
597 struct gengetopt_args_info local_args_info;
599 if (initialize)
600 cmdline_parser_init (args_info);
602 cmdline_parser_init (&local_args_info);
604 optarg = 0;
605 optind = 0;
606 opterr = 1;
607 optopt = '?';
609 while (1)
611 int option_index = 0;
612 char *stop_char;
614 static struct option long_options[] = {
615 { "help", 0, NULL, 'h' },
616 { "version", 0, NULL, 'V' },
617 { "mount", 0, NULL, 0 },
618 { "uname", 0, NULL, 0 },
619 { "ipc", 0, NULL, 0 },
620 { "mask", 1, NULL, 0 },
621 { "chroot", 1, NULL, 0 },
622 { "uid", 1, NULL, 0 },
623 { "username", 1, NULL, 0 },
624 { "gid", 1, NULL, 0 },
625 { "groupname", 1, NULL, 0 },
626 { "daemonize", 0, NULL, 0 },
627 { "alarm", 1, NULL, 0 },
628 { NULL, 0, NULL, 0 }
631 stop_char = 0;
632 c = getopt_long (argc, argv, "hV", long_options, &option_index);
634 if (c == -1) break; /* Exit from `while (1)' loop. */
636 switch (c)
638 case 'h': /* Print help and exit. */
639 cmdline_parser_print_help ();
640 cmdline_parser_free (&local_args_info);
641 exit (EXIT_SUCCESS);
643 case 'V': /* Print version and exit. */
644 cmdline_parser_print_version ();
645 cmdline_parser_free (&local_args_info);
646 exit (EXIT_SUCCESS);
649 case 0: /* Long option with no short option */
650 /* New mount namespace. */
651 if (strcmp (long_options[option_index].name, "mount") == 0)
653 if (local_args_info.mount_given)
655 fprintf (stderr, "%s: `--mount' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
656 goto failure;
658 if (args_info->mount_given && ! override)
659 continue;
660 local_args_info.mount_given = 1;
661 args_info->mount_given = 1;
662 args_info->mount_flag = !(args_info->mount_flag);
664 /* New uname. */
665 else if (strcmp (long_options[option_index].name, "uname") == 0)
667 if (local_args_info.uname_given)
669 fprintf (stderr, "%s: `--uname' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
670 goto failure;
672 if (args_info->uname_given && ! override)
673 continue;
674 local_args_info.uname_given = 1;
675 args_info->uname_given = 1;
676 args_info->uname_flag = !(args_info->uname_flag);
678 /* New IPC context. */
679 else if (strcmp (long_options[option_index].name, "ipc") == 0)
681 if (local_args_info.ipc_given)
683 fprintf (stderr, "%s: `--ipc' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
684 goto failure;
686 if (args_info->ipc_given && ! override)
687 continue;
688 local_args_info.ipc_given = 1;
689 args_info->ipc_given = 1;
690 args_info->ipc_flag = !(args_info->ipc_flag);
692 /* Pass user defined flag. */
693 else if (strcmp (long_options[option_index].name, "mask") == 0)
695 local_args_info.mask_given++;
697 multi_token = get_multiple_arg_token(optarg);
698 multi_next = get_multiple_arg_token_next (optarg);
700 while (1)
702 mask_new = (struct int_list *) malloc (sizeof (struct int_list));
703 mask_new->next = mask_list;
704 mask_list = mask_new;
705 mask_new->arg = strtol (multi_token, &stop_char, 0);
706 if (!(stop_char && *stop_char == '\0')) {
707 fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], multi_token);
708 goto failure;
710 mask_new->orig = multi_token;
712 if (multi_next)
714 multi_token = get_multiple_arg_token(multi_next);
715 multi_next = get_multiple_arg_token_next (multi_next);
716 local_args_info.mask_given++;
718 else
719 break;
721 break;
723 /* Chroot in the specified directory. */
724 else if (strcmp (long_options[option_index].name, "chroot") == 0)
726 if (local_args_info.chroot_given)
728 fprintf (stderr, "%s: `--chroot' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
729 goto failure;
731 if (args_info->chroot_given && ! override)
732 continue;
733 local_args_info.chroot_given = 1;
734 args_info->chroot_given = 1;
735 if (args_info->chroot_arg)
736 free (args_info->chroot_arg); /* free previous string */
737 args_info->chroot_arg = gengetopt_strdup (optarg);
738 if (args_info->chroot_orig)
739 free (args_info->chroot_orig); /* free previous string */
740 args_info->chroot_orig = gengetopt_strdup (optarg);
742 /* Change to the specified UID. */
743 else if (strcmp (long_options[option_index].name, "uid") == 0)
745 if (local_args_info.uid_given)
747 fprintf (stderr, "%s: `--uid' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
748 goto failure;
750 if (args_info->uid_given && ! override)
751 continue;
752 local_args_info.uid_given = 1;
753 args_info->uid_given = 1;
754 args_info->uid_arg = strtol (optarg, &stop_char, 0);
755 if (!(stop_char && *stop_char == '\0')) {
756 fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg);
757 goto failure;
759 if (args_info->uid_orig)
760 free (args_info->uid_orig); /* free previous string */
761 args_info->uid_orig = gengetopt_strdup (optarg);
763 /* Change to the specified username. */
764 else if (strcmp (long_options[option_index].name, "username") == 0)
766 if (local_args_info.username_given)
768 fprintf (stderr, "%s: `--username' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
769 goto failure;
771 if (args_info->username_given && ! override)
772 continue;
773 local_args_info.username_given = 1;
774 args_info->username_given = 1;
775 if (args_info->username_arg)
776 free (args_info->username_arg); /* free previous string */
777 args_info->username_arg = gengetopt_strdup (optarg);
778 if (args_info->username_orig)
779 free (args_info->username_orig); /* free previous string */
780 args_info->username_orig = gengetopt_strdup (optarg);
782 /* Add the specified GID. */
783 else if (strcmp (long_options[option_index].name, "gid") == 0)
785 local_args_info.gid_given++;
787 multi_token = get_multiple_arg_token(optarg);
788 multi_next = get_multiple_arg_token_next (optarg);
790 while (1)
792 gid_new = (struct int_list *) malloc (sizeof (struct int_list));
793 gid_new->next = gid_list;
794 gid_list = gid_new;
795 gid_new->arg = strtol (multi_token, &stop_char, 0);
796 if (!(stop_char && *stop_char == '\0')) {
797 fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], multi_token);
798 goto failure;
800 gid_new->orig = multi_token;
802 if (multi_next)
804 multi_token = get_multiple_arg_token(multi_next);
805 multi_next = get_multiple_arg_token_next (multi_next);
806 local_args_info.gid_given++;
808 else
809 break;
811 break;
813 /* Add the specified group. */
814 else if (strcmp (long_options[option_index].name, "groupname") == 0)
816 local_args_info.groupname_given++;
818 multi_token = get_multiple_arg_token(optarg);
819 multi_next = get_multiple_arg_token_next (optarg);
821 while (1)
823 groupname_new = (struct string_list *) malloc (sizeof (struct string_list));
824 groupname_new->next = groupname_list;
825 groupname_list = groupname_new;
826 groupname_new->arg = gengetopt_strdup (multi_token);
827 groupname_new->orig = multi_token;
829 if (multi_next)
831 multi_token = get_multiple_arg_token(multi_next);
832 multi_next = get_multiple_arg_token_next (multi_next);
833 local_args_info.groupname_given++;
835 else
836 break;
838 break;
840 /* Run as daemon. */
841 else if (strcmp (long_options[option_index].name, "daemonize") == 0)
843 if (local_args_info.daemonize_given)
845 fprintf (stderr, "%s: `--daemonize' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
846 goto failure;
848 if (args_info->daemonize_given && ! override)
849 continue;
850 local_args_info.daemonize_given = 1;
851 args_info->daemonize_given = 1;
852 args_info->daemonize_flag = !(args_info->daemonize_flag);
854 /* Set an alarm after the specified delay. */
855 else if (strcmp (long_options[option_index].name, "alarm") == 0)
857 if (local_args_info.alarm_given)
859 fprintf (stderr, "%s: `--alarm' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
860 goto failure;
862 if (args_info->alarm_given && ! override)
863 continue;
864 local_args_info.alarm_given = 1;
865 args_info->alarm_given = 1;
866 args_info->alarm_arg = strtol (optarg, &stop_char, 0);
867 if (!(stop_char && *stop_char == '\0')) {
868 fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg);
869 goto failure;
871 if (args_info->alarm_orig)
872 free (args_info->alarm_orig); /* free previous string */
873 args_info->alarm_orig = gengetopt_strdup (optarg);
876 break;
877 case '?': /* Invalid option. */
878 /* `getopt_long' already printed an error message. */
879 goto failure;
881 default: /* bug: option not considered. */
882 fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : ""));
883 abort ();
884 } /* switch */
885 } /* while */
888 if (local_args_info.mask_given && mask_list)
890 struct int_list *tmp;
891 args_info->mask_arg = (int *) realloc (args_info->mask_arg, (args_info->mask_given + local_args_info.mask_given) * sizeof (int));
892 args_info->mask_orig = (char **) realloc (args_info->mask_orig, (args_info->mask_given + local_args_info.mask_given) * sizeof (char *));
893 for (i = (local_args_info.mask_given - 1); i >= 0; --i)
895 tmp = mask_list;
896 args_info->mask_arg [i + args_info->mask_given] = mask_list->arg;
897 args_info->mask_orig [i + args_info->mask_given] = mask_list->orig;
898 mask_list = mask_list->next;
899 free (tmp);
903 if (local_args_info.gid_given && gid_list)
905 struct int_list *tmp;
906 args_info->gid_arg = (int *) realloc (args_info->gid_arg, (args_info->gid_given + local_args_info.gid_given) * sizeof (int));
907 args_info->gid_orig = (char **) realloc (args_info->gid_orig, (args_info->gid_given + local_args_info.gid_given) * sizeof (char *));
908 for (i = (local_args_info.gid_given - 1); i >= 0; --i)
910 tmp = gid_list;
911 args_info->gid_arg [i + args_info->gid_given] = gid_list->arg;
912 args_info->gid_orig [i + args_info->gid_given] = gid_list->orig;
913 gid_list = gid_list->next;
914 free (tmp);
918 if (local_args_info.groupname_given && groupname_list)
920 struct string_list *tmp;
921 args_info->groupname_arg = (char * *) realloc (args_info->groupname_arg, (args_info->groupname_given + local_args_info.groupname_given) * sizeof (char *));
922 args_info->groupname_orig = (char **) realloc (args_info->groupname_orig, (args_info->groupname_given + local_args_info.groupname_given) * sizeof (char *));
923 for (i = (local_args_info.groupname_given - 1); i >= 0; --i)
925 tmp = groupname_list;
926 args_info->groupname_arg [i + args_info->groupname_given] = groupname_list->arg;
927 args_info->groupname_orig [i + args_info->groupname_given] = groupname_list->orig;
928 groupname_list = groupname_list->next;
929 free (tmp);
934 args_info->mask_given += local_args_info.mask_given;
935 local_args_info.mask_given = 0;
936 args_info->gid_given += local_args_info.gid_given;
937 local_args_info.gid_given = 0;
938 args_info->groupname_given += local_args_info.groupname_given;
939 local_args_info.groupname_given = 0;
941 if (check_required)
943 error += cmdline_parser_required2 (args_info, argv[0], additional_error);
946 cmdline_parser_release (&local_args_info);
948 if ( error )
949 return (EXIT_FAILURE);
951 if (optind < argc)
953 int i = 0 ;
954 int found_prog_name = 0;
955 /* whether program name, i.e., argv[0], is in the remaining args
956 (this may happen with some implementations of getopt,
957 but surely not with the one included by gengetopt) */
959 i = optind;
960 while (i < argc)
961 if (argv[i++] == argv[0]) {
962 found_prog_name = 1;
963 break;
965 i = 0;
967 args_info->inputs_num = argc - optind - found_prog_name;
968 args_info->inputs =
969 (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
970 while (optind < argc)
971 if (argv[optind++] != argv[0])
972 args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind-1]) ;
975 return 0;
977 failure:
978 if (mask_list)
980 struct int_list *tmp;
981 while (mask_list)
983 tmp = mask_list;
984 free (mask_list->orig);
985 mask_list = mask_list->next;
986 free (tmp);
989 if (gid_list)
991 struct int_list *tmp;
992 while (gid_list)
994 tmp = gid_list;
995 free (gid_list->orig);
996 gid_list = gid_list->next;
997 free (tmp);
1000 if (groupname_list)
1002 struct string_list *tmp;
1003 while (groupname_list)
1005 tmp = groupname_list;
1006 free (groupname_list->arg);
1007 free (groupname_list->orig);
1008 groupname_list = groupname_list->next;
1009 free (tmp);
1013 cmdline_parser_release (&local_args_info);
1014 return (EXIT_FAILURE);