1acfe248484543b4057ea2899746721c6adc2746
[openwrt/openwrt.git] / package / iptables / patches / 004-multiport_v1.patch
1 Index: iptables-1.3.8/extensions/libipt_multiport.c
2 ===================================================================
3 --- iptables-1.3.8.orig/extensions/libipt_multiport.c 2007-07-31 15:27:55.000000000 -0500
4 +++ iptables-1.3.8/extensions/libipt_multiport.c 2007-07-31 15:27:56.000000000 -0500
5 @@ -8,24 +8,6 @@
6 /* To ensure that iptables compiles with an old kernel */
7 #include "../include/linux/netfilter_ipv4/ipt_multiport.h"
8
9 -/* Function which prints out usage message. */
10 -static void
11 -help(void)
12 -{
13 - printf(
14 -"multiport v%s options:\n"
15 -" --source-ports port[,port,port...]\n"
16 -" --sports ...\n"
17 -" match source port(s)\n"
18 -" --destination-ports port[,port,port...]\n"
19 -" --dports ...\n"
20 -" match destination port(s)\n"
21 -" --ports port[,port,port]\n"
22 -" match both source and destination port(s)\n"
23 -" NOTE: this kernel does not support port ranges in multiport.\n",
24 -IPTABLES_VERSION);
25 -}
26 -
27 static void
28 help_v1(void)
29 {
30 @@ -70,26 +52,6 @@
31 }
32 }
33
34 -static unsigned int
35 -parse_multi_ports(const char *portstring, u_int16_t *ports, const char *proto)
36 -{
37 - char *buffer, *cp, *next;
38 - unsigned int i;
39 -
40 - buffer = strdup(portstring);
41 - if (!buffer) exit_error(OTHER_PROBLEM, "strdup failed");
42 -
43 - for (cp=buffer, i=0; cp && i<IPT_MULTI_PORTS; cp=next,i++)
44 - {
45 - next=strchr(cp, ',');
46 - if (next) *next++='\0';
47 - ports[i] = parse_port(cp, proto);
48 - }
49 - if (cp) exit_error(PARAMETER_PROBLEM, "too many ports specified");
50 - free(buffer);
51 - return i;
52 -}
53 -
54 static void
55 parse_multi_ports_v1(const char *portstring,
56 struct ipt_multiport_v1 *multiinfo,
57 @@ -156,58 +118,6 @@
58 "multiport only works with TCP, UDP, UDPLITE, SCTP and DCCP");
59 }
60
61 -/* Function which parses command options; returns true if it
62 - ate an option */
63 -static int
64 -parse(int c, char **argv, int invert, unsigned int *flags,
65 - const struct ipt_entry *entry,
66 - unsigned int *nfcache,
67 - struct ipt_entry_match **match)
68 -{
69 - const char *proto;
70 - struct ipt_multiport *multiinfo
71 - = (struct ipt_multiport *)(*match)->data;
72 -
73 - switch (c) {
74 - case '1':
75 - check_inverse(argv[optind-1], &invert, &optind, 0);
76 - proto = check_proto(entry);
77 - multiinfo->count = parse_multi_ports(argv[optind-1],
78 - multiinfo->ports, proto);
79 - multiinfo->flags = IPT_MULTIPORT_SOURCE;
80 - break;
81 -
82 - case '2':
83 - check_inverse(argv[optind-1], &invert, &optind, 0);
84 - proto = check_proto(entry);
85 - multiinfo->count = parse_multi_ports(argv[optind-1],
86 - multiinfo->ports, proto);
87 - multiinfo->flags = IPT_MULTIPORT_DESTINATION;
88 - break;
89 -
90 - case '3':
91 - check_inverse(argv[optind-1], &invert, &optind, 0);
92 - proto = check_proto(entry);
93 - multiinfo->count = parse_multi_ports(argv[optind-1],
94 - multiinfo->ports, proto);
95 - multiinfo->flags = IPT_MULTIPORT_EITHER;
96 - break;
97 -
98 - default:
99 - return 0;
100 - }
101 -
102 - if (invert)
103 - exit_error(PARAMETER_PROBLEM,
104 - "multiport does not support invert");
105 -
106 - if (*flags)
107 - exit_error(PARAMETER_PROBLEM,
108 - "multiport can only have one option");
109 - *flags = 1;
110 - return 1;
111 -}
112 -
113 static int
114 parse_v1(int c, char **argv, int invert, unsigned int *flags,
115 const struct ipt_entry *entry,
116 @@ -284,43 +194,6 @@
117 printf("%s", service);
118 }
119
120 -/* Prints out the matchinfo. */
121 -static void
122 -print(const struct ipt_ip *ip,
123 - const struct ipt_entry_match *match,
124 - int numeric)
125 -{
126 - const struct ipt_multiport *multiinfo
127 - = (const struct ipt_multiport *)match->data;
128 - unsigned int i;
129 -
130 - printf("multiport ");
131 -
132 - switch (multiinfo->flags) {
133 - case IPT_MULTIPORT_SOURCE:
134 - printf("sports ");
135 - break;
136 -
137 - case IPT_MULTIPORT_DESTINATION:
138 - printf("dports ");
139 - break;
140 -
141 - case IPT_MULTIPORT_EITHER:
142 - printf("ports ");
143 - break;
144 -
145 - default:
146 - printf("ERROR ");
147 - break;
148 - }
149 -
150 - for (i=0; i < multiinfo->count; i++) {
151 - printf("%s", i ? "," : "");
152 - print_port(multiinfo->ports[i], ip->proto, numeric);
153 - }
154 - printf(" ");
155 -}
156 -
157 static void
158 print_v1(const struct ipt_ip *ip,
159 const struct ipt_entry_match *match,
160 @@ -364,34 +237,6 @@
161 printf(" ");
162 }
163
164 -/* Saves the union ipt_matchinfo in parsable form to stdout. */
165 -static void save(const struct ipt_ip *ip, const struct ipt_entry_match *match)
166 -{
167 - const struct ipt_multiport *multiinfo
168 - = (const struct ipt_multiport *)match->data;
169 - unsigned int i;
170 -
171 - switch (multiinfo->flags) {
172 - case IPT_MULTIPORT_SOURCE:
173 - printf("--sports ");
174 - break;
175 -
176 - case IPT_MULTIPORT_DESTINATION:
177 - printf("--dports ");
178 - break;
179 -
180 - case IPT_MULTIPORT_EITHER:
181 - printf("--ports ");
182 - break;
183 - }
184 -
185 - for (i=0; i < multiinfo->count; i++) {
186 - printf("%s", i ? "," : "");
187 - print_port(multiinfo->ports[i], ip->proto, 1);
188 - }
189 - printf(" ");
190 -}
191 -
192 static void save_v1(const struct ipt_ip *ip,
193 const struct ipt_entry_match *match)
194 {
195 @@ -427,19 +272,20 @@
196 printf(" ");
197 }
198
199 +
200 static struct iptables_match multiport = {
201 .next = NULL,
202 .name = "multiport",
203 - .revision = 0,
204 .version = IPTABLES_VERSION,
205 - .size = IPT_ALIGN(sizeof(struct ipt_multiport)),
206 - .userspacesize = IPT_ALIGN(sizeof(struct ipt_multiport)),
207 - .help = &help,
208 + .revision = 0,
209 + .size = IPT_ALIGN(sizeof(struct ipt_multiport_v1)),
210 + .userspacesize = IPT_ALIGN(sizeof(struct ipt_multiport_v1)),
211 + .help = &help_v1,
212 .init = &init,
213 - .parse = &parse,
214 + .parse = &parse_v1,
215 .final_check = &final_check,
216 - .print = &print,
217 - .save = &save,
218 + .print = &print_v1,
219 + .save = &save_v1,
220 .extra_opts = opts
221 };
222