1
1

More accurate and trustworthy descriptions of the netmask exist.

Interested readers can quench their curiosity either with one
of the Richard Stevens books (ISBN 9780201633467) or the
Wikipedia page (http://en.wikipedia.org/wiki/Subnetwork).

This commit was SVN r24680.
Этот коммит содержится в:
George Bosilca 2011-05-03 21:59:51 +00:00
родитель fb3fd8fd0e
Коммит 34abbce82c
2 изменённых файлов: 11 добавлений и 113 удалений

Просмотреть файл

@ -488,7 +488,7 @@ opal_ifislocal(const char *hostname)
return false; return false;
} }
static uint32_t parse_dots(char *addr) static uint32_t parse_dots(const char *addr)
{ {
char **tuple; char **tuple;
uint32_t n[]={0,0,0,0}; uint32_t n[]={0,0,0,0};
@ -506,9 +506,8 @@ static uint32_t parse_dots(char *addr)
} }
int int
opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask) opal_iftupletoaddr(const char *inaddr, uint32_t *net, uint32_t *mask)
{ {
char *addr;
char **tuple; char **tuple;
int pval; int pval;
char *msk, *ptr; char *msk, *ptr;
@ -517,12 +516,10 @@ opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask)
if (NULL != mask) { if (NULL != mask) {
/* set default */ /* set default */
*mask = 0xFFFFFFFF; *mask = 0xFFFFFFFF;
/* protect the input */
addr = strdup(inaddr);
/* if entry includes mask, split that off */ /* if entry includes mask, split that off */
msk = NULL; msk = NULL;
if (NULL != (ptr = strchr(addr, '/'))) { if (NULL != (ptr = strchr(inaddr, '/'))) {
*ptr = '\0'; *ptr = '\0';
msk = ptr + 1; msk = ptr + 1;
/* is the mask a tuple? */ /* is the mask a tuple? */
@ -530,113 +527,19 @@ opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask)
/* yes - extract mask from it */ /* yes - extract mask from it */
*mask = parse_dots(msk); *mask = parse_dots(msk);
} else { } else {
/* no - must be an int telling us how /* no - must be an int telling us how much of the addr to use: e.g., /16
* much of the addr to use: e.g., /16 * For more information please read http://en.wikipedia.org/wiki/Subnetwork.
*/ */
pval = strtol(msk, NULL, 10); pval = strtol(msk, NULL, 10);
switch(pval) { if ((pval > 31) || (pval < 1)) {
case 30:
*mask = parse_dots("255.255.255.252");
break;
case 29:
*mask = parse_dots("255.255.255.248");
break;
case 28:
*mask = parse_dots("255.255.255.240");
break;
case 27:
*mask = parse_dots("255.255.255.224");
break;
case 26:
*mask = parse_dots("255.255.255.192");
break;
case 25:
*mask = parse_dots("255.255.255.128");
break;
case 24:
*mask = parse_dots("255.255.255.0");
break;
case 23:
*mask = parse_dots("255.255.254.0");
break;
case 22:
*mask = parse_dots("255.255.252.0");
break;
case 21:
*mask = parse_dots("255.255.248.0");
break;
case 20:
*mask = parse_dots("255.255.240.0");
break;
case 19:
*mask = parse_dots("255.255.224.0");
break;
case 18:
*mask = parse_dots("255.255.192.0");
break;
case 17:
*mask = parse_dots("255.255.128.0");
break;
case 16:
*mask = parse_dots("255.255.0.0");
break;
case 15:
*mask = parse_dots("255.254.0.0");
break;
case 14:
*mask = parse_dots("255.252.0.0");
break;
case 13:
*mask = parse_dots("255.248.0.0");
break;
case 12:
*mask = parse_dots("255.240.0.0");
break;
case 11:
*mask = parse_dots("255.224.0.0");
break;
case 10:
*mask = parse_dots("255.192.0.0");
break;
case 9:
*mask = parse_dots("255.128.0.0");
break;
case 8:
*mask = parse_dots("255.0.0.0");
break;
case 7:
*mask = parse_dots("254.0.0.0");
break;
case 6:
*mask = parse_dots("252.0.0.0");
break;
case 5:
*mask = parse_dots("248.0.0.0");
break;
case 4:
*mask = parse_dots("240.0.0.0");
break;
case 3:
*mask = parse_dots("224.0.0.0");
break;
case 2:
*mask = parse_dots("192.0.0.0");
break;
case 1:
*mask = parse_dots("128.0.0.0");
break;
case 0:
*mask = parse_dots("0.0.0.0");
break;
default:
opal_output(0, "opal_iftupletoaddr: unknown mask"); opal_output(0, "opal_iftupletoaddr: unknown mask");
free(addr);
return OPAL_ERROR; return OPAL_ERROR;
} }
*mask = 0xFFFFFFFF << (32 - pval);
} }
} else { } else {
/* use the number of dots to determine it */ /* use the number of dots to determine it */
tuple = opal_argv_split(addr, '.'); tuple = opal_argv_split(inaddr, '.');
pval = opal_argv_count(tuple); pval = opal_argv_count(tuple);
/* if we have three dots, then we have four /* if we have three dots, then we have four
* fields since it is a full address, so the * fields since it is a full address, so the
@ -651,29 +554,24 @@ opal_iftupletoaddr(char *inaddr, uint32_t *net, uint32_t *mask)
*mask = 0xFF000000; *mask = 0xFF000000;
} else { } else {
opal_output(0, "opal_iftupletoaddr: unknown mask"); opal_output(0, "opal_iftupletoaddr: unknown mask");
free(addr);
return OPAL_ERROR; return OPAL_ERROR;
} }
} }
opal_argv_free(tuple); opal_argv_free(tuple);
} }
free(addr);
} }
/* if network addr is desired... */ /* if network addr is desired... */
if (NULL != net) { if (NULL != net) {
/* set default */ /* set default */
*net = 0; *net = 0;
/* protect the input */
addr = strdup(inaddr);
/* if entry includes mask, split that off */ /* if entry includes mask, split that off */
if (NULL != (ptr = strchr(addr, '/'))) { if (NULL != (ptr = strchr(inaddr, '/'))) {
*ptr = '\0'; *ptr = '\0';
} }
/* now assemble the address */ /* now assemble the address */
*net = parse_dots(addr); *net = parse_dots(inaddr);
free(addr);
} }
return OPAL_SUCCESS; return OPAL_SUCCESS;

Просмотреть файл

@ -179,7 +179,7 @@ OPAL_DECLSPEC bool opal_ifislocal(const char *hostname);
* @return OPAL_SUCCESS if no problems encountered * @return OPAL_SUCCESS if no problems encountered
* @return OPAL_ERROR if data could not be released * @return OPAL_ERROR if data could not be released
*/ */
OPAL_DECLSPEC int opal_iftupletoaddr(char *addr, uint32_t *net, uint32_t *mask); OPAL_DECLSPEC int opal_iftupletoaddr(const char *addr, uint32_t *net, uint32_t *mask);
/** /**
* Determine if given interface is loopback * Determine if given interface is loopback