#define IPSET_PROTO_SEPARATOR ":"
struct ipset_session;
+struct ipset_arg;
typedef int (*ipset_parsefn)(struct ipset_session *s,
enum ipset_opt opt, const char *str);
extern int ipset_parse_elem(struct ipset_session *session,
enum ipset_opt opt, const char *str);
extern int ipset_call_parser(struct ipset_session *session,
- ipset_parsefn parse, const char *optstr,
- enum ipset_opt optional, const char *str);
+ const struct ipset_arg *arg,
+ const char *str);
/* Compatibility parser functions */
extern int ipset_parse_iptimeout(struct ipset_session *session,
*/
int
ipset_call_parser(struct ipset_session *session,
- ipset_parsefn parse, const char *optstr,
- enum ipset_opt opt, const char *str)
+ const struct ipset_arg *arg,
+ const char *str)
{
if (ipset_data_flags_test(ipset_session_data(session),
- IPSET_FLAG(opt)))
- syntax_err("%s already specified", optstr);
+ IPSET_FLAG(arg->opt)))
+ syntax_err("%s already specified", arg->name[0]);
- return parse(session, opt, parse == ipset_parse_ignored
- ? optstr : str);
+ return arg->parse(session, arg->opt, str);
}
#define parse_elem(s, t, d, str) \
/* Fall through */
case IPSET_OPTIONAL_ARG:
if (i + 1 <= *argc) {
- ret = ipset_call_parser(session,
- arg->parse,
- optstr, arg->opt,
- argv[i]);
+ ret = ipset_call_parser(session, arg, argv[i]);
if (ret < 0)
return ret;
ipset_shift_argv(argc, argv, i);
}
/* Fall through */
default:
- ret = ipset_call_parser(session,
- arg->parse,
- optstr, arg->opt,
- optstr);
+ ret = ipset_call_parser(session, arg, optstr);
if (ret < 0)
return ret;
}