From eb2800995279a3194cdb79d8dbd3a73f5162b0ec Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 27 Dec 2012 14:40:58 +0000 Subject: [PATCH] improved error number handling. handled a broken pipe condition from an anonymous pipe in awk --- qse/cmd/awk/awk.c | 39 +-------------- qse/include/qse/cmn/dir.h | 25 +++++----- qse/include/qse/cmn/fio.h | 1 + qse/include/qse/cmn/mux.h | 4 +- qse/include/qse/cmn/pio.h | 2 + qse/include/qse/cmn/sio.h | 3 ++ qse/include/qse/cmn/stdio.h | 42 +++++----------- qse/include/qse/net/httpd.h | 3 +- qse/lib/awk/std.c | 10 ++++ qse/lib/cmn/mux.c | 10 ++++ qse/lib/cmn/sio.c | 5 +- qse/lib/cmn/stdio.c | 98 +++++++++++++++++++++++++------------ qse/lib/cmn/syserr.h | 3 ++ qse/lib/net/httpd-std.c | 86 +++++++++++++++++++++++++++----- 14 files changed, 204 insertions(+), 127 deletions(-) diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index 287f50cc..0e922e71 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -808,43 +808,6 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg) isfl++; } -#if 0 - else if (isfl >= 2) - { - /* if more than one -f has been specified, attempt to convert - * it to a single script containing @include statements. this way - * a parse error in a particular script file can be pin-pointed. - * qse_awk_parsestd() treats multiple QSE_AWK_PARSED_FILEs as - * a single stream concatenated. so this is a workaround. */ - qse_str_t script; - if (qse_str_init (&script, arg->icf.mmgr, 256) >= 0) - { - for (i = 0; i < isfl; i++) - { - /* TOOD: use an absolute path for this conversion - * to avoid any conflicts with the search path - * for the included file. you can combine the - * file name with the current working directory. */ - if (qse_str_cat (&script, QSE_T("@include \"")) == (qse_size_t)-1 || - qse_str_cat (&script, isf[i].u.file.path) == (qse_size_t)-1 || - qse_str_cat (&script, QSE_T("\";")) == (qse_size_t)-1) - { - goto incl_conv_oops; - } - } - - /* after successful conversion, only 1 string stream - * should take place */ - qse_str_yield (&script, &isf[0].u.str, 0); - isf[0].type = QSE_AWK_PARSESTD_STR; - isfl = 1; - arg->incl_conv = 1; - - incl_conv_oops: - qse_str_fini (&script); - } - } -#endif for (i = 0; i < isfl ; i++) isf[isfl].cmgr = arg->script_cmgr; @@ -869,7 +832,7 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg) return 1; oops: - if (gvm != QSE_NULL) qse_htb_close (gvm); + if (gvm) qse_htb_close (gvm); purge_xarg (&arg->icf); if (isf) { diff --git a/qse/include/qse/cmn/dir.h b/qse/include/qse/cmn/dir.h index 643807a2..5f3a534d 100644 --- a/qse/include/qse/cmn/dir.h +++ b/qse/include/qse/cmn/dir.h @@ -34,19 +34,20 @@ typedef struct qse_dir_ent_t qse_dir_ent_t; enum qse_dir_errnum_t { - QSE_DIR_ENOERR = 0, /**< no error */ - QSE_DIR_EOTHER, /**< other error */ - QSE_DIR_ENOIMPL, /**< not implemented */ - QSE_DIR_ESYSERR, /**< subsystem(system call) error */ - QSE_DIR_EINTERN, /**< internal error */ + QSE_DIR_ENOERR = 0, /**< no error */ + QSE_DIR_EOTHER, /**< other error */ + QSE_DIR_ENOIMPL, /**< not implemented */ + QSE_DIR_ESYSERR, /**< subsystem(system call) error */ + QSE_DIR_EINTERN, /**< internal error */ - QSE_DIR_ENOMEM, /**< out of memory */ - QSE_DIR_EINVAL, /**< invalid parameter */ - QSE_DIR_EACCES, /**< access denied */ - QSE_DIR_ENOENT, /**< no such file */ - QSE_DIR_EEXIST, /**< already exist */ - QSE_DIR_EINTR, /**< interrupted */ - QSE_DIR_EPIPE /**< broken pipe */ + QSE_DIR_ENOMEM, /**< out of memory */ + QSE_DIR_EINVAL, /**< invalid parameter */ + QSE_DIR_EACCES, /**< access denied */ + QSE_DIR_ENOENT, /**< no such file */ + QSE_DIR_EEXIST, /**< already exist */ + QSE_DIR_EINTR, /**< interrupted */ + QSE_DIR_EPIPE, /**< broken pipe */ + QSE_DIR_EAGAIN /**< resource not available temporarily */ }; typedef enum qse_dir_errnum_t qse_dir_errnum_t; diff --git a/qse/include/qse/cmn/fio.h b/qse/include/qse/cmn/fio.h index 7bdaccf0..45750462 100644 --- a/qse/include/qse/cmn/fio.h +++ b/qse/include/qse/cmn/fio.h @@ -85,6 +85,7 @@ enum qse_fio_errnum_t QSE_FIO_EEXIST, /**< already exist */ QSE_FIO_EINTR, /**< interrupted */ QSE_FIO_EPIPE, /**< broken pipe */ + QSE_FIO_EAGAIN /**< resource not available temporarily */ }; typedef enum qse_fio_errnum_t qse_fio_errnum_t; diff --git a/qse/include/qse/cmn/mux.h b/qse/include/qse/cmn/mux.h index 1b38af09..0fcc8668 100644 --- a/qse/include/qse/cmn/mux.h +++ b/qse/include/qse/cmn/mux.h @@ -45,7 +45,9 @@ enum qse_mux_errnum_t QSE_MUX_EACCES, /**< access denied */ QSE_MUX_ENOENT, /**< no such file */ QSE_MUX_EEXIST, /**< already exist */ - QSE_MUX_EINTR /**< interrupted */ + QSE_MUX_EINTR, /**< interrupted */ + QSE_MUX_EPIPE, /**< broken pipe */ + QSE_MUX_EAGAIN, /**< resource not available temporarily */ }; typedef enum qse_mux_errnum_t qse_mux_errnum_t; diff --git a/qse/include/qse/cmn/pio.h b/qse/include/qse/cmn/pio.h index bfb95302..2551470a 100644 --- a/qse/include/qse/cmn/pio.h +++ b/qse/include/qse/cmn/pio.h @@ -124,6 +124,8 @@ enum qse_pio_errnum_t QSE_PIO_EEXIST, /**< already exist */ QSE_PIO_EINTR, /**< interrupted */ QSE_PIO_EPIPE, /**< broken pipe */ + QSE_PIO_EAGAIN, /**< resource not available temporarily */ + QSE_PIO_ENOHND, /**< no handle available */ QSE_PIO_ECHILD, /**< the child is not valid */ QSE_PIO_EILSEQ, /**< illegal sequence */ diff --git a/qse/include/qse/cmn/sio.h b/qse/include/qse/cmn/sio.h index 44ccc423..0c8b7246 100644 --- a/qse/include/qse/cmn/sio.h +++ b/qse/include/qse/cmn/sio.h @@ -73,6 +73,9 @@ enum qse_sio_errnum_t QSE_SIO_ENOENT, /**< no such file */ QSE_SIO_EEXIST, /**< already exist */ QSE_SIO_EINTR, /**< interrupted */ + QSE_SIO_EPIPE, /**< broken pipe */ + QSE_SIO_EAGAIN, /**< resource not available temporarily */ + QSE_SIO_EILSEQ, /**< illegal sequence */ QSE_SIO_EICSEQ, /**< incomplete sequence */ QSE_SIO_EILCHR /**< illegal character */ diff --git a/qse/include/qse/cmn/stdio.h b/qse/include/qse/cmn/stdio.h index fc599556..4283afbd 100644 --- a/qse/include/qse/cmn/stdio.h +++ b/qse/include/qse/cmn/stdio.h @@ -28,32 +28,13 @@ #include #include -#include #include -#include -#if defined(_WIN32) && !defined(__WATCOMC__) - #include - #define qse_fgets(x,y,s) _fgetts(x,y,s) - #define qse_fgetc(x) _fgettc(x) - #define qse_fputs(x,s) _fputts(x,s) - #define qse_fputc(x,s) _fputtc(x,s) -#elif defined(QSE_CHAR_IS_MCHAR) - #define qse_fgets(x,y,s) fgets(x,y,s) - #define qse_fgetc(x) fgetc(x) - #define qse_fputs(x,s) fputs(x,s) - #define qse_fputc(x,s) fputc(x,s) -#else - #define qse_fgets(x,y,s) fgetws(x,y,s) - #define qse_fgetc(x) fgetwc(x) - #define qse_fputs(x,s) fputws(x,s) - #define qse_fputc(x,s) fputwc(x,s) -#endif +typedef struct QSE_FILE QSE_FILE; -#define QSE_FILE FILE -#define QSE_STDIN stdin -#define QSE_STDOUT stdout -#define QSE_STDERR stderr +#define QSE_STDIN ((QSE_FILE*)1) +#define QSE_STDOUT ((QSE_FILE*)2) +#define QSE_STDERR ((QSE_FILE*)3) typedef int (*qse_getdelim_t) (const qse_char_t* ptr,qse_size_t len,void* arg); @@ -89,11 +70,11 @@ QSE_EXPORT int qse_dprintf ( QSE_EXPORT QSE_FILE* qse_fopen ( const qse_char_t* path, const qse_char_t* mode); -QSE_EXPORT void qse_fclose (QSE_FILE* fp); -QSE_EXPORT int qse_fflush (QSE_FILE* fp); -QSE_EXPORT void qse_clearerr (QSE_FILE* fp); -QSE_EXPORT int qse_feof (QSE_FILE* fp); -QSE_EXPORT int qse_ferror (QSE_FILE* fp); +QSE_EXPORT void qse_fclose (QSE_FILE* stream); +QSE_EXPORT int qse_fflush (QSE_FILE* stream); +QSE_EXPORT void qse_clearerr (QSE_FILE* stream); +QSE_EXPORT int qse_feof (QSE_FILE* stream); +QSE_EXPORT int qse_ferror (QSE_FILE* stream); /** * The qse_getline() function read a line from a file pointer @a fp @@ -101,7 +82,8 @@ QSE_EXPORT int qse_ferror (QSE_FILE* fp); * * @return -2 on error, -1 on eof, length of data read on success */ -QSE_EXPORT qse_ssize_t qse_getline (qse_char_t **buf, qse_size_t *n, QSE_FILE *fp); +QSE_EXPORT qse_ssize_t qse_getline ( + qse_char_t **buf, qse_size_t *n, QSE_FILE *stream); /** * The qse_getdelim() function reads characters from a file pointer @a fp @@ -112,7 +94,7 @@ QSE_EXPORT qse_ssize_t qse_getline (qse_char_t **buf, qse_size_t *n, QSE_FILE *f */ QSE_EXPORT qse_ssize_t qse_getdelim ( qse_char_t **buf, qse_size_t *n, - qse_getdelim_t fn, void* fnarg, QSE_FILE *fp); + qse_getdelim_t fn, void* fnarg, QSE_FILE* stream); #ifdef __cplusplus } diff --git a/qse/include/qse/net/httpd.h b/qse/include/qse/net/httpd.h index ac454e48..e0dc2912 100644 --- a/qse/include/qse/net/httpd.h +++ b/qse/include/qse/net/httpd.h @@ -46,9 +46,10 @@ enum qse_httpd_errnum_t QSE_HTTPD_ENOENT, QSE_HTTPD_EEXIST, QSE_HTTPD_EINTR, + QSE_HTTPD_EPIPE, QSE_HTTPD_EAGAIN, - QSE_HTTPD_ENOBUF, + QSE_HTTPD_ENOBUF, /* no buffer available */ QSE_HTTPD_EDISCON, /* client disconnnected */ QSE_HTTPD_EBADREQ, /* bad request */ QSE_HTTPD_ETASK diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index bf4ab924..22b32e1c 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -1728,6 +1728,16 @@ 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; } diff --git a/qse/lib/cmn/mux.c b/qse/lib/cmn/mux.c index 9a01570f..1aeae808 100644 --- a/qse/lib/cmn/mux.c +++ b/qse/lib/cmn/mux.c @@ -110,6 +110,7 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse 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) { @@ -136,6 +137,9 @@ static qse_mux_errnum_t syserr_to_errnum (DWORD e) case ERROR_FILE_EXISTS: return QSE_MUX_EEXIST; + case ERROR_BROKEN_PIPE: + return QSE_MUX_EPIPE; + default: return QSE_MUX_ESYSERR; } @@ -221,6 +225,12 @@ static qse_mux_errnum_t syserr_to_errnum (int e) case EINTR: return QSE_MUX_EINTR; + case EPIPE: + return QSE_MUX_EPIPE; + + case EAGAIN: + return QSE_MUX_EAGAIN; + default: return QSE_MUX_ESYSERR; } diff --git a/qse/lib/cmn/sio.c b/qse/lib/cmn/sio.c index e716204e..f5818031 100644 --- a/qse/lib/cmn/sio.c +++ b/qse/lib/cmn/sio.c @@ -31,7 +31,6 @@ # include "syscall.h" #endif - /* internal status codes */ enum { @@ -60,6 +59,10 @@ static qse_sio_errnum_t fio_errnum_to_sio_errnum (qse_fio_t* fio) return QSE_SIO_EEXIST; case QSE_FIO_EINTR: return QSE_SIO_EINTR; + case QSE_FIO_EPIPE: + return QSE_SIO_EPIPE; + case QSE_FIO_EAGAIN: + return QSE_SIO_EAGAIN; case QSE_FIO_ESYSERR: return QSE_SIO_ESYSERR; case QSE_FIO_ENOIMPL: diff --git a/qse/lib/cmn/stdio.c b/qse/lib/cmn/stdio.c index 4e497046..e44ebdc7 100644 --- a/qse/lib/cmn/stdio.c +++ b/qse/lib/cmn/stdio.c @@ -23,29 +23,49 @@ #include #include "mem.h" +#include + +#if defined(__GLIBC__) +/* for vswprintf */ +# define __USE_UNIX98 +#endif #include + #include #include -#ifndef PATH_MAX -# define PATH_MAX 2048 +#if defined(_WIN32) && !defined(__WATCOMC__) +# include +# define FGETC(x) _fgettc(x) +#elif defined(QSE_CHAR_IS_MCHAR) +# define FGETC(x) fgetc(x) +#else +# define FGETC(x) fgetwc(x) #endif +#define STREAM_TO_FILE(stream) \ + ((stream == QSE_STDOUT)? stdout: \ + (stream == QSE_STDERR)? stderr: \ + (stream == QSE_STDIN)? stdin: (FILE*)stream) + static qse_char_t* __adjust_format (const qse_char_t* format); int qse_vfprintf (QSE_FILE *stream, const qse_char_t* fmt, va_list ap) { int n; qse_char_t* nf; + FILE* fp; nf = __adjust_format (fmt); if (nf == NULL) return -1; - #if defined(QSE_CHAR_IS_MCHAR) - n = vfprintf (stream, nf, ap); - #else - n = vfwprintf (stream, nf, ap); - #endif + fp = STREAM_TO_FILE (stream); + +#if defined(QSE_CHAR_IS_MCHAR) + n = vfprintf (fp, nf, ap); +#else + n = vfwprintf (fp, nf, ap); +#endif QSE_MMGR_FREE (QSE_MMGR_GETDFL(), nf); return n; } @@ -59,29 +79,32 @@ int qse_vprintf (const qse_char_t* fmt, va_list ap) if (nf == NULL) return -1; #if defined(QSE_CHAR_IS_MCHAR) - n = vfprintf (QSE_STDOUT, nf, ap); + n = vfprintf (stdout, nf, ap); #else - n = vfwprintf (QSE_STDOUT, nf, ap); + n = vfwprintf (stdout, nf, ap); #endif QSE_MMGR_FREE (QSE_MMGR_GETDFL(), nf); return n; } -int qse_fprintf (QSE_FILE* file, const qse_char_t* fmt, ...) +int qse_fprintf (QSE_FILE* stream, const qse_char_t* fmt, ...) { int n; va_list ap; qse_char_t* nf; + FILE* fp; nf = __adjust_format (fmt); if (nf == NULL) return -1; + fp = STREAM_TO_FILE (stream); + va_start (ap, fmt); #if defined(QSE_CHAR_IS_MCHAR) - n = vfprintf (file, nf, ap); + n = vfprintf (fp, nf, ap); #else - n = vfwprintf (file, nf, ap); + n = vfwprintf (fp, nf, ap); #endif va_end (ap); @@ -100,9 +123,9 @@ int qse_printf (const qse_char_t* fmt, ...) va_start (ap, fmt); #if defined(QSE_CHAR_IS_MCHAR) - n = vfprintf (QSE_STDOUT, nf, ap); + n = vfprintf (stdout, nf, ap); #else - n = vfwprintf (QSE_STDOUT, nf, ap); + n = vfwprintf (stdout, nf, ap); #endif va_end (ap); @@ -121,9 +144,9 @@ int qse_dprintf (const qse_char_t* fmt, ...) va_start (ap, fmt); #if defined(QSE_CHAR_IS_MCHAR) - n = vfprintf (QSE_STDERR, nf, ap); + n = vfprintf (stderr, nf, ap); #else - n = vfwprintf (QSE_STDOUT, nf, ap); + n = vfwprintf (stderr, nf, ap); #endif va_end (ap); @@ -426,12 +449,12 @@ done: QSE_FILE* qse_fopen (const qse_char_t* path, const qse_char_t* mode) { #if defined(QSE_CHAR_IS_MCHAR) - return fopen (path, mode); + return (QSE_FILE*)fopen (path, mode); #elif defined(_WIN32) || defined(__OS2__) - return _wfopen (path, mode); + return (QSE_FILE*)_wfopen (path, mode); #else - QSE_FILE* fp = QSE_NULL; + FILE* fp = QSE_NULL; qse_mchar_t* path_mb; qse_mchar_t* mode_mb; @@ -446,33 +469,43 @@ QSE_FILE* qse_fopen (const qse_char_t* path, const qse_char_t* mode) if (mode_mb) QSE_MMGR_FREE (QSE_MMGR_GETDFL(), mode_mb); if (path_mb) QSE_MMGR_FREE (QSE_MMGR_GETDFL(), path_mb); - return fp; + return (QSE_FILE*)fp; #endif } -void qse_fclose (QSE_FILE* fp) +void qse_fclose (QSE_FILE* stream) { + FILE* fp; + fp = STREAM_TO_FILE (stream); fclose (fp); } -int qse_fflush (QSE_FILE* fp) +int qse_fflush (QSE_FILE* stream) { + FILE* fp; + fp = STREAM_TO_FILE (stream); return fflush (fp); } -void qse_clearerr (QSE_FILE* fp) +void qse_clearerr (QSE_FILE* stream) { + FILE* fp; + fp = STREAM_TO_FILE (stream); clearerr (fp); } -int qse_feof (QSE_FILE* fp) +int qse_feof (QSE_FILE* stream) { + FILE* fp; + fp = STREAM_TO_FILE (stream); return feof (fp); } -int qse_ferror (QSE_FILE* fp) +int qse_ferror (QSE_FILE* stream) { + FILE* fp; + fp = STREAM_TO_FILE (stream); return ferror (fp); } @@ -481,24 +514,27 @@ static int isnl (const qse_char_t* ptr, qse_size_t len, void* delim) return (ptr[len-1] == *(qse_char_t*)delim)? 1: 0; } -qse_ssize_t qse_getline (qse_char_t **buf, qse_size_t *n, QSE_FILE *fp) +qse_ssize_t qse_getline (qse_char_t **buf, qse_size_t *n, QSE_FILE *stream) { qse_char_t nl = QSE_T('\n'); - return qse_getdelim (buf, n, isnl, &nl, fp); + return qse_getdelim (buf, n, isnl, &nl, stream); } qse_ssize_t qse_getdelim ( qse_char_t **buf, qse_size_t *n, - qse_getdelim_t fn, void* fnarg, QSE_FILE *fp) + qse_getdelim_t fn, void* fnarg, QSE_FILE *stream) { qse_char_t* b; qse_size_t capa; qse_size_t len = 0; int x; + FILE* fp; QSE_ASSERT (buf != QSE_NULL); QSE_ASSERT (n != QSE_NULL); + fp = STREAM_TO_FILE (stream); + b = *buf; capa = *n; @@ -510,7 +546,7 @@ qse_ssize_t qse_getdelim ( if (b == QSE_NULL) return -2; } - if (qse_feof(fp)) + if (feof(fp)) { len = (qse_size_t)-1; goto exit_task; @@ -518,10 +554,10 @@ qse_ssize_t qse_getdelim ( while (1) { - qse_cint_t c = qse_fgetc(fp); + qse_cint_t c = FGETC (fp); if (c == QSE_CHAR_EOF) { - if (qse_ferror(fp)) + if (ferror(fp)) { len = (qse_size_t)-2; goto exit_task; diff --git a/qse/lib/cmn/syserr.h b/qse/lib/cmn/syserr.h index 41f97493..ae4a09dd 100644 --- a/qse/lib/cmn/syserr.h +++ b/qse/lib/cmn/syserr.h @@ -108,6 +108,7 @@ #elif defined(vms) || defined(__vms) + /* TODO: */ #define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \ static __SYSERRTYPE__(obj1) syserr_to_errnum (unsigned long e) \ { \ @@ -128,10 +129,12 @@ case ENOMEM: return __SYSERRNUM__ (obj2, ENOMEM); \ case EINVAL: return __SYSERRNUM__ (obj2, EINVAL); \ case EACCES: return __SYSERRNUM__ (obj2, EACCES); \ + case ENOTDIR: \ case ENOENT: return __SYSERRNUM__ (obj2, ENOENT); \ case EEXIST: return __SYSERRNUM__ (obj2, EEXIST); \ case EINTR: return __SYSERRNUM__ (obj2, EINTR); \ case EPIPE: return __SYSERRNUM__ (obj2, EPIPE); \ + case EAGAIN: return __SYSERRNUM__ (obj2, EAGAIN); \ default: return __SYSERRNUM__ (obj2, ESYSERR); \ } \ } diff --git a/qse/lib/net/httpd-std.c b/qse/lib/net/httpd-std.c index 57ecb35f..d31a553e 100644 --- a/qse/lib/net/httpd-std.c +++ b/qse/lib/net/httpd-std.c @@ -123,6 +123,8 @@ 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) { @@ -149,33 +151,41 @@ static qse_httpd_errnum_t syserr_to_errnum (DWORD e) case ERROR_FILE_EXISTS: return QSE_HTTPD_EEXIST; + case ERROR_BROKEN_PIPE: + return QSE_HTTPD_EPIPE; + default: return QSE_HTTPD_ESYSERR; } } #elif defined(__OS2__) -static qse_httpd_errnum_t syserr_to_errnum (APIRET e) +static qse_httpd_errnum_t syserr_to_errnum (int e) { switch (e) { - case ERROR_NOT_ENOUGH_MEMORY: + #if defined(SOCENOMEM) + case SOCENOMEM: return QSE_HTTPD_ENOMEM; + #endif - case ERROR_INVALID_PARAMETER: - case ERROR_INVALID_HANDLE: - case ERROR_INVALID_NAME: + case SOCEINVAL: return QSE_HTTPD_EINVAL; - case ERROR_ACCESS_DENIED: - case ERROR_SHARING_VIOLATION: + case SOCEACCES: return QSE_HTTPD_EACCES; - case ERROR_FILE_NOT_FOUND: - case ERROR_PATH_NOT_FOUND: + #if defined(SOCENOENT) + case SOCENOENT: return QSE_HTTPD_ENOENT; + #endif - case ERROR_ALREADY_EXISTS: + #if defined(SOCEEXIST) + case SOCEEXIST: return QSE_HTTPD_EEXIST; + #endif + + case SOCEINTR: + return QSE_HTTPD_EINTR; default: return QSE_HTTPD_ESYSERR; @@ -270,6 +280,12 @@ static qse_httpd_errnum_t muxerr_to_errnum (qse_mux_errnum_t e) case QSE_MUX_EINTR: return QSE_HTTPD_EINTR; + case QSE_MUX_EPIPE: + return QSE_HTTPD_EPIPE; + + case QSE_MUX_EAGAIN: + return QSE_HTTPD_EAGAIN; + default: return QSE_HTTPD_ESYSERR; } @@ -297,6 +313,45 @@ static qse_httpd_errnum_t fioerr_to_errnum (qse_fio_errnum_t e) case QSE_FIO_EINTR: return QSE_HTTPD_EINTR; + case QSE_FIO_EPIPE: + return QSE_HTTPD_EPIPE; + + case QSE_FIO_EAGAIN: + return QSE_HTTPD_EAGAIN; + + default: + return QSE_HTTPD_ESYSERR; + } +} + +static qse_httpd_errnum_t direrr_to_errnum (qse_dir_errnum_t e) +{ + switch (e) + { + case QSE_DIR_ENOMEM: + return QSE_HTTPD_ENOMEM; + + case QSE_DIR_EINVAL: + return QSE_HTTPD_EINVAL; + + case QSE_DIR_EACCES: + return QSE_HTTPD_EACCES; + + case QSE_DIR_ENOENT: + return QSE_HTTPD_ENOENT; + + case QSE_DIR_EEXIST: + return QSE_HTTPD_EEXIST; + + case QSE_DIR_EINTR: + return QSE_HTTPD_EINTR; + + case QSE_DIR_EPIPE: + return QSE_HTTPD_EPIPE; + + case QSE_DIR_EAGAIN: + return QSE_HTTPD_EAGAIN; + default: return QSE_HTTPD_ESYSERR; } @@ -1312,6 +1367,7 @@ struct dir_t static int dir_open (qse_httpd_t* httpd, const qse_mchar_t* path, qse_ubi_t* handle) { dir_t* d; + qse_dir_errnum_t direrrnum; d = QSE_MMGR_ALLOC (httpd->mmgr, QSE_SIZEOF(*d)); if (d == QSE_NULL) @@ -1328,11 +1384,15 @@ static int dir_open (qse_httpd_t* httpd, const qse_mchar_t* path, qse_ubi_t* han return -1; } - d->dp = qse_dir_open (httpd->mmgr, 0, - (const qse_char_t*)d->path, QSE_DIR_MBSPATH | QSE_DIR_SORT); + d->dp = qse_dir_open ( + httpd->mmgr, 0, + (const qse_char_t*)d->path, + QSE_DIR_MBSPATH | QSE_DIR_SORT, + &direrrnum + ); if (d->dp == QSE_NULL) { - qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); + qse_httpd_seterrnum (httpd, direrr_to_errnum(direrrnum)); QSE_MMGR_FREE (httpd->mmgr, d->path); QSE_MMGR_FREE (httpd->mmgr, d); return -1;