added win32 nwio
This commit is contained in:
@ -22,6 +22,7 @@
|
||||
#include <qse/awk/std.h>
|
||||
#include <qse/cmn/sio.h>
|
||||
#include <qse/cmn/pio.h>
|
||||
#include <qse/cmn/nwio.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/mbwc.h>
|
||||
#include <qse/cmn/time.h>
|
||||
@ -734,6 +735,10 @@ static qse_ssize_t sf_out (
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
/* other code must not trigger this function */
|
||||
break;
|
||||
}
|
||||
|
||||
qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL);
|
||||
@ -793,7 +798,30 @@ int qse_awk_parsestd (
|
||||
|
||||
/*** RTX_OPENSTD ***/
|
||||
|
||||
static qse_ssize_t awk_rio_pipe (
|
||||
static qse_ssize_t nwio_handler_open (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod, int flags, qse_nwad_t* nwad)
|
||||
{
|
||||
qse_nwio_t* handle;
|
||||
|
||||
handle = qse_nwio_open (
|
||||
qse_awk_rtx_getmmgr(rtx), 0, nwad,
|
||||
flags | QSE_NWIO_TEXT | QSE_NWIO_IGNOREMBWCERR |
|
||||
QSE_NWIO_READNORETRY | QSE_NWIO_WRITENORETRY
|
||||
);
|
||||
if (handle == QSE_NULL) return -1;
|
||||
|
||||
#if defined(QSE_CHAR_IS_WCHAR)
|
||||
{
|
||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgrstd (rtx, riod->name);
|
||||
if (cmgr) qse_nwio_setcmgr (handle, cmgr);
|
||||
}
|
||||
#endif
|
||||
|
||||
riod->handle2 = (void*)handle;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static qse_ssize_t nwio_handler_rest (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
@ -801,55 +829,135 @@ static qse_ssize_t awk_rio_pipe (
|
||||
{
|
||||
case QSE_AWK_RIO_OPEN:
|
||||
{
|
||||
qse_pio_t* handle;
|
||||
int flags;
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (riod->mode == QSE_AWK_RIO_PIPE_READ)
|
||||
{
|
||||
/* TODO: should ERRTOOUT be unset? */
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_WRITE)
|
||||
{
|
||||
flags = QSE_PIO_WRITEIN;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_RW)
|
||||
{
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT |
|
||||
QSE_PIO_WRITEIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* this must not happen */
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
case QSE_AWK_RIO_CLOSE:
|
||||
{
|
||||
qse_nwio_close ((qse_nwio_t*)riod->handle2);
|
||||
riod->handle2 = QSE_NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
handle = qse_pio_open (
|
||||
rtx->awk->mmgr,
|
||||
0,
|
||||
riod->name,
|
||||
QSE_NULL,
|
||||
flags|QSE_PIO_SHELL|QSE_PIO_TEXT|QSE_PIO_IGNOREMBWCERR
|
||||
);
|
||||
if (handle == QSE_NULL) return -1;
|
||||
case QSE_AWK_RIO_READ:
|
||||
{
|
||||
return qse_nwio_read ((qse_nwio_t*)riod->handle2, data, size);
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_WRITE:
|
||||
{
|
||||
return qse_nwio_write ((qse_nwio_t*)riod->handle2, data, size);
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_FLUSH:
|
||||
{
|
||||
/*if (riod->mode == QSE_AWK_RIO_PIPE_READ) return -1;*/
|
||||
return qse_nwio_flush ((qse_nwio_t*)riod->handle2);
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_NEXT:
|
||||
break;
|
||||
}
|
||||
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int parse_rwpipe_uri (const qse_char_t* uri, int* flags, qse_nwad_t* nwad)
|
||||
{
|
||||
static struct
|
||||
{
|
||||
qse_char_t* prefix;
|
||||
qse_size_t len;
|
||||
int flags;
|
||||
} x[] =
|
||||
{
|
||||
{ QSE_T("tcp://"), 6, QSE_NWIO_TCP },
|
||||
{ QSE_T("udp://"), 6, QSE_NWIO_UDP },
|
||||
{ QSE_T("tcpd://"), 7, QSE_NWIO_TCP | QSE_NWIO_PASSIVE },
|
||||
{ QSE_T("udpd://"), 7, QSE_NWIO_UDP | QSE_NWIO_PASSIVE }
|
||||
};
|
||||
int i;
|
||||
|
||||
|
||||
for (i = 0; i < QSE_COUNTOF(x); i++)
|
||||
{
|
||||
if (qse_strzcmp (uri, x[i].prefix, x[i].len) == 0)
|
||||
{
|
||||
if (qse_strtonwad (uri + x[i].len, nwad) <= -1) return -1;
|
||||
*flags = x[i].flags;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_handler_open (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
|
||||
{
|
||||
qse_pio_t* handle;
|
||||
int flags;
|
||||
|
||||
if (riod->mode == QSE_AWK_RIO_PIPE_READ)
|
||||
{
|
||||
/* TODO: should ERRTOOUT be unset? */
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_WRITE)
|
||||
{
|
||||
flags = QSE_PIO_WRITEIN;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_RW)
|
||||
{
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT |
|
||||
QSE_PIO_WRITEIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* this must not happen */
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
handle = qse_pio_open (
|
||||
rtx->awk->mmgr,
|
||||
0,
|
||||
riod->name,
|
||||
QSE_NULL,
|
||||
flags|QSE_PIO_SHELL|QSE_PIO_TEXT|QSE_PIO_IGNOREMBWCERR
|
||||
);
|
||||
if (handle == QSE_NULL) return -1;
|
||||
|
||||
#if defined(QSE_CHAR_IS_WCHAR)
|
||||
{
|
||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgrstd (rtx, riod->name);
|
||||
if (cmgr)
|
||||
{
|
||||
qse_pio_setcmgr (handle, QSE_PIO_IN, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_OUT, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_ERR, cmgr);
|
||||
}
|
||||
}
|
||||
{
|
||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgrstd (rtx, riod->name);
|
||||
if (cmgr)
|
||||
{
|
||||
qse_pio_setcmgr (handle, QSE_PIO_IN, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_OUT, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_ERR, cmgr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
riod->handle = (void*)handle;
|
||||
return 1;
|
||||
riod->handle = (void*)handle;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_handler_rest (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case QSE_AWK_RIO_OPEN:
|
||||
{
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_CLOSE:
|
||||
@ -900,14 +1008,34 @@ static qse_ssize_t awk_rio_pipe (
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_NEXT:
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static qse_ssize_t awk_rio_pipe (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
if (cmd == QSE_AWK_RIO_OPEN)
|
||||
{
|
||||
int flags;
|
||||
qse_nwad_t nwad;
|
||||
|
||||
if (riod->mode != QSE_AWK_RIO_PIPE_RW ||
|
||||
parse_rwpipe_uri (riod->name, &flags, &nwad) <= -1)
|
||||
return pio_handler_open (rtx, riod);
|
||||
else
|
||||
return nwio_handler_open (rtx, riod, flags, &nwad);
|
||||
}
|
||||
else if (riod->handle2)
|
||||
return nwio_handler_rest (rtx, cmd, riod, data, size);
|
||||
else
|
||||
return pio_handler_rest (rtx, cmd, riod, data, size);
|
||||
}
|
||||
|
||||
static qse_ssize_t awk_rio_file (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
|
@ -104,10 +104,7 @@ libqsecmn_la_SOURCES = \
|
||||
xma.c
|
||||
|
||||
libqsecmn_la_LDFLAGS = -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||
|
||||
#if WIN32
|
||||
#libqsecmn_la_LIBADD = -lpsapi
|
||||
#endif
|
||||
libqsecmn_la_LIBADD = $(SOCKET_LIBS)
|
||||
|
||||
if ENABLE_CXX
|
||||
|
||||
@ -115,6 +112,7 @@ lib_LTLIBRARIES += libqsecmnxx.la
|
||||
libqsecmnxx_la_SOURCES = \
|
||||
Mmgr.cpp StdMmgr.cpp
|
||||
libqsecmnxx_la_LDFLAGS = -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||
libqsecmnxx_la_LIBADD =
|
||||
|
||||
endif
|
||||
|
||||
|
@ -35,10 +35,6 @@ PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
|
||||
#if WIN32
|
||||
#libqsecmn_la_LIBADD = -lpsapi
|
||||
#endif
|
||||
@ENABLE_CXX_TRUE@am__append_1 = libqsecmnxx.la
|
||||
subdir = lib/cmn
|
||||
DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
|
||||
@ -78,7 +74,8 @@ am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__installdirs = "$(DESTDIR)$(libdir)"
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libqsecmn_la_LIBADD =
|
||||
am__DEPENDENCIES_1 =
|
||||
libqsecmn_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||
am_libqsecmn_la_OBJECTS = alg-rand.lo alg-search.lo alg-sort.lo \
|
||||
assert.lo chr.lo cp949.lo cp950.lo dll.lo env.lo gdl.lo htb.lo \
|
||||
lda.lo fio.lo fma.lo fmt.lo fs.lo fs-err.lo fs-move.lo hton.lo \
|
||||
@ -98,7 +95,7 @@ libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
|
||||
libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(libqsecmn_la_LDFLAGS) $(LDFLAGS) -o $@
|
||||
libqsecmnxx_la_LIBADD =
|
||||
libqsecmnxx_la_DEPENDENCIES =
|
||||
am__libqsecmnxx_la_SOURCES_DIST = Mmgr.cpp StdMmgr.cpp
|
||||
@ENABLE_CXX_TRUE@am_libqsecmnxx_la_OBJECTS = Mmgr.lo StdMmgr.lo
|
||||
libqsecmnxx_la_OBJECTS = $(am_libqsecmnxx_la_OBJECTS)
|
||||
@ -384,10 +381,12 @@ libqsecmn_la_SOURCES = \
|
||||
xma.c
|
||||
|
||||
libqsecmn_la_LDFLAGS = -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||
libqsecmn_la_LIBADD = $(SOCKET_LIBS)
|
||||
@ENABLE_CXX_TRUE@libqsecmnxx_la_SOURCES = \
|
||||
@ENABLE_CXX_TRUE@ Mmgr.cpp StdMmgr.cpp
|
||||
|
||||
@ENABLE_CXX_TRUE@libqsecmnxx_la_LDFLAGS = -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||
@ENABLE_CXX_TRUE@libqsecmnxx_la_LIBADD =
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
|
@ -22,7 +22,9 @@
|
||||
#include "mem.h"
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* TODO: */
|
||||
# include <winsock2.h>
|
||||
# include <ws2tcpip.h> /* sockaddr_in6 */
|
||||
# include <windows.h>
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: */
|
||||
#elif defined(__DOS__)
|
||||
@ -97,28 +99,24 @@ static qse_nwio_errnum_t syserr_to_errnum (DWORD e)
|
||||
{
|
||||
switch (e)
|
||||
{
|
||||
case ERROR_NOT_ENOUGH_MEMORY:
|
||||
case ERROR_OUTOFMEMORY:
|
||||
case WSA_NOT_ENOUGH_MEMORY:
|
||||
return QSE_NWIO_ENOMEM;
|
||||
|
||||
case ERROR_INVALID_PARAMETER:
|
||||
case ERROR_INVALID_HANDLE:
|
||||
case ERROR_INVALID_NAME:
|
||||
case WSA_INVALID_PARAMETER:
|
||||
case WSA_INVALID_HANDLE:
|
||||
return QSE_NWIO_EINVAL;
|
||||
|
||||
case ERROR_ACCESS_DENIED:
|
||||
case WSAEACCES:
|
||||
return QSE_NWIO_EACCES;
|
||||
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
case ERROR_PATH_NOT_FOUND:
|
||||
return QSE_NWIO_ENOENT;
|
||||
case WSAEINTR:
|
||||
return QSE_NWIO_EINTR;
|
||||
|
||||
case ERROR_ALREADY_EXISTS:
|
||||
case ERROR_FILE_EXISTS:
|
||||
return QSE_NWIO_EEXIST;
|
||||
|
||||
case ERROR_BROKEN_PIPE:
|
||||
return QSE_NWIO_EPIPE;
|
||||
case WSAECONNREFUSED:
|
||||
case WSAENETUNREACH:
|
||||
case WSAEHOSTUNREACH:
|
||||
case WSAEHOSTDOWN:
|
||||
return QSE_NWIO_ECONN;
|
||||
|
||||
default:
|
||||
return QSE_NWIO_ESYSERR;
|
||||
@ -205,12 +203,18 @@ static qse_nwio_errnum_t syserr_to_errnum (int e)
|
||||
case EPIPE:
|
||||
return QSE_NWIO_EPIPE;
|
||||
|
||||
#if defined(ECONNREFUSED) || defined(ENETUNREACH)
|
||||
#if defined(ECONNREFUSED) || defined(ENETUNREACH) || defined(EHOSTUNREACH) || defined(EHOSTDOWN)
|
||||
#if defined(ECONNREFUSED)
|
||||
case ECONNREFUSED:
|
||||
#endif
|
||||
#if defined(ENETUNREACH)
|
||||
case ENETUNREACH:
|
||||
#endif
|
||||
#if defined(EHOSTUNREACH)
|
||||
case EHOSTUNREACH:
|
||||
#endif
|
||||
#if defined(EHOSTDOWN)
|
||||
case EHOSTDOWN:
|
||||
#endif
|
||||
return QSE_NWIO_ECONN;
|
||||
#endif
|
||||
@ -285,13 +289,6 @@ int qse_nwio_init (
|
||||
|
||||
addrlen = nwad_to_sockaddr (nwad, &family, &addr);
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* TODO: */
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: */
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
#else
|
||||
if (flags & QSE_NWIO_TCP) type = SOCK_STREAM;
|
||||
else if (flags & QSE_NWIO_UDP) type = SOCK_DGRAM;
|
||||
else
|
||||
@ -300,6 +297,65 @@ int qse_nwio_init (
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
nwio->handle = socket (family, type, 0);
|
||||
if (nwio->handle == INVALID_SOCKET)
|
||||
{
|
||||
nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (flags & QSE_NWIO_PASSIVE)
|
||||
{
|
||||
qse_nwio_hnd_t handle;
|
||||
|
||||
if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) == SOCKET_ERROR)
|
||||
{
|
||||
nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (flags & QSE_NWIO_TCP)
|
||||
{
|
||||
if (listen (nwio->handle, 10) == SOCKET_ERROR)
|
||||
{
|
||||
nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen);
|
||||
if (handle == INVALID_SOCKET)
|
||||
{
|
||||
nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
goto oops;
|
||||
}
|
||||
|
||||
closesocket (nwio->handle);
|
||||
nwio->handle = handle;
|
||||
}
|
||||
else if (flags & QSE_NWIO_UDP)
|
||||
{
|
||||
nwio->status |= UDP_CONNECT_NEEDED;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (connect (nwio->handle, (struct sockaddr*)&addr, addrlen) == SOCKET_ERROR)
|
||||
{
|
||||
nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(__OS2__)
|
||||
nwio->errnum = QSE_NWIO_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#elif defined(__DOS__)
|
||||
nwio->errnum = QSE_NWIO_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#else
|
||||
nwio->handle = socket (family, type, 0);
|
||||
if (nwio->handle <= -1)
|
||||
{
|
||||
@ -307,12 +363,12 @@ int qse_nwio_init (
|
||||
goto oops;
|
||||
}
|
||||
|
||||
#if defined(FD_CLOEXEC)
|
||||
#if defined(FD_CLOEXEC)
|
||||
{
|
||||
int tmp = fcntl (nwio->handle, F_GETFD);
|
||||
if (tmp >= 0) fcntl (nwio->handle, F_SETFD, tmp | FD_CLOEXEC);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (flags & QSE_NWIO_PASSIVE)
|
||||
{
|
||||
@ -339,7 +395,15 @@ int qse_nwio_init (
|
||||
goto oops;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
closesocket (nwio->handle);
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: */
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
#else
|
||||
QSE_CLOSE (nwio->handle);
|
||||
#endif
|
||||
nwio->handle = handle;
|
||||
}
|
||||
else if (flags & QSE_NWIO_UDP)
|
||||
@ -386,16 +450,22 @@ int qse_nwio_init (
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
if (nwio->tio) qse_tio_close (nwio->tio);
|
||||
if (nwio->tio)
|
||||
{
|
||||
qse_tio_close (nwio->tio);
|
||||
nwio->tio = QSE_NULL;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* TODO: */
|
||||
if (nwio->handle != INVALID_SOCKET) closesocket (nwio->handle);
|
||||
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: */
|
||||
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
#else
|
||||
QSE_CLOSE (nwio->handle);
|
||||
if (nwio->handle >= 0) QSE_CLOSE (nwio->handle);
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
@ -409,6 +479,16 @@ void qse_nwio_fini (qse_nwio_t* nwio)
|
||||
qse_tio_close (nwio->tio);
|
||||
nwio->tio = QSE_NULL;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
closesocket (nwio->handle);
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: */
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
#else
|
||||
QSE_CLOSE (nwio->handle);
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_nwio_errnum_t qse_nwio_geterrnum (const qse_nwio_t* nwio)
|
||||
@ -428,7 +508,7 @@ void qse_nwio_setcmgr (qse_nwio_t* nwio, qse_cmgr_t* cmgr)
|
||||
|
||||
qse_nwio_hnd_t qse_nwio_gethandle (const qse_nwio_t* nwio)
|
||||
{
|
||||
return QSE_NWIO_HANDLE(nwio);
|
||||
return nwio->handle;
|
||||
}
|
||||
|
||||
qse_ubi_t qse_nwio_gethandleasubi (const qse_nwio_t* nwio)
|
||||
@ -436,11 +516,11 @@ qse_ubi_t qse_nwio_gethandleasubi (const qse_nwio_t* nwio)
|
||||
qse_ubi_t ubi;
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* TODO: */
|
||||
ubi.intptr = nwio->handle;
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: */
|
||||
/* TODO: */
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
/* TODO: */
|
||||
#else
|
||||
ubi.i = nwio->handle;
|
||||
#endif
|
||||
@ -473,7 +553,7 @@ void qse_nwio_purge (qse_nwio_t* nwio)
|
||||
static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
DWORD count;
|
||||
int count;
|
||||
#elif defined(__OS2__)
|
||||
ULONG count;
|
||||
APIRET rc;
|
||||
@ -484,13 +564,48 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* TODO: */
|
||||
if (size > (QSE_TYPE_MAX(qse_ssize_t) & QSE_TYPE_MAX(int)))
|
||||
size = QSE_TYPE_MAX(qse_ssize_t) & QSE_TYPE_MAX(int);
|
||||
|
||||
if (nwio->status & UDP_CONNECT_NEEDED)
|
||||
{
|
||||
union sockaddr_t addr;
|
||||
int addrlen;
|
||||
|
||||
addrlen = QSE_SIZEOF(addr);
|
||||
count = recvfrom (
|
||||
nwio->handle, buf, size, 0,
|
||||
(struct sockaddr*)&addr, &addrlen);
|
||||
if (count == SOCKET_ERROR) nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
else if (count >= 1)
|
||||
{
|
||||
/* for udp, it just creates a stream with the
|
||||
* first sender */
|
||||
if (connect (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1)
|
||||
{
|
||||
nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
return -1;
|
||||
}
|
||||
nwio->status &= ~UDP_CONNECT_NEEDED;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
count = recv (nwio->handle, buf, size, 0);
|
||||
if (count == SOCKET_ERROR) nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
}
|
||||
|
||||
return count;
|
||||
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: */
|
||||
nwio->errnum = QSE_NWIO_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#elif defined(__DOS__)
|
||||
/* TODO: */
|
||||
|
||||
nwio->errnum = QSE_NWIO_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#else
|
||||
|
||||
if (size > (QSE_TYPE_MAX(qse_ssize_t) & QSE_TYPE_MAX(size_t)))
|
||||
@ -577,7 +692,7 @@ qse_ssize_t qse_nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
|
||||
static qse_ssize_t nwio_write (qse_nwio_t* nwio, const void* data, qse_size_t size)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
DWORD count;
|
||||
int count;
|
||||
#elif defined(__OS2__)
|
||||
ULONG count;
|
||||
APIRET rc;
|
||||
@ -589,15 +704,22 @@ static qse_ssize_t nwio_write (qse_nwio_t* nwio, const void* data, qse_size_t si
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
/* TODO: */
|
||||
if (size > (QSE_TYPE_MAX(qse_ssize_t) & QSE_TYPE_MAX(int)))
|
||||
size = QSE_TYPE_MAX(qse_ssize_t) & QSE_TYPE_MAX(int);
|
||||
|
||||
count = send (nwio->handle, data, size, 0);
|
||||
if (count == SOCKET_ERROR) nwio->errnum = syserr_to_errnum (WSAGetLastError());
|
||||
return count;
|
||||
|
||||
#elif defined(__OS2__)
|
||||
|
||||
/* TODO: */
|
||||
nwio->errnum = QSE_NWIO_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#elif defined(__DOS__)
|
||||
|
||||
/* TODO: */
|
||||
nwio->errnum = QSE_NWIO_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#else
|
||||
|
||||
|
Reference in New Issue
Block a user