improved error handling in httpd

added more win32/watcom targets
This commit is contained in:
2012-12-10 14:39:57 +00:00
parent 988621d148
commit b2d7199f39
34 changed files with 1095 additions and 122 deletions

View File

@ -56,7 +56,6 @@ enum
#if defined(_WIN32)
static qse_fio_errnum_t syserr_to_errnum (DWORD e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
@ -69,6 +68,7 @@ static qse_fio_errnum_t syserr_to_errnum (DWORD e)
return QSE_FIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_FIO_EACCES;
case ERROR_FILE_NOT_FOUND:
@ -97,6 +97,7 @@ static qse_fio_errnum_t syserr_to_errnum (APIRET e)
return QSE_FIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_FIO_EACCES;
case ERROR_FILE_NOT_FOUND:

View File

@ -41,6 +41,7 @@ qse_fs_errnum_t qse_fs_syserrtoerrnum (qse_fs_t* fs, qse_fs_syserr_t e)
return QSE_FS_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_FS_EACCES;
case ERROR_FILE_NOT_FOUND:
@ -70,6 +71,7 @@ qse_fs_errnum_t qse_fs_syserrtoerrnum (qse_fs_t* fs, qse_fs_syserr_t e)
return QSE_FS_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_FS_EACCES;
case ERROR_FILE_NOT_FOUND:

View File

@ -120,6 +120,7 @@ static qse_mux_errnum_t syserr_to_errnum (DWORD e)
return QSE_MUX_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_MUX_EACCES;
case ERROR_FILE_NOT_FOUND:

View File

@ -60,6 +60,7 @@ static qse_pio_errnum_t syserr_to_errnum (DWORD e)
return QSE_PIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_PIO_EACCES;
case ERROR_FILE_NOT_FOUND:
@ -91,6 +92,7 @@ static qse_pio_errnum_t syserr_to_errnum (APIRET e)
return QSE_PIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_PIO_EACCES;
case ERROR_FILE_NOT_FOUND:

View File

@ -134,6 +134,7 @@ static qse_httpd_errnum_t syserr_to_errnum (DWORD e)
return QSE_HTTPD_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_HTTPD_EACCES;
case ERROR_FILE_NOT_FOUND:
@ -162,6 +163,7 @@ static qse_httpd_errnum_t syserr_to_errnum (APIRET e)
return QSE_HTTPD_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_HTTPD_EACCES;
case ERROR_FILE_NOT_FOUND:
@ -269,6 +271,34 @@ static qse_httpd_errnum_t muxerr_to_errnum (qse_mux_errnum_t e)
}
}
static qse_httpd_errnum_t fioerr_to_errnum (qse_fio_errnum_t e)
{
switch (e)
{
case QSE_FIO_ENOMEM:
return QSE_HTTPD_ENOMEM;
case QSE_FIO_EINVAL:
return QSE_HTTPD_EINVAL;
case QSE_FIO_EACCES:
return QSE_HTTPD_EACCES;
case QSE_FIO_ENOENT:
return QSE_HTTPD_ENOENT;
case QSE_FIO_EEXIST:
return QSE_HTTPD_EEXIST;
case QSE_FIO_EINTR:
return QSE_HTTPD_EINTR;
default:
return QSE_HTTPD_ESYSERR;
}
}
/* ------------------------------------------------------------------- */
@ -511,7 +541,7 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server)
#if defined(SO_REUSEADDR)
flag = 1;
setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &flag, QSE_SIZEOF(flag));
setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (void*)&flag, QSE_SIZEOF(flag));
#endif
/* TODO: linux. use capset() to set required capabilities just in case */
@ -569,7 +599,7 @@ IP_TRANSPRENT is needed for:
/*if (bind (s, (struct sockaddr*)&addr, QSE_SIZEOF(addr)) <= -1) goto oops_esocket;*/
if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1)
{
#if defined(IPV6_V6ONLY)
#if defined(IPV6_V6ONLY) && defined(EADDRINUSE)
if (errno == EADDRINUSE && qse_skadfamily(&addr) == AF_INET6)
{
int on = 1;
@ -1062,7 +1092,11 @@ static int stat_file (
if (qse_mbspbrk (path, QSE_MT("?*")) != QSE_NULL) return -1;
fh = FindFirstFileA (path, &fdata);
if (fh == INVALID_HANDLE_VALUE) return -1;
if (fh == INVALID_HANDLE_VALUE)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum(GetLastError()));
return -1;
}
QSE_MEMSET (hst, 0, QSE_SIZEOF(*hst));
if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) hst->isdir = 1;
@ -1088,7 +1122,11 @@ static int stat_file (
FILESTATUS3L ffb;
rc = DosQueryPathInfo (path, FIL_STANDARDL, &ffb, QSE_SIZEOF(ffb));
if (rc != NO_ERROR) return -1;
if (rc != NO_ERROR)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum(rc));
return -1;
}
QSE_MEMSET (&bt, 0, QSE_SIZEOF(bt));
bt.mday = ffb.fdateLastWrite.day;
@ -1181,13 +1219,19 @@ static int file_ropen (
{
qse_fio_t* fio;
fio = qse_fio_open (
httpd->mmgr, 0, (const qse_char_t*)path,
QSE_FIO_READ | QSE_FIO_MBSPATH, 0);
fio = QSE_MMGR_ALLOC (httpd->mmgr, QSE_SIZEOF(*fio));
if (fio == QSE_NULL)
{
/* TODO: translate fio error to a proper error code */
qse_httpd_seterrnum (httpd, QSE_HTTPD_EINVAL);
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM);
return -1;
}
if (qse_fio_init (
fio, httpd->mmgr, (const qse_char_t*)path,
QSE_FIO_READ | QSE_FIO_MBSPATH, 0) <= -1)
{
qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(fio)));
QSE_MMGR_FREE (httpd->mmgr, fio);
return -1;
}
@ -1203,14 +1247,20 @@ static int file_wopen (
{
qse_fio_t* fio;
fio = qse_fio_open (
httpd->mmgr, 0, (const qse_char_t*)path,
QSE_FIO_WRITE | QSE_FIO_CREATE |
QSE_FIO_TRUNCATE | QSE_FIO_MBSPATH, 0644);
fio = QSE_MMGR_ALLOC (httpd->mmgr, QSE_SIZEOF(*fio));
if (fio == QSE_NULL)
{
/* TODO: translate fio error to a proper error code */
qse_httpd_seterrnum (httpd, QSE_HTTPD_EINVAL);
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM);
return -1;
}
if (qse_fio_init (
fio, httpd->mmgr, (const qse_char_t*)path,
QSE_FIO_WRITE | QSE_FIO_CREATE |
QSE_FIO_TRUNCATE | QSE_FIO_MBSPATH, 0644) <= -1)
{
qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(fio)));
QSE_MMGR_FREE (httpd->mmgr, fio);
return -1;
}
@ -1222,23 +1272,28 @@ qse_printf (QSE_T("opened wfile [%hs][%p][%p]\n"), path, handle->ptr, fio->handl
static void file_close (qse_httpd_t* httpd, qse_ubi_t handle)
{
qse_printf (QSE_T("closed file....%p\n"), handle.ptr);
qse_fio_close (handle.ptr);
qse_fio_fini (handle.ptr);
QSE_MMGR_FREE (httpd->mmgr, handle.ptr);
}
static qse_ssize_t file_read (
qse_httpd_t* httpd, qse_ubi_t handle,
qse_mchar_t* buf, qse_size_t len)
{
/* TODO: error code conversion */
return qse_fio_read (handle.ptr, buf, len);
qse_ssize_t n;
n = qse_fio_read (handle.ptr, buf, len);
if (n <= -1) qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(handle.ptr)));
return n;
}
static qse_ssize_t file_write (
qse_httpd_t* httpd, qse_ubi_t handle,
const qse_mchar_t* buf, qse_size_t len)
{
/* TODO: error code conversion */
return qse_fio_write (handle.ptr, buf, len);
qse_ssize_t n;
n = qse_fio_write (handle.ptr, buf, len);
if (n <= -1) qse_httpd_seterrnum (httpd, fioerr_to_errnum(qse_fio_geterrnum(handle.ptr)));
return n;
}
/* ------------------------------------------------------------------- */