diff options
Diffstat (limited to 'src/net.c')
| -rw-r--r-- | src/net.c | 60 |
1 files changed, 60 insertions, 0 deletions
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 <stdio.h> +#include <stdarg.h> +#include <stdbool.h> +#include <string.h> + +#include <net/if.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> + + +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; +} |
