diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk4sock20.c |
Initial commit
Diffstat (limited to 'support/dktools/dk4sock20.c')
-rw-r--r-- | support/dktools/dk4sock20.c | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/support/dktools/dk4sock20.c b/support/dktools/dk4sock20.c new file mode 100644 index 0000000000..fd75d1bceb --- /dev/null +++ b/support/dktools/dk4sock20.c @@ -0,0 +1,287 @@ +/* + WARNING: This file was generated by dkct. + 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: dk4sock20.ctr +*/ + +/* +Copyright (C) 2015-2017, Dirk Krause + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above opyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the author nor the names of contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +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 OWNER 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. +*/ + +/** @file dk4sock20.c The dk4sock20 module. +*/ + + +#line 10 "dk4sock20.ctr" + +#include "dk4sock.h" + +#if DK4_HAVE_LIMITS_H +#ifndef LIMITS_H_INCLUDED +#include <limits.h> +#define LIMITS_H_INCLUDED 1 +#endif +#endif + +#if DK4_HAVE_STDINT_H +#ifndef STDINT_H_INCLUDED +#if defined(__cplusplus) && (!defined(__STDC_LIMIT_MACROS)) +#define __STDC_LIMIT_MACROS 1 +#endif +#if defined(__cplusplus) && (!defined(__STDC_CONSTANT_MACROS)) +#define __STDC_CONSTANT_MACROS 1 +#endif +#include <stdint.h> +#define STDINT_H_INCLUDED 1 +#endif +#endif + +#if DK4_HAVE_STRING_H +#ifndef STRING_H_INCLUDED +#include <string.h> +#define STRING_H_INCLUDED 1 +#endif +#endif + +#include "dk4numco.h" + + + + + +#line 45 "dk4sock20.ctr" + + + + +int +dk4socket_send( + dk4_socket_t sock, + const void *buf, + size_t *pszbuf, + int flags, + long secs, + long usecs, + dk4_er_t *erp +) +{ + fd_set wfds; + struct timeval to; +#if DK4_HAVE_SSIZE_T + ssize_t bwr; +#else + int bwr; +#endif + int res; + int back = DK4_SOCKET_RESULT_FAILED; + + if ((INVALID_SOCKET != sock) && (NULL != buf) && (NULL != pszbuf)) { + if (0 < *pszbuf) { +#if DK4_HAVE_SSIZE_T + if ((dk4_um_t)(*pszbuf) <= (dk4_um_t)(SIZE_MAX / 2)) +#else + if ((dk4_um_t)(*pszbuf) <= (dk4_um_t)(INT_MAX)) +#endif + { + if ((0L != secs) || (0L != usecs)) { + /* + Timeout, check writability. + */ + FD_ZERO(&wfds); + FD_SET(sock, &wfds); + to.tv_sec = secs; + to.tv_usec = usecs; + dk4socket_error_reset(); + res = select(((int)sock + 1), NULL, &wfds, NULL, &to); + if (0 < res) { + if (FD_ISSET(sock, &wfds)) { + back = DK4_SOCKET_RESULT_SUCCESS; + } else { + /* Timeout */ + dk4error_set_simple_error_code(erp, DK4_E_SOCKET_TIMEOUT); + } + } else { +#if DK4_ON_WINDOWS + if (SOCKET_ERROR == res) +#else + if (-1 == res) +#endif + { + /* select error */ + dk4socket_error_report(erp, DK4_E_SOCKET_SELECT); + } + else + { + /* Timeout */ + dk4error_set_simple_error_code(erp, DK4_E_SOCKET_TIMEOUT); + } + } + } else { + /* + No timeout, can continue sending immediately. + */ + back = DK4_SOCKET_RESULT_SUCCESS; + } + if (DK4_SOCKET_RESULT_SUCCESS == back) { + back = DK4_SOCKET_RESULT_FAILED; + /* + Really send. + */ + dk4socket_error_reset(); +#if DK4_ON_WINDOWS + bwr = send(sock, buf, (int)(*pszbuf), flags); +#else + bwr = send(sock, buf, *pszbuf, flags); +#endif + if (0 <= bwr) { + if ((size_t)bwr == *pszbuf) { + back = DK4_SOCKET_RESULT_SUCCESS; + } else { + back = DK4_SOCKET_RESULT_IN_PROGRESS; + } + *pszbuf = (size_t)bwr; + } else { + dk4socket_error_report(erp, DK4_E_SOCKET_SEND); + *pszbuf = 0; + } + } else { + *pszbuf = 0; + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + *pszbuf = 0; + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + *pszbuf = 0; + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + if (NULL != pszbuf) { *pszbuf = 0; } + } + return back; +} + + + +int +dk4socket_recv( + dk4_socket_t sock, + void *buf, + size_t *pszbuf, + int flags, + long secs, + long usecs, + dk4_er_t *erp +) +{ + fd_set rfds; + struct timeval to; +#if DK4_HAVE_SSIZE_T + ssize_t bwr; +#else + int bwr; +#endif + int res; + int back = DK4_SOCKET_RESULT_FAILED; + + if ((INVALID_SOCKET != sock) && (NULL != buf) && (NULL != pszbuf)) { + if (0 < *pszbuf) { +#if DK4_HAVE_SSIZE_T + if ((dk4_um_t)(*pszbuf) <= (dk4_um_t)(SIZE_MAX / 2)) +#else + if ((dk4_um_t)(*pszbuf) <= (dk4_um_t)(INT_MAX)) +#endif + { + if ((0L != secs) || (0L != usecs)) { + /* + Timeout, check readability. + */ + FD_ZERO(&rfds); + FD_SET(sock, &rfds); + to.tv_sec = secs; + to.tv_usec = usecs; + dk4socket_error_reset(); + res = select(((int)sock + 1), &rfds, NULL, NULL, &to); + if (0 < res) { + if (FD_ISSET(sock, &rfds)) { + back = DK4_SOCKET_RESULT_SUCCESS; + } else { + dk4error_set_simple_error_code(erp, DK4_E_SOCKET_TIMEOUT); + } + } else { +#if DK4_ON_WINDOWS + if (SOCKET_ERROR == res) +#else + if (-1 == res) +#endif + { + dk4socket_error_report(erp, DK4_E_SOCKET_SELECT); + } + else + { + dk4error_set_simple_error_code(erp, DK4_E_SOCKET_TIMEOUT); + } + } + } else { + /* + No timeout. + */ + back = DK4_SOCKET_RESULT_SUCCESS; + } + if (DK4_SOCKET_RESULT_SUCCESS == back) { + back = DK4_SOCKET_RESULT_FAILED; + dk4socket_error_reset(); +#if DK4_ON_WINDOWS + bwr = recv(sock, buf, (int)(*pszbuf), flags); +#else + bwr = recv(sock, buf, *pszbuf, flags); +#endif + if (0 <= bwr) { + back = DK4_SOCKET_RESULT_SUCCESS; + *pszbuf = (size_t)bwr; + } else { + dk4socket_error_report(erp, DK4_E_SOCKET_RECV); + *pszbuf = 0; + } + } + } + else + { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + return back; +} + + |