static int owner_mt_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_match **match) { struct xt_owner_match_info *info = (void *)(*match)->data; struct passwd *pwd; struct group *grp; unsigned int from, to; switch (c) { case 'u': xtables_param_act(XTF_ONLY_ONCE, "owner", "--uid-owner", *flags & FLAG_UID_OWNER); if ((pwd = getpwnam(optarg)) != NULL) from = to = pwd->pw_uid; else owner_parse_range(optarg, &from, &to, "--uid-owner"); if (invert) info->invert |= XT_OWNER_UID; info->match |= XT_OWNER_UID; info->uid_min = from; info->uid_max = to; *flags |= FLAG_UID_OWNER; return true; case 'g': xtables_param_act(XTF_ONLY_ONCE, "owner", "--gid-owner", *flags & FLAG_GID_OWNER); if ((grp = getgrnam(optarg)) != NULL) from = to = grp->gr_gid; else owner_parse_range(optarg, &from, &to, "--gid-owner"); if (invert) info->invert |= XT_OWNER_GID; info->match |= XT_OWNER_GID; info->gid_min = from; info->gid_max = to; *flags |= FLAG_GID_OWNER; return true; case 'k': xtables_param_act(XTF_ONLY_ONCE, "owner", "--socket-exists", *flags & FLAG_SOCKET_EXISTS); if (invert) info->invert |= XT_OWNER_SOCKET; info->match |= XT_OWNER_SOCKET; *flags |= FLAG_SOCKET_EXISTS; return true; } return false; }
static void owner_mt_parse(struct xt_option_call *cb) { struct xt_owner_match_info *info = cb->data; struct passwd *pwd; struct group *grp; unsigned int from, to; xtables_option_parse(cb); switch (cb->entry->id) { case O_USER: if ((pwd = getpwnam(cb->arg)) != NULL) from = to = pwd->pw_uid; else owner_parse_range(cb->arg, &from, &to, "--uid-owner"); if (cb->invert) info->invert |= XT_OWNER_UID; info->match |= XT_OWNER_UID; info->uid_min = from; info->uid_max = to; break; case O_GROUP: if ((grp = getgrnam(cb->arg)) != NULL) from = to = grp->gr_gid; else owner_parse_range(cb->arg, &from, &to, "--gid-owner"); if (cb->invert) info->invert |= XT_OWNER_GID; info->match |= XT_OWNER_GID; info->gid_min = from; info->gid_max = to; break; case O_SOCK_EXISTS: if (cb->invert) info->invert |= XT_OWNER_SOCKET; info->match |= XT_OWNER_SOCKET; break; } }