forked from Bananymous/banan-os
LibC: Implement inet_aton
This is not POSIX but IMO it makes sense to have the counter part to inet_ntoa
This commit is contained in:
parent
be6da3e0db
commit
022bb69782
|
@ -27,28 +27,10 @@ uint16_t ntohs(uint16_t netshort)
|
||||||
|
|
||||||
in_addr_t inet_addr(const char* cp)
|
in_addr_t inet_addr(const char* cp)
|
||||||
{
|
{
|
||||||
uint32_t a, b, c, d, n;
|
in_addr addr;
|
||||||
const int ret = sscanf(cp, "%i%n.%i%n.%i%n.%i%n",
|
if (inet_aton(cp, &addr) == 0)
|
||||||
&a, &n, &b, &n, &c, &n, &d, &n
|
|
||||||
);
|
|
||||||
|
|
||||||
if (ret < 1 || ret > 4 || cp[n] != '\0')
|
|
||||||
return INADDR_NONE;
|
return INADDR_NONE;
|
||||||
if (ret == 1 && (a > 0xFFFFFFFF))
|
return addr.s_addr;
|
||||||
return INADDR_NONE;
|
|
||||||
if (ret == 2 && (a > 0xFF || b > 0xFFFFFF))
|
|
||||||
return INADDR_NONE;
|
|
||||||
if (ret == 3 && (a > 0xFF || b > 0xFF || c > 0xFFFF))
|
|
||||||
return INADDR_NONE;
|
|
||||||
if (ret == 4 && (a > 0xFF || b > 0xFF || c > 0xFF || d > 0xFF))
|
|
||||||
return INADDR_NONE;
|
|
||||||
|
|
||||||
uint32_t result = 0;
|
|
||||||
result |= (ret == 1) ? a : a << 24;
|
|
||||||
result |= (ret == 2) ? b : b << 16;
|
|
||||||
result |= (ret == 3) ? c : c << 8;
|
|
||||||
result |= (ret == 4) ? d : d << 0;
|
|
||||||
return htonl(result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char* inet_ntoa(struct in_addr in)
|
char* inet_ntoa(struct in_addr in)
|
||||||
|
@ -64,6 +46,33 @@ char* inet_ntoa(struct in_addr in)
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int inet_aton(const char* cp, struct in_addr* inp)
|
||||||
|
{
|
||||||
|
uint32_t a, b, c, d, n;
|
||||||
|
const int ret = sscanf(cp, "%i%n.%i%n.%i%n.%i%n",
|
||||||
|
&a, &n, &b, &n, &c, &n, &d, &n
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ret < 1 || ret > 4 || cp[n] != '\0')
|
||||||
|
return 0;
|
||||||
|
if (ret == 1 && (a > 0xFFFFFFFF))
|
||||||
|
return 0;
|
||||||
|
if (ret == 2 && (a > 0xFF || b > 0xFFFFFF))
|
||||||
|
return 0;
|
||||||
|
if (ret == 3 && (a > 0xFF || b > 0xFF || c > 0xFFFF))
|
||||||
|
return 0;
|
||||||
|
if (ret == 4 && (a > 0xFF || b > 0xFF || c > 0xFF || d > 0xFF))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
uint32_t result = 0;
|
||||||
|
result |= (ret == 1) ? a : a << 24;
|
||||||
|
result |= (ret == 2) ? b : b << 16;
|
||||||
|
result |= (ret == 3) ? c : c << 8;
|
||||||
|
result |= (ret == 4) ? d : d << 0;
|
||||||
|
inp->s_addr = htonl(result);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
const char* inet_ntop(int af, const void* __restrict src, char* __restrict dst, socklen_t size)
|
const char* inet_ntop(int af, const void* __restrict src, char* __restrict dst, socklen_t size)
|
||||||
{
|
{
|
||||||
if (af == AF_INET)
|
if (af == AF_INET)
|
||||||
|
|
|
@ -11,6 +11,7 @@ __BEGIN_DECLS
|
||||||
#include <bits/types/socklen_t.h>
|
#include <bits/types/socklen_t.h>
|
||||||
|
|
||||||
in_addr_t inet_addr(const char* cp);
|
in_addr_t inet_addr(const char* cp);
|
||||||
|
int inet_aton(const char* cp, struct in_addr* inp);
|
||||||
char* inet_ntoa(struct in_addr in);
|
char* inet_ntoa(struct in_addr in);
|
||||||
const char* inet_ntop(int af, const void* __restrict src, char* __restrict dst, socklen_t size);
|
const char* inet_ntop(int af, const void* __restrict src, char* __restrict dst, socklen_t size);
|
||||||
int inet_pton(int af, const char* __restrict src, void* __restrict dst);
|
int inet_pton(int af, const char* __restrict src, void* __restrict dst);
|
||||||
|
|
Loading…
Reference in New Issue