mirror of
git://git.code.sf.net/p/xtables-addons/xtables-addons
synced 2026-01-11 09:43:51 +01:00
ipset: update to 6.0
This commit is contained in:
@@ -21,8 +21,10 @@
|
||||
/* Core kernel error codes */
|
||||
static const struct ipset_errcode_table core_errcode_table[] = {
|
||||
/* Generic error codes */
|
||||
{ EEXIST, 0,
|
||||
{ ENOENT, 0,
|
||||
"The set with the given name does not exist" },
|
||||
{ EMSGSIZE, 0,
|
||||
"Kernel error received: message could not be created" },
|
||||
{ IPSET_ERR_PROTOCOL, 0,
|
||||
"Kernel error received: ipset protocol error" },
|
||||
|
||||
@@ -30,14 +32,14 @@ static const struct ipset_errcode_table core_errcode_table[] = {
|
||||
{ EEXIST, IPSET_CMD_CREATE,
|
||||
"Set cannot be created: set with the same name already exists" },
|
||||
{ IPSET_ERR_FIND_TYPE, 0,
|
||||
"Kernel error received: set type does not supported" },
|
||||
"Kernel error received: set type not supported" },
|
||||
{ IPSET_ERR_MAX_SETS, 0,
|
||||
"Kernel error received: maximal number of sets reached, "
|
||||
"cannot create more." },
|
||||
{ IPSET_ERR_INVALID_NETMASK, 0,
|
||||
"The value of the netmask parameter is invalid" },
|
||||
{ IPSET_ERR_INVALID_FAMILY, 0,
|
||||
"The protocol family not supported by the set type" },
|
||||
"Protocol family not supported by the set type" },
|
||||
|
||||
/* DESTROY specific error codes */
|
||||
{ IPSET_ERR_BUSY, IPSET_CMD_DESTROY,
|
||||
|
||||
@@ -206,62 +206,54 @@ restore(char *argv0)
|
||||
static int
|
||||
call_parser(int *argc, char *argv[], const struct ipset_arg *args)
|
||||
{
|
||||
int i = 1, ret = 0;
|
||||
int ret = 0;
|
||||
const struct ipset_arg *arg;
|
||||
const char *optstr;
|
||||
|
||||
/* Currently CREATE and ADT may have got additional arguments */
|
||||
if (!args)
|
||||
goto done;
|
||||
for (arg = args; arg->opt; arg++) {
|
||||
for (i = 1; i < *argc; ) {
|
||||
D("argc: %u, i: %u: %s vs %s",
|
||||
*argc, i, argv[i], arg->name[0]);
|
||||
if (!(ipset_match_option(argv[i], arg->name))) {
|
||||
i++;
|
||||
if (!args && *argc > 1)
|
||||
goto err_unknown;
|
||||
while (*argc > 1) {
|
||||
for (arg = args; arg->opt; arg++) {
|
||||
D("argc: %u, %s vs %s", *argc, argv[1], arg->name[0]);
|
||||
if (!(ipset_match_option(argv[1], arg->name)))
|
||||
continue;
|
||||
}
|
||||
optstr = argv[i];
|
||||
|
||||
optstr = argv[1];
|
||||
/* Shift off matched option */
|
||||
D("match %s", arg->name[0]);
|
||||
ipset_shift_argv(argc, argv, i);
|
||||
D("argc: %u, i: %u", *argc, i);
|
||||
ipset_shift_argv(argc, argv, 1);
|
||||
switch (arg->has_arg) {
|
||||
case IPSET_MANDATORY_ARG:
|
||||
if (i + 1 > *argc)
|
||||
if (*argc < 2)
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Missing mandatory argument "
|
||||
"of option `%s'",
|
||||
arg->name[0]);
|
||||
/* Fall through */
|
||||
case IPSET_OPTIONAL_ARG:
|
||||
if (i + 1 <= *argc) {
|
||||
ret = ipset_call_parser(session,
|
||||
arg->parse,
|
||||
optstr, arg->opt,
|
||||
argv[i]);
|
||||
if (*argc >= 2) {
|
||||
ret = ipset_call_parser(session, arg, argv[1]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ipset_shift_argv(argc, argv, i);
|
||||
ipset_shift_argv(argc, argv, 1);
|
||||
break;
|
||||
}
|
||||
/* 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;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!arg->opt)
|
||||
goto err_unknown;
|
||||
}
|
||||
done:
|
||||
if (i < *argc)
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Unknown argument: `%s'",
|
||||
argv[i]);
|
||||
return ret;
|
||||
|
||||
err_unknown:
|
||||
return exit_error(PARAMETER_PROBLEM, "Unknown argument: `%s'", argv[1]);
|
||||
}
|
||||
|
||||
static enum ipset_adt
|
||||
@@ -476,61 +468,57 @@ parse_commandline(int argc, char *argv[])
|
||||
|
||||
/* Second: parse command */
|
||||
for (command = ipset_commands;
|
||||
command->cmd && cmd == IPSET_CMD_NONE;
|
||||
argc > 1 && command->cmd && cmd == IPSET_CMD_NONE;
|
||||
command++) {
|
||||
for (i = 1; i < argc; ) {
|
||||
if (!ipset_match_cmd(argv[1], command->name)) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if (restore_line != 0
|
||||
&& (command->cmd == IPSET_CMD_RESTORE
|
||||
|| command->cmd == IPSET_CMD_VERSION
|
||||
|| command->cmd == IPSET_CMD_HELP))
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Command `%s' is invalid "
|
||||
"in restore mode.",
|
||||
command->name[0]);
|
||||
if (interactive
|
||||
&& command->cmd == IPSET_CMD_RESTORE) {
|
||||
printf("Restore command ignored "
|
||||
"in interactive mode\n");
|
||||
return 0;
|
||||
}
|
||||
if (!ipset_match_cmd(argv[1], command->name))
|
||||
continue;
|
||||
|
||||
/* Shift off matched command arg */
|
||||
ipset_shift_argv(&argc, argv, i);
|
||||
cmd = command->cmd;
|
||||
switch (command->has_arg) {
|
||||
case IPSET_MANDATORY_ARG:
|
||||
case IPSET_MANDATORY_ARG2:
|
||||
if (i + 1 > argc)
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Missing mandatory argument "
|
||||
"to command %s",
|
||||
command->name[0]);
|
||||
/* Fall through */
|
||||
case IPSET_OPTIONAL_ARG:
|
||||
arg0 = argv[i];
|
||||
if (i + 1 <= argc)
|
||||
/* Shift off first arg */
|
||||
ipset_shift_argv(&argc, argv, i);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (command->has_arg == IPSET_MANDATORY_ARG2) {
|
||||
if (i + 1 > argc)
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Missing second mandatory "
|
||||
"argument to command %s",
|
||||
command->name[0]);
|
||||
arg1 = argv[i];
|
||||
/* Shift off second arg */
|
||||
ipset_shift_argv(&argc, argv, i);
|
||||
}
|
||||
if (restore_line != 0
|
||||
&& (command->cmd == IPSET_CMD_RESTORE
|
||||
|| command->cmd == IPSET_CMD_VERSION
|
||||
|| command->cmd == IPSET_CMD_HELP))
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Command `%s' is invalid "
|
||||
"in restore mode.",
|
||||
command->name[0]);
|
||||
if (interactive && command->cmd == IPSET_CMD_RESTORE) {
|
||||
printf("Restore command ignored "
|
||||
"in interactive mode\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Shift off matched command arg */
|
||||
ipset_shift_argv(&argc, argv, 1);
|
||||
cmd = command->cmd;
|
||||
switch (command->has_arg) {
|
||||
case IPSET_MANDATORY_ARG:
|
||||
case IPSET_MANDATORY_ARG2:
|
||||
if (argc < 2)
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Missing mandatory argument "
|
||||
"to command %s",
|
||||
command->name[0]);
|
||||
/* Fall through */
|
||||
case IPSET_OPTIONAL_ARG:
|
||||
arg0 = argv[1];
|
||||
if (argc >= 2)
|
||||
/* Shift off first arg */
|
||||
ipset_shift_argv(&argc, argv, 1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (command->has_arg == IPSET_MANDATORY_ARG2) {
|
||||
if (argc < 2)
|
||||
return exit_error(PARAMETER_PROBLEM,
|
||||
"Missing second mandatory "
|
||||
"argument to command %s",
|
||||
command->name[0]);
|
||||
arg1 = argv[1];
|
||||
/* Shift off second arg */
|
||||
ipset_shift_argv(&argc, argv, 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Third: catch interactive mode, handle help, version */
|
||||
@@ -565,7 +553,8 @@ parse_commandline(int argc, char *argv[])
|
||||
argv[1]);
|
||||
return exit_error(PARAMETER_PROBLEM, "No command specified.");
|
||||
case IPSET_CMD_VERSION:
|
||||
printf("%s v%s.\n", program_name, program_version);
|
||||
printf("%s v%s, protocol version: %u\n",
|
||||
program_name, program_version, IPSET_PROTOCOL);
|
||||
if (interactive)
|
||||
return 0;
|
||||
return exit_error(NO_PROBLEM, NULL);
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
const struct ipset_commands ipset_commands[] = {
|
||||
/* Order is important */
|
||||
|
||||
{ /* c[reate], --create, n, -N */
|
||||
{ /* c[reate], --create, n[ew], -N */
|
||||
.cmd = IPSET_CMD_CREATE,
|
||||
.name = { "create", "n" },
|
||||
.name = { "create", "new" },
|
||||
.has_arg = IPSET_MANDATORY_ARG2,
|
||||
.help = "SETNAME TYPENAME [type-specific-options]\n"
|
||||
" Create a new set",
|
||||
@@ -143,14 +143,14 @@ ipset_match_cmd(const char *arg, const char * const name[])
|
||||
|
||||
if (len > strlen(name[0]) || !len)
|
||||
return false;
|
||||
else if (strncmp(arg, name[0], len) == 0)
|
||||
else if (len > 1 &&
|
||||
((strncmp(arg, name[0], len) == 0) ||
|
||||
(name[1] != NULL && (strncmp(arg, name[1], len) == 0))))
|
||||
return true;
|
||||
else if (len != 1)
|
||||
return false;
|
||||
else if (name[1] == NULL)
|
||||
return tolower(arg[0]) == name[0][0];
|
||||
else
|
||||
return tolower(arg[0]) == name[1][0];
|
||||
else return tolower(arg[0]) == name[0][0] ||
|
||||
(name[1] != NULL && tolower(arg[0]) == name[1][0]);
|
||||
}
|
||||
|
||||
const struct ipset_envopts ipset_envopts[] = {
|
||||
|
||||
Reference in New Issue
Block a user