diff options
author | zfl9 <zfl9.com@gmail.com> | 2019-08-31 13:55:12 +0800 |
---|---|---|
committer | zfl9 <zfl9.com@gmail.com> | 2019-08-31 13:55:12 +0800 |
commit | f0448448b01cf04cc7b04a81c4480734c5bfe84b (patch) | |
tree | 64b78260d1434dbc60dc9c94e4c2c9855f0e7add | |
parent | update dns2tcp.c (diff) | |
download | dns2tcp-f0448448b01cf04cc7b04a81c4480734c5bfe84b.tar.gz dns2tcp-f0448448b01cf04cc7b04a81c4480734c5bfe84b.tar.bz2 dns2tcp-f0448448b01cf04cc7b04a81c4480734c5bfe84b.zip |
add netutils
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | netutils.c | 43 | ||||
-rw-r--r-- | netutils.h | 38 |
3 files changed, 82 insertions, 1 deletions
@@ -1,6 +1,6 @@ CC = gcc CFLAGS = -std=c99 -Wall -Wextra -O3 -SRCS = dns2tcp.c +SRCS = netutils.c dns2tcp.c OBJS = $(SRCS:.c=.o) MAIN = dns2tcp DESTDIR = /usr/local/bin diff --git a/netutils.c b/netutils.c new file mode 100644 index 0000000..03fbb44 --- /dev/null +++ b/netutils.c @@ -0,0 +1,43 @@ +#define _GNU_SOURCE +#include "netutils.h" +#include <arpa/inet.h> +#undef _GNU_SOURCE + +/* build ipv4 socket address from ipstr and portno */ +void build_ipv4_addr(skaddr4_t *addr, const char *ipstr, portno_t portno) { + addr->sin_family = AF_INET; + inet_pton(AF_INET, ipstr, &addr->sin_addr); + addr->sin_port = htons(portno); +} + +/* build ipv6 socket address from ipstr and portno */ +void build_ipv6_addr(skaddr6_t *addr, const char *ipstr, portno_t portno) { + addr->sin6_family = AF_INET6; + inet_pton(AF_INET6, ipstr, &addr->sin6_addr); + addr->sin6_port = htons(portno); +} + +/* parse ipstr and portno from ipv4 socket address */ +void parse_ipv4_addr(const skaddr4_t *addr, char *ipstr, portno_t *portno) { + inet_ntop(AF_INET, &addr->sin_addr, ipstr, IP4STRLEN); + *portno = ntohs(addr->sin_port); +} + +/* parse ipstr and portno from ipv6 socket address */ +void parse_ipv6_addr(const skaddr6_t *addr, char *ipstr, portno_t *portno) { + inet_ntop(AF_INET6, &addr->sin6_addr, ipstr, IP6STRLEN); + *portno = ntohs(addr->sin6_port); +} + +/* AF_INET or AF_INET6 or -1(invalid ip string) */ +int get_ipstr_family(const char *ipstr) { + if (!ipstr) return -1; + uint8_t ipaddr[16]; /* save ipv4/ipv6 addr */ + if (inet_pton(AF_INET, ipstr, &ipaddr) == 1) { + return AF_INET; + } else if (inet_pton(AF_INET6, ipstr, &ipaddr) == 1) { + return AF_INET6; + } else { + return -1; + } +} diff --git a/netutils.h b/netutils.h new file mode 100644 index 0000000..1645701 --- /dev/null +++ b/netutils.h @@ -0,0 +1,38 @@ +#ifndef DNS2TCP_NETUTILS_H +#define DNS2TCP_NETUTILS_H + +#define _GNU_SOURCE +#include <stdint.h> +#include <netinet/in.h> +#undef _GNU_SOURCE + +/* ipaddr string len */ +#define IP4STRLEN INET_ADDRSTRLEN +#define IP6STRLEN INET6_ADDRSTRLEN + +/* portno string len */ +#define PORTSTRLEN 6 + +/* port number typedef */ +typedef uint16_t portno_t; + +/* sockaddr type alias */ +typedef struct sockaddr_in skaddr4_t; +typedef struct sockaddr_in6 skaddr6_t; + +/* build ipv4 socket address from ipstr and portno */ +void build_ipv4_addr(skaddr4_t *addr, const char *ipstr, portno_t portno); + +/* build ipv6 socket address from ipstr and portno */ +void build_ipv6_addr(skaddr6_t *addr, const char *ipstr, portno_t portno); + +/* parse ipstr and portno from ipv4 socket address */ +void parse_ipv4_addr(const skaddr4_t *addr, char *ipstr, portno_t *portno); + +/* parse ipstr and portno from ipv6 socket address */ +void parse_ipv6_addr(const skaddr6_t *addr, char *ipstr, portno_t *portno); + +/* AF_INET or AF_INET6 or -1(invalid ip string) */ +int get_ipstr_family(const char *ipstr); + +#endif |