static int parse(int c, char **argv, int invert, unsigned int *flags, const struct ip6t_entry *entry, struct ip6t_entry_target **target) { struct ip6t_mark_target_info *markinfo = (struct ip6t_mark_target_info *)(*target)->data; switch (c) { case '1': #ifdef KERNEL_64_USERSPACE_32 if (string_to_number_ll(optarg, 0, 0, &markinfo->mark)) #else if (string_to_number_l(optarg, 0, 0, &markinfo->mark)) #endif exit_error(PARAMETER_PROBLEM, "Bad MARK value `%s'", optarg); if (*flags) exit_error(PARAMETER_PROBLEM, "MARK target: Can't specify --set-mark twice"); *flags = 1; break; default: return 0; } return 1; }
/* Function which parses command options; returns true if it ate an option */ static int MARK_parse_v0(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_target **target) { struct xt_mark_target_info *markinfo = (struct xt_mark_target_info *)(*target)->data; switch (c) { case '1': if (string_to_number_l(optarg, 0, 0, &markinfo->mark)) exit_error(PARAMETER_PROBLEM, "Bad MARK value `%s'", optarg); if (*flags) exit_error(PARAMETER_PROBLEM, "MARK target: Can't specify --set-mark twice"); *flags = 1; break; case '2': exit_error(PARAMETER_PROBLEM, "MARK target: kernel too old for --and-mark"); case '3': exit_error(PARAMETER_PROBLEM, "MARK target: kernel too old for --or-mark"); default: return 0; } return 1; }
/* Function which parses command options; returns true if it ate an option */ static int MARK_parse_v1(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_target **target) { struct xt_mark_target_info_v1 *markinfo = (struct xt_mark_target_info_v1 *)(*target)->data; switch (c) { case '1': markinfo->mode = XT_MARK_SET; break; case '2': markinfo->mode = XT_MARK_AND; break; case '3': markinfo->mode = XT_MARK_OR; break; default: return 0; } if (string_to_number_l(optarg, 0, 0, &markinfo->mark)) exit_error(PARAMETER_PROBLEM, "Bad MARK value `%s'", optarg); if (*flags) exit_error(PARAMETER_PROBLEM, "MARK target: Can't specify --set-mark twice"); *flags = 1; return 1; }
static int string_to_number(const char *s, unsigned int min, unsigned int max, unsigned int *ret) { int result; unsigned long number; result = string_to_number_l(s, min, max, &number); *ret = (unsigned int)number; return result; }