version 1.17, 2017/01/09 12:53:18
|
version 1.21.18.1, 2022/09/12 21:26:33
|
Line 12 terms:
|
Line 12 terms:
|
All of the documentation and software included in the ELWIX and AITNET |
All of the documentation and software included in the ELWIX and AITNET |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
|
|
Copyright 2004 - 2017 | Copyright 2004 - 2022 |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
|
|
Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
Line 67 link_addr(const char *addr, struct sockaddr_dl *sdl)
|
Line 67 link_addr(const char *addr, struct sockaddr_dl *sdl)
|
{ |
{ |
char *cp = sdl->sdl_data; |
char *cp = sdl->sdl_data; |
char *cplim = sdl->sdl_len + (char *)sdl; |
char *cplim = sdl->sdl_len + (char *)sdl; |
int byte = 0, state = NAMING, new; | int byte = 0, state = NAMING, new = 0; |
|
|
bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1); |
bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1); |
sdl->sdl_family = AF_LINK; |
sdl->sdl_family = AF_LINK; |
Line 498 e_innet(netaddr_t * __restrict net, inaddr_t * __restr
|
Line 498 e_innet(netaddr_t * __restrict net, inaddr_t * __restr
|
case AF_INET: |
case AF_INET: |
for (i = 0; i < sizeof(struct in_addr); i++) { |
for (i = 0; i < sizeof(struct in_addr); i++) { |
ret = ((caddr_t) &net->addr.sin.sin_addr.s_addr)[i] & |
ret = ((caddr_t) &net->addr.sin.sin_addr.s_addr)[i] & |
net->mask.in.s4_addr[i]; | net->mask.in4.s4_addr[i]; |
ret -= addr->in.s4_addr[i] & net->mask.in.s4_addr[i]; | ret -= addr->in4.s4_addr[i] & net->mask.in4.s4_addr[i]; |
if (ret) |
if (ret) |
break; |
break; |
} |
} |
Line 563 e_getnet(const char *net)
|
Line 563 e_getnet(const char *net)
|
#endif |
#endif |
n->addr.sin.sin_family = host->h_addrtype; |
n->addr.sin.sin_family = host->h_addrtype; |
memcpy(&n->addr.sin.sin_addr, host->h_addr, sizeof n->addr.sin.sin_addr); |
memcpy(&n->addr.sin.sin_addr, host->h_addr, sizeof n->addr.sin.sin_addr); |
if (wrk) | if (wrk && strtol(wrk, NULL, 10) != 32) |
n->mask.in.s_addr = E_CIDRMASK(strtol(wrk, NULL, 10)); |
n->mask.in.s_addr = E_CIDRMASK(strtol(wrk, NULL, 10)); |
else |
else |
n->mask.in.s_addr = 0xFFFFFFFF; |
n->mask.in.s_addr = 0xFFFFFFFF; |
Line 778 e_getlinkbyether(const ether_addr_t * __restrict mac,
|
Line 778 e_getlinkbyether(const ether_addr_t * __restrict mac,
|
return a; |
return a; |
} |
} |
#endif |
#endif |
|
|
|
/* |
|
* e_network() - Get network from address string |
|
* |
|
* @csAddr = Address string with CIDR mask /xx |
|
* @net = Network information structure |
|
* return: -1 error, 1 nothing for return or 0 ok |
|
*/ |
|
int |
|
e_network(const char *csAddr, netaddr_t * __restrict net) |
|
{ |
|
int ret = 0; |
|
u_char mask = 0; |
|
inaddr_t a; |
|
char *pos, szAddr[STRSIZ]; |
|
register int i; |
|
|
|
if (!csAddr || !net) |
|
return -1; |
|
else |
|
strlcpy(szAddr, csAddr, sizeof szAddr); |
|
|
|
memset(net, 0, sizeof(netaddr_t)); |
|
|
|
pos = strrchr(szAddr, '/'); |
|
if (pos) { |
|
*pos++ = 0; |
|
mask = (u_char) strtol(pos, NULL, 10); |
|
} else |
|
return 1; |
|
|
|
if (strchr(szAddr, ':')) { |
|
if (mask > 128) |
|
return -1; |
|
else { |
|
#ifndef __linux__ |
|
for (i = 0; i < 4 && (mask / 32); i++, mask -= 32) |
|
net->mask.in6.__u6_addr.__u6_addr32[i] = 0xFFFFFFFF; |
|
if (mask) |
|
net->mask.in6.__u6_addr.__u6_addr32[i] = E_CIDRMASK(mask % 32); |
|
#else |
|
for (i = 0; i < 4 && (mask / 32); i++, mask -= 32) |
|
net->mask.in6.__in6_u.__u6_addr32[i] = 0xFFFFFFFF; |
|
if (mask) |
|
net->mask.in6.__in6_u.__u6_addr32[i] = E_CIDRMASK(mask % 32); |
|
#endif |
|
} |
|
|
|
inet_pton(AF_INET6, szAddr, &a.in6); |
|
|
|
#ifndef __linux__ |
|
net->addr.sin6.sin6_len = sizeof net->addr.sin6; |
|
for (i = 0; i < 4; i++) |
|
net->addr.sin6.sin6_addr.__u6_addr.__u6_addr32[i] = |
|
a.in6.__u6_addr.__u6_addr32[i] & net->mask.in6.__u6_addr.__u6_addr32[i]; |
|
#else |
|
for (i = 0; i < 4; i++) |
|
net->addr.sin6.sin6_addr.__in6_u.__u6_addr32[i] = |
|
a.in6.__in6_u.__u6_addr32[i] & net->mask.in6.__in6_u.__u6_addr32[i]; |
|
#endif |
|
} else { |
|
if (mask > 32) |
|
return -1; |
|
else { |
|
if (mask == 32) |
|
net->mask.in.s_addr = 0xFFFFFFFF; |
|
else |
|
net->mask.in.s_addr = E_CIDRMASK(mask); |
|
} |
|
|
|
inet_pton(AF_INET, szAddr, &a.in4); |
|
|
|
#ifndef __linux__ |
|
net->addr.sin.sin_len = sizeof net->addr.sin; |
|
#endif |
|
net->addr.sin.sin_addr.s_addr = a.in.s_addr & net->mask.in.s_addr; |
|
} |
|
|
|
return ret; |
|
} |