ip addr helpers
parent
e298e1950b
commit
ecdbef8b45
@ -0,0 +1,33 @@
|
|||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "str.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TLSL_L3PROTO_IPV4,
|
||||||
|
TLSL_L3PROTO_IPV6,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tlsl_ipv4_addr {
|
||||||
|
uint32_t addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tlsl_ipv6_addr {
|
||||||
|
uint8_t addr[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tlsl_ip_addr {
|
||||||
|
union {
|
||||||
|
struct tlsl_ipv4_addr v4;
|
||||||
|
struct tlsl_ipv6_addr v6;
|
||||||
|
};
|
||||||
|
uint8_t l3proto;
|
||||||
|
};
|
||||||
|
|
||||||
|
int tlsl_ip_addr_parse(const char *s, struct tlsl_ip_addr *out);
|
||||||
|
str_buf_t tlsl_ip_addr_fmt(const struct tlsl_ip_addr *a);
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include "export.h"
|
||||||
|
#include "public/net.h"
|
||||||
|
|
||||||
|
EXPORT int tlsl_ip_addr_parse(const char *s, struct tlsl_ip_addr *out) {
|
||||||
|
if (inet_pton(AF_INET, s, &out->v4) == 1) {
|
||||||
|
out->l3proto = TLSL_L3PROTO_IPV4;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (inet_pton(AF_INET6, s, &out->v6) == 1) {
|
||||||
|
out->l3proto = TLSL_L3PROTO_IPV6;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT str_buf_t tlsl_ip_addr_fmt(const struct tlsl_ip_addr *a) {
|
||||||
|
char buf[INET6_ADDRSTRLEN] = { 0 };
|
||||||
|
const char *res;
|
||||||
|
|
||||||
|
switch (a->l3proto) {
|
||||||
|
case TLSL_L3PROTO_IPV4:
|
||||||
|
res = inet_ntop(AF_INET, &a->v4, buf, sizeof(buf));
|
||||||
|
break;
|
||||||
|
case TLSL_L3PROTO_IPV6:
|
||||||
|
res = inet_ntop(AF_INET6, &a->v6, buf, sizeof(buf));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errno = EINVAL;
|
||||||
|
return SBUF_NULL;
|
||||||
|
}
|
||||||
|
if (!res)
|
||||||
|
return SBUF_NULL;
|
||||||
|
return sbuf_from_sview(sview_from_cstr_unbounded(buf));
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue