%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% module #include "dk4sock.h" #include #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_STRINGS_H #ifndef STRINGS_H_INCLUDED #include #define STRINGS_H_INCLUDED 1 #endif #endif #include "dk4mem.h" $!trace-include int dk4socket_connect( dk4_socket_t sock, const struct sockaddr *pAddr, size_t szAddr, dk4_er_t *erp ) { int back = DK4_SOCKET_RESULT_FAILED; int errc = 0; $? "+ dk4socket_connect" if ((INVALID_SOCKET != sock) && (NULL != pAddr) && (0 < szAddr)) { $? ". args PTR=%d %lu", TR_IPTR(pAddr), (unsigned long)szAddr (void)dk4socket_correct_addr_lgt(pAddr, &szAddr); dk4socket_error_reset(); #if DK4_HAVE_SOCKLEN_T if (0 == connect(sock, pAddr, (socklen_t)szAddr)) #else if (0 == connect(sock, pAddr, (int)szAddr)) #endif { back = DK4_SOCKET_RESULT_SUCCESS; $? ". connect() = 0" } else { errc = dk4socket_error_get(); $? "! connect() != 0, error code = %d", errc #if DK4_ON_WINDOWS if (WSAEWOULDBLOCK == errc) #else if (EINPROGRESS == errc) #endif { back = DK4_SOCKET_RESULT_IN_PROGRESS; $? ". would block" } else { dk4error_set_idetails(erp, DK4_E_SOCKET_CONNECT, errc); $? "! any error" } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); $? "! args" } $? "- dk4socket_connect %d", back return back; } #if DK4_HAVE_STRUCT_SOCKADDR_UN /** Create a UNIX domain socket in client mode. @param filename File name, max 107 characters long. @param erp Error report, may be NULL. @return Valid socket on success, INVALID_SOCKET on error. */ dk4_socket_t dk4socket_c8_unix_client( const char *filename, dk4_er_t *erp ) { struct sockaddr_un soun; size_t slen; dk4_socket_t back = INVALID_SOCKET; int res; if (NULL != filename) { if (108 > strlen(filename)) { DK4_MEMRES(&soun, sizeof(soun)); soun.sun_family = AF_UNIX; strcpy(soun.sun_path, filename); slen = dk4socket_unix_length(&soun); back = dk4socket_open(AF_UNIX, SOCK_STREAM, 0, erp); if (INVALID_SOCKET != back) { res = dk4socket_connect( back, (const struct sockaddr *)(&soun), slen, erp ); if (DK4_SOCKET_RESULT_SUCCESS != res) { (void)dk4socket_close(back, NULL); back = INVALID_SOCKET; } } } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } #endif