/* Copyright (C) 2016-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4sock33.ctr */ /** @file dk4sock33.c The dk4sock33 module. */ #line 10 "dk4sock33.ctr" #include "dk4conf.h" #include "dk4types.h" #include "dk4mem.h" #include "dk4sock.h" #include "dk4mai8dus.h" #include "dk4mao8d.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 27 "dk4sock33.ctr" /** Attempt to convert an IPv4 or IPv6 address from text to address. @param dptr Destination variable. @param str Source text. @return 1 on success, 0 on error. */ static int dk4socket_c8_find_address(dk4_sockaddr_storage_t *dptr, const char *str) { #if DK4_HAVE_STRUCT_SOCKADDR_IN6 struct sockaddr_in6 *in6; #endif struct sockaddr_in *in4; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 IN6_ADDR addr6; #endif IN_ADDR addr4; int back = 0; int res; #line 50 "dk4sock33.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != str); #endif res = dk4socket_c8_inet_pton(&addr4, sizeof(addr4), AF_INET, str, NULL); if (DK4_SOCKET_RESULT_SUCCESS == res) { #line 56 "dk4sock33.ctr" in4 = (struct sockaddr_in *)dptr; in4->sin_family = AF_INET; DK4_MEMCPY(&(in4->sin_addr), &addr4, sizeof(addr4)); back = 1; } else { #if DK4_HAVE_STRUCT_SOCKADDR_IN6 res = dk4socket_c8_inet_pton(&addr6, sizeof(addr6), AF_INET6, str, NULL); if (DK4_SOCKET_RESULT_SUCCESS == res) { #line 64 "dk4sock33.ctr" in6 = (struct sockaddr_in6 *)dptr; in6->sin6_family = AF_INET6; DK4_MEMCPY(&(in6->sin6_addr), &addr6, sizeof(addr6)); back = 1; } #endif } #line 72 "dk4sock33.ctr" return back; } /** Find address for one host name. @param dptr Address of destination data structure. @param remhost Remote host name. @param remport Remote port number in host representation. @param ip4 Flag: Prefer IPv4 over IPv6 addresses. @return 1 on success, 0 on error. */ static int dk4socket_c8_find_host( dk4_sockaddr_storage_t *dptr, const char *remhost, unsigned short remport, int ip4 ) { #if DK4_HAVE_GETADDRINFO char buf[16*sizeof(unsigned short)]; struct addrinfo hints; struct addrinfo *results = NULL; struct addrinfo *rptr = NULL; int back = 0; int res = 0; #line 101 "dk4sock33.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != remhost); assert(0 < remport); #endif res = dk4ma_write_c8_decimal_unsigned( buf, sizeof(buf), (dk4_um_t)remport, 0, NULL ); if (0 != res) { DK4_MEMRES(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = 0; hints.ai_flags = AI_NUMERICSERV; res = getaddrinfo(remhost, buf, &hints, &results); if ((0 == res) && (NULL != results)) { #line 117 "dk4sock33.ctr" if (0 != ip4) { #line 118 "dk4sock33.ctr" rptr = results; while ((NULL != rptr) && (0 == back)) { #line 120 "dk4sock33.ctr" if ((0 < rptr->ai_addrlen) && (NULL != rptr->ai_addr)) { if (AF_INET == rptr->ai_addr->sa_family) { if (sizeof(dk4_sockaddr_storage_t) >= rptr->ai_addrlen) { DK4_MEMCPY(dptr, rptr->ai_addr, rptr->ai_addrlen); back = 1; #line 125 "dk4sock33.ctr" } else { #line 126 "dk4sock33.ctr" } } else { #line 128 "dk4sock33.ctr" } } else { #line 130 "dk4sock33.ctr" } rptr = rptr->ai_next; } if (0 == back) { rptr = results; while ((NULL != rptr) && (0 == back)) { #line 136 "dk4sock33.ctr" if ((0 < rptr->ai_addrlen) && (NULL != rptr->ai_addr)) { if (sizeof(dk4_sockaddr_storage_t) >= rptr->ai_addrlen) { DK4_MEMCPY(dptr, rptr->ai_addr, rptr->ai_addrlen); back = 1; #line 140 "dk4sock33.ctr" } else { #line 141 "dk4sock33.ctr" } } else { #line 143 "dk4sock33.ctr" } rptr = rptr->ai_next; } } } else { #line 148 "dk4sock33.ctr" rptr = results; while ((NULL != rptr) && (0 == back)) { #line 150 "dk4sock33.ctr" if ((0 < rptr->ai_addrlen) && (NULL != rptr->ai_addr)) { if (sizeof(dk4_sockaddr_storage_t) >= rptr->ai_addrlen) { DK4_MEMCPY(dptr, rptr->ai_addr, rptr->ai_addrlen); back = 1; #line 154 "dk4sock33.ctr" } else { #line 155 "dk4sock33.ctr" } } else { #line 157 "dk4sock33.ctr" } rptr = rptr->ai_next; } } } else { #line 162 "dk4sock33.ctr" } if (NULL != results) { freeaddrinfo(results); } } else { #line 165 "dk4sock33.ctr" } #line 167 "dk4sock33.ctr" return back; #else #if DK4_HAVE_GETHOSTBYNAME #if DK4_HAVE_STRUCT_SOCKADDR_IN6 struct sockaddr_in6 *sa6; #endif struct sockaddr_in *sa4; struct hostent *hep = NULL; int back = 0; #line 177 "dk4sock33.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(NULL != remhost); assert(0 < remport); #endif hep = gethostbyname(remhost); if (NULL != hep) { #line 184 "dk4sock33.ctr" if (NULL != hep->h_addr_list) { #line 185 "dk4sock33.ctr" if (NULL != *(hep->h_addr_list)) { #line 186 "dk4sock33.ctr" switch (hep->h_addrtype) { case AF_INET : { #line 188 "dk4sock33.ctr" sa4 = (struct sockaddr_in *)dptr; DK4_MEMRES(sa4, sizeof(struct sockaddr_in)); sa4->sin_family = AF_INET; sa4->sin_port = dk4socket_htons(remport); DK4_MEMCPY(&(sa4->sin_addr),*(hep->h_addr_list),sizeof(IN_ADDR)); back = 1; #line 194 "dk4sock33.ctr" } break; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : { #line 197 "dk4sock33.ctr" sa6 = (struct sockaddr_in6 *)dptr; DK4_MEMRES(sa6, sizeof(struct sockaddr_in6)); sa6->sin6_family = AF_INET6; sa6->sin_port = dk4socket_htons(remport); DK4_MEMCPY(&(sa6->sin6_addr),*(hep->h_addr_list),sizeof(IN6_ADDR)); back = 1; #line 203 "dk4sock33.ctr" } break; #endif } } else { #line 207 "dk4sock33.ctr" } } else { #line 209 "dk4sock33.ctr" } } else { #line 211 "dk4sock33.ctr" } #line 213 "dk4sock33.ctr" return back; #else int back = 0; #line 217 "dk4sock33.ctr" #line 218 "dk4sock33.ctr" return back; #endif #endif } int dk4socket_c8_udp_addresses_numeric( dk4_sockaddr_storage_t *array, const char *remhost, unsigned short remport, unsigned short locport, int ip4, dk4_er_t *erp ) { int back = DK4_SOCKET_RESULT_FAILED; #line 237 "dk4sock33.ctr" #if DK4_USE_ASSERT assert(NULL != array); assert(NULL != remhost); assert(0 < remport); assert(0 < locport); #endif if ((NULL != array) && (NULL != remhost) && (0 < remport) && (0 < locport)) { DK4_MEMRES(array, (2*sizeof(dk4_sockaddr_storage_t))); if (0 != dk4socket_c8_find_address(array, remhost)) { #line 247 "dk4sock33.ctr" back = dk4socket_complete_addresses(array, remport, locport); #line 249 "dk4sock33.ctr" } if (DK4_SOCKET_RESULT_FAILED == back) { #line 251 "dk4sock33.ctr" if (0 != dk4socket_c8_find_host(array, remhost, remport, ip4)) { back = dk4socket_complete_addresses(array, remport, locport); if (DK4_SOCKET_RESULT_FAILED == back) { #line 254 "dk4sock33.ctr" dk4error_set_simple_error_code(erp, DK4_E_BUG); } } else { #line 257 "dk4sock33.ctr" dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } } else { #line 261 "dk4sock33.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 264 "dk4sock33.ctr" return back; }