diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-01-21 21:59:26 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-01-21 21:59:26 +0100 |
commit | e8f565c1eeba336fa13ce8216464c9daedd36f76 (patch) | |
tree | 85a8bba11af1083fc0eacd310e91df05185892ec | |
parent | b40da22357563bf53fa93823342f8ab59899222d (diff) | |
parent | dd169e84683aa7be3604d491f1c34ab657973365 (diff) | |
download | busybox-w32-e8f565c1eeba336fa13ce8216464c9daedd36f76.tar.gz busybox-w32-e8f565c1eeba336fa13ce8216464c9daedd36f76.tar.bz2 busybox-w32-e8f565c1eeba336fa13ce8216464c9daedd36f76.zip |
Merge branch 'master' of git+ssh://vda@busybox.net/var/lib/git/busybox
-rw-r--r-- | networking/ifplugd.c | 26 | ||||
-rw-r--r-- | networking/route.c | 71 | ||||
-rw-r--r-- | networking/traceroute.c | 3 | ||||
-rw-r--r-- | networking/udhcp/socket.c | 25 |
4 files changed, 69 insertions, 56 deletions
diff --git a/networking/ifplugd.c b/networking/ifplugd.c index 58f56dbf1..8dd0a5bd8 100644 --- a/networking/ifplugd.c +++ b/networking/ifplugd.c | |||
@@ -131,18 +131,21 @@ static int network_ioctl(int request, void* data, const char *errmsg) | |||
131 | 131 | ||
132 | static smallint detect_link_mii(void) | 132 | static smallint detect_link_mii(void) |
133 | { | 133 | { |
134 | struct ifreq ifreq; | 134 | /* char buffer instead of bona-fide struct avoids aliasing warning */ |
135 | struct mii_ioctl_data *mii = (void *)&ifreq.ifr_data; | 135 | char buf[sizeof(struct ifreq)]; |
136 | struct ifreq *const ifreq = (void *)buf; | ||
136 | 137 | ||
137 | set_ifreq_to_ifname(&ifreq); | 138 | struct mii_ioctl_data *mii = (void *)&ifreq->ifr_data; |
139 | |||
140 | set_ifreq_to_ifname(ifreq); | ||
138 | 141 | ||
139 | if (network_ioctl(SIOCGMIIPHY, &ifreq, "SIOCGMIIPHY") < 0) { | 142 | if (network_ioctl(SIOCGMIIPHY, ifreq, "SIOCGMIIPHY") < 0) { |
140 | return IFSTATUS_ERR; | 143 | return IFSTATUS_ERR; |
141 | } | 144 | } |
142 | 145 | ||
143 | mii->reg_num = 1; | 146 | mii->reg_num = 1; |
144 | 147 | ||
145 | if (network_ioctl(SIOCGMIIREG, &ifreq, "SIOCGMIIREG") < 0) { | 148 | if (network_ioctl(SIOCGMIIREG, ifreq, "SIOCGMIIREG") < 0) { |
146 | return IFSTATUS_ERR; | 149 | return IFSTATUS_ERR; |
147 | } | 150 | } |
148 | 151 | ||
@@ -151,18 +154,21 @@ static smallint detect_link_mii(void) | |||
151 | 154 | ||
152 | static smallint detect_link_priv(void) | 155 | static smallint detect_link_priv(void) |
153 | { | 156 | { |
154 | struct ifreq ifreq; | 157 | /* char buffer instead of bona-fide struct avoids aliasing warning */ |
155 | struct mii_ioctl_data *mii = (void *)&ifreq.ifr_data; | 158 | char buf[sizeof(struct ifreq)]; |
159 | struct ifreq *const ifreq = (void *)buf; | ||
156 | 160 | ||
157 | set_ifreq_to_ifname(&ifreq); | 161 | struct mii_ioctl_data *mii = (void *)&ifreq->ifr_data; |
162 | |||
163 | set_ifreq_to_ifname(ifreq); | ||
158 | 164 | ||
159 | if (network_ioctl(SIOCDEVPRIVATE, &ifreq, "SIOCDEVPRIVATE") < 0) { | 165 | if (network_ioctl(SIOCDEVPRIVATE, ifreq, "SIOCDEVPRIVATE") < 0) { |
160 | return IFSTATUS_ERR; | 166 | return IFSTATUS_ERR; |
161 | } | 167 | } |
162 | 168 | ||
163 | mii->reg_num = 1; | 169 | mii->reg_num = 1; |
164 | 170 | ||
165 | if (network_ioctl(SIOCDEVPRIVATE+1, &ifreq, "SIOCDEVPRIVATE+1") < 0) { | 171 | if (network_ioctl(SIOCDEVPRIVATE+1, ifreq, "SIOCDEVPRIVATE+1") < 0) { |
166 | return IFSTATUS_ERR; | 172 | return IFSTATUS_ERR; |
167 | } | 173 | } |
168 | 174 | ||
diff --git a/networking/route.c b/networking/route.c index 98567aaee..b7d08dd63 100644 --- a/networking/route.c +++ b/networking/route.c | |||
@@ -153,7 +153,10 @@ static int kw_lookup(const char *kwtbl, char ***pargs) | |||
153 | 153 | ||
154 | static NOINLINE void INET_setroute(int action, char **args) | 154 | static NOINLINE void INET_setroute(int action, char **args) |
155 | { | 155 | { |
156 | struct rtentry rt; | 156 | /* char buffer instead of bona-fide struct avoids aliasing warning */ |
157 | char rt_buf[sizeof(struct rtentry)]; | ||
158 | struct rtentry *const rt = (void *)rt_buf; | ||
159 | |||
157 | const char *netmask = NULL; | 160 | const char *netmask = NULL; |
158 | int skfd, isnet, xflag; | 161 | int skfd, isnet, xflag; |
159 | 162 | ||
@@ -166,7 +169,7 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
166 | } | 169 | } |
167 | 170 | ||
168 | /* Clean out the RTREQ structure. */ | 171 | /* Clean out the RTREQ structure. */ |
169 | memset(&rt, 0, sizeof(rt)); | 172 | memset(rt, 0, sizeof(*rt)); |
170 | 173 | ||
171 | { | 174 | { |
172 | const char *target = *args++; | 175 | const char *target = *args++; |
@@ -178,17 +181,17 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
178 | int prefix_len; | 181 | int prefix_len; |
179 | 182 | ||
180 | prefix_len = xatoul_range(prefix+1, 0, 32); | 183 | prefix_len = xatoul_range(prefix+1, 0, 32); |
181 | mask_in_addr(rt) = htonl( ~(0xffffffffUL >> prefix_len)); | 184 | mask_in_addr(*rt) = htonl( ~(0xffffffffUL >> prefix_len)); |
182 | *prefix = '\0'; | 185 | *prefix = '\0'; |
183 | #if HAVE_NEW_ADDRT | 186 | #if HAVE_NEW_ADDRT |
184 | rt.rt_genmask.sa_family = AF_INET; | 187 | rt->rt_genmask.sa_family = AF_INET; |
185 | #endif | 188 | #endif |
186 | } else { | 189 | } else { |
187 | /* Default netmask. */ | 190 | /* Default netmask. */ |
188 | netmask = "default"; | 191 | netmask = "default"; |
189 | } | 192 | } |
190 | /* Prefer hostname lookup is -host flag (xflag==1) was given. */ | 193 | /* Prefer hostname lookup is -host flag (xflag==1) was given. */ |
191 | isnet = INET_resolve(target, (struct sockaddr_in *) &rt.rt_dst, | 194 | isnet = INET_resolve(target, (struct sockaddr_in *) &rt->rt_dst, |
192 | (xflag & HOST_FLAG)); | 195 | (xflag & HOST_FLAG)); |
193 | if (isnet < 0) { | 196 | if (isnet < 0) { |
194 | bb_error_msg_and_die("resolving %s", target); | 197 | bb_error_msg_and_die("resolving %s", target); |
@@ -204,20 +207,20 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
204 | } | 207 | } |
205 | 208 | ||
206 | /* Fill in the other fields. */ | 209 | /* Fill in the other fields. */ |
207 | rt.rt_flags = ((isnet) ? RTF_UP : (RTF_UP | RTF_HOST)); | 210 | rt->rt_flags = ((isnet) ? RTF_UP : (RTF_UP | RTF_HOST)); |
208 | 211 | ||
209 | while (*args) { | 212 | while (*args) { |
210 | int k = kw_lookup(tbl_ipvx, &args); | 213 | int k = kw_lookup(tbl_ipvx, &args); |
211 | const char *args_m1 = args[-1]; | 214 | const char *args_m1 = args[-1]; |
212 | 215 | ||
213 | if (k & KW_IPVx_FLAG_ONLY) { | 216 | if (k & KW_IPVx_FLAG_ONLY) { |
214 | rt.rt_flags |= flags_ipvx[k & 3]; | 217 | rt->rt_flags |= flags_ipvx[k & 3]; |
215 | continue; | 218 | continue; |
216 | } | 219 | } |
217 | 220 | ||
218 | #if HAVE_NEW_ADDRT | 221 | #if HAVE_NEW_ADDRT |
219 | if (k == KW_IPVx_METRIC) { | 222 | if (k == KW_IPVx_METRIC) { |
220 | rt.rt_metric = xatoul(args_m1) + 1; | 223 | rt->rt_metric = xatoul(args_m1) + 1; |
221 | continue; | 224 | continue; |
222 | } | 225 | } |
223 | #endif | 226 | #endif |
@@ -225,7 +228,7 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
225 | if (k == KW_IPVx_NETMASK) { | 228 | if (k == KW_IPVx_NETMASK) { |
226 | struct sockaddr mask; | 229 | struct sockaddr mask; |
227 | 230 | ||
228 | if (mask_in_addr(rt)) { | 231 | if (mask_in_addr(*rt)) { |
229 | bb_show_usage(); | 232 | bb_show_usage(); |
230 | } | 233 | } |
231 | 234 | ||
@@ -234,18 +237,18 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
234 | if (isnet < 0) { | 237 | if (isnet < 0) { |
235 | bb_error_msg_and_die("resolving %s", netmask); | 238 | bb_error_msg_and_die("resolving %s", netmask); |
236 | } | 239 | } |
237 | rt.rt_genmask = full_mask(mask); | 240 | rt->rt_genmask = full_mask(mask); |
238 | continue; | 241 | continue; |
239 | } | 242 | } |
240 | 243 | ||
241 | if (k == KW_IPVx_GATEWAY) { | 244 | if (k == KW_IPVx_GATEWAY) { |
242 | if (rt.rt_flags & RTF_GATEWAY) { | 245 | if (rt->rt_flags & RTF_GATEWAY) { |
243 | bb_show_usage(); | 246 | bb_show_usage(); |
244 | } | 247 | } |
245 | 248 | ||
246 | isnet = INET_resolve(args_m1, | 249 | isnet = INET_resolve(args_m1, |
247 | (struct sockaddr_in *) &rt.rt_gateway, 1); | 250 | (struct sockaddr_in *) &rt->rt_gateway, 1); |
248 | rt.rt_flags |= RTF_GATEWAY; | 251 | rt->rt_flags |= RTF_GATEWAY; |
249 | 252 | ||
250 | if (isnet) { | 253 | if (isnet) { |
251 | if (isnet < 0) { | 254 | if (isnet < 0) { |
@@ -257,24 +260,24 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
257 | } | 260 | } |
258 | 261 | ||
259 | if (k == KW_IPVx_MSS) { /* Check valid MSS bounds. */ | 262 | if (k == KW_IPVx_MSS) { /* Check valid MSS bounds. */ |
260 | rt.rt_flags |= RTF_MSS; | 263 | rt->rt_flags |= RTF_MSS; |
261 | rt.rt_mss = xatoul_range(args_m1, 64, 32768); | 264 | rt->rt_mss = xatoul_range(args_m1, 64, 32768); |
262 | continue; | 265 | continue; |
263 | } | 266 | } |
264 | 267 | ||
265 | if (k == KW_IPVx_WINDOW) { /* Check valid window bounds. */ | 268 | if (k == KW_IPVx_WINDOW) { /* Check valid window bounds. */ |
266 | rt.rt_flags |= RTF_WINDOW; | 269 | rt->rt_flags |= RTF_WINDOW; |
267 | rt.rt_window = xatoul_range(args_m1, 128, INT_MAX); | 270 | rt->rt_window = xatoul_range(args_m1, 128, INT_MAX); |
268 | continue; | 271 | continue; |
269 | } | 272 | } |
270 | 273 | ||
271 | #ifdef RTF_IRTT | 274 | #ifdef RTF_IRTT |
272 | if (k == KW_IPVx_IRTT) { | 275 | if (k == KW_IPVx_IRTT) { |
273 | rt.rt_flags |= RTF_IRTT; | 276 | rt->rt_flags |= RTF_IRTT; |
274 | rt.rt_irtt = xatoul(args_m1); | 277 | rt->rt_irtt = xatoul(args_m1); |
275 | rt.rt_irtt *= (sysconf(_SC_CLK_TCK) / 100); /* FIXME */ | 278 | rt->rt_irtt *= (sysconf(_SC_CLK_TCK) / 100); /* FIXME */ |
276 | #if 0 /* FIXME: do we need to check anything of this? */ | 279 | #if 0 /* FIXME: do we need to check anything of this? */ |
277 | if (rt.rt_irtt < 1 || rt.rt_irtt > (120 * HZ)) { | 280 | if (rt->rt_irtt < 1 || rt->rt_irtt > (120 * HZ)) { |
278 | bb_error_msg_and_die("bad irtt"); | 281 | bb_error_msg_and_die("bad irtt"); |
279 | } | 282 | } |
280 | #endif | 283 | #endif |
@@ -284,9 +287,9 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
284 | 287 | ||
285 | /* Device is special in that it can be the last arg specified | 288 | /* Device is special in that it can be the last arg specified |
286 | * and doesn't requre the dev/device keyword in that case. */ | 289 | * and doesn't requre the dev/device keyword in that case. */ |
287 | if (!rt.rt_dev && ((k == KW_IPVx_DEVICE) || (!k && !*++args))) { | 290 | if (!rt->rt_dev && ((k == KW_IPVx_DEVICE) || (!k && !*++args))) { |
288 | /* Don't use args_m1 here since args may have changed! */ | 291 | /* Don't use args_m1 here since args may have changed! */ |
289 | rt.rt_dev = args[-1]; | 292 | rt->rt_dev = args[-1]; |
290 | continue; | 293 | continue; |
291 | } | 294 | } |
292 | 295 | ||
@@ -295,41 +298,41 @@ static NOINLINE void INET_setroute(int action, char **args) | |||
295 | } | 298 | } |
296 | 299 | ||
297 | #ifdef RTF_REJECT | 300 | #ifdef RTF_REJECT |
298 | if ((rt.rt_flags & RTF_REJECT) && !rt.rt_dev) { | 301 | if ((rt->rt_flags & RTF_REJECT) && !rt->rt_dev) { |
299 | rt.rt_dev = (char*)"lo"; | 302 | rt->rt_dev = (char*)"lo"; |
300 | } | 303 | } |
301 | #endif | 304 | #endif |
302 | 305 | ||
303 | /* sanity checks.. */ | 306 | /* sanity checks.. */ |
304 | if (mask_in_addr(rt)) { | 307 | if (mask_in_addr(*rt)) { |
305 | uint32_t mask = mask_in_addr(rt); | 308 | uint32_t mask = mask_in_addr(*rt); |
306 | 309 | ||
307 | mask = ~ntohl(mask); | 310 | mask = ~ntohl(mask); |
308 | if ((rt.rt_flags & RTF_HOST) && mask != 0xffffffff) { | 311 | if ((rt->rt_flags & RTF_HOST) && mask != 0xffffffff) { |
309 | bb_error_msg_and_die("netmask %.8x and host route conflict", | 312 | bb_error_msg_and_die("netmask %.8x and host route conflict", |
310 | (unsigned int) mask); | 313 | (unsigned int) mask); |
311 | } | 314 | } |
312 | if (mask & (mask + 1)) { | 315 | if (mask & (mask + 1)) { |
313 | bb_error_msg_and_die("bogus netmask %s", netmask); | 316 | bb_error_msg_and_die("bogus netmask %s", netmask); |
314 | } | 317 | } |
315 | mask = ((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr; | 318 | mask = ((struct sockaddr_in *) &rt->rt_dst)->sin_addr.s_addr; |
316 | if (mask & ~(uint32_t)mask_in_addr(rt)) { | 319 | if (mask & ~(uint32_t)mask_in_addr(*rt)) { |
317 | bb_error_msg_and_die("netmask and route address conflict"); | 320 | bb_error_msg_and_die("netmask and route address conflict"); |
318 | } | 321 | } |
319 | } | 322 | } |
320 | 323 | ||
321 | /* Fill out netmask if still unset */ | 324 | /* Fill out netmask if still unset */ |
322 | if ((action == RTACTION_ADD) && (rt.rt_flags & RTF_HOST)) { | 325 | if ((action == RTACTION_ADD) && (rt->rt_flags & RTF_HOST)) { |
323 | mask_in_addr(rt) = 0xffffffff; | 326 | mask_in_addr(*rt) = 0xffffffff; |
324 | } | 327 | } |
325 | 328 | ||
326 | /* Create a socket to the INET kernel. */ | 329 | /* Create a socket to the INET kernel. */ |
327 | skfd = xsocket(AF_INET, SOCK_DGRAM, 0); | 330 | skfd = xsocket(AF_INET, SOCK_DGRAM, 0); |
328 | 331 | ||
329 | if (action == RTACTION_ADD) | 332 | if (action == RTACTION_ADD) |
330 | xioctl(skfd, SIOCADDRT, &rt); | 333 | xioctl(skfd, SIOCADDRT, rt); |
331 | else | 334 | else |
332 | xioctl(skfd, SIOCDELRT, &rt); | 335 | xioctl(skfd, SIOCDELRT, rt); |
333 | 336 | ||
334 | if (ENABLE_FEATURE_CLEAN_UP) close(skfd); | 337 | if (ENABLE_FEATURE_CLEAN_UP) close(skfd); |
335 | } | 338 | } |
diff --git a/networking/traceroute.c b/networking/traceroute.c index c18fba8d0..82bb0118c 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c | |||
@@ -751,7 +751,8 @@ print(int read_len, const struct sockaddr *from, const struct sockaddr *to) | |||
751 | } else | 751 | } else |
752 | #endif | 752 | #endif |
753 | { | 753 | { |
754 | read_len -= ((struct ip*)recv_pkt)->ip_hl << 2; | 754 | struct ip *ip4packet = (struct ip*)recv_pkt; |
755 | read_len -= ip4packet->ip_hl << 2; | ||
755 | } | 756 | } |
756 | printf(" %d bytes to %s", read_len, ina); | 757 | printf(" %d bytes to %s", read_len, ina); |
757 | free(ina); | 758 | free(ina); |
diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c index 0ed7ad1c6..39f1cec54 100644 --- a/networking/udhcp/socket.c +++ b/networking/udhcp/socket.c | |||
@@ -36,42 +36,45 @@ | |||
36 | 36 | ||
37 | int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) | 37 | int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) |
38 | { | 38 | { |
39 | /* char buffer instead of bona-fide struct avoids aliasing warning */ | ||
40 | char ifr_buf[sizeof(struct ifreq)]; | ||
41 | struct ifreq *const ifr = (void *)ifr_buf; | ||
42 | |||
39 | int fd; | 43 | int fd; |
40 | struct ifreq ifr; | ||
41 | struct sockaddr_in *our_ip; | 44 | struct sockaddr_in *our_ip; |
42 | 45 | ||
43 | memset(&ifr, 0, sizeof(ifr)); | 46 | memset(ifr, 0, sizeof(*ifr)); |
44 | fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); | 47 | fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); |
45 | 48 | ||
46 | ifr.ifr_addr.sa_family = AF_INET; | 49 | ifr->ifr_addr.sa_family = AF_INET; |
47 | strncpy_IFNAMSIZ(ifr.ifr_name, interface); | 50 | strncpy_IFNAMSIZ(ifr->ifr_name, interface); |
48 | if (nip) { | 51 | if (nip) { |
49 | if (ioctl_or_perror(fd, SIOCGIFADDR, &ifr, | 52 | if (ioctl_or_perror(fd, SIOCGIFADDR, ifr, |
50 | "is interface %s up and configured?", interface) | 53 | "is interface %s up and configured?", interface) |
51 | ) { | 54 | ) { |
52 | close(fd); | 55 | close(fd); |
53 | return -1; | 56 | return -1; |
54 | } | 57 | } |
55 | our_ip = (struct sockaddr_in *) &ifr.ifr_addr; | 58 | our_ip = (struct sockaddr_in *) &ifr->ifr_addr; |
56 | *nip = our_ip->sin_addr.s_addr; | 59 | *nip = our_ip->sin_addr.s_addr; |
57 | log1("IP %s", inet_ntoa(our_ip->sin_addr)); | 60 | log1("IP %s", inet_ntoa(our_ip->sin_addr)); |
58 | } | 61 | } |
59 | 62 | ||
60 | if (ifindex) { | 63 | if (ifindex) { |
61 | if (ioctl_or_warn(fd, SIOCGIFINDEX, &ifr) != 0) { | 64 | if (ioctl_or_warn(fd, SIOCGIFINDEX, ifr) != 0) { |
62 | close(fd); | 65 | close(fd); |
63 | return -1; | 66 | return -1; |
64 | } | 67 | } |
65 | log1("Adapter index %d", ifr.ifr_ifindex); | 68 | log1("Adapter index %d", ifr->ifr_ifindex); |
66 | *ifindex = ifr.ifr_ifindex; | 69 | *ifindex = ifr->ifr_ifindex; |
67 | } | 70 | } |
68 | 71 | ||
69 | if (mac) { | 72 | if (mac) { |
70 | if (ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr) != 0) { | 73 | if (ioctl_or_warn(fd, SIOCGIFHWADDR, ifr) != 0) { |
71 | close(fd); | 74 | close(fd); |
72 | return -1; | 75 | return -1; |
73 | } | 76 | } |
74 | memcpy(mac, ifr.ifr_hwaddr.sa_data, 6); | 77 | memcpy(mac, ifr->ifr_hwaddr.sa_data, 6); |
75 | log1("MAC %02x:%02x:%02x:%02x:%02x:%02x", | 78 | log1("MAC %02x:%02x:%02x:%02x:%02x:%02x", |
76 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); | 79 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); |
77 | } | 80 | } |