#include #include #include #include #include #include "main.h" #include "utils.h" char * sockaddr_to_str(struct sockaddr_in46 *addr, char *buf, size_t buflen) { char abuf[ADDRSTRLEN]; switch (addr->storage.ss_family) { case AF_INET: snprintf(buf, buflen, "AF_INET4 %s %u", inet_ntop(addr->in4.sin_family, &addr->in4.sin_addr, abuf, sizeof(abuf)), (unsigned)ntohs(addr->in4.sin_port)); break; case AF_INET6: snprintf(buf, buflen, "AF_INET6 %s %u", inet_ntop(addr->in6.sin6_family, &addr->in6.sin6_addr, abuf, sizeof(abuf)), (unsigned)ntohs(addr->in6.sin6_port)); break; default: snprintf(buf, buflen, "AF_UNKNOWN"); break; } return buf; } int strtou16_strict(const char *str, uint16_t *result) { char *end; long val; if (!str) return -EINVAL; errno = 0; val = strtol(str, &end, 10); if (errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) return -EINVAL; if (errno != 0 && val == 0) return -EINVAL; if (end == str) return -EINVAL; if (*end != '\0') return -EINVAL; if (val < 1 || val > UINT16_MAX) return -EINVAL; if (result) *result = val; return 0; }