/* * Copyright (c) 2018-2020, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include extern "C" { const char* inet_ntop(int af, const void* src, char* dst, socklen_t len) { if (af != AF_INET) { errno = EAFNOSUPPORT; return nullptr; } auto* bytes = (const unsigned char*)src; snprintf(dst, len, "%u.%u.%u.%u", bytes[0], bytes[1], bytes[2], bytes[3]); return (const char*)dst; } int inet_pton(int af, const char* src, void* dst) { if (af != AF_INET) { errno = EAFNOSUPPORT; return -1; } unsigned a; unsigned b; unsigned c; unsigned d; int count = sscanf(src, "%u.%u.%u.%u", &a, &b, &c, &d); if (count != 4) { errno = EINVAL; return 0; } union { struct { uint8_t a; uint8_t b; uint8_t c; uint8_t d; }; uint32_t l; } u; u.a = a; u.b = b; u.c = c; u.d = d; *(uint32_t*)dst = u.l; return 1; } in_addr_t inet_addr(const char* str) { in_addr_t tmp; int rc = inet_pton(AF_INET, str, &tmp); if (rc < 0) return INADDR_NONE; return tmp; } char* inet_ntoa(struct in_addr in) { static char buffer[32]; inet_ntop(AF_INET, &in.s_addr, buffer, sizeof(buffer)); return buffer; } }