From 2278df1493e064c197913e49b5d1935942d83448 Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 6 May 2025 16:57:32 -0700 Subject: initial import --- src/net.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/net.c (limited to 'src/net.c') diff --git a/src/net.c b/src/net.c new file mode 100644 index 0000000..02c3d6e --- /dev/null +++ b/src/net.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + + +int sockprintf(int s, const char *fmt, ...) { + int n; + char buf[8192] = {0}; + va_list vl; + + va_start(vl, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, vl); + va_end(vl); + + return send(s, buf, n, 0); +} + +bool validate_ipv4(const char *ip) { + return inet_aton(ip, NULL) ? true : false; +} + +bool validate_ip(const char *ip) { + struct in_addr addr4; + struct in6_addr addr6; + + return inet_pton(AF_INET, ip, &addr4) == 1 || inet_pton(AF_INET6, ip, &addr6) == 1; +} + +// get the interface assigned to the default route. this is a sensible +// default for most deployments, but not perfect. +char *get_default_iface(void) { + static char iface[IFNAMSIZ] = {0}; + FILE *fp = fopen("/proc/net/route", "r"); + if (!fp) { + return NULL; + } + + char line[256]; + fgets(line, sizeof(line), fp); // skip header line + while (fgets(line, sizeof(line), fp)) { + char iface_name[IFNAMSIZ]; + unsigned long dest; + if (sscanf(line, "%s %lx", iface_name, &dest) == 2) { + if (dest == 0) { // default route + strncpy(iface, iface_name, IFNAMSIZ - 1); + fclose(fp); + return iface; + } + } + } + + fclose(fp); + return NULL; +} -- cgit v1.2.3