Imported Upstream version 1.24
[platform/upstream/connman.git] / tools / iptables-test.c
1 /*
2  *  Connection Manager
3  *
4  *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
5  *  Copyright (C) 2013  BMW Car IT GmbH.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License version 2 as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  */
21
22 #include <getopt.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <errno.h>
26
27 #include <glib.h>
28
29 #include "../src/connman.h"
30
31 enum iptables_command {
32         IPTABLES_COMMAND_APPEND,
33         IPTABLES_COMMAND_INSERT,
34         IPTABLES_COMMAND_DELETE,
35         IPTABLES_COMMAND_POLICY,
36         IPTABLES_COMMAND_CHAIN_INSERT,
37         IPTABLES_COMMAND_CHAIN_DELETE,
38         IPTABLES_COMMAND_CHAIN_FLUSH,
39         IPTABLES_COMMAND_DUMP,
40         IPTABLES_COMMAND_UNKNOWN,
41 };
42
43 int main(int argc, char *argv[])
44 {
45         enum iptables_command cmd = IPTABLES_COMMAND_UNKNOWN;
46         char *table = NULL, *chain = NULL, *rule = NULL, *tmp;
47         int err, c, i;
48
49         opterr = 0;
50
51         while ((c = getopt_long(argc, argv,
52                                 "-A:I:D:P:N:X:F:Lt:", NULL, NULL)) != -1) {
53                 switch (c) {
54                 case 'A':
55                         chain = optarg;
56                         cmd = IPTABLES_COMMAND_APPEND;
57                         break;
58                 case 'I':
59                         chain = optarg;
60                         cmd = IPTABLES_COMMAND_INSERT;
61                         break;
62                 case 'D':
63                         chain = optarg;
64                         cmd = IPTABLES_COMMAND_DELETE;
65                         break;
66                 case 'P':
67                         chain = optarg;
68                         /* The policy will be stored in rule. */
69                         cmd = IPTABLES_COMMAND_POLICY;
70                         break;
71                 case 'N':
72                         chain = optarg;
73                         cmd = IPTABLES_COMMAND_CHAIN_INSERT;
74                         break;
75                 case 'X':
76                         chain = optarg;
77                         cmd = IPTABLES_COMMAND_CHAIN_DELETE;
78                         break;
79                 case 'F':
80                         chain = optarg;
81                         cmd = IPTABLES_COMMAND_CHAIN_FLUSH;
82                         break;
83                 case 'L':
84                         cmd = IPTABLES_COMMAND_DUMP;
85                         break;
86                 case 't':
87                         table = optarg;
88                         break;
89                 default:
90                         goto out;
91                 }
92         }
93
94 out:
95         if (!table)
96                 table = "filter";
97
98         for (i = optind - 1; i < argc; i++) {
99                 if (rule) {
100                         tmp = rule;
101                         rule = g_strdup_printf("%s %s", rule,  argv[i]);
102                         g_free(tmp);
103                 } else
104                         rule = g_strdup(argv[i]);
105         }
106
107         __connman_iptables_init();
108
109         switch (cmd) {
110         case IPTABLES_COMMAND_APPEND:
111                 err = __connman_iptables_append(table, chain, rule);
112                 break;
113         case IPTABLES_COMMAND_INSERT:
114                 err = __connman_iptables_insert(table, chain, rule);
115                 break;
116         case IPTABLES_COMMAND_DELETE:
117                 err = __connman_iptables_delete(table, chain, rule);
118                 break;
119         case IPTABLES_COMMAND_POLICY:
120                 err = __connman_iptables_change_policy(table, chain, rule);
121                 break;
122         case IPTABLES_COMMAND_CHAIN_INSERT:
123                 err = __connman_iptables_new_chain(table, chain);
124                 break;
125         case IPTABLES_COMMAND_CHAIN_DELETE:
126                 err = __connman_iptables_delete_chain(table, chain);
127                 break;
128         case IPTABLES_COMMAND_CHAIN_FLUSH:
129                 err = __connman_iptables_flush_chain(table, chain);
130                 break;
131         case IPTABLES_COMMAND_DUMP:
132                 __connman_log_init(argv[0], "*", false, false,
133                         "iptables-test", "1");
134                 err = __connman_iptables_dump(table);
135                 break;
136         case IPTABLES_COMMAND_UNKNOWN:
137                 printf("Missing command\n");
138                 printf("usage: iptables-test [-t table] {-A|-I|-D} chain rule\n");
139                 printf("       iptables-test [-t table] {-N|-X|-F} chain\n");
140                 printf("       iptables-test [-t table] -L\n");
141                 printf("       iptables-test [-t table] -P chain target\n");
142                 exit(-EINVAL);
143         }
144
145         if (err < 0) {
146                 printf("Error: %s\n", strerror(-err));
147                 exit(err);
148         }
149
150         err = __connman_iptables_commit(table);
151         if (err < 0) {
152                 printf("Failed to commit changes: %s\n", strerror(-err));
153                 exit(err);
154         }
155
156         g_free(rule);
157
158         __connman_iptables_cleanup();
159
160         return 0;
161 }