diff options
author | Eric Andersen | 2001-07-07 05:19:52 +0000 |
---|---|---|
committer | Eric Andersen | 2001-07-07 05:19:52 +0000 |
commit | 48dfc56b4a62c535725234ff49481e24f33244b6 (patch) | |
tree | 16c4a99a45dc16b691f923e8c51ac82b08023b80 | |
parent | d9d75555ba685c63d5ed6fe25bfdaecb4817d56e (diff) | |
download | busybox-48dfc56b4a62c535725234ff49481e24f33244b6.zip busybox-48dfc56b4a62c535725234ff49481e24f33244b6.tar.gz |
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
@@ -15,7 +15,7 @@ * Foundation; either version 2 of the License, or (at * your option) any later version. * - * $Id: ifconfig.c,v 1.10 2001/03/26 16:26:16 mjn3 Exp $ + * $Id: ifconfig.c,v 1.11 2001/07/07 05:19:52 andersen Exp $ * */ @@ -110,6 +110,8 @@ #define A_NETMASK 0x20 /* Set if netmask (check for multiple sets). */ #define A_SET_AFTER 0x40 /* Set a flag at the end. */ #define A_COLON_CHK 0x80 /* Is this needed? See below. */ +#define A_HOSTNAME 0x100 /* Set if it is ip addr. */ +#define A_BROADCAST 0x200 /* Set if it is broadcast addr. */ /* * These defines are for dealing with the A_CAST_TYPE field. @@ -139,12 +141,12 @@ #define ARG_IRQ (A_ARG_REQ | A_MAP_UCHAR) #define ARG_DSTADDR (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE) #define ARG_NETMASK (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_NETMASK) -#define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) +#define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_BROADCAST) #define ARG_HW (A_ARG_REQ | A_CAST_HOST_COPY_IN_ETHER) #define ARG_POINTOPOINT (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) #define ARG_KEEPALIVE (A_ARG_REQ | A_CAST_CHAR_PTR) #define ARG_OUTFILL (A_ARG_REQ | A_CAST_CHAR_PTR) -#define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK) +#define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK | A_HOSTNAME) /* @@ -160,7 +162,7 @@ struct arg1opt { struct options { const char *name; const unsigned char flags; - const unsigned char arg_flags; + const unsigned int arg_flags; const unsigned short selector; }; @@ -246,6 +248,7 @@ int ifconfig_main(int argc, char **argv) { struct ifreq ifr; struct sockaddr_in sai; + struct sockaddr_in sai_hostname, sai_netmask; #ifdef BB_FEATURE_IFCONFIG_HW struct sockaddr sa; #endif @@ -256,8 +259,8 @@ int ifconfig_main(int argc, char **argv) int selector; char *p; char host[128]; - unsigned char mask; - unsigned char did_flags; + unsigned int mask; + unsigned int did_flags; goterr = 0; did_flags = 0; @@ -331,7 +334,7 @@ int ifconfig_main(int argc, char **argv) } } else { /* got an arg so process it */ HOSTNAME: - did_flags |= (mask & A_NETMASK); + did_flags |= (mask & (A_NETMASK|A_HOSTNAME)); if (mask & A_CAST_HOST_COPY) { #ifdef BB_FEATURE_IFCONFIG_HW if (mask & A_CAST_RESOLVE) { @@ -342,11 +345,20 @@ int ifconfig_main(int argc, char **argv) if (!strcmp(host, "default")) { /* Default is special, meaning 0.0.0.0. */ sai.sin_addr.s_addr = INADDR_ANY; + } else if ((!strcmp(host, "+")) && (mask & A_BROADCAST) && + (did_flags & (A_NETMASK|A_HOSTNAME))) { + /* + is special, meaning broadcast is derived. */ + sai.sin_addr.s_addr = (~sai_netmask.sin_addr.s_addr) | + (sai_hostname.sin_addr.s_addr & sai_netmask.sin_addr.s_addr); } else if (inet_aton(host, &sai.sin_addr) == 0) { /* It's not a dotted quad. */ ++goterr; continue; } + if(mask & A_HOSTNAME) + sai_hostname = sai; + if(mask & A_NETMASK) + sai_netmask = sai; p = (char *) &sai; #ifdef BB_FEATURE_IFCONFIG_HW } else { /* A_CAST_HOST_COPY_IN_ETHER */ diff --git a/networking/ifconfig.c b/networking/ifconfig.c index 61d73f5..7f3978a 100644 --- a/networking/ifconfig.c +++ b/networking/ifconfig.c @@ -15,7 +15,7 @@ * Foundation; either version 2 of the License, or (at * your option) any later version. * - * $Id: ifconfig.c,v 1.10 2001/03/26 16:26:16 mjn3 Exp $ + * $Id: ifconfig.c,v 1.11 2001/07/07 05:19:52 andersen Exp $ * */ @@ -110,6 +110,8 @@ #define A_NETMASK 0x20 /* Set if netmask (check for multiple sets). */ #define A_SET_AFTER 0x40 /* Set a flag at the end. */ #define A_COLON_CHK 0x80 /* Is this needed? See below. */ +#define A_HOSTNAME 0x100 /* Set if it is ip addr. */ +#define A_BROADCAST 0x200 /* Set if it is broadcast addr. */ /* * These defines are for dealing with the A_CAST_TYPE field. @@ -139,12 +141,12 @@ #define ARG_IRQ (A_ARG_REQ | A_MAP_UCHAR) #define ARG_DSTADDR (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE) #define ARG_NETMASK (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_NETMASK) -#define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) +#define ARG_BROADCAST (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_BROADCAST) #define ARG_HW (A_ARG_REQ | A_CAST_HOST_COPY_IN_ETHER) #define ARG_POINTOPOINT (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER) #define ARG_KEEPALIVE (A_ARG_REQ | A_CAST_CHAR_PTR) #define ARG_OUTFILL (A_ARG_REQ | A_CAST_CHAR_PTR) -#define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK) +#define ARG_HOSTNAME (A_CAST_HOST_COPY_RESOLVE | A_SET_AFTER | A_COLON_CHK | A_HOSTNAME) /* @@ -160,7 +162,7 @@ struct arg1opt { struct options { const char *name; const unsigned char flags; - const unsigned char arg_flags; + const unsigned int arg_flags; const unsigned short selector; }; @@ -246,6 +248,7 @@ int ifconfig_main(int argc, char **argv) { struct ifreq ifr; struct sockaddr_in sai; + struct sockaddr_in sai_hostname, sai_netmask; #ifdef BB_FEATURE_IFCONFIG_HW struct sockaddr sa; #endif @@ -256,8 +259,8 @@ int ifconfig_main(int argc, char **argv) int selector; char *p; char host[128]; - unsigned char mask; - unsigned char did_flags; + unsigned int mask; + unsigned int did_flags; goterr = 0; did_flags = 0; @@ -331,7 +334,7 @@ int ifconfig_main(int argc, char **argv) } } else { /* got an arg so process it */ HOSTNAME: - did_flags |= (mask & A_NETMASK); + did_flags |= (mask & (A_NETMASK|A_HOSTNAME)); if (mask & A_CAST_HOST_COPY) { #ifdef BB_FEATURE_IFCONFIG_HW if (mask & A_CAST_RESOLVE) { @@ -342,11 +345,20 @@ int ifconfig_main(int argc, char **argv) if (!strcmp(host, "default")) { /* Default is special, meaning 0.0.0.0. */ sai.sin_addr.s_addr = INADDR_ANY; + } else if ((!strcmp(host, "+")) && (mask & A_BROADCAST) && + (did_flags & (A_NETMASK|A_HOSTNAME))) { + /* + is special, meaning broadcast is derived. */ + sai.sin_addr.s_addr = (~sai_netmask.sin_addr.s_addr) | + (sai_hostname.sin_addr.s_addr & sai_netmask.sin_addr.s_addr); } else if (inet_aton(host, &sai.sin_addr) == 0) { /* It's not a dotted quad. */ ++goterr; continue; } + if(mask & A_HOSTNAME) + sai_hostname = sai; + if(mask & A_NETMASK) + sai_netmask = sai; p = (char *) &sai; #ifdef BB_FEATURE_IFCONFIG_HW } else { /* A_CAST_HOST_COPY_IN_ETHER */ |