ip6tables-restore.c revision 74ace0a46048d01611a44c24f6fe5f59d936231b
15b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann/* Code to restore the iptables state, from file by ip6tables-save. 22f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó * Author: Andras Kis-Szabo <kisza@sch.bme.hu> 32f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó * 42f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó * based on iptables-restore 52f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó * Authors: 65b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann * Harald Welte <laforge@gnumonks.org> 75b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann * Rusty Russell <rusty@linuxcare.com.au> 80c4188f446e7c0ed07076c69d1d7f336a92efc8bAndrás Kis-Szabó * This code is distributed under the terms of GNU GPL v2 92f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó */ 102f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 112f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#include <getopt.h> 122f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#include <sys/errno.h> 13c021c3ce7b1583eb5dd71b10ac3d8ab3cd36beaaJan Engelhardt#include <stdbool.h> 142f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#include <string.h> 152f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#include <stdio.h> 162f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#include <stdlib.h> 172f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#include "ip6tables.h" 180b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "xtables.h" 192f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#include "libiptc/libip6tc.h" 2033690a1aec0b6309ff90066ca56285b6e43013f2Jan Engelhardt#include "ip6tables-multi.h" 212f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 222f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#ifdef DEBUG 232f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#define DEBUGP(x, args...) fprintf(stderr, x, ## args) 242f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#else 255b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann#define DEBUGP(x, args...) 262f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó#endif 272f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 282f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabóstatic int binary = 0, counters = 0, verbose = 0, noflush = 0; 292f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 302f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó/* Keeping track of external matches and targets. */ 317bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajosstatic const struct option options[] = { 327bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {.name = "binary", .has_arg = false, .val = 'b'}, 337bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {.name = "counters", .has_arg = false, .val = 'c'}, 347bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {.name = "verbose", .has_arg = false, .val = 'v'}, 357bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {.name = "test", .has_arg = false, .val = 't'}, 367bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {.name = "help", .has_arg = false, .val = 'h'}, 377bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {.name = "noflush", .has_arg = false, .val = 'n'}, 387bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {.name = "modprobe", .has_arg = true, .val = 'M'}, 397bc3cb7eec4c4db5edc4b503a5dfab799e0bce62Gáspár Lajos {NULL}, 402f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó}; 412f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 422f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabóstatic void print_usage(const char *name, const char *version) __attribute__((noreturn)); 432f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 442f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabóstatic void print_usage(const char *name, const char *version) 452f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó{ 466004439c2ba892f553da473180e006b93a0986aaMartin Josefsson fprintf(stderr, "Usage: %s [-b] [-c] [-v] [-t] [-h]\n" 472f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó " [ --binary ]\n" 482f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó " [ --counters ]\n" 492f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó " [ --verbose ]\n" 504e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson " [ --test ]\n" 512f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó " [ --help ]\n" 5258918654563975e7bf3a6ec26af92a3bc222c229Harald Welte " [ --noflush ]\n" 535b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann " [ --modprobe=<command>]\n", name); 545b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann 552f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 562f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó} 572f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 58c354105d3578e3dd1ec825a57005fe60c095f7cbJan Engelhardtstatic struct ip6tc_handle *create_handle(const char *tablename) 592f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó{ 60fd1873110f8e57be578df17fc9d03536b10f4f73Jan Engelhardt struct ip6tc_handle *handle; 612f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 622f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó handle = ip6tc_init(tablename); 6358918654563975e7bf3a6ec26af92a3bc222c229Harald Welte 6458918654563975e7bf3a6ec26af92a3bc222c229Harald Welte if (!handle) { 6597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* try to insmod the module if iptc_init failed */ 66c021c3ce7b1583eb5dd71b10ac3d8ab3cd36beaaJan Engelhardt xtables_load_ko(xtables_modprobe_program, false); 6797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó handle = ip6tc_init(tablename); 6858918654563975e7bf3a6ec26af92a3bc222c229Harald Welte } 6958918654563975e7bf3a6ec26af92a3bc222c229Harald Welte 702f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!handle) { 711829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, "%s: unable to initialize " 725dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim "table '%s'\n", ip6tables_globals.program_name, 735dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim tablename); 742f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 752f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 762f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó return handle; 772f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó} 782f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 79e78c69c8146c5dcd096ba13ac03d7a7bb90e3ea7Lutz Jaenickestatic int parse_counters(char *string, struct ip6t_counters *ctr) 802f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó{ 81875441ea60d9fd9378475526f2f632b932790553Patrick McHardy unsigned long long pcnt, bcnt; 82875441ea60d9fd9378475526f2f632b932790553Patrick McHardy int ret; 83875441ea60d9fd9378475526f2f632b932790553Patrick McHardy 84bb8be30857edd501e701c2f22db6c59bd6839c87Jan Engelhardt ret = sscanf(string, "[%llu:%llu]", &pcnt, &bcnt); 85875441ea60d9fd9378475526f2f632b932790553Patrick McHardy ctr->pcnt = pcnt; 86875441ea60d9fd9378475526f2f632b932790553Patrick McHardy ctr->bcnt = bcnt; 87875441ea60d9fd9378475526f2f632b932790553Patrick McHardy return ret == 2; 882f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó} 892f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 90885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte/* global new argv and argc */ 91885c6eb5ec8a186c77a4710808374dd612e82b20Harald Weltestatic char *newargv[255]; 92885c6eb5ec8a186c77a4710808374dd612e82b20Harald Weltestatic int newargc; 93885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 945b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann/* function adding one argument to newargv, updating newargc 9597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó * returns true if argument added, false otherwise */ 96885c6eb5ec8a186c77a4710808374dd612e82b20Harald Weltestatic int add_argv(char *what) { 9797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó DEBUGP("add_argv: %s\n", what); 982c69b55e55f2efc5a334b87ccdceaa9de0ecb658Jan Engelhardt if (what && newargc + 1 < ARRAY_SIZE(newargv)) { 9997fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó newargv[newargc] = strdup(what); 10097fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó newargc++; 10197fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó return 1; 1026a0448eecdee4c6a19303b75c1707915a80cbfbbJan Engelhardt } else { 1036a0448eecdee4c6a19303b75c1707915a80cbfbbJan Engelhardt xtables_error(PARAMETER_PROBLEM, 1046a0448eecdee4c6a19303b75c1707915a80cbfbbJan Engelhardt "Parser cannot handle more arguments\n"); 10597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó return 0; 1066a0448eecdee4c6a19303b75c1707915a80cbfbbJan Engelhardt } 107885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte} 108885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 109885c6eb5ec8a186c77a4710808374dd612e82b20Harald Weltestatic void free_argv(void) { 11097fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó int i; 111885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 11297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó for (i = 0; i < newargc; i++) 11397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó free(newargv[i]); 114885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte} 115885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 1164bc48331d2d1ef64ba452329f2c77137036f6437Hann-Huei Chiou#ifdef IPTABLES_MULTI 1174bc48331d2d1ef64ba452329f2c77137036f6437Hann-Huei Chiouint ip6tables_restore_main(int argc, char *argv[]) 1184bc48331d2d1ef64ba452329f2c77137036f6437Hann-Huei Chiou#else 1192f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabóint main(int argc, char *argv[]) 1204bc48331d2d1ef64ba452329f2c77137036f6437Hann-Huei Chiou#endif 1212f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó{ 122fd1873110f8e57be578df17fc9d03536b10f4f73Jan Engelhardt struct ip6tc_handle *handle = NULL; 1232f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char buffer[10240]; 1242f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó int c; 1252f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char curtable[IP6T_TABLE_MAXNAMELEN + 1]; 1262f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó FILE *in; 1274e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson int in_table = 0, testing = 0; 1282f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 129a8658ca43fba82f7761f774f4daeb29b3e335053Harald Welte line = 0; 1302f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 131617d3d140f4739558dce2ef8ed01aef251cf5487Jamal Hadi Salim ip6tables_globals.program_name = "ip6tables-restore"; 1327e4db2f50133007f549f222468bde4f3adcf41acJamal Hadi Salim c = xtables_init_all(&ip6tables_globals, NFPROTO_IPV6); 1337e4db2f50133007f549f222468bde4f3adcf41acJamal Hadi Salim if (c < 0) { 1347e4db2f50133007f549f222468bde4f3adcf41acJamal Hadi Salim fprintf(stderr, "%s/%s Failed to initialize xtables\n", 1357e4db2f50133007f549f222468bde4f3adcf41acJamal Hadi Salim ip6tables_globals.program_name, 1367e4db2f50133007f549f222468bde4f3adcf41acJamal Hadi Salim ip6tables_globals.program_version); 1377e4db2f50133007f549f222468bde4f3adcf41acJamal Hadi Salim exit(1); 1387e4db2f50133007f549f222468bde4f3adcf41acJamal Hadi Salim } 139b79ec69027fd8b65e7eccd78a445b6665e8ad53bJan Engelhardt#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS) 14049d8c5d564cad70c5c1bef2d5571e8e494454210Maciej Zenczykowski init_extensions6(); 1413efb6ead2e51fe1eca55bcb2b06afb4dc4b8cb7cHarald Welte#endif 1423efb6ead2e51fe1eca55bcb2b06afb4dc4b8cb7cHarald Welte 1434e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson while ((c = getopt_long(argc, argv, "bcvthnM:", options, NULL)) != -1) { 1442f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó switch (c) { 1452f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó case 'b': 1462f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó binary = 1; 1472f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó break; 1482f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó case 'c': 1492f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó counters = 1; 1502f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó break; 15197fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó case 'v': 15297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó verbose = 1; 15397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó break; 1544e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson case 't': 1554e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson testing = 1; 1564e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson break; 1572f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó case 'h': 1582f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó print_usage("ip6tables-restore", 159dacafa55379fd98212031d8c559096c91d7ce93bJan Engelhardt IPTABLES_VERSION); 1602f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó break; 1612f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó case 'n': 1622f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó noflush = 1; 1632f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó break; 16458918654563975e7bf3a6ec26af92a3bc222c229Harald Welte case 'M': 165c021c3ce7b1583eb5dd71b10ac3d8ab3cd36beaaJan Engelhardt xtables_modprobe_program = optarg; 16658918654563975e7bf3a6ec26af92a3bc222c229Harald Welte break; 1672f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 1682f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 1695b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann 1702f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (optind == argc - 1) { 171a239728ec064666025de2723997d87b176d57fd6Maciej Zenczykowski in = fopen(argv[optind], "re"); 1722f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!in) { 173972af09e79618c5086e26ef6438bd38c45c4bb3fPavel Rusnak fprintf(stderr, "Can't open %s: %s\n", argv[optind], 1742f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó strerror(errno)); 1752f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 1762f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 1772f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 1782f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó else if (optind < argc) { 179972af09e79618c5086e26ef6438bd38c45c4bb3fPavel Rusnak fprintf(stderr, "Unknown arguments found on commandline\n"); 1802f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 1812f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 1822f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó else in = stdin; 1835b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann 1842f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó /* Grab standard input. */ 1852f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó while (fgets(buffer, sizeof(buffer), in)) { 186cc53628e73fee066105d8387d0b4f6b7e9d577c9Martin Josefsson int ret = 0; 1872f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 1882f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó line++; 1895065afa11159f4d8cfad672ac01f2958379fad4bMartin Josefsson if (buffer[0] == '\n') 1905065afa11159f4d8cfad672ac01f2958379fad4bMartin Josefsson continue; 1912f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó else if (buffer[0] == '#') { 1923673dcb1545a53d70cee3ad14d101fab33541990Martin Josefsson if (verbose) 1933673dcb1545a53d70cee3ad14d101fab33541990Martin Josefsson fputs(buffer, stdout); 1942f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó continue; 195a8658ca43fba82f7761f774f4daeb29b3e335053Harald Welte } else if ((strcmp(buffer, "COMMIT\n") == 0) && (in_table)) { 1964e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson if (!testing) { 1974e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson DEBUGP("Calling commit\n"); 1981c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt ret = ip6tc_commit(handle); 1991c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt ip6tc_free(handle); 2001c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt handle = NULL; 2014e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson } else { 2024e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson DEBUGP("Not calling commit, testing\n"); 2034e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson ret = 1; 2044e5e29adf4d3946253351b871aececfe652239b2Martin Josefsson } 205a8658ca43fba82f7761f774f4daeb29b3e335053Harald Welte in_table = 0; 206a8658ca43fba82f7761f774f4daeb29b3e335053Harald Welte } else if ((buffer[0] == '*') && (!in_table)) { 2072f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó /* New table */ 2082f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char *table; 2092f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2102f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó table = strtok(buffer+1, " \t\n"); 2112f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó DEBUGP("line %u, table '%s'\n", line, table); 2122f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!table) { 2131829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 2142f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó "%s: line %u table name invalid\n", 2155dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim ip6tables_globals.program_name, 2165dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim line); 2172f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 2182f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 2192f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó strncpy(curtable, table, IP6T_TABLE_MAXNAMELEN); 220073df8feb0a8c4023ce40138e519ac9b341b1ca2Karsten Desler curtable[IP6T_TABLE_MAXNAMELEN] = '\0'; 2212f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 222841e4aed2349046eb2c0b1375139c06569a93bd0Martin Josefsson if (handle) 2231c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt ip6tc_free(handle); 224841e4aed2349046eb2c0b1375139c06569a93bd0Martin Josefsson 225c354105d3578e3dd1ec825a57005fe60c095f7cbJan Engelhardt handle = create_handle(table); 2262f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (noflush == 0) { 2272f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó DEBUGP("Cleaning all chains of table '%s'\n", 2282f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó table); 22974ace0a46048d01611a44c24f6fe5f59d936231bMaciej Zenczykowski for_each_chain6(flush_entries6, verbose, 1, 2301c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt handle); 2315b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann 2322f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó DEBUGP("Deleting all user-defined chains " 2332f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó "of table '%s'\n", table); 234241e73594f6d75e32a7e89ebdb6b7f7917a48df0Maciej Zenczykowski for_each_chain6(delete_chain, verbose, 0, 2351c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt handle); 2362f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 2372f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2382f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó ret = 1; 239a8658ca43fba82f7761f774f4daeb29b3e335053Harald Welte in_table = 1; 2402f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 241a8658ca43fba82f7761f774f4daeb29b3e335053Harald Welte } else if ((buffer[0] == ':') && (in_table)) { 2422f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó /* New chain. */ 2432f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char *policy, *chain; 2442f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2452f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó chain = strtok(buffer+1, " \t\n"); 2462f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó DEBUGP("line %u, chain '%s'\n", line, chain); 2472f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!chain) { 2481829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 2492f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó "%s: line %u chain name invalid\n", 2505dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim ip6tables_globals.program_name, 2515dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim line); 2522f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 2532f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 2542f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2550cb675b8f18c4b074d4c69461638820708e98100Jan Engelhardt if (strlen(chain) >= XT_EXTENSION_MAXNAMELEN) 25621d1283750d9c4df7ca80165d2b9dc0b9bd214ebJan Engelhardt xtables_error(PARAMETER_PROBLEM, 25721d1283750d9c4df7ca80165d2b9dc0b9bd214ebJan Engelhardt "Invalid chain name `%s' " 25821d1283750d9c4df7ca80165d2b9dc0b9bd214ebJan Engelhardt "(%u chars max)", 2590cb675b8f18c4b074d4c69461638820708e98100Jan Engelhardt chain, XT_EXTENSION_MAXNAMELEN - 1); 26021d1283750d9c4df7ca80165d2b9dc0b9bd214ebJan Engelhardt 261df1c71cc78e3bf0bf73604d13516cefffc783aabHarald Welte if (ip6tc_builtin(chain, handle) <= 0) { 262595e493649a97a738dd84699f65207735b9567e7Charlie Brady if (noflush && ip6tc_is_chain(chain, handle)) { 263595e493649a97a738dd84699f65207735b9567e7Charlie Brady DEBUGP("Flushing existing user defined chain '%s'\n", chain); 2641c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt if (!ip6tc_flush_entries(chain, handle)) 2651829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 266595e493649a97a738dd84699f65207735b9567e7Charlie Brady "error flushing chain " 267595e493649a97a738dd84699f65207735b9567e7Charlie Brady "'%s':%s\n", chain, 268595e493649a97a738dd84699f65207735b9567e7Charlie Brady strerror(errno)); 269595e493649a97a738dd84699f65207735b9567e7Charlie Brady } else { 270595e493649a97a738dd84699f65207735b9567e7Charlie Brady DEBUGP("Creating new chain '%s'\n", chain); 2711c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt if (!ip6tc_create_chain(chain, handle)) 2721829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 273595e493649a97a738dd84699f65207735b9567e7Charlie Brady "error creating chain " 274595e493649a97a738dd84699f65207735b9567e7Charlie Brady "'%s':%s\n", chain, 275595e493649a97a738dd84699f65207735b9567e7Charlie Brady strerror(errno)); 276595e493649a97a738dd84699f65207735b9567e7Charlie Brady } 277885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte } 2782f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2792f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó policy = strtok(NULL, " \t\n"); 2802f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó DEBUGP("line %u, policy '%s'\n", line, policy); 2812f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!policy) { 2821829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 2832f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó "%s: line %u policy invalid\n", 2845dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim ip6tables_globals.program_name, 2855dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim line); 2862f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 2872f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 2882f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2892f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (strcmp(policy, "-") != 0) { 2902f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó struct ip6t_counters count; 2912f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2922f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (counters) { 2932f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char *ctrs; 2942f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó ctrs = strtok(NULL, " \t\n"); 2952f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 2966f38a30f99966435e0c6b6f5f3ff497f8309ee81Harald Welte if (!ctrs || !parse_counters(ctrs, &count)) 2971829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 2986f38a30f99966435e0c6b6f5f3ff497f8309ee81Harald Welte "invalid policy counters " 2996f38a30f99966435e0c6b6f5f3ff497f8309ee81Harald Welte "for chain '%s'\n", chain); 3002f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 3012f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } else { 3025b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann memset(&count, 0, 3032f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó sizeof(struct ip6t_counters)); 3042f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 3052f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 3062f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó DEBUGP("Setting policy of chain %s to %s\n", 3072f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó chain, policy); 3082f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 3092f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!ip6tc_set_policy(chain, policy, &count, 3101c9015b2cb483678f153121255e10ec0bbfde3e6Jan Engelhardt handle)) 3111829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(OTHER_PROBLEM, 3122f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó "Can't set policy `%s'" 3132f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó " on `%s' line %u: %s\n", 314f6d6449c88812634e663cef4e09db7b691af3eb5Rob Leslie policy, chain, line, 3152f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó ip6tc_strerror(errno)); 3162f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 3172f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 3182f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó ret = 1; 3192f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 320a8658ca43fba82f7761f774f4daeb29b3e335053Harald Welte } else if (in_table) { 321885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte int a; 3222f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char *ptr = buffer; 3232f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char *pcnt = NULL; 3242f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó char *bcnt = NULL; 32597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó char *parsestart; 326885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 32797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* the parser */ 3283bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann char *curchar; 3293bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann int quote_open, escaped; 3303bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann size_t param_len; 331885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 33297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* reset the newargv */ 33397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó newargc = 0; 3342f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 3352f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (buffer[0] == '[') { 33697fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* we have counters in our input */ 3372f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó ptr = strchr(buffer, ']'); 3382f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!ptr) 3391829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 3402f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó "Bad line %u: need ]\n", 3412f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó line); 3422f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 343885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte pcnt = strtok(buffer+1, ":"); 34497fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó if (!pcnt) 3451829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 34697fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó "Bad line %u: need :\n", 34797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó line); 3482f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 349885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte bcnt = strtok(NULL, "]"); 35097fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó if (!bcnt) 3511829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 35297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó "Bad line %u: need ]\n", 35397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó line); 354885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 35597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* start command parsing after counter */ 35697fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó parsestart = ptr + 1; 35797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } else { 35897fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* start command parsing at start of line */ 35997fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó parsestart = buffer; 36097fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } 36197fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó 36297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó add_argv(argv[0]); 36397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó add_argv("-t"); 36400696591b1f2582cb0c5a8c1887c2f24b6aafeddJan Engelhardt add_argv(curtable); 3655b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann 3662f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (counters && pcnt && bcnt) { 36797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó add_argv("--set-counters"); 36897fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó add_argv((char *) pcnt); 36997fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó add_argv((char *) bcnt); 3702f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 371bb41f8879f5743d683ff3e66ef440b7b7bb5f6d2Harald Welte 37297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* After fighting with strtok enough, here's now 37397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó * a 'real' parser. According to Rusty I'm now no 37497fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó * longer a real hacker, but I can live with that */ 37597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó 37697fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó quote_open = 0; 3773bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann escaped = 0; 3783bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann param_len = 0; 3795b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann 38097fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó for (curchar = parsestart; *curchar; curchar++) { 3813bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann char param_buffer[1024]; 3823bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann 3833bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann if (quote_open) { 384fe05c768f877bcc69c13d7a9cb1d2b33ef56f600Max Kellermann if (escaped) { 385fe05c768f877bcc69c13d7a9cb1d2b33ef56f600Max Kellermann param_buffer[param_len++] = *curchar; 386fe05c768f877bcc69c13d7a9cb1d2b33ef56f600Max Kellermann escaped = 0; 387fe05c768f877bcc69c13d7a9cb1d2b33ef56f600Max Kellermann continue; 388fe05c768f877bcc69c13d7a9cb1d2b33ef56f600Max Kellermann } else if (*curchar == '\\') { 3893bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann escaped = 1; 3903bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann continue; 3913bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann } else if (*curchar == '"') { 39297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó quote_open = 0; 39397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó *curchar = ' '; 39497fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } else { 3953bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann param_buffer[param_len++] = *curchar; 3963bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann continue; 3973bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann } 3983bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann } else { 3993bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann if (*curchar == '"') { 40097fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó quote_open = 1; 4013bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann continue; 40297fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } 4033bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann } 4043bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann 40597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó if (*curchar == ' ' 40697fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó || *curchar == '\t' 40797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó || * curchar == '\n') { 40897fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó if (!param_len) { 40997fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* two spaces? */ 41097fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó continue; 41197fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } 4123bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann 4133bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann param_buffer[param_len] = '\0'; 41497fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó 41597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó /* check if table name specified */ 416d0cbf5f34d3421064eb0fbbcdc6b90cda4e81f2dJan Engelhardt if (!strncmp(param_buffer, "-t", 2) 41748a6f900fa25a4dd2d9b39cff4bf1ab83356d967Harald Welte || !strncmp(param_buffer, "--table", 8)) { 4181829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 419bb41f8879f5743d683ff3e66ef440b7b7bb5f6d2Harald Welte "Line %u seems to have a " 420bb41f8879f5743d683ff3e66ef440b7b7bb5f6d2Harald Welte "-t table option.\n", line); 421bb41f8879f5743d683ff3e66ef440b7b7bb5f6d2Harald Welte exit(1); 422bb41f8879f5743d683ff3e66ef440b7b7bb5f6d2Harald Welte } 423bb41f8879f5743d683ff3e66ef440b7b7bb5f6d2Harald Welte 42497fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó add_argv(param_buffer); 4253bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann param_len = 0; 42697fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } else { 4273bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann /* regular character, copy to buffer */ 4283bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann param_buffer[param_len++] = *curchar; 4293bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann 4303bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann if (param_len >= sizeof(param_buffer)) 4311829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt xtables_error(PARAMETER_PROBLEM, 4323bf54dffc605c88f10b0937c5e3e980328b64b72Max Kellermann "Parameter too long!"); 43397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } 43497fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó } 435885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 436885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte DEBUGP("calling do_command6(%u, argv, &%s, handle):\n", 43797fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó newargc, curtable); 438885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 43997fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó for (a = 0; a < newargc; a++) 4402f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó DEBUGP("argv[%u]: %s\n", a, newargv[a]); 4412f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 4425b76f682f722bebc2f0616fca4600eee2c08dfe2Max Kellermann ret = do_command6(newargc, newargv, 44397fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó &newargv[2], &handle); 444885c6eb5ec8a186c77a4710808374dd612e82b20Harald Welte 44597fd91a58e7978338451471cfc2cd5ead3b22f26András Kis-Szabó free_argv(); 446d213760d4ffb5d2c45e024783741b4b191b91a74Henrik Nordstrom fflush(stdout); 4472f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 4482f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó if (!ret) { 4492f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó fprintf(stderr, "%s: line %u failed\n", 4505dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim ip6tables_globals.program_name, 4515dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim line); 4522f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó exit(1); 4532f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 4542f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó } 455e0dc5813667b87449ab4f2c1ffff5339f2927f1bMartin Josefsson if (in_table) { 456e0dc5813667b87449ab4f2c1ffff5339f2927f1bMartin Josefsson fprintf(stderr, "%s: COMMIT expected at line %u\n", 4575dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim ip6tables_globals.program_name, 4585dd19de34380c91ad07bbe79a34726e59891cf54Jamal Hadi Salim line + 1); 459e0dc5813667b87449ab4f2c1ffff5339f2927f1bMartin Josefsson exit(1); 460e0dc5813667b87449ab4f2c1ffff5339f2927f1bMartin Josefsson } 4612f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó 462f1afcc896e7f8be3a6419681fd8cdee1d600a3aaJan Engelhardt if (in != NULL) 463f1afcc896e7f8be3a6419681fd8cdee1d600a3aaJan Engelhardt fclose(in); 4642f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó return 0; 4652f52379841217e55201fbc93872be9a21fa5d443András Kis-Szabó} 466