|
Packit Service |
d1fe03 |
/* Code to restore the iptables state, from file by iptables-save.
|
|
Packit Service |
d1fe03 |
* (C) 2000-2002 by Harald Welte <laforge@gnumonks.org>
|
|
Packit Service |
d1fe03 |
* based on previous code from Rusty Russell <rusty@linuxcare.com.au>
|
|
Packit Service |
d1fe03 |
*
|
|
Packit Service |
d1fe03 |
* This code is distributed under the terms of GNU GPL v2
|
|
Packit Service |
d1fe03 |
*/
|
|
Packit Service |
d1fe03 |
#include "config.h"
|
|
Packit Service |
d1fe03 |
#include <getopt.h>
|
|
Packit Service |
d1fe03 |
#include <errno.h>
|
|
Packit Service |
d1fe03 |
#include <stdbool.h>
|
|
Packit Service |
d1fe03 |
#include <string.h>
|
|
Packit Service |
d1fe03 |
#include <stdio.h>
|
|
Packit Service |
d1fe03 |
#include <stdlib.h>
|
|
Packit Service |
d1fe03 |
#include "iptables.h"
|
|
Packit Service |
d1fe03 |
#include "ip6tables.h"
|
|
Packit Service |
d1fe03 |
#include "xshared.h"
|
|
Packit Service |
d1fe03 |
#include "xtables.h"
|
|
Packit Service |
d1fe03 |
#include "libiptc/libiptc.h"
|
|
Packit Service |
d1fe03 |
#include "libiptc/libip6tc.h"
|
|
Packit Service |
d1fe03 |
#include "iptables-multi.h"
|
|
Packit Service |
d1fe03 |
#include "ip6tables-multi.h"
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
static int counters, verbose, noflush, wait;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
static struct timeval wait_interval = {
|
|
Packit Service |
d1fe03 |
.tv_sec = 1,
|
|
Packit Service |
d1fe03 |
};
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
/* Keeping track of external matches and targets. */
|
|
Packit Service |
d1fe03 |
static const struct option options[] = {
|
|
Packit Service |
d1fe03 |
{.name = "counters", .has_arg = 0, .val = 'c'},
|
|
Packit Service |
d1fe03 |
{.name = "verbose", .has_arg = 0, .val = 'v'},
|
|
Packit Service |
d1fe03 |
{.name = "version", .has_arg = 0, .val = 'V'},
|
|
Packit Service |
d1fe03 |
{.name = "test", .has_arg = 0, .val = 't'},
|
|
Packit Service |
d1fe03 |
{.name = "help", .has_arg = 0, .val = 'h'},
|
|
Packit Service |
d1fe03 |
{.name = "noflush", .has_arg = 0, .val = 'n'},
|
|
Packit Service |
d1fe03 |
{.name = "modprobe", .has_arg = 1, .val = 'M'},
|
|
Packit Service |
d1fe03 |
{.name = "table", .has_arg = 1, .val = 'T'},
|
|
Packit Service |
d1fe03 |
{.name = "wait", .has_arg = 2, .val = 'w'},
|
|
Packit Service |
d1fe03 |
{.name = "wait-interval", .has_arg = 2, .val = 'W'},
|
|
Packit Service |
d1fe03 |
{NULL},
|
|
Packit Service |
d1fe03 |
};
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
static void print_usage(const char *name, const char *version)
|
|
Packit Service |
d1fe03 |
{
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "Usage: %s [-c] [-v] [-V] [-t] [-h] [-n] [-w secs] [-W usecs] [-T table] [-M command] [file]\n"
|
|
Packit Service |
d1fe03 |
" [ --counters ]\n"
|
|
Packit Service |
d1fe03 |
" [ --verbose ]\n"
|
|
Packit Service |
d1fe03 |
" [ --version]\n"
|
|
Packit Service |
d1fe03 |
" [ --test ]\n"
|
|
Packit Service |
d1fe03 |
" [ --help ]\n"
|
|
Packit Service |
d1fe03 |
" [ --noflush ]\n"
|
|
Packit Service |
d1fe03 |
" [ --wait=<seconds>\n"
|
|
Packit Service |
d1fe03 |
" [ --wait-interval=<usecs>\n"
|
|
Packit Service |
d1fe03 |
" [ --table= ]\n"
|
|
Packit Service |
d1fe03 |
" [ --modprobe=<command> ]\n", name);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
struct iptables_restore_cb {
|
|
Packit Service |
d1fe03 |
const struct xtc_ops *ops;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
int (*for_each_chain)(int (*fn)(const xt_chainlabel,
|
|
Packit Service |
d1fe03 |
int, struct xtc_handle *),
|
|
Packit Service |
d1fe03 |
int verbose, int builtinstoo,
|
|
Packit Service |
d1fe03 |
struct xtc_handle *handle);
|
|
Packit Service |
d1fe03 |
int (*flush_entries)(const xt_chainlabel, int, struct xtc_handle *);
|
|
Packit Service |
d1fe03 |
int (*delete_chain)(const xt_chainlabel, int, struct xtc_handle *);
|
|
Packit Service |
d1fe03 |
int (*do_command)(int argc, char *argv[], char **table,
|
|
Packit Service |
d1fe03 |
struct xtc_handle **handle, bool restore);
|
|
Packit Service |
d1fe03 |
};
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
static struct xtc_handle *
|
|
Packit Service |
d1fe03 |
create_handle(const struct iptables_restore_cb *cb, const char *tablename)
|
|
Packit Service |
d1fe03 |
{
|
|
Packit Service |
d1fe03 |
struct xtc_handle *handle;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
handle = cb->ops->init(tablename);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (!handle) {
|
|
Packit Service |
d1fe03 |
/* try to insmod the module if iptc_init failed */
|
|
Packit Service |
d1fe03 |
xtables_load_ko(xtables_modprobe_program, false);
|
|
Packit Service |
d1fe03 |
handle = cb->ops->init(tablename);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (!handle)
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM, "%s: unable to initialize "
|
|
Packit Service |
d1fe03 |
"table '%s'\n", xt_params->program_name, tablename);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
return handle;
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
static int
|
|
Packit Service |
d1fe03 |
ip46tables_restore_main(const struct iptables_restore_cb *cb,
|
|
Packit Service |
d1fe03 |
int argc, char *argv[])
|
|
Packit Service |
d1fe03 |
{
|
|
Packit Service |
d1fe03 |
struct xtc_handle *handle = NULL;
|
|
Packit Service |
d1fe03 |
struct argv_store av_store = {};
|
|
Packit Service |
d1fe03 |
char buffer[10240];
|
|
Packit Service |
d1fe03 |
int c, lock;
|
|
Packit Service |
d1fe03 |
char curtable[XT_TABLE_MAXNAMELEN + 1] = {};
|
|
Packit Service |
d1fe03 |
FILE *in;
|
|
Packit Service |
d1fe03 |
int in_table = 0, testing = 0;
|
|
Packit Service |
d1fe03 |
const char *tablename = NULL;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
line = 0;
|
|
Packit Service |
d1fe03 |
lock = XT_LOCK_NOT_ACQUIRED;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
while ((c = getopt_long(argc, argv, "bcvVthnwWM:T:", options, NULL)) != -1) {
|
|
Packit Service |
d1fe03 |
switch (c) {
|
|
Packit Service |
d1fe03 |
case 'b':
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "-b/--binary option is not implemented\n");
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'c':
|
|
Packit Service |
d1fe03 |
counters = 1;
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'v':
|
|
Packit Service |
d1fe03 |
verbose = 1;
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'V':
|
|
Packit Service |
d1fe03 |
printf("%s v%s (legacy)\n",
|
|
Packit Service |
d1fe03 |
xt_params->program_name,
|
|
Packit Service |
d1fe03 |
xt_params->program_version);
|
|
Packit Service |
d1fe03 |
exit(0);
|
|
Packit Service |
d1fe03 |
case 't':
|
|
Packit Service |
d1fe03 |
testing = 1;
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'h':
|
|
Packit Service |
d1fe03 |
print_usage(xt_params->program_name,
|
|
Packit Service |
d1fe03 |
PACKAGE_VERSION);
|
|
Packit Service |
d1fe03 |
exit(0);
|
|
Packit Service |
d1fe03 |
case 'n':
|
|
Packit Service |
d1fe03 |
noflush = 1;
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'w':
|
|
Packit Service |
d1fe03 |
wait = parse_wait_time(argc, argv);
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'W':
|
|
Packit Service |
d1fe03 |
parse_wait_interval(argc, argv, &wait_interval);
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'M':
|
|
Packit Service |
d1fe03 |
xtables_modprobe_program = optarg;
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
case 'T':
|
|
Packit Service |
d1fe03 |
tablename = optarg;
|
|
Packit Service |
d1fe03 |
break;
|
|
Packit Service |
d1fe03 |
default:
|
|
Packit Service |
d1fe03 |
fprintf(stderr,
|
|
Packit Service |
d1fe03 |
"Try `%s -h' for more information.\n",
|
|
Packit Service |
d1fe03 |
xt_params->program_name);
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (optind == argc - 1) {
|
|
Packit Service |
d1fe03 |
in = fopen(argv[optind], "re");
|
|
Packit Service |
d1fe03 |
if (!in) {
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "Can't open %s: %s\n", argv[optind],
|
|
Packit Service |
d1fe03 |
strerror(errno));
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
else if (optind < argc) {
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "Unknown arguments found on commandline\n");
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
else in = stdin;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (!wait_interval.tv_sec && !wait) {
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "Option --wait-interval requires option --wait\n");
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
/* Grab standard input. */
|
|
Packit Service |
d1fe03 |
while (fgets(buffer, sizeof(buffer), in)) {
|
|
Packit Service |
d1fe03 |
int ret = 0;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
line++;
|
|
Packit Service |
d1fe03 |
if (buffer[0] == '\n')
|
|
Packit Service |
d1fe03 |
continue;
|
|
Packit Service |
d1fe03 |
else if (buffer[0] == '#') {
|
|
Packit Service |
d1fe03 |
if (verbose)
|
|
Packit Service |
d1fe03 |
fputs(buffer, stdout);
|
|
Packit Service |
d1fe03 |
continue;
|
|
Packit Service |
d1fe03 |
} else if ((strcmp(buffer, "COMMIT\n") == 0) && (in_table)) {
|
|
Packit Service |
d1fe03 |
if (!testing) {
|
|
Packit Service |
d1fe03 |
DEBUGP("Calling commit\n");
|
|
Packit Service |
d1fe03 |
ret = cb->ops->commit(handle);
|
|
Packit Service |
d1fe03 |
cb->ops->free(handle);
|
|
Packit Service |
d1fe03 |
handle = NULL;
|
|
Packit Service |
d1fe03 |
} else {
|
|
Packit Service |
d1fe03 |
DEBUGP("Not calling commit, testing\n");
|
|
Packit Service |
d1fe03 |
ret = 1;
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
/* Done with the current table, release the lock. */
|
|
Packit Service |
d1fe03 |
if (lock >= 0) {
|
|
Packit Service |
d1fe03 |
xtables_unlock(lock);
|
|
Packit Service |
d1fe03 |
lock = XT_LOCK_NOT_ACQUIRED;
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
in_table = 0;
|
|
Packit Service |
d1fe03 |
} else if ((buffer[0] == '*') && (!in_table)) {
|
|
Packit Service |
d1fe03 |
/* Acquire a lock before we create a new table handle */
|
|
Packit Service |
d1fe03 |
lock = xtables_lock_or_exit(wait, &wait_interval);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
/* New table */
|
|
Packit Service |
d1fe03 |
char *table;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
table = strtok(buffer+1, " \t\n");
|
|
Packit Service |
d1fe03 |
DEBUGP("line %u, table '%s'\n", line, table);
|
|
Packit Service |
d1fe03 |
if (!table)
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"%s: line %u table name invalid\n",
|
|
Packit Service |
d1fe03 |
xt_params->program_name, line);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
strncpy(curtable, table, XT_TABLE_MAXNAMELEN);
|
|
Packit Service |
d1fe03 |
curtable[XT_TABLE_MAXNAMELEN] = '\0';
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (tablename && strcmp(tablename, table) != 0) {
|
|
Packit Service |
d1fe03 |
if (lock >= 0) {
|
|
Packit Service |
d1fe03 |
xtables_unlock(lock);
|
|
Packit Service |
d1fe03 |
lock = XT_LOCK_NOT_ACQUIRED;
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
continue;
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
if (handle)
|
|
Packit Service |
d1fe03 |
cb->ops->free(handle);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
handle = create_handle(cb, table);
|
|
Packit Service |
d1fe03 |
if (noflush == 0) {
|
|
Packit Service |
d1fe03 |
DEBUGP("Cleaning all chains of table '%s'\n",
|
|
Packit Service |
d1fe03 |
table);
|
|
Packit Service |
d1fe03 |
cb->for_each_chain(cb->flush_entries, verbose, 1,
|
|
Packit Service |
d1fe03 |
handle);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
DEBUGP("Deleting all user-defined chains "
|
|
Packit Service |
d1fe03 |
"of table '%s'\n", table);
|
|
Packit Service |
d1fe03 |
cb->for_each_chain(cb->delete_chain, verbose, 0,
|
|
Packit Service |
d1fe03 |
handle);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
ret = 1;
|
|
Packit Service |
d1fe03 |
in_table = 1;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
} else if ((buffer[0] == ':') && (in_table)) {
|
|
Packit Service |
d1fe03 |
/* New chain. */
|
|
Packit Service |
d1fe03 |
char *policy, *chain;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
chain = strtok(buffer+1, " \t\n");
|
|
Packit Service |
d1fe03 |
DEBUGP("line %u, chain '%s'\n", line, chain);
|
|
Packit Service |
d1fe03 |
if (!chain)
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"%s: line %u chain name invalid\n",
|
|
Packit Service |
d1fe03 |
xt_params->program_name, line);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (strlen(chain) >= XT_EXTENSION_MAXNAMELEN)
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"Invalid chain name `%s' "
|
|
Packit Service |
d1fe03 |
"(%u chars max)",
|
|
Packit Service |
d1fe03 |
chain, XT_EXTENSION_MAXNAMELEN - 1);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (cb->ops->builtin(chain, handle) <= 0) {
|
|
Packit Service |
d1fe03 |
if (noflush && cb->ops->is_chain(chain, handle)) {
|
|
Packit Service |
d1fe03 |
DEBUGP("Flushing existing user defined chain '%s'\n", chain);
|
|
Packit Service |
d1fe03 |
if (!cb->ops->flush_entries(chain, handle))
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"error flushing chain "
|
|
Packit Service |
d1fe03 |
"'%s':%s\n", chain,
|
|
Packit Service |
d1fe03 |
strerror(errno));
|
|
Packit Service |
d1fe03 |
} else {
|
|
Packit Service |
d1fe03 |
DEBUGP("Creating new chain '%s'\n", chain);
|
|
Packit Service |
d1fe03 |
if (!cb->ops->create_chain(chain, handle))
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"error creating chain "
|
|
Packit Service |
d1fe03 |
"'%s':%s\n", chain,
|
|
Packit Service |
d1fe03 |
strerror(errno));
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
policy = strtok(NULL, " \t\n");
|
|
Packit Service |
d1fe03 |
DEBUGP("line %u, policy '%s'\n", line, policy);
|
|
Packit Service |
d1fe03 |
if (!policy)
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"%s: line %u policy invalid\n",
|
|
Packit Service |
d1fe03 |
xt_params->program_name, line);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (strcmp(policy, "-") != 0) {
|
|
Packit Service |
d1fe03 |
struct xt_counters count = {};
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (counters) {
|
|
Packit Service |
d1fe03 |
char *ctrs;
|
|
Packit Service |
d1fe03 |
ctrs = strtok(NULL, " \t\n");
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (!ctrs || !parse_counters(ctrs, &count))
|
|
Packit Service |
d1fe03 |
xtables_error(PARAMETER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"invalid policy counters "
|
|
Packit Service |
d1fe03 |
"for chain '%s'\n", chain);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
DEBUGP("Setting policy of chain %s to %s\n",
|
|
Packit Service |
d1fe03 |
chain, policy);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
if (!cb->ops->set_policy(chain, policy, &count,
|
|
Packit Service |
d1fe03 |
handle))
|
|
Packit Service |
d1fe03 |
xtables_error(OTHER_PROBLEM,
|
|
Packit Service |
d1fe03 |
"Can't set policy `%s'"
|
|
Packit Service |
d1fe03 |
" on `%s' line %u: %s\n",
|
|
Packit Service |
d1fe03 |
policy, chain, line,
|
|
Packit Service |
d1fe03 |
cb->ops->strerror(errno));
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
ret = 1;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
} else if (in_table) {
|
|
Packit Service |
d1fe03 |
char *pcnt = NULL;
|
|
Packit Service |
d1fe03 |
char *bcnt = NULL;
|
|
Packit Service |
d1fe03 |
char *parsestart = buffer;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
add_argv(&av_store, argv[0], 0);
|
|
Packit Service |
d1fe03 |
add_argv(&av_store, "-t", 0);
|
|
Packit Service |
d1fe03 |
add_argv(&av_store, curtable, 0);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
tokenize_rule_counters(&parsestart, &pcnt, &bcnt, line);
|
|
Packit Service |
d1fe03 |
if (counters && pcnt && bcnt) {
|
|
Packit Service |
d1fe03 |
add_argv(&av_store, "--set-counters", 0);
|
|
Packit Service |
d1fe03 |
add_argv(&av_store, pcnt, 0);
|
|
Packit Service |
d1fe03 |
add_argv(&av_store, bcnt, 0);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
add_param_to_argv(&av_store, parsestart, line);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
DEBUGP("calling do_command(%u, argv, &%s, handle):\n",
|
|
Packit Service |
d1fe03 |
av_store.argc, curtable);
|
|
Packit Service |
d1fe03 |
debug_print_argv(&av_store);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
ret = cb->do_command(av_store.argc, av_store.argv,
|
|
Packit Service |
d1fe03 |
&av_store.argv[2], &handle, true);
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
free_argv(&av_store);
|
|
Packit Service |
d1fe03 |
fflush(stdout);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
if (tablename && strcmp(tablename, curtable) != 0)
|
|
Packit Service |
d1fe03 |
continue;
|
|
Packit Service |
d1fe03 |
if (!ret) {
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "%s: line %u failed\n",
|
|
Packit Service |
d1fe03 |
xt_params->program_name, line);
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
if (in_table) {
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "%s: COMMIT expected at line %u\n",
|
|
Packit Service |
d1fe03 |
xt_params->program_name, line + 1);
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
fclose(in);
|
|
Packit Service |
d1fe03 |
return 0;
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
#if defined ENABLE_IPV4
|
|
Packit Service |
d1fe03 |
static const struct iptables_restore_cb ipt_restore_cb = {
|
|
Packit Service |
d1fe03 |
.ops = &iptc_ops,
|
|
Packit Service |
d1fe03 |
.for_each_chain = for_each_chain4,
|
|
Packit Service |
d1fe03 |
.flush_entries = flush_entries4,
|
|
Packit Service |
d1fe03 |
.delete_chain = delete_chain4,
|
|
Packit Service |
d1fe03 |
.do_command = do_command4,
|
|
Packit Service |
d1fe03 |
};
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
int
|
|
Packit Service |
d1fe03 |
iptables_restore_main(int argc, char *argv[])
|
|
Packit Service |
d1fe03 |
{
|
|
Packit Service |
d1fe03 |
int c;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
iptables_globals.program_name = "iptables-restore";
|
|
Packit Service |
d1fe03 |
c = xtables_init_all(&iptables_globals, NFPROTO_IPV4);
|
|
Packit Service |
d1fe03 |
if (c < 0) {
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "%s/%s Failed to initialize xtables\n",
|
|
Packit Service |
d1fe03 |
iptables_globals.program_name,
|
|
Packit Service |
d1fe03 |
iptables_globals.program_version);
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS)
|
|
Packit Service |
d1fe03 |
init_extensions();
|
|
Packit Service |
d1fe03 |
init_extensions4();
|
|
Packit Service |
d1fe03 |
#endif
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
return ip46tables_restore_main(&ipt_restore_cb, argc, argv);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
#endif
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
#if defined ENABLE_IPV6
|
|
Packit Service |
d1fe03 |
static const struct iptables_restore_cb ip6t_restore_cb = {
|
|
Packit Service |
d1fe03 |
.ops = &ip6tc_ops,
|
|
Packit Service |
d1fe03 |
.for_each_chain = for_each_chain6,
|
|
Packit Service |
d1fe03 |
.flush_entries = flush_entries6,
|
|
Packit Service |
d1fe03 |
.delete_chain = delete_chain6,
|
|
Packit Service |
d1fe03 |
.do_command = do_command6,
|
|
Packit Service |
d1fe03 |
};
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
int
|
|
Packit Service |
d1fe03 |
ip6tables_restore_main(int argc, char *argv[])
|
|
Packit Service |
d1fe03 |
{
|
|
Packit Service |
d1fe03 |
int c;
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
ip6tables_globals.program_name = "ip6tables-restore";
|
|
Packit Service |
d1fe03 |
c = xtables_init_all(&ip6tables_globals, NFPROTO_IPV6);
|
|
Packit Service |
d1fe03 |
if (c < 0) {
|
|
Packit Service |
d1fe03 |
fprintf(stderr, "%s/%s Failed to initialize xtables\n",
|
|
Packit Service |
d1fe03 |
ip6tables_globals.program_name,
|
|
Packit Service |
d1fe03 |
ip6tables_globals.program_version);
|
|
Packit Service |
d1fe03 |
exit(1);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS)
|
|
Packit Service |
d1fe03 |
init_extensions();
|
|
Packit Service |
d1fe03 |
init_extensions6();
|
|
Packit Service |
d1fe03 |
#endif
|
|
Packit Service |
d1fe03 |
|
|
Packit Service |
d1fe03 |
return ip46tables_restore_main(&ip6t_restore_cb, argc, argv);
|
|
Packit Service |
d1fe03 |
}
|
|
Packit Service |
d1fe03 |
#endif
|