changed the way to fix ERROR_BROKEN_PIPE.

improved socket error translation
This commit is contained in:
2012-12-28 08:39:41 +00:00
parent eb28009952
commit 3aec7946c3
28 changed files with 394 additions and 1455 deletions

View File

@ -1729,16 +1729,6 @@ static qse_ssize_t awk_rio_console (
if (sio) qse_sio_close (sio);
}
#if defined(_WIN32)
/* DIRTY HACK FOR WIN32.
* ReadFile returns failure with ERROR_BROKEN_PIPE
* when an anonymous pipe is closed. it doesn't return EOF.
* Let me handle that specially here for console only.
*/
if (nn <= -1 &&
qse_sio_geterrnum ((qse_sio_t*)riod->handle) == QSE_SIO_EPIPE) return 0;
#endif
return nn;
}

View File

@ -51,8 +51,9 @@
/* internal status codes */
enum
{
STATUS_APPEND = (1 << 0),
STATUS_NOCLOSE = (1 << 1)
STATUS_APPEND = (1 << 0),
STATUS_NOCLOSE = (1 << 1),
STATUS_WIN32_STDIN = (1 << 2)
};
#include "syserr.h"
@ -230,6 +231,9 @@ int qse_fio_init (
handle != INVALID_HANDLE_VALUE,
"Do not specify an invalid handle value"
);
if (handle == GetStdHandle (STD_INPUT_HANDLE))
fio->status |= STATUS_WIN32_STDIN;
}
else
{
@ -1073,7 +1077,7 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size)
sz.ulLo = (ULONG)(size&0xFFFFFFFFlu);
sz.ulHi = (ULONG)(size>>32);
ret = DosSetFileSizeL (fio->handle, sz);
ret = dos_set_file_size_l (fio->handle, sz);
}
else
{
@ -1128,7 +1132,13 @@ qse_ssize_t qse_fio_read (qse_fio_t* fio, void* buf, qse_size_t size)
size = QSE_TYPE_MAX(qse_ssize_t) & QSE_TYPE_MAX(DWORD);
if (ReadFile (fio->handle, buf, (DWORD)size, &count, QSE_NULL) == FALSE)
{
fio->errnum = syserr_to_errnum (GetLastError());
DWORD e = GetLastError();
/* special case when ReadFile returns failure with ERROR_BROKEN_PIPE.
* this happens when an anonymous pipe is a standard input for redirection.
* assuming that ERROR_BROKEN_PIPE doesn't occur with normal
* input streams, i treat the condition as a normal EOF indicator. */
if ((fio->status & STATUS_WIN32_STDIN) && e == ERROR_BROKEN_PIPE) return 0;
fio->errnum = syserr_to_errnum (e);
return -1;
}
return (qse_ssize_t)count;

View File

@ -109,43 +109,31 @@ struct qse_mux_t
int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse_size_t capahint);
void qse_mux_fini (qse_mux_t* mux);
#if defined(_WIN32)
/* TODO: change the error code handling. this is wrong... use WSA error codes .... */
static qse_mux_errnum_t syserr_to_errnum (DWORD e)
{
#if defined(_WIN32)
static qse_mux_errnum_t skerr_to_errnum (DWORD e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
case WSA_NOT_ENOUGH_MEMORY:
return QSE_MUX_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
case WSA_INVALID_PARAMETER:
case WSA_INVALID_HANDLE:
return QSE_MUX_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
case WSAEACCES:
return QSE_MUX_EACCES;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_MUX_ENOENT;
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
return QSE_MUX_EEXIST;
case ERROR_BROKEN_PIPE:
return QSE_MUX_EPIPE;
case WSAEINTR:
return QSE_MUX_EINTR;
default:
return QSE_MUX_ESYSERR;
}
}
#elif defined(__OS2__)
static qse_mux_errnum_t syserr_to_errnum (int e)
static qse_mux_errnum_t skerr_to_errnum (int e)
{
switch (e)
{
@ -165,7 +153,7 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
return QSE_MUX_ENOENT;
#endif
#if defined(SOCEEXIST)
#if defined(SOCEXIST)
case SOCEEXIST:
return QSE_MUX_EEXIST;
#endif
@ -173,37 +161,22 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
case SOCEINTR:
return QSE_MUX_EINTR;
case SOCEPIPE:
return QSE_MUX_EPIPE;
default:
return QSE_MUX_ESYSERR;
}
}
#elif defined(__DOS__)
static qse_mux_errnum_t syserr_to_errnum (int e)
static qse_mux_errnum_t skerr_to_errnum (int e)
{
switch (e)
{
case ENOMEM:
return QSE_MUX_ENOMEM;
case EINVAL:
return QSE_MUX_EINVAL;
case EACCES:
return QSE_MUX_EACCES;
case ENOENT:
return QSE_MUX_ENOENT;
case EEXIST:
return QSE_MUX_EEXIST;
default:
return QSE_MUX_ESYSERR;
}
/* TODO: */
return QSE_MUX_ESYSERR;
}
#else
static qse_mux_errnum_t syserr_to_errnum (int e)
static qse_mux_errnum_t skerr_to_errnum (int e)
{
switch (e)
{
@ -213,12 +186,12 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
case EINVAL:
return QSE_MUX_EINVAL;
case ENOENT:
return QSE_MUX_ENOENT;
case EACCES:
return QSE_MUX_EACCES;
case ENOENT:
return QSE_MUX_ENOENT;
case EEXIST:
return QSE_MUX_EEXIST;
@ -286,7 +259,7 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse
#endif
if (mux->fd <= -1)
{
mux->errnum = syserr_to_errnum (errno);
mux->errnum = skerr_to_errnum (errno);
return -1;
}
@ -507,7 +480,7 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
if (epoll_ctl (mux->fd, EPOLL_CTL_ADD, evt->hnd, &ev) == -1)
{
mux->errnum = syserr_to_errnum (errno);
mux->errnum = skerr_to_errnum (errno);
return -1;
}
@ -626,7 +599,7 @@ done:
if (epoll_ctl (mux->fd, EPOLL_CTL_DEL, evt->hnd, QSE_NULL) <= -1)
{
mux->errnum = syserr_to_errnum(errno);
mux->errnum = skerr_to_errnum(errno);
return -1;
}
@ -680,11 +653,11 @@ int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
if (n <= -1)
{
#if defined(_WIN32)
mux->errnum = syserr_to_errnum(WSAGetLastError());
mux->errnum = skerr_to_errnum(WSAGetLastError());
#elif defined(__OS2__)
mux->errnum = syserr_to_errnum(sock_errno());
mux->errnum = skerr_to_errnum(sock_errno());
#else
mux->errnum = syserr_to_errnum(errno);
mux->errnum = skerr_to_errnum(errno);
#endif
return -1;
}
@ -722,7 +695,7 @@ int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
);
if (nfds <= -1)
{
mux->errnum = syserr_to_errnum(errno);
mux->errnum = skerr_to_errnum(errno);
return -1;
}
@ -779,7 +752,7 @@ int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
n = os2_select (mux->fdarr, rcount, wcount, 0, tv);
if (n <= -1)
{
mux->errnum = syserr_to_errnum(sock_errno());
mux->errnum = skerr_to_errnum(sock_errno());
return -1;
}

View File

@ -64,7 +64,7 @@ static qse_ssize_t socket_input (
#define TMOUT_ENABLED(tmout) (tmout.sec >= 0 && tmout.nsec >= 0)
#if defined(_WIN32)
static qse_nwio_errnum_t syserr_to_errnum (DWORD e)
static qse_nwio_errnum_t skerr_to_errnum (DWORD e)
{
switch (e)
{
@ -92,7 +92,7 @@ static qse_nwio_errnum_t syserr_to_errnum (DWORD e)
}
}
#elif defined(__OS2__)
static qse_nwio_errnum_t syserr_to_errnum (int e)
static qse_nwio_errnum_t skerr_to_errnum (int e)
{
switch (e)
{
@ -135,13 +135,13 @@ static qse_nwio_errnum_t syserr_to_errnum (int e)
}
#elif defined(__DOS__)
static qse_nwio_errnum_t syserr_to_errnum (int e)
static qse_nwio_errnum_t skerr_to_errnum (int e)
{
/* TODO: */
return QSE_NWIO_ESYSERR;
}
#else
static qse_nwio_errnum_t syserr_to_errnum (int e)
static qse_nwio_errnum_t skerr_to_errnum (int e)
{
switch (e)
{
@ -166,6 +166,9 @@ static qse_nwio_errnum_t syserr_to_errnum (int e)
case EPIPE:
return QSE_NWIO_EPIPE;
case EAGAIN:
return QSE_NWIO_EAGAIN;
#if defined(ECONNREFUSED) || defined(ENETUNREACH) || defined(EHOSTUNREACH) || defined(EHOSTDOWN)
#if defined(ECONNREFUSED)
case ECONNREFUSED:
@ -235,11 +238,11 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
#endif
{
#if defined(_WIN32)
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
#elif defined(__OS2__)
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
#else
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
#endif
return -1;
}
@ -260,7 +263,7 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
xret = os2_select (&nwio->handle, count[0], count[1], 0, tmout_msecs);
if (xret <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
return -1;
}
else if (xret == 0)
@ -325,11 +328,11 @@ static int preset_tmout (qse_nwio_t* nwio)
if (setsockopt (nwio->handle, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv, QSE_SIZEOF(tv)) <= -1)
{
#if defined(_WIN32)
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
#elif defined(__OS2__)
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
#else
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
#endif
return -1; /* tried to set but failed */
}
@ -348,11 +351,11 @@ static int preset_tmout (qse_nwio_t* nwio)
if (setsockopt (nwio->handle, SOL_SOCKET, SO_SNDTIMEO, (void*)&tv, QSE_SIZEOF(tv)) <= -1)
{
#if defined(_WIN32)
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
#elif defined(__OS2__)
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
#else
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
#endif
return -1; /* tried to set but failed */
}
@ -416,7 +419,7 @@ int qse_nwio_init (
nwio->handle = socket (family, type, 0);
if (nwio->handle == INVALID_SOCKET)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
@ -438,7 +441,7 @@ int qse_nwio_init (
if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) == SOCKET_ERROR)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
@ -446,7 +449,7 @@ int qse_nwio_init (
{
if (listen (nwio->handle, 10) == SOCKET_ERROR)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
@ -456,7 +459,7 @@ int qse_nwio_init (
handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen);
if (handle == INVALID_SOCKET)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
@ -478,7 +481,7 @@ int qse_nwio_init (
if (ioctlsocket(nwio->handle, FIONBIO, &cmd) == SOCKET_ERROR)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
}
@ -492,7 +495,7 @@ int qse_nwio_init (
if ((xret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) ||
ioctlsocket (nwio->handle, FIONBIO, &cmd) == SOCKET_ERROR)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
@ -505,12 +508,12 @@ int qse_nwio_init (
xlen = QSE_SIZEOF(xerr);
if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xerr, &xlen) == SOCKET_ERROR)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
else if (xerr != 0)
{
nwio->errnum = syserr_to_errnum (xerr);
nwio->errnum = skerr_to_errnum (xerr);
goto oops;
}
}
@ -519,7 +522,7 @@ int qse_nwio_init (
{
if (xret == SOCKET_ERROR)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
goto oops;
}
}
@ -529,7 +532,7 @@ int qse_nwio_init (
nwio->handle = socket (family, type, 0);
if (nwio->handle <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
@ -551,7 +554,7 @@ int qse_nwio_init (
if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
@ -559,7 +562,7 @@ int qse_nwio_init (
{
if (listen (nwio->handle, 10) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
@ -569,7 +572,7 @@ int qse_nwio_init (
handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen);
if (handle <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
@ -591,7 +594,7 @@ int qse_nwio_init (
if (ioctl (nwio->handle, FIONBIO, (void*)&noblk, QSE_SIZEOF(noblk)) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
}
@ -605,7 +608,7 @@ int qse_nwio_init (
if ((xret <= -1 && sock_errno() != SOCEINPROGRESS) ||
ioctl (nwio->handle, FIONBIO, (void*)&noblk, QSE_SIZEOF(noblk)) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
@ -617,12 +620,12 @@ int qse_nwio_init (
xlen = QSE_SIZEOF(xerr);
if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xerr, &xlen) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
else if (xerr != 0)
{
nwio->errnum = syserr_to_errnum (xerr);
nwio->errnum = skerr_to_errnum (xerr);
goto oops;
}
}
@ -631,7 +634,7 @@ int qse_nwio_init (
{
if (xret <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
goto oops;
}
}
@ -649,7 +652,7 @@ int qse_nwio_init (
#endif
if (nwio->handle <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
@ -680,7 +683,7 @@ int qse_nwio_init (
if (bind (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
@ -688,7 +691,7 @@ int qse_nwio_init (
{
if (listen (nwio->handle, 10) <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
@ -698,7 +701,7 @@ int qse_nwio_init (
handle = accept (nwio->handle, (struct sockaddr*)&addr, &addrlen);
if (handle <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
@ -722,7 +725,7 @@ int qse_nwio_init (
if (orgfl <= -1 ||
fcntl (nwio->handle, F_SETFL, orgfl | O_NONBLOCK) <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
@ -731,7 +734,7 @@ int qse_nwio_init (
if ((xret <= -1 && errno != EINPROGRESS) ||
fcntl (nwio->handle, F_SETFL, orgfl) <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
@ -746,12 +749,12 @@ int qse_nwio_init (
xlen = QSE_SIZEOF(xret);
if (getsockopt (nwio->handle, SOL_SOCKET, SO_ERROR, (char*)&xret, &xlen) <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
else if (xret != 0)
{
nwio->errnum = syserr_to_errnum (xret);
nwio->errnum = skerr_to_errnum (xret);
goto oops;
}
}
@ -761,7 +764,7 @@ int qse_nwio_init (
xret = connect (nwio->handle, (struct sockaddr*)&addr, addrlen);
if (xret <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
goto oops;
}
}
@ -940,7 +943,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
(struct sockaddr*)&addr, &addrlen);
if (count == SOCKET_ERROR)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
}
else if (count >= 1)
{
@ -948,7 +951,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
* first sender */
if (connect (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1)
{
nwio->errnum = syserr_to_errnum (WSAGetLastError());
nwio->errnum = skerr_to_errnum (WSAGetLastError());
return -1;
}
nwio->status &= ~STATUS_UDP_CONNECT;
@ -961,7 +964,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
wait_for_data (nwio, &nwio->tmout.r, 0) <= -1) return -1;
count = recv (nwio->handle, buf, size, 0);
if (count == SOCKET_ERROR) nwio->errnum = syserr_to_errnum (WSAGetLastError());
if (count == SOCKET_ERROR) nwio->errnum = skerr_to_errnum (WSAGetLastError());
}
return count;
@ -985,7 +988,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
(struct sockaddr*)&addr, &addrlen);
if (n <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
}
else if (n >= 1)
{
@ -993,7 +996,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
* first sender */
if (connect (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
nwio->errnum = skerr_to_errnum (sock_errno());
return -1;
}
nwio->status &= ~STATUS_UDP_CONNECT;
@ -1006,7 +1009,7 @@ static qse_ssize_t nwio_read (qse_nwio_t* nwio, void* buf, qse_size_t size)
wait_for_data (nwio, &nwio->tmout.r, 0) <= -1) return -1;
n = recv (nwio->handle, buf, size, 0);
if (n <= -1) nwio->errnum = syserr_to_errnum (sock_errno());
if (n <= -1) nwio->errnum = skerr_to_errnum (sock_errno());
}
return n;
@ -1054,7 +1057,7 @@ reread:
}
else
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
}
}
else if (n >= 1)
@ -1063,7 +1066,7 @@ reread:
* first sender */
if (connect (nwio->handle, (struct sockaddr*)&addr, addrlen) <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
return -1;
}
nwio->status &= ~STATUS_UDP_CONNECT;
@ -1086,7 +1089,7 @@ reread:
}
else
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
}
}
}
@ -1134,7 +1137,7 @@ static qse_ssize_t nwio_write (qse_nwio_t* nwio, const void* data, qse_size_t si
wait_for_data (nwio, &nwio->tmout.w, 1) <= -1) return -1;
count = send (nwio->handle, data, size, 0);
if (count == SOCKET_ERROR) nwio->errnum = syserr_to_errnum (WSAGetLastError());
if (count == SOCKET_ERROR) nwio->errnum = skerr_to_errnum (WSAGetLastError());
return count;
#elif defined(__OS2__)
@ -1147,7 +1150,7 @@ static qse_ssize_t nwio_write (qse_nwio_t* nwio, const void* data, qse_size_t si
wait_for_data (nwio, &nwio->tmout.w, 1) <= -1) return -1;
n = send (nwio->handle, data, size, 0);
if (n <= -1) nwio->errnum = syserr_to_errnum (sock_errno());
if (n <= -1) nwio->errnum = skerr_to_errnum (sock_errno());
return n;
#elif defined(__DOS__)
@ -1176,7 +1179,7 @@ rewrite:
}
else
{
nwio->errnum = syserr_to_errnum (errno);
nwio->errnum = skerr_to_errnum (errno);
}
}
return n;

View File

@ -161,13 +161,13 @@ int qse_vsprintf (qse_char_t* buf, qse_size_t size, const qse_char_t* fmt, va_li
if (nf == NULL) return -1;
#if defined(QSE_CHAR_IS_MCHAR)
#if defined(_MSC_VER) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
#if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
n = _vsnprintf (buf, size, nf, ap);
#else
n = vsnprintf (buf, size, nf, ap);
#endif
#else
#if defined(_MSC_VER) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
#if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
n = _vsnwprintf (buf, size, nf, ap);
#else
n = vswprintf (buf, size, nf, ap);

View File

@ -24,7 +24,7 @@
#include <qse/cmn/htb.h>
#include "../cmn/mem.h"
#include <qse/cmn/stdio.h> /* for snprintf. TODO: remove this. */
#include <stdio.h> /* for snprintf. TODO: remove this. */
int qse_comparehttpversions (
const qse_http_version_t* v1,

View File

@ -24,7 +24,7 @@
#include <qse/cmn/pio.h>
#include <qse/cmn/fmt.h>
#include <qse/cmn/stdio.h> /* TOOD: remove this */
#include <stdio.h> /* TODO: remove this */
typedef struct task_cgi_arg_t task_cgi_arg_t;
struct task_cgi_arg_t

View File

@ -23,8 +23,6 @@
#include <qse/cmn/str.h>
#include <qse/cmn/fmt.h>
#include <qse/cmn/stdio.h> /* TODO: remove this */
typedef struct task_dir_t task_dir_t;
struct task_dir_t
{

View File

@ -23,18 +23,6 @@
#include <qse/cmn/str.h>
#include <qse/cmn/fmt.h>
#if defined(_WIN32)
/* TODO: */
#elif defined(__OS2__)
/* TODO: */
#elif defined(__DOS__)
/* TODO: */
#else
# include "../cmn/syscall.h"
#endif
#include <qse/cmn/stdio.h> /* TODO: remove this */
#define ETAG_LEN_MAX 127
typedef struct task_file_t task_file_t;

View File

@ -24,7 +24,7 @@
#include <qse/cmn/str.h>
#include <qse/cmn/fmt.h>
#include <qse/cmn/stdio.h> /* TODO: remove this.*/
#include <stdio.h> /* TODO: remove this.*/
typedef struct task_proxy_arg_t task_proxy_arg_t;
struct task_proxy_arg_t
@ -1317,7 +1317,8 @@ qse_printf (QSE_T("task_main_proxy_1....\n"));
{
/* improve error conversion */
if (httpd->errnum == QSE_HTTPD_ENOENT) http_errnum = 404;
else if (httpd->errnum == QSE_HTTPD_EACCES) http_errnum = 403;
else if (httpd->errnum == QSE_HTTPD_EACCES ||
httpd->errnum == QSE_HTTPD_ECONN) http_errnum = 403;
qse_printf (QSE_T("task_main_proxy_1.... ERROR \n"));
goto oops;
}
@ -1388,7 +1389,8 @@ qse_printf (QSE_T("task_main_proxy....\n"));
{
/* TODO: translate error code to http error... */
if (httpd->errnum == QSE_HTTPD_ENOENT) http_errnum = 404;
else if (httpd->errnum == QSE_HTTPD_EACCES) http_errnum = 403;
else if (httpd->errnum == QSE_HTTPD_EACCES ||
httpd->errnum == QSE_HTTPD_ECONN) http_errnum = 403;
qse_printf (QSE_T("caanot open peer....\n"));
goto oops;
}

View File

@ -84,7 +84,7 @@
# include <openssl/engine.h>
#endif
#include <qse/cmn/stdio.h> /* TODO: remove this */
#include <stdio.h> /* TODO: remove this */
#define DEFAULT_PORT 80
#define DEFAULT_SECURE_PORT 443
@ -122,44 +122,42 @@ struct server_xtn_t
/* ------------------------------------------------------------------- */
#if defined(_WIN32)
/* TODO: change the error code handling. this is wrong... use WSA error codes .... */
/* sockerr_to_errnum??? */
static qse_httpd_errnum_t syserr_to_errnum (DWORD e)
{
#include "../cmn/syserr.h"
IMPLEMENT_SYSERR_TO_ERRNUM (httpd, HTTPD)
#if defined(_WIN32)
static qse_httpd_errnum_t skerr_to_errnum (DWORD e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
case WSA_NOT_ENOUGH_MEMORY:
return QSE_HTTPD_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
case WSA_INVALID_PARAMETER:
case WSA_INVALID_HANDLE:
return QSE_HTTPD_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
case WSAEACCES:
return QSE_HTTPD_EACCES;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_HTTPD_ENOENT;
case WSAEINTR:
return QSE_HTTPD_EINTR;
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
return QSE_HTTPD_EEXIST;
case ERROR_BROKEN_PIPE:
return QSE_HTTPD_EPIPE;
case WSAECONNREFUSED:
case WSAENETUNREACH:
case WSAEHOSTUNREACH:
case WSAEHOSTDOWN:
return QSE_HTTPD_ECONN;
default:
return QSE_HTTPD_ESYSERR;
}
}
#define SKERR_TO_ERRNUM() skerr_to_errnum(WSAGetLastError())
#elif defined(__OS2__)
static qse_httpd_errnum_t syserr_to_errnum (int e)
static qse_httpd_errnum_t skerr_to_errnum (int e)
{
switch (e)
{
@ -179,7 +177,7 @@ static qse_httpd_errnum_t syserr_to_errnum (int e)
return QSE_HTTPD_ENOENT;
#endif
#if defined(SOCEEXIST)
#if defined(SOCEXIST)
case SOCEEXIST:
return QSE_HTTPD_EEXIST;
#endif
@ -187,12 +185,33 @@ static qse_httpd_errnum_t syserr_to_errnum (int e)
case SOCEINTR:
return QSE_HTTPD_EINTR;
case SOCEPIPE:
return QSE_HTTPD_EPIPE;
case SOCECONNREFUSED:
case SOCENETUNREACH:
case SOCEHOSTUNREACH:
case SOCEHOSTDOWN:
return QSE_HTTPD_ECONN;
default:
return QSE_HTTPD_ESYSERR;
}
}
#define SKERR_TO_ERRNUM() skerr_to_errnum(sock_errno())
#elif defined(__DOS__)
static qse_httpd_errnum_t syserr_to_errnum (int e)
static qse_httpd_errnum_t skerr_to_errnum (int e)
{
/* TODO: */
return QSE_HTTPD_ESYSERR;
}
#define SKERR_TO_ERRNUM() skerr_to_errnum(errno)
#else
static qse_httpd_errnum_t skerr_to_errnum (int e)
{
switch (e)
{
@ -211,50 +230,37 @@ static qse_httpd_errnum_t syserr_to_errnum (int e)
case EEXIST:
return QSE_HTTPD_EEXIST;
default:
return QSE_HTTPD_ESYSERR;
}
}
#else
static qse_httpd_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
case ENOMEM:
return QSE_HTTPD_ENOMEM;
case EINVAL:
return QSE_HTTPD_EINVAL;
case EACCES:
case ECONNREFUSED:
return QSE_HTTPD_EACCES;
case ENOENT:
case ENOTDIR:
/* ENOTDIR can be returned in this situation.
* i want to access /tmp/t1.cgi/abc/def
* while /tmp/t1.cgi is an existing file.
* I'm not sure if it is really good to translate
* ENOTDIR to QSE_HTTPD_ENOENT.
*/
return QSE_HTTPD_ENOENT;
case EEXIST:
return QSE_HTTPD_EEXIST;
case EINTR:
return QSE_HTTPD_EINTR;
case EPIPE:
return QSE_HTTPD_EPIPE;
case EAGAIN:
/*case EWOULDBLOCK:*/
return QSE_HTTPD_EAGAIN;
#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_HTTPD_ECONN;
#endif
default:
return QSE_HTTPD_ESYSERR;
}
}
#define SKERR_TO_ERRNUM() skerr_to_errnum(errno)
#endif
@ -683,16 +689,14 @@ IP_TRANSPRENT is needed for:
return 0;
oops:
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
#if defined(_WIN32)
qse_httpd_seterrnum (httpd, syserr_to_errnum(WSAGetLastError()));
if (fd != INVALID_SOCKET) closesocket (fd);
#elif defined(__OS2__)
qse_httpd_seterrnum (httpd, syserr_to_errnum(sock_errno()));
if (fd >= 0) soclose (fd);
#elif defined(__DOS__)
/* TODO: */
#else
qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
if (fd >= 0) QSE_CLOSE (fd);
#endif
return -1;
@ -727,7 +731,7 @@ static int server_accept (
fd = accept (server->handle.i, (struct sockaddr*)&addr, &addrlen);
if (fd <= -1)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum (errno));
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
return -1;
}
@ -879,16 +883,14 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
return connected;
oops:
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
#if defined(_WIN32)
qse_httpd_seterrnum (httpd, syserr_to_errnum(WSAGetLastError()));
if (fd != INVALID_SOCKET) closesocket (fd);
#elif defined(__OS2__)
qse_httpd_seterrnum (httpd, syserr_to_errnum(sock_errno()));
if (fd >= 0) soclose (fd);
#elif defined(__DOS__)
/* TODO: */
#else
qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
if (fd >= 0) QSE_CLOSE (fd);
#endif
return -1;
@ -916,14 +918,14 @@ static int peer_connected (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
len = QSE_SIZEOF(ret);
if (getsockopt (peer->handle.i, SOL_SOCKET, SO_ERROR, (char*)&ret, &len) == SOCKET_ERROR)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum (ret));
qse_httpd_seterrnum (httpd, skerr_to_errnum (ret));
return -1;
}
if (ret == WSAEWOULDBLOCK) return 0;
if (ret != 0)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum (ret));
qse_httpd_seterrnum (httpd, skerr_to_errnum (ret));
return -1;
}
@ -949,14 +951,14 @@ static int peer_connected (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
len = QSE_SIZEOF(ret);
if (getsockopt (peer->handle.i, SOL_SOCKET, SO_ERROR, &ret, &len) <= -1)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum (ret));
qse_httpd_seterrnum (httpd, skerr_to_errnum (ret));
return -1;
}
if (ret == EINPROGRESS) return 0;
if (ret != 0)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum (ret));
qse_httpd_seterrnum (httpd, skerr_to_errnum (ret));
return -1;
}
@ -969,7 +971,7 @@ static qse_ssize_t peer_recv (
qse_mchar_t* buf, qse_size_t bufsize)
{
qse_ssize_t ret = recv (peer->handle.i, buf, bufsize, 0);
if (ret <= -1) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
return ret;
}
@ -978,7 +980,7 @@ static qse_ssize_t peer_send (
const qse_mchar_t* buf, qse_size_t bufsize)
{
qse_ssize_t ret = send (peer->handle.i, buf, bufsize, 0);
if (ret <= -1) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
return ret;
}
@ -1503,7 +1505,7 @@ static qse_ssize_t client_recv (
{
qse_ssize_t ret;
ret = recv (client->handle.i, buf, bufsize, 0);
if (ret <= -1) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
return ret;
}
}
@ -1531,7 +1533,7 @@ static qse_ssize_t client_send (
else
{
qse_ssize_t ret = send (client->handle.i, buf, bufsize, 0);
if (ret <= -1) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
return ret;
}
}

View File

@ -23,9 +23,8 @@
#include <qse/cmn/fmt.h>
#include "../cmn/mem.h"
#include <stdarg.h>
#include <qse/cmn/stdio.h> /* TODO: remove this */
#include <stdio.h> /* TODO: remove this */
/* TODO:

View File

@ -25,6 +25,8 @@
#include <qse/net/httpd.h>
#include <qse/cmn/stdio.h> /* TODO: remove this.. only for debugging at this moment */
struct qse_httpd_t
{
qse_mmgr_t* mmgr;
@ -86,8 +88,7 @@ struct qse_httpd_t
#define CLIENT_HANDLE_IN_MUX (CLIENT_HANDLE_READ_IN_MUX|CLIENT_HANDLE_WRITE_IN_MUX)
#define CLIENT_TASK_TRIGGER_IN_MUX(i) (1 << ((i) + 8))
#if defined(_MSC_VER) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
#if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
# define snprintf _snprintf
# define vsnprintf _vsnprintf
#endif