/* Copyright (C) 2015-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: dk4sock16.ctr */ /** @file dk4sock16.c The dk4sock16 module. */ #line 9 "dk4sock16.ctr" #include "dk4conf.h" #include "dk4sock.h" #include #if !DK4_ON_WINDOWS #if DK4_HAVE_FCNTL_H #ifndef FCNTL_H_INCLUDED #include #define FCNTL_H_INCLUDED 1 #endif #endif #endif #if DK4_HAVE_ERRNO_H #ifndef ERRNO_H_INCLUDED #include #define ERRNO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_UNISTD_H #ifndef UNISTD_H_INCLUDED #include #define UNISTD_H_INCLUDED 1 #endif #endif #if DK4_HAVE_IO_H #ifndef IO_H_INCLUDED #include #define IO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_STRING_H #ifndef STRING_H_INCLUDED #include #define STRING_H_INCLUDED 1 #endif #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 61 "dk4sock16.ctr" static dk4_socket_t dk4socket_tcp_client_cleanup_socket( dk4_socket_t sock ) { #if 0 /* Setting SO_REUSEADDR or SO_REUSEPORT must follow socket() immediately. */ if ((0 < level) || ((NULL != pAddr) && (0 < szAddr))) { (void)dk4socket_option_set_reuse(sock, 1, NULL); } #endif #if DK4_ON_WINDOWS closesocket(sock); #else close(sock); #endif return (INVALID_SOCKET); } static dk4_socket_t dk4socket_tcp_client_connect_attempt( dk4_socket_t back, struct sockaddr *pAddr, size_t szAddr, long secs, long usecs, dk4_er_t *erp ) { fd_set wfds; struct timeval to; #if (!DK4_ON_WINDOWS) && (DK4_HAVE_SETSOCKOPT) \ && defined(SOL_SOCKET) && defined(SO_ERROR) #if DK4_HAVE_SOCKLEN_T socklen_t slo; #else int slo; #endif int err; #endif int res; #line 113 "dk4sock16.ctr" #line 114 "dk4sock16.ctr" #if DK4_USE_ASSERT assert(NULL != pAddr); assert(0 < szAddr); #endif res = dk4socket_connect(back, pAddr, szAddr, erp); switch (res) { case DK4_SOCKET_RESULT_SUCCESS : { #line 121 "dk4sock16.ctr" /* do nothing */ } break; case DK4_SOCKET_RESULT_IN_PROGRESS : { #line 124 "dk4sock16.ctr" FD_ZERO(&wfds); FD_SET(back, &wfds); to.tv_sec = secs; to.tv_usec = usecs; dk4socket_error_reset(); res = select((((int)back) + 1), NULL, &wfds, NULL, &to); if (0 < res) { #line 131 "dk4sock16.ctr" if (FD_ISSET(back, &wfds)) { #line 132 "dk4sock16.ctr" #if (!DK4_ON_WINDOWS) && (DK4_HAVE_SETSOCKOPT) \ && defined(SOL_SOCKET) && defined(SO_ERROR) err = 0; slo = sizeof(err); dk4socket_error_reset(); res = getsockopt(back, SOL_SOCKET, SO_ERROR, &err, &slo); if (0 == res) { #line 139 "dk4sock16.ctr" if (0 != dk4socket_non_null_getsockopt(err, slo)) { #line 141 "dk4sock16.ctr" dk4error_set_idetails(erp, DK4_E_SOCKET_CONNECT, err); back = dk4socket_tcp_client_cleanup_socket(back); } #if VERSION_BEFORE_20160415 if (sizeof(int) != slo) { if (0 != err) { #line 147 "dk4sock16.ctr" dk4error_set_idetails(erp, DK4_E_SOCKET_CONNECT, err); back = dk4socket_tcp_client_cleanup_socket(back); } } else { #line 151 "dk4sock16.ctr" dk4socket_error_report(erp, DK4_E_SOCKET_GETSOCKOPT); back = dk4socket_tcp_client_cleanup_socket(back); } #endif } else { #line 156 "dk4sock16.ctr" dk4socket_error_report(erp, DK4_E_SOCKET_GETSOCKOPT); back = dk4socket_tcp_client_cleanup_socket(back); } #endif } else { #line 161 "dk4sock16.ctr" dk4error_set_simple_error_code(erp, DK4_E_SOCKET_TIMEOUT); back = dk4socket_tcp_client_cleanup_socket(back); } } else { if (0 > res) { #line 166 "dk4sock16.ctr" dk4socket_error_report(erp, DK4_E_SOCKET_SELECT); } else { #line 168 "dk4sock16.ctr" dk4error_set_simple_error_code(erp, DK4_E_SOCKET_TIMEOUT); } back = dk4socket_tcp_client_cleanup_socket(back); } } break; default : { #line 174 "dk4sock16.ctr" back = dk4socket_tcp_client_cleanup_socket(back); } break; } #line 178 "dk4sock16.ctr" return back; } dk4_socket_t dk4socket_tcp_client_for_addr( int protfam, struct sockaddr *pRemoteAddr, size_t szRemoteAddr, struct sockaddr *pLocalAddr, size_t szLocalAddr, long seconds, long microSeconds, dk4_er_t *erp ) { dk4_socket_t back = INVALID_SOCKET; int res; #if DK4_HAVE_SETSOCKOPT && (defined(SO_REUSEPORT) || defined(SO_REUSEADDR)) int opt = 0; #endif #line 201 "dk4sock16.ctr" #if DK4_USE_ASSERT assert(NULL != pRemoteAddr); assert(0 < szRemoteAddr); #endif if ((NULL != pRemoteAddr) && (0 < szRemoteAddr)) { #line 206 "dk4sock16.ctr" #line 207 "dk4sock16.ctr" back = dk4socket_open(protfam, SOCK_STREAM, 0, erp); if (INVALID_SOCKET != back) { #line 209 "dk4sock16.ctr" if ((NULL != pLocalAddr) && (0 < szLocalAddr)) { #line 210 "dk4sock16.ctr" #if DK4_HAVE_SETSOCKOPT && defined(SO_REUSEPORT) #line 212 "dk4sock16.ctr" dk4socket_set_one_bytes(&opt, sizeof(opt)); res = setsockopt( back, SOL_SOCKET, SO_REUSEPORT, (void *)(&opt), sizeof(opt) ); if (0 != res) { #line 218 "dk4sock16.ctr" } #else #if DK4_HAVE_SETSOCKOPT && defined(SO_REUSEADDR) #line 222 "dk4sock16.ctr" dk4socket_set_one_bytes(&opt, sizeof(opt)); res = setsockopt( back, SOL_SOCKET, SO_REUSEADDR, (void *)(&opt), sizeof(opt) ); if (0 != res) { #line 228 "dk4sock16.ctr" } #else #line 231 "dk4sock16.ctr" #endif #endif res = dk4socket_bind(back, pLocalAddr, szLocalAddr, erp); if (DK4_SOCKET_RESULT_FAILED == res) { #line 235 "dk4sock16.ctr" back = dk4socket_tcp_client_cleanup_socket(back); } } if (INVALID_SOCKET != back) { if ((0L != seconds) || (0L != microSeconds)) { #line 240 "dk4sock16.ctr" res = dk4socket_option_set_nonblock(back, 1, erp); if (DK4_SOCKET_RESULT_SUCCESS == res) { #line 242 "dk4sock16.ctr" back = dk4socket_tcp_client_connect_attempt( back, pRemoteAddr, szRemoteAddr, seconds, microSeconds, erp ); if (INVALID_SOCKET != back) { res = dk4socket_option_set_nonblock(back, 0, erp); if (DK4_SOCKET_RESULT_SUCCESS != res) { #line 249 "dk4sock16.ctr" back = dk4socket_tcp_client_cleanup_socket(back); } } } else { #line 253 "dk4sock16.ctr" back = dk4socket_tcp_client_cleanup_socket(back); } } else { #line 256 "dk4sock16.ctr" back = dk4socket_tcp_client_connect_attempt( back, pRemoteAddr, szRemoteAddr, 0L, 0L, erp ); } } } else { #line 263 "dk4sock16.ctr" #line 264 "dk4sock16.ctr" } } else { #line 266 "dk4sock16.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 269 "dk4sock16.ctr" return back; }