diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-07-07 05:19:52 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-07-07 05:19:52 +0000 |
commit | 48dfc56b4a62c535725234ff49481e24f33244b6 (patch) | |
tree | 16c4a99a45dc16b691f923e8c51ac82b08023b80 | |
parent | d9d75555ba685c63d5ed6fe25bfdaecb4817d56e (diff) | |
download | busybox-w32-48dfc56b4a62c535725234ff49481e24f33244b6.tar.gz busybox-w32-48dfc56b4a62c535725234ff49481e24f33244b6.tar.bz2 busybox-w32-48dfc56b4a62c535725234ff49481e24f33244b6.zip |
This patch from Fabio Ferrari <fabio.ferrari@digitro.com.br> enables
"broadcast +" for deriving the broadcast address automagically.
-rw-r--r-- | ifconfig.c | 26 | ||||
-rw-r--r-- | networking/ifconfig.c | 26 |
2 files changed, 38 insertions, 14 deletions
diff --git a/ifconfig.c b/ifconfig.c index 61d73f56b..7f3978a4a 100644 --- a/ifconfig.c +++ b/ifconfig.c | |||
@@ -15,7 +15,7 @@ | |||
15 | * Foundation; either version 2 of the License, or (at | 15 | * Foundation; either version 2 of the License, or (at |
16 | * your option) any later version. | 16 | * your option) any later version. |
17 | * | 17 | * |
18 | * $Id: ifconfig.c,v 1.10 2001/03/26 16:26:16 mjn3 Exp $ | 18 | * $Id: ifconfig.c,v 1.11 2001/07/07 05:19:52 andersen Exp $ |
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
@@ -110,6 +110,8 @@ | |||
110 | #define A_NETMASK 0x20 /* Set if netmask (check for multiple sets). */ | 110 | #define A_NETMASK 0x20 /* Set if netmask (check for multiple sets). */ |
111 | #define A_SET_AFTER 0x40 /* Set a flag at the end. */ | 111 | #define A_SET_AFTER 0x40 /* Set a flag at the end. */ |
112 | #define A_COLON_CHK 0x80 /* Is this needed? See below. */ | 112 | #define A_COLON_CHK 0x80 /* Is this needed? See below. */ |
113 | #define A_HOSTNAME 0x100 /* Set if it is ip addr. */ | ||
114 | #define A_BROADCAST 0x200 /* Set if it is broadcast addr. */ | ||
113 | 115 | ||
114 | /* | 116 | /* |
115 | * These defines are for dealing with the A_CAST_TYPE field. | 117 | * These defines are for dealing with the A_CAST_TYPE field. |
@@ -139,12 +141,12 @@ | |||
139 | #define ARG_IRQ (A_ARG_REQ | A_MAP_UCHAR) | 141 | #define ARG_IRQ (A_ARG_REQ | A_MAP_UCHAR) |
140 | #define ARG_DSTADDR (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE) | 142 | #define ARG_DSTADDR (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE) |
141 | #define ARG_NETMASK (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_NETMASK) | 143 | #define ARG_NETMASK (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_NETMASK) |
142 | #define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) | 144 | #define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_BROADCAST) |
143 | #define ARG_HW (A_ARG_REQ | A_CAST_HOST_COPY_IN_ETHER) | 145 | #define ARG_HW (A_ARG_REQ | A_CAST_HOST_COPY_IN_ETHER) |
144 | #define ARG_POINTOPOINT (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) | 146 | #define ARG_POINTOPOINT (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) |
145 | #define ARG_KEEPALIVE (A_ARG_REQ | A_CAST_CHAR_PTR) | 147 | #define ARG_KEEPALIVE (A_ARG_REQ | A_CAST_CHAR_PTR) |
146 | #define ARG_OUTFILL (A_ARG_REQ | A_CAST_CHAR_PTR) | 148 | #define ARG_OUTFILL (A_ARG_REQ | A_CAST_CHAR_PTR) |
147 | #define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK) | 149 | #define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK | A_HOSTNAME) |
148 | 150 | ||
149 | 151 | ||
150 | /* | 152 | /* |
@@ -160,7 +162,7 @@ struct arg1opt { | |||
160 | struct options { | 162 | struct options { |
161 | const char *name; | 163 | const char *name; |
162 | const unsigned char flags; | 164 | const unsigned char flags; |
163 | const unsigned char arg_flags; | 165 | const unsigned int arg_flags; |
164 | const unsigned short selector; | 166 | const unsigned short selector; |
165 | }; | 167 | }; |
166 | 168 | ||
@@ -246,6 +248,7 @@ int ifconfig_main(int argc, char **argv) | |||
246 | { | 248 | { |
247 | struct ifreq ifr; | 249 | struct ifreq ifr; |
248 | struct sockaddr_in sai; | 250 | struct sockaddr_in sai; |
251 | struct sockaddr_in sai_hostname, sai_netmask; | ||
249 | #ifdef BB_FEATURE_IFCONFIG_HW | 252 | #ifdef BB_FEATURE_IFCONFIG_HW |
250 | struct sockaddr sa; | 253 | struct sockaddr sa; |
251 | #endif | 254 | #endif |
@@ -256,8 +259,8 @@ int ifconfig_main(int argc, char **argv) | |||
256 | int selector; | 259 | int selector; |
257 | char *p; | 260 | char *p; |
258 | char host[128]; | 261 | char host[128]; |
259 | unsigned char mask; | 262 | unsigned int mask; |
260 | unsigned char did_flags; | 263 | unsigned int did_flags; |
261 | 264 | ||
262 | goterr = 0; | 265 | goterr = 0; |
263 | did_flags = 0; | 266 | did_flags = 0; |
@@ -331,7 +334,7 @@ int ifconfig_main(int argc, char **argv) | |||
331 | } | 334 | } |
332 | } else { /* got an arg so process it */ | 335 | } else { /* got an arg so process it */ |
333 | HOSTNAME: | 336 | HOSTNAME: |
334 | did_flags |= (mask & A_NETMASK); | 337 | did_flags |= (mask & (A_NETMASK|A_HOSTNAME)); |
335 | if (mask & A_CAST_HOST_COPY) { | 338 | if (mask & A_CAST_HOST_COPY) { |
336 | #ifdef BB_FEATURE_IFCONFIG_HW | 339 | #ifdef BB_FEATURE_IFCONFIG_HW |
337 | if (mask & A_CAST_RESOLVE) { | 340 | if (mask & A_CAST_RESOLVE) { |
@@ -342,11 +345,20 @@ int ifconfig_main(int argc, char **argv) | |||
342 | if (!strcmp(host, "default")) { | 345 | if (!strcmp(host, "default")) { |
343 | /* Default is special, meaning 0.0.0.0. */ | 346 | /* Default is special, meaning 0.0.0.0. */ |
344 | sai.sin_addr.s_addr = INADDR_ANY; | 347 | sai.sin_addr.s_addr = INADDR_ANY; |
348 | } else if ((!strcmp(host, "+")) && (mask & A_BROADCAST) && | ||
349 | (did_flags & (A_NETMASK|A_HOSTNAME))) { | ||
350 | /* + is special, meaning broadcast is derived. */ | ||
351 | sai.sin_addr.s_addr = (~sai_netmask.sin_addr.s_addr) | | ||
352 | (sai_hostname.sin_addr.s_addr & sai_netmask.sin_addr.s_addr); | ||
345 | } else if (inet_aton(host, &sai.sin_addr) == 0) { | 353 | } else if (inet_aton(host, &sai.sin_addr) == 0) { |
346 | /* It's not a dotted quad. */ | 354 | /* It's not a dotted quad. */ |
347 | ++goterr; | 355 | ++goterr; |
348 | continue; | 356 | continue; |
349 | } | 357 | } |
358 | if(mask & A_HOSTNAME) | ||
359 | sai_hostname = sai; | ||
360 | if(mask & A_NETMASK) | ||
361 | sai_netmask = sai; | ||
350 | p = (char *) &sai; | 362 | p = (char *) &sai; |
351 | #ifdef BB_FEATURE_IFCONFIG_HW | 363 | #ifdef BB_FEATURE_IFCONFIG_HW |
352 | } else { /* A_CAST_HOST_COPY_IN_ETHER */ | 364 | } else { /* A_CAST_HOST_COPY_IN_ETHER */ |
diff --git a/networking/ifconfig.c b/networking/ifconfig.c index 61d73f56b..7f3978a4a 100644 --- a/networking/ifconfig.c +++ b/networking/ifconfig.c | |||
@@ -15,7 +15,7 @@ | |||
15 | * Foundation; either version 2 of the License, or (at | 15 | * Foundation; either version 2 of the License, or (at |
16 | * your option) any later version. | 16 | * your option) any later version. |
17 | * | 17 | * |
18 | * $Id: ifconfig.c,v 1.10 2001/03/26 16:26:16 mjn3 Exp $ | 18 | * $Id: ifconfig.c,v 1.11 2001/07/07 05:19:52 andersen Exp $ |
19 | * | 19 | * |
20 | */ | 20 | */ |
21 | 21 | ||
@@ -110,6 +110,8 @@ | |||
110 | #define A_NETMASK 0x20 /* Set if netmask (check for multiple sets). */ | 110 | #define A_NETMASK 0x20 /* Set if netmask (check for multiple sets). */ |
111 | #define A_SET_AFTER 0x40 /* Set a flag at the end. */ | 111 | #define A_SET_AFTER 0x40 /* Set a flag at the end. */ |
112 | #define A_COLON_CHK 0x80 /* Is this needed? See below. */ | 112 | #define A_COLON_CHK 0x80 /* Is this needed? See below. */ |
113 | #define A_HOSTNAME 0x100 /* Set if it is ip addr. */ | ||
114 | #define A_BROADCAST 0x200 /* Set if it is broadcast addr. */ | ||
113 | 115 | ||
114 | /* | 116 | /* |
115 | * These defines are for dealing with the A_CAST_TYPE field. | 117 | * These defines are for dealing with the A_CAST_TYPE field. |
@@ -139,12 +141,12 @@ | |||
139 | #define ARG_IRQ (A_ARG_REQ | A_MAP_UCHAR) | 141 | #define ARG_IRQ (A_ARG_REQ | A_MAP_UCHAR) |
140 | #define ARG_DSTADDR (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE) | 142 | #define ARG_DSTADDR (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE) |
141 | #define ARG_NETMASK (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_NETMASK) | 143 | #define ARG_NETMASK (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_NETMASK) |
142 | #define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) | 144 | #define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_BROADCAST) |
143 | #define ARG_HW (A_ARG_REQ | A_CAST_HOST_COPY_IN_ETHER) | 145 | #define ARG_HW (A_ARG_REQ | A_CAST_HOST_COPY_IN_ETHER) |
144 | #define ARG_POINTOPOINT (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) | 146 | #define ARG_POINTOPOINT (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) |
145 | #define ARG_KEEPALIVE (A_ARG_REQ | A_CAST_CHAR_PTR) | 147 | #define ARG_KEEPALIVE (A_ARG_REQ | A_CAST_CHAR_PTR) |
146 | #define ARG_OUTFILL (A_ARG_REQ | A_CAST_CHAR_PTR) | 148 | #define ARG_OUTFILL (A_ARG_REQ | A_CAST_CHAR_PTR) |
147 | #define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK) | 149 | #define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK | A_HOSTNAME) |
148 | 150 | ||
149 | 151 | ||
150 | /* | 152 | /* |
@@ -160,7 +162,7 @@ struct arg1opt { | |||
160 | struct options { | 162 | struct options { |
161 | const char *name; | 163 | const char *name; |
162 | const unsigned char flags; | 164 | const unsigned char flags; |
163 | const unsigned char arg_flags; | 165 | const unsigned int arg_flags; |
164 | const unsigned short selector; | 166 | const unsigned short selector; |
165 | }; | 167 | }; |
166 | 168 | ||
@@ -246,6 +248,7 @@ int ifconfig_main(int argc, char **argv) | |||
246 | { | 248 | { |
247 | struct ifreq ifr; | 249 | struct ifreq ifr; |
248 | struct sockaddr_in sai; | 250 | struct sockaddr_in sai; |
251 | struct sockaddr_in sai_hostname, sai_netmask; | ||
249 | #ifdef BB_FEATURE_IFCONFIG_HW | 252 | #ifdef BB_FEATURE_IFCONFIG_HW |
250 | struct sockaddr sa; | 253 | struct sockaddr sa; |
251 | #endif | 254 | #endif |
@@ -256,8 +259,8 @@ int ifconfig_main(int argc, char **argv) | |||
256 | int selector; | 259 | int selector; |
257 | char *p; | 260 | char *p; |
258 | char host[128]; | 261 | char host[128]; |
259 | unsigned char mask; | 262 | unsigned int mask; |
260 | unsigned char did_flags; | 263 | unsigned int did_flags; |
261 | 264 | ||
262 | goterr = 0; | 265 | goterr = 0; |
263 | did_flags = 0; | 266 | did_flags = 0; |
@@ -331,7 +334,7 @@ int ifconfig_main(int argc, char **argv) | |||
331 | } | 334 | } |
332 | } else { /* got an arg so process it */ | 335 | } else { /* got an arg so process it */ |
333 | HOSTNAME: | 336 | HOSTNAME: |
334 | did_flags |= (mask & A_NETMASK); | 337 | did_flags |= (mask & (A_NETMASK|A_HOSTNAME)); |
335 | if (mask & A_CAST_HOST_COPY) { | 338 | if (mask & A_CAST_HOST_COPY) { |
336 | #ifdef BB_FEATURE_IFCONFIG_HW | 339 | #ifdef BB_FEATURE_IFCONFIG_HW |
337 | if (mask & A_CAST_RESOLVE) { | 340 | if (mask & A_CAST_RESOLVE) { |
@@ -342,11 +345,20 @@ int ifconfig_main(int argc, char **argv) | |||
342 | if (!strcmp(host, "default")) { | 345 | if (!strcmp(host, "default")) { |
343 | /* Default is special, meaning 0.0.0.0. */ | 346 | /* Default is special, meaning 0.0.0.0. */ |
344 | sai.sin_addr.s_addr = INADDR_ANY; | 347 | sai.sin_addr.s_addr = INADDR_ANY; |
348 | } else if ((!strcmp(host, "+")) && (mask & A_BROADCAST) && | ||
349 | (did_flags & (A_NETMASK|A_HOSTNAME))) { | ||
350 | /* + is special, meaning broadcast is derived. */ | ||
351 | sai.sin_addr.s_addr = (~sai_netmask.sin_addr.s_addr) | | ||
352 | (sai_hostname.sin_addr.s_addr & sai_netmask.sin_addr.s_addr); | ||
345 | } else if (inet_aton(host, &sai.sin_addr) == 0) { | 353 | } else if (inet_aton(host, &sai.sin_addr) == 0) { |
346 | /* It's not a dotted quad. */ | 354 | /* It's not a dotted quad. */ |
347 | ++goterr; | 355 | ++goterr; |
348 | continue; | 356 | continue; |
349 | } | 357 | } |
358 | if(mask & A_HOSTNAME) | ||
359 | sai_hostname = sai; | ||
360 | if(mask & A_NETMASK) | ||
361 | sai_netmask = sai; | ||
350 | p = (char *) &sai; | 362 | p = (char *) &sai; |
351 | #ifdef BB_FEATURE_IFCONFIG_HW | 363 | #ifdef BB_FEATURE_IFCONFIG_HW |
352 | } else { /* A_CAST_HOST_COPY_IN_ETHER */ | 364 | } else { /* A_CAST_HOST_COPY_IN_ETHER */ |