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/dk4sock21.ctr |
Initial commit
Diffstat (limited to 'support/dktools/dk4sock21.ctr')
-rw-r--r-- | support/dktools/dk4sock21.ctr | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/support/dktools/dk4sock21.ctr b/support/dktools/dk4sock21.ctr new file mode 100644 index 0000000000..c778b67d9d --- /dev/null +++ b/support/dktools/dk4sock21.ctr @@ -0,0 +1,293 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2015-xxxx +license = bsd + + + +%% module + +#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" + + + +$!trace-include + + + + +int +dk4socket_sendto( + dk4_socket_t sock, + const void *buf, + size_t *pszbuf, + int flags, + const struct sockaddr *saddr, + size_t addrlen, + 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) + && (NULL != saddr) && (0 < addrlen) + ) + { + if ((0 < *pszbuf) && (0 != dk4socket_correct_addr_lgt(saddr, &addrlen))) { +#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) { + (void)dk4socket_correct_addr_lgt(saddr, &addrlen); + back = DK4_SOCKET_RESULT_FAILED; + /* + Really send. + */ + dk4socket_error_reset(); +#if DK4_ON_WINDOWS +#if DK4_HAVE_SOCKLEN_T + bwr = sendto( + sock, buf, (int)(*pszbuf), flags, saddr, (socklen_t)addrlen + ); +#else + bwr = sendto( + sock, buf, (int)(*pszbuf), flags, saddr, (int)addrlen + ); +#endif +#else +#if DK4_HAVE_SOCKLEN_T + bwr = sendto( + sock, buf, *pszbuf, flags, saddr, (socklen_t)addrlen + ); +#else + bwr = sendto( + sock, buf, *pszbuf, flags, saddr, (int)addrlen + ); +#endif +#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 { + 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; +} + + + +int +dk4socket_recvfrom( + dk4_socket_t sock, + void *buf, + size_t *pszbuf, + int flags, + struct sockaddr *saddr, + size_t *paddrlen, + 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 +#if DK4_HAVE_SOCKLEN_T + socklen_t peersize; +#else + int peersize; +#endif + int res; + int back = DK4_SOCKET_RESULT_FAILED; + + if ( + (INVALID_SOCKET != sock) && (NULL != buf) && (NULL != pszbuf) + && (NULL != saddr) && (NULL != paddrlen) + ) + { + if ((0 < *pszbuf) && (0 < *paddrlen)) { +#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; +#if DK4_HAVE_SOCKLEN_T + peersize = (socklen_t)(*paddrlen); +#else + peersize = (int)(*paddrlen); +#endif + dk4socket_error_reset(); +#if DK4_ON_WINDOWS + bwr = recvfrom( + sock, buf, (int)(*pszbuf), flags, saddr, &peersize + ); +#else + bwr = recvfrom( + sock, buf, *pszbuf, flags, saddr, &peersize + ); +#endif + if (0 <= bwr) { + back = DK4_SOCKET_RESULT_SUCCESS; + *pszbuf = (size_t)bwr; + } else { + dk4socket_error_report(erp, DK4_E_SOCKET_RECV); + *pszbuf = 0; + } + *paddrlen = (size_t)peersize; + } + } + 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; +} + + |