58 for (
i = 0;
i < 5; ++
i) {
59 memcpy(&word, addr->
octet +
i *
sizeof(word),
sizeof(word));
63 memcpy(&word, addr->
octet +
i *
sizeof(word),
sizeof(word));
68 memcpy(&temp, addr->
octet +
sizeof(addr->
octet) -
sizeof(temp),
76 return word == 0xFFFF ? 1 : 0;
104 static const size_t size =
sizeof(ipv4);
117 memcpy( &ipv4, &addr->
octet[5],
size - 1);
118 memcpy((
char*) &ipv4 +
size - 1, &addr->
octet[9], 1);
121 memcpy( &ipv4, &addr->
octet[6],
size - 2);
122 memcpy((
char*) &ipv4 +
size - 2, &addr->
octet[9], 2);
125 memcpy( &ipv4, &addr->
octet[7],
size - 3);
126 memcpy((
char*) &ipv4 +
size - 3, &addr->
octet[9], 3);
136 return (
unsigned int)(-1);
143 unsigned int ipv4,
size_t pfxlen)
145 static const size_t size =
sizeof(ipv4);
150 memset(addr, 0,
sizeof(*addr));
151 memset(addr->
octet + (5 << 1),
'\xFF',
sizeof(
unsigned short));
159 memcpy(&addr->
octet[5], &ipv4,
size - 1);
160 memcpy(&addr->
octet[9], (
char*) &ipv4 +
size - 1, 1);
163 memcpy(&addr->
octet[6], &ipv4,
size - 2);
164 memcpy(&addr->
octet[9], (
char*) &ipv4 +
size - 2, 2);
167 memcpy(&addr->
octet[7], &ipv4,
size - 3);
168 memcpy(&addr->
octet[9], (
char*) &ipv4 +
size - 3, 3);
189 const char*
str,
size_t len)
195 unsigned char *ptr = (
unsigned char*) &
tmp;
198 for (
n = 0;
n <
len; ++
n) {
200 if (
'0' <= c && c <=
'9') {
202 if (was_digit && !*ptr)
204 val = (
unsigned int)(*ptr * 10 + (c -
'0'));
207 *ptr = (
unsigned char)
val;
213 }
else if (c ==
'.') {
214 if (!was_digit || octets >= 4)
231 char tmp[
sizeof(
"255.255.255.255")];
232 unsigned char* ptr = (
unsigned char*) src;
234 = (size_t) sprintf(
tmp,
"%u.%u.%u.%u", ptr[0], ptr[1], ptr[2], ptr[3]);
241 const char*
str,
size_t len)
247 } token[
sizeof(addr->
octet) /
sizeof(word) + 1];
248 size_t maxt =
sizeof(token) /
sizeof(token[0]) - 1,
t,
n;
255 if (
len < 2 || (
str[
n = 0] ==
':' &&
str[++
n] !=
':'))
259 token[
t = 0].ptr =
str +
n;
263 token[
t].len = (size_t)(&
str[
n] - token[
t].ptr);
280 token[
t].ptr =
str +
n;
284 token[
t].len = (size_t)(&
str[
n] - token[
t].ptr);
287 if (
t <= maxt -
sizeof(
ip) /
sizeof(word)) {
292 if (end && *end !=
':'
293 &&
t <= (maxt -=
sizeof(
ip) /
sizeof(word))) {
294 token[
t].len = (size_t)(end - token[
t].ptr);
310 if (
t < maxt && !gap)
314 for (
n = 0;
n <
t; ++
n) {
316 if (*token[
n].ptr !=
':') {
321 val = strtol(token[
n].ptr, &end, 16);
322 if (errno ||
val ^ (
val & 0xFFFF))
324 assert(end == token[
n].ptr + token[
n].
len - (*end ==
':'));
325 if (*end ==
':' &&
n ==
t - !ipv4)
328 memcpy(dst, &word,
sizeof(word));
331 gap = (maxt -
t) *
sizeof(word) +
sizeof(word);
337 memcpy(dst, &
ip,
sizeof(
ip));
342 return token[
t - 1].ptr + token[
t - 1].len;
347 const char*
str,
size_t len)
357 for (
n = 0;
n <
len; ++
n) {
366 const char*
str,
size_t len)
371 memset(addr, 0,
sizeof(*addr));
376 for (
n = 0;
n <
len; ++
n) {
388 char ipv4[
sizeof(
"255.255.255.255")];
389 size_t i,
n, pos,
len, zpos, zlen;
395 n =
sizeof(addr->
octet) -
sizeof(
ip);
400 n =
sizeof(addr->
octet) /
sizeof(word);
404 pos =
i = zpos = zlen = 0;
407 memcpy(&word, &addr->
octet[
i *
sizeof(word)],
sizeof(word));
427 if (zlen && zpos ==
i) {
436 memcpy(&word, &addr->
octet[
i *
sizeof(word)],
sizeof(word));
437 ptr += sprintf(ptr, &
":%x"[!
i],
448 n = (size_t)(ptr - ipv6);
451 memcpy(
buf, ipv6,
n);
453 memcpy(
buf, ipv4,
i);
512 const unsigned char* src;
525 for (
n = 0;
n <
sizeof(
unsigned int); ++
n) {
526 size_t off = (size_t)sprintf(dst,
"%d.", *src--);
532 for (
n = 0;
n <
sizeof(addr->
octet); ++
n) {
533 size_t off = (size_t)sprintf(dst,
"%x.%x.", *src & 0xF, *src >> 4);
552 const char*
str,
size_t len)
557 unsigned char* ptr = (
unsigned char*) &temp +
sizeof(temp);
561 for (
n = 0;
n <
sizeof(temp); ++
n) {
566 d = strtol(
str, &e, 10);
567 if (errno ||
str == e || e -
str > 3 || *e !=
'.'
569 || sprintf(s,
"%u", (
unsigned int) d) != (
int)(e -
str)) {
573 *--ptr = (
unsigned char) d;
583 const char*
str,
size_t len)
585 static const char xdigits[] =
"0123456789abcdef";
591 if (
len != 4 *
sizeof(addr->
octet) - 1)
593 dst = temp.octet +
sizeof(temp.octet) - 1;
594 for (
n = 0;
n < 2 *
sizeof(addr->
octet); ++
n) {
595 const char* ptr = strchr(xdigits,
tolower((
unsigned char)(*
str++)));
598 if (!ptr || *
str++ !=
'.')
600 val = (
unsigned char)(ptr - xdigits);
619 const char*
str,
size_t len,
629 memset(addr, 0,
sizeof(*addr));
635 for (
n = 0;
n <
len; ++
n) {
641 for (
n = 0;
n <
len; ++
n) {
649 size_t dns =
str[--
n] ==
'.' ? 1 : 0;
680 const char*
str,
size_t len)
689 const char*
str,
size_t len)
698 const char*
str,
size_t len)
715 if (bits > (
sizeof(base->
octet) << 3))
718 for (
n = 0;
n <
sizeof(addr->
octet); ++
n) {
722 }
else if (8 > bits) {
723 mask = (
unsigned char)(~0 << (8 - bits));
726 mask = (
unsigned char)(~0);
743 for (
n = 0;
n <
sizeof(addr->
octet); ++
n) {
746 }
else if (8 > bits) {
747 unsigned char mask = (
unsigned char)(~0 << (8 - bits));
769 if (bits <
sizeof(addr->
octet) * 8)
770 bits =
sizeof(addr->
octet) * 8 - bits;
773 for (
n = 0;
n <
sizeof(addr->
octet); ++
n) {
777 }
else if (8 > bits) {
778 unsigned char mask = (
unsigned char)(~0 << (8 - bits));
#define SOCK_NetToHostLong
#define SOCK_NetToHostShort
unsigned short SOCK_HostToNetShort(unsigned short value)
See man for the BSDisms, htonl() and htons().
int SOCK_ntoa(unsigned int addr, char *buf, size_t bufsize)
Convert IP address to a string in dotted notation.
unsigned int
A callback function used to compare two keys in a database.
const struct ncbi::grid::netcache::search::fields::SIZE size
int NcbiIsEmptyIPv6(const TNCBI_IPv6Addr *addr)
Return non-zero if the address is empty (either as IPv6 or IPv4); return zero otherwise.
const char * NcbiStringToIPv6(TNCBI_IPv6Addr *addr, const char *str, size_t len)
Convert into an IPv6 address, the first "len" (or "strlen(str)" if "len" is 0) bytes of "str" from a ...
const char * NcbiDNSIPToAddr(TNCBI_IPv6Addr *addr, const char *str, size_t len)
Convert into an IPv6 address, the first "len" (or "strlen(str)" if "len" is 0) bytes of "str",...
unsigned int TNcbiIP_Form
static char * x_IPv6ToString(char *buf, size_t bufsize, const TNCBI_IPv6Addr *addr)
static char * x_IPv4ToString(char *buf, size_t bufsize, const void *src)
unsigned int NcbiIPv6ToIPv4(const TNCBI_IPv6Addr *addr, size_t pfxlen)
Extract and return a network byte order IPv4 embedded address from an IPv6 address,...
char * NcbiAddrToString(char *buf, size_t bufsize, const TNCBI_IPv6Addr *addr)
Convert an IPv6 address into either a full-quad text IPv4 (for IPv4-mapped IPv6 addresses) or a hex c...
static const char * x_DNSToIPv6(TNCBI_IPv6Addr *addr, const char *str, size_t len)
static int x_NcbiIsIPv4(const TNCBI_IPv6Addr *addr, int compat)
int NcbiIPv6Suffix(TNCBI_IPv6Addr *addr, unsigned int bits)
Retain last "bits" in a given "addr", resetting all remaining bits to 0.
char * NcbiIPv6ToString(char *buf, size_t bufsize, const TNCBI_IPv6Addr *addr)
Convert an IPv6 address into a hex colon-separated text form and store the result in the "buf" of siz...
int NcbiIsIPv4(const TNCBI_IPv6Addr *addr)
Return non-zero(true) if the address is a true IPv4 address (a mapped IPv4 address); return zero(fals...
static const char * x_DNSToIPv4(unsigned int *addr, const char *str, size_t len)
const char * NcbiStringToIPv4(unsigned int *addr, const char *str, size_t len)
Convert into a network byte order IPv4 address, the first "len" (or "strlen(str)" if "len" is 0) byte...
int NcbiIsIPv4Ex(const TNCBI_IPv6Addr *addr, int compat)
Return non-zero(true) if the address is either a mapped IPv4 address or (optionally) an IPv4-compatib...
static const struct SIPDNSsfx kIPv6DNS
char * NcbiIPv4ToString(char *buf, size_t bufsize, unsigned int addr)
Convert a network byte order IPv4 into a full-quad text form and store the result in the "buf" of siz...
int NcbiIPv6Subnet(TNCBI_IPv6Addr *addr, unsigned int bits)
Retain first "bits" in a given "addr", resetting all remaining bits to 0.
const char * NcbiStringToAddr(TNCBI_IPv6Addr *addr, const char *str, size_t len)
Convert into an IPv6 address, the first "len" (or "strlen(str)" if "len" is 0) bytes of "str",...
static const char * x_StringToIPv4(unsigned int *dst, const char *str, size_t len)
int NcbiIsInIPv6Network(const TNCBI_IPv6Addr *base, unsigned int bits, const TNCBI_IPv6Addr *addr)
Return non-zero(true) if "addr" belongs to the network specified as CIDR "base/bits"; return a zero(f...
const char * NcbiAddrToDNS(char *buf, size_t bufsize, const TNCBI_IPv6Addr *addr)
Convert an IPv6 address into either .in-addr.arpa domain (for IPv4-mapped IPv6 addresses) or ....
static const char * x_StringToIPv6(TNCBI_IPv6Addr *addr, const char *str, size_t len)
int NcbiIPv4ToIPv6(TNCBI_IPv6Addr *addr, unsigned int ipv4, size_t pfxlen)
Embed a passed network byte order IPv4 address into an IPv6 address using the specified prefix length...
static const struct SIPDNSsfx kIPv4DNS
const char * NcbiIPToAddr(TNCBI_IPv6Addr *addr, const char *str, size_t len)
Convert into an IPv6 address, the first "len" (or "strlen(str)" if "len" is 0) bytes of "str" from ei...
static const char * s_StringToAddr(TNCBI_IPv6Addr *addr, const char *str, size_t len, TNcbiIP_Form how)
#define CORE_DEBUG_ARG(arg)
static const char * str(char *buf, int n)