static int brarpreply_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_target **tg) { struct ebt_arpreply_info *replyinfo = (void *)(*tg)->data; struct ether_addr *addr; switch (c) { case REPLY_MAC: EBT_CHECK_OPTION(flags, OPT_REPLY_MAC); if (!(addr = ether_aton(optarg))) xtables_error(PARAMETER_PROBLEM, "Problem with specified --arpreply-mac mac"); memcpy(replyinfo->mac, addr, ETH_ALEN); break; case REPLY_TARGET: EBT_CHECK_OPTION(flags, OPT_REPLY_TARGET); if (ebt_fill_target(optarg, (unsigned int *)&replyinfo->target)) xtables_error(PARAMETER_PROBLEM, "Illegal --arpreply-target target"); break; default: return 0; } return 1; }
static int brmark_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_target **target) { struct ebt_mark_t_info *info = (struct ebt_mark_t_info *) (*target)->data; char *end; uint32_t mask; switch (c) { case MARK_TARGET: { unsigned int tmp; EBT_CHECK_OPTION(flags, OPT_MARK_TARGET); if (ebt_fill_target(optarg, &tmp)) xtables_error(PARAMETER_PROBLEM, "Illegal --mark-target target"); /* the 4 lsb are left to designate the target */ info->target = (info->target & ~EBT_VERDICT_BITS) | (tmp & EBT_VERDICT_BITS); } return 1; case MARK_SETMARK: EBT_CHECK_OPTION(flags, OPT_MARK_SETMARK); mask = (OPT_MARK_ORMARK|OPT_MARK_ANDMARK|OPT_MARK_XORMARK); if (*flags & mask) xtables_error(PARAMETER_PROBLEM, "--mark-set cannot be used together with" " specific --mark option"); info->target = (info->target & EBT_VERDICT_BITS) | MARK_SET_VALUE; break; case MARK_ORMARK: EBT_CHECK_OPTION(flags, OPT_MARK_ORMARK); mask = (OPT_MARK_SETMARK|OPT_MARK_ANDMARK|OPT_MARK_XORMARK); if (*flags & mask) xtables_error(PARAMETER_PROBLEM, "--mark-or cannot be used together with" " specific --mark option"); info->target = (info->target & EBT_VERDICT_BITS) | MARK_OR_VALUE; break; case MARK_ANDMARK: EBT_CHECK_OPTION(flags, OPT_MARK_ANDMARK); mask = (OPT_MARK_SETMARK|OPT_MARK_ORMARK|OPT_MARK_XORMARK); if (*flags & mask) xtables_error(PARAMETER_PROBLEM, "--mark-and cannot be used together with" " specific --mark option"); info->target = (info->target & EBT_VERDICT_BITS) | MARK_AND_VALUE; break; case MARK_XORMARK: EBT_CHECK_OPTION(flags, OPT_MARK_XORMARK); mask = (OPT_MARK_SETMARK|OPT_MARK_ANDMARK|OPT_MARK_ORMARK); if (*flags & mask) xtables_error(PARAMETER_PROBLEM, "--mark-xor cannot be used together with" " specific --mark option"); info->target = (info->target & EBT_VERDICT_BITS) | MARK_XOR_VALUE; break; default: return 0; } /* mutual code */ info->mark = strtoul(optarg, &end, 0); if (*end != '\0' || end == optarg) xtables_error(PARAMETER_PROBLEM, "Bad MARK value '%s'", optarg); mark_supplied = 1; return 1; }