#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; }