static int brip_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_match **match) { struct ebt_ip_info *info = (struct ebt_ip_info *)(*match)->data; switch (c) { case IP_SOURCE: if (invert) info->invflags |= EBT_IP_SOURCE; ebt_parse_ip_address(optarg, &info->saddr, &info->smsk); info->bitmask |= EBT_IP_SOURCE; break; case IP_DEST: if (invert) info->invflags |= EBT_IP_DEST; ebt_parse_ip_address(optarg, &info->daddr, &info->dmsk); info->bitmask |= EBT_IP_DEST; break; case IP_SPORT: if (invert) info->invflags |= EBT_IP_SPORT; parse_port_range(NULL, optarg, info->sport); info->bitmask |= EBT_IP_SPORT; break; case IP_DPORT: if (invert) info->invflags |= EBT_IP_DPORT; parse_port_range(NULL, optarg, info->dport); info->bitmask |= EBT_IP_DPORT; break; case IP_EBT_TOS: if (invert) info->invflags |= EBT_IP_TOS; if (!xtables_strtoul(optarg, NULL, (uintmax_t *)&info->tos, 0, 255)) xtables_error(PARAMETER_PROBLEM, "Problem with specified IP tos"); info->bitmask |= EBT_IP_TOS; break; case IP_PROTO: if (invert) info->invflags |= EBT_IP_PROTO; info->protocol = xtables_parse_protocol(optarg); if (info->protocol == -1) xtables_error(PARAMETER_PROBLEM, "Unknown specified IP protocol - %s", optarg); info->bitmask |= EBT_IP_PROTO; break; default: return 0; } *flags |= info->bitmask; return 1; }
bool xtables_strtoui(const char *s, char **end, unsigned int *value, unsigned int min, unsigned int max) { uintmax_t v; bool ret; ret = xtables_strtoul(s, end, &v, min, max); if (value != NULL) *value = v; return ret; }
static uint64_t parse_counter(const char *opt) { uintmax_t value; if (!xtables_strtoul(opt, NULL, &value, 0, UINT64_MAX)) xtables_error(PARAMETER_PROBLEM, "Cannot parse %s as a counter value\n", opt); return (uint64_t)value; }
static void ct_parse_zone_id(const char *opt, unsigned int opt_id, uint16_t *zone_id, uint16_t *flags) { if (opt_id == O_ZONE_ORIG) *flags |= XT_CT_ZONE_DIR_ORIG; if (opt_id == O_ZONE_REPLY) *flags |= XT_CT_ZONE_DIR_REPL; *zone_id = 0; if (strcasecmp(opt, "mark") == 0) { *flags |= XT_CT_ZONE_MARK; } else { uintmax_t val; if (!xtables_strtoul(opt, NULL, &val, 0, UINT16_MAX)) xtables_error(PARAMETER_PROBLEM, "Cannot parse %s as a zone ID\n", opt); *zone_id = (uint16_t)val; } }