improved error number handling.
handled a broken pipe condition from an anonymous pipe in awk
This commit is contained in:
parent
b8c66b5b8d
commit
eb28009952
@ -808,43 +808,6 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
|
|||||||
|
|
||||||
isfl++;
|
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;
|
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;
|
return 1;
|
||||||
|
|
||||||
oops:
|
oops:
|
||||||
if (gvm != QSE_NULL) qse_htb_close (gvm);
|
if (gvm) qse_htb_close (gvm);
|
||||||
purge_xarg (&arg->icf);
|
purge_xarg (&arg->icf);
|
||||||
if (isf)
|
if (isf)
|
||||||
{
|
{
|
||||||
|
@ -34,19 +34,20 @@ typedef struct qse_dir_ent_t qse_dir_ent_t;
|
|||||||
|
|
||||||
enum qse_dir_errnum_t
|
enum qse_dir_errnum_t
|
||||||
{
|
{
|
||||||
QSE_DIR_ENOERR = 0, /**< no error */
|
QSE_DIR_ENOERR = 0, /**< no error */
|
||||||
QSE_DIR_EOTHER, /**< other error */
|
QSE_DIR_EOTHER, /**< other error */
|
||||||
QSE_DIR_ENOIMPL, /**< not implemented */
|
QSE_DIR_ENOIMPL, /**< not implemented */
|
||||||
QSE_DIR_ESYSERR, /**< subsystem(system call) error */
|
QSE_DIR_ESYSERR, /**< subsystem(system call) error */
|
||||||
QSE_DIR_EINTERN, /**< internal error */
|
QSE_DIR_EINTERN, /**< internal error */
|
||||||
|
|
||||||
QSE_DIR_ENOMEM, /**< out of memory */
|
QSE_DIR_ENOMEM, /**< out of memory */
|
||||||
QSE_DIR_EINVAL, /**< invalid parameter */
|
QSE_DIR_EINVAL, /**< invalid parameter */
|
||||||
QSE_DIR_EACCES, /**< access denied */
|
QSE_DIR_EACCES, /**< access denied */
|
||||||
QSE_DIR_ENOENT, /**< no such file */
|
QSE_DIR_ENOENT, /**< no such file */
|
||||||
QSE_DIR_EEXIST, /**< already exist */
|
QSE_DIR_EEXIST, /**< already exist */
|
||||||
QSE_DIR_EINTR, /**< interrupted */
|
QSE_DIR_EINTR, /**< interrupted */
|
||||||
QSE_DIR_EPIPE /**< broken pipe */
|
QSE_DIR_EPIPE, /**< broken pipe */
|
||||||
|
QSE_DIR_EAGAIN /**< resource not available temporarily */
|
||||||
};
|
};
|
||||||
typedef enum qse_dir_errnum_t qse_dir_errnum_t;
|
typedef enum qse_dir_errnum_t qse_dir_errnum_t;
|
||||||
|
|
||||||
|
@ -85,6 +85,7 @@ enum qse_fio_errnum_t
|
|||||||
QSE_FIO_EEXIST, /**< already exist */
|
QSE_FIO_EEXIST, /**< already exist */
|
||||||
QSE_FIO_EINTR, /**< interrupted */
|
QSE_FIO_EINTR, /**< interrupted */
|
||||||
QSE_FIO_EPIPE, /**< broken pipe */
|
QSE_FIO_EPIPE, /**< broken pipe */
|
||||||
|
QSE_FIO_EAGAIN /**< resource not available temporarily */
|
||||||
};
|
};
|
||||||
typedef enum qse_fio_errnum_t qse_fio_errnum_t;
|
typedef enum qse_fio_errnum_t qse_fio_errnum_t;
|
||||||
|
|
||||||
|
@ -45,7 +45,9 @@ enum qse_mux_errnum_t
|
|||||||
QSE_MUX_EACCES, /**< access denied */
|
QSE_MUX_EACCES, /**< access denied */
|
||||||
QSE_MUX_ENOENT, /**< no such file */
|
QSE_MUX_ENOENT, /**< no such file */
|
||||||
QSE_MUX_EEXIST, /**< already exist */
|
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;
|
typedef enum qse_mux_errnum_t qse_mux_errnum_t;
|
||||||
|
|
||||||
|
@ -124,6 +124,8 @@ enum qse_pio_errnum_t
|
|||||||
QSE_PIO_EEXIST, /**< already exist */
|
QSE_PIO_EEXIST, /**< already exist */
|
||||||
QSE_PIO_EINTR, /**< interrupted */
|
QSE_PIO_EINTR, /**< interrupted */
|
||||||
QSE_PIO_EPIPE, /**< broken pipe */
|
QSE_PIO_EPIPE, /**< broken pipe */
|
||||||
|
QSE_PIO_EAGAIN, /**< resource not available temporarily */
|
||||||
|
|
||||||
QSE_PIO_ENOHND, /**< no handle available */
|
QSE_PIO_ENOHND, /**< no handle available */
|
||||||
QSE_PIO_ECHILD, /**< the child is not valid */
|
QSE_PIO_ECHILD, /**< the child is not valid */
|
||||||
QSE_PIO_EILSEQ, /**< illegal sequence */
|
QSE_PIO_EILSEQ, /**< illegal sequence */
|
||||||
|
@ -73,6 +73,9 @@ enum qse_sio_errnum_t
|
|||||||
QSE_SIO_ENOENT, /**< no such file */
|
QSE_SIO_ENOENT, /**< no such file */
|
||||||
QSE_SIO_EEXIST, /**< already exist */
|
QSE_SIO_EEXIST, /**< already exist */
|
||||||
QSE_SIO_EINTR, /**< interrupted */
|
QSE_SIO_EINTR, /**< interrupted */
|
||||||
|
QSE_SIO_EPIPE, /**< broken pipe */
|
||||||
|
QSE_SIO_EAGAIN, /**< resource not available temporarily */
|
||||||
|
|
||||||
QSE_SIO_EILSEQ, /**< illegal sequence */
|
QSE_SIO_EILSEQ, /**< illegal sequence */
|
||||||
QSE_SIO_EICSEQ, /**< incomplete sequence */
|
QSE_SIO_EICSEQ, /**< incomplete sequence */
|
||||||
QSE_SIO_EILCHR /**< illegal character */
|
QSE_SIO_EILCHR /**< illegal character */
|
||||||
|
@ -28,32 +28,13 @@
|
|||||||
#include <qse/types.h>
|
#include <qse/types.h>
|
||||||
#include <qse/macros.h>
|
#include <qse/macros.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <wchar.h>
|
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(__WATCOMC__)
|
typedef struct QSE_FILE QSE_FILE;
|
||||||
#include <tchar.h>
|
|
||||||
#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
|
|
||||||
|
|
||||||
#define QSE_FILE FILE
|
#define QSE_STDIN ((QSE_FILE*)1)
|
||||||
#define QSE_STDIN stdin
|
#define QSE_STDOUT ((QSE_FILE*)2)
|
||||||
#define QSE_STDOUT stdout
|
#define QSE_STDERR ((QSE_FILE*)3)
|
||||||
#define QSE_STDERR stderr
|
|
||||||
|
|
||||||
typedef int (*qse_getdelim_t) (const qse_char_t* ptr,qse_size_t len,void* arg);
|
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 (
|
QSE_EXPORT QSE_FILE* qse_fopen (
|
||||||
const qse_char_t* path, const qse_char_t* mode);
|
const qse_char_t* path, const qse_char_t* mode);
|
||||||
|
|
||||||
QSE_EXPORT void qse_fclose (QSE_FILE* fp);
|
QSE_EXPORT void qse_fclose (QSE_FILE* stream);
|
||||||
QSE_EXPORT int qse_fflush (QSE_FILE* fp);
|
QSE_EXPORT int qse_fflush (QSE_FILE* stream);
|
||||||
QSE_EXPORT void qse_clearerr (QSE_FILE* fp);
|
QSE_EXPORT void qse_clearerr (QSE_FILE* stream);
|
||||||
QSE_EXPORT int qse_feof (QSE_FILE* fp);
|
QSE_EXPORT int qse_feof (QSE_FILE* stream);
|
||||||
QSE_EXPORT int qse_ferror (QSE_FILE* fp);
|
QSE_EXPORT int qse_ferror (QSE_FILE* stream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_getline() function read a line from a file pointer @a fp
|
* 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
|
* @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
|
* 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_EXPORT qse_ssize_t qse_getdelim (
|
||||||
qse_char_t **buf, qse_size_t *n,
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -46,9 +46,10 @@ enum qse_httpd_errnum_t
|
|||||||
QSE_HTTPD_ENOENT,
|
QSE_HTTPD_ENOENT,
|
||||||
QSE_HTTPD_EEXIST,
|
QSE_HTTPD_EEXIST,
|
||||||
QSE_HTTPD_EINTR,
|
QSE_HTTPD_EINTR,
|
||||||
|
QSE_HTTPD_EPIPE,
|
||||||
QSE_HTTPD_EAGAIN,
|
QSE_HTTPD_EAGAIN,
|
||||||
QSE_HTTPD_ENOBUF,
|
|
||||||
|
|
||||||
|
QSE_HTTPD_ENOBUF, /* no buffer available */
|
||||||
QSE_HTTPD_EDISCON, /* client disconnnected */
|
QSE_HTTPD_EDISCON, /* client disconnnected */
|
||||||
QSE_HTTPD_EBADREQ, /* bad request */
|
QSE_HTTPD_EBADREQ, /* bad request */
|
||||||
QSE_HTTPD_ETASK
|
QSE_HTTPD_ETASK
|
||||||
|
@ -1728,6 +1728,16 @@ static qse_ssize_t awk_rio_console (
|
|||||||
|
|
||||||
if (sio) qse_sio_close (sio);
|
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;
|
return nn;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
void qse_mux_fini (qse_mux_t* mux);
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#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)
|
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:
|
case ERROR_FILE_EXISTS:
|
||||||
return QSE_MUX_EEXIST;
|
return QSE_MUX_EEXIST;
|
||||||
|
|
||||||
|
case ERROR_BROKEN_PIPE:
|
||||||
|
return QSE_MUX_EPIPE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QSE_MUX_ESYSERR;
|
return QSE_MUX_ESYSERR;
|
||||||
}
|
}
|
||||||
@ -221,6 +225,12 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
|
|||||||
case EINTR:
|
case EINTR:
|
||||||
return QSE_MUX_EINTR;
|
return QSE_MUX_EINTR;
|
||||||
|
|
||||||
|
case EPIPE:
|
||||||
|
return QSE_MUX_EPIPE;
|
||||||
|
|
||||||
|
case EAGAIN:
|
||||||
|
return QSE_MUX_EAGAIN;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QSE_MUX_ESYSERR;
|
return QSE_MUX_ESYSERR;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
# include "syscall.h"
|
# include "syscall.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* internal status codes */
|
/* internal status codes */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@ -60,6 +59,10 @@ static qse_sio_errnum_t fio_errnum_to_sio_errnum (qse_fio_t* fio)
|
|||||||
return QSE_SIO_EEXIST;
|
return QSE_SIO_EEXIST;
|
||||||
case QSE_FIO_EINTR:
|
case QSE_FIO_EINTR:
|
||||||
return QSE_SIO_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:
|
case QSE_FIO_ESYSERR:
|
||||||
return QSE_SIO_ESYSERR;
|
return QSE_SIO_ESYSERR;
|
||||||
case QSE_FIO_ENOIMPL:
|
case QSE_FIO_ENOIMPL:
|
||||||
|
@ -23,29 +23,49 @@
|
|||||||
#include <qse/cmn/mbwc.h>
|
#include <qse/cmn/mbwc.h>
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if defined(__GLIBC__)
|
||||||
|
/* for vswprintf */
|
||||||
|
# define __USE_UNIX98
|
||||||
|
#endif
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#if defined(_WIN32) && !defined(__WATCOMC__)
|
||||||
# define PATH_MAX 2048
|
# include <tchar.h>
|
||||||
|
# define FGETC(x) _fgettc(x)
|
||||||
|
#elif defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
# define FGETC(x) fgetc(x)
|
||||||
|
#else
|
||||||
|
# define FGETC(x) fgetwc(x)
|
||||||
#endif
|
#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);
|
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 qse_vfprintf (QSE_FILE *stream, const qse_char_t* fmt, va_list ap)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
qse_char_t* nf;
|
qse_char_t* nf;
|
||||||
|
FILE* fp;
|
||||||
|
|
||||||
nf = __adjust_format (fmt);
|
nf = __adjust_format (fmt);
|
||||||
if (nf == NULL) return -1;
|
if (nf == NULL) return -1;
|
||||||
|
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
fp = STREAM_TO_FILE (stream);
|
||||||
n = vfprintf (stream, nf, ap);
|
|
||||||
#else
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
n = vfwprintf (stream, nf, ap);
|
n = vfprintf (fp, nf, ap);
|
||||||
#endif
|
#else
|
||||||
|
n = vfwprintf (fp, nf, ap);
|
||||||
|
#endif
|
||||||
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), nf);
|
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), nf);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
@ -59,29 +79,32 @@ int qse_vprintf (const qse_char_t* fmt, va_list ap)
|
|||||||
if (nf == NULL) return -1;
|
if (nf == NULL) return -1;
|
||||||
|
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
n = vfprintf (QSE_STDOUT, nf, ap);
|
n = vfprintf (stdout, nf, ap);
|
||||||
#else
|
#else
|
||||||
n = vfwprintf (QSE_STDOUT, nf, ap);
|
n = vfwprintf (stdout, nf, ap);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), nf);
|
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), nf);
|
||||||
return n;
|
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;
|
int n;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
qse_char_t* nf;
|
qse_char_t* nf;
|
||||||
|
FILE* fp;
|
||||||
|
|
||||||
nf = __adjust_format (fmt);
|
nf = __adjust_format (fmt);
|
||||||
if (nf == NULL) return -1;
|
if (nf == NULL) return -1;
|
||||||
|
|
||||||
|
fp = STREAM_TO_FILE (stream);
|
||||||
|
|
||||||
va_start (ap, fmt);
|
va_start (ap, fmt);
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
n = vfprintf (file, nf, ap);
|
n = vfprintf (fp, nf, ap);
|
||||||
#else
|
#else
|
||||||
n = vfwprintf (file, nf, ap);
|
n = vfwprintf (fp, nf, ap);
|
||||||
#endif
|
#endif
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
|
|
||||||
@ -100,9 +123,9 @@ int qse_printf (const qse_char_t* fmt, ...)
|
|||||||
|
|
||||||
va_start (ap, fmt);
|
va_start (ap, fmt);
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
n = vfprintf (QSE_STDOUT, nf, ap);
|
n = vfprintf (stdout, nf, ap);
|
||||||
#else
|
#else
|
||||||
n = vfwprintf (QSE_STDOUT, nf, ap);
|
n = vfwprintf (stdout, nf, ap);
|
||||||
#endif
|
#endif
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
|
|
||||||
@ -121,9 +144,9 @@ int qse_dprintf (const qse_char_t* fmt, ...)
|
|||||||
|
|
||||||
va_start (ap, fmt);
|
va_start (ap, fmt);
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
n = vfprintf (QSE_STDERR, nf, ap);
|
n = vfprintf (stderr, nf, ap);
|
||||||
#else
|
#else
|
||||||
n = vfwprintf (QSE_STDOUT, nf, ap);
|
n = vfwprintf (stderr, nf, ap);
|
||||||
#endif
|
#endif
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
|
|
||||||
@ -426,12 +449,12 @@ done:
|
|||||||
QSE_FILE* qse_fopen (const qse_char_t* path, const qse_char_t* mode)
|
QSE_FILE* qse_fopen (const qse_char_t* path, const qse_char_t* mode)
|
||||||
{
|
{
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
return fopen (path, mode);
|
return (QSE_FILE*)fopen (path, mode);
|
||||||
#elif defined(_WIN32) || defined(__OS2__)
|
#elif defined(_WIN32) || defined(__OS2__)
|
||||||
return _wfopen (path, mode);
|
return (QSE_FILE*)_wfopen (path, mode);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
QSE_FILE* fp = QSE_NULL;
|
FILE* fp = QSE_NULL;
|
||||||
qse_mchar_t* path_mb;
|
qse_mchar_t* path_mb;
|
||||||
qse_mchar_t* mode_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 (mode_mb) QSE_MMGR_FREE (QSE_MMGR_GETDFL(), mode_mb);
|
||||||
if (path_mb) QSE_MMGR_FREE (QSE_MMGR_GETDFL(), path_mb);
|
if (path_mb) QSE_MMGR_FREE (QSE_MMGR_GETDFL(), path_mb);
|
||||||
|
|
||||||
return fp;
|
return (QSE_FILE*)fp;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_fclose (QSE_FILE* fp)
|
void qse_fclose (QSE_FILE* stream)
|
||||||
{
|
{
|
||||||
|
FILE* fp;
|
||||||
|
fp = STREAM_TO_FILE (stream);
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_fflush (QSE_FILE* fp)
|
int qse_fflush (QSE_FILE* stream)
|
||||||
{
|
{
|
||||||
|
FILE* fp;
|
||||||
|
fp = STREAM_TO_FILE (stream);
|
||||||
return fflush (fp);
|
return fflush (fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_clearerr (QSE_FILE* fp)
|
void qse_clearerr (QSE_FILE* stream)
|
||||||
{
|
{
|
||||||
|
FILE* fp;
|
||||||
|
fp = STREAM_TO_FILE (stream);
|
||||||
clearerr (fp);
|
clearerr (fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_feof (QSE_FILE* fp)
|
int qse_feof (QSE_FILE* stream)
|
||||||
{
|
{
|
||||||
|
FILE* fp;
|
||||||
|
fp = STREAM_TO_FILE (stream);
|
||||||
return feof (fp);
|
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);
|
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;
|
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');
|
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_ssize_t qse_getdelim (
|
||||||
qse_char_t **buf, qse_size_t *n,
|
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_char_t* b;
|
||||||
qse_size_t capa;
|
qse_size_t capa;
|
||||||
qse_size_t len = 0;
|
qse_size_t len = 0;
|
||||||
int x;
|
int x;
|
||||||
|
FILE* fp;
|
||||||
|
|
||||||
QSE_ASSERT (buf != QSE_NULL);
|
QSE_ASSERT (buf != QSE_NULL);
|
||||||
QSE_ASSERT (n != QSE_NULL);
|
QSE_ASSERT (n != QSE_NULL);
|
||||||
|
|
||||||
|
fp = STREAM_TO_FILE (stream);
|
||||||
|
|
||||||
b = *buf;
|
b = *buf;
|
||||||
capa = *n;
|
capa = *n;
|
||||||
|
|
||||||
@ -510,7 +546,7 @@ qse_ssize_t qse_getdelim (
|
|||||||
if (b == QSE_NULL) return -2;
|
if (b == QSE_NULL) return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qse_feof(fp))
|
if (feof(fp))
|
||||||
{
|
{
|
||||||
len = (qse_size_t)-1;
|
len = (qse_size_t)-1;
|
||||||
goto exit_task;
|
goto exit_task;
|
||||||
@ -518,10 +554,10 @@ qse_ssize_t qse_getdelim (
|
|||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
qse_cint_t c = qse_fgetc(fp);
|
qse_cint_t c = FGETC (fp);
|
||||||
if (c == QSE_CHAR_EOF)
|
if (c == QSE_CHAR_EOF)
|
||||||
{
|
{
|
||||||
if (qse_ferror(fp))
|
if (ferror(fp))
|
||||||
{
|
{
|
||||||
len = (qse_size_t)-2;
|
len = (qse_size_t)-2;
|
||||||
goto exit_task;
|
goto exit_task;
|
||||||
|
@ -108,6 +108,7 @@
|
|||||||
|
|
||||||
#elif defined(vms) || defined(__vms)
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
/* TODO: */
|
||||||
#define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \
|
#define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \
|
||||||
static __SYSERRTYPE__(obj1) syserr_to_errnum (unsigned long e) \
|
static __SYSERRTYPE__(obj1) syserr_to_errnum (unsigned long e) \
|
||||||
{ \
|
{ \
|
||||||
@ -128,10 +129,12 @@
|
|||||||
case ENOMEM: return __SYSERRNUM__ (obj2, ENOMEM); \
|
case ENOMEM: return __SYSERRNUM__ (obj2, ENOMEM); \
|
||||||
case EINVAL: return __SYSERRNUM__ (obj2, EINVAL); \
|
case EINVAL: return __SYSERRNUM__ (obj2, EINVAL); \
|
||||||
case EACCES: return __SYSERRNUM__ (obj2, EACCES); \
|
case EACCES: return __SYSERRNUM__ (obj2, EACCES); \
|
||||||
|
case ENOTDIR: \
|
||||||
case ENOENT: return __SYSERRNUM__ (obj2, ENOENT); \
|
case ENOENT: return __SYSERRNUM__ (obj2, ENOENT); \
|
||||||
case EEXIST: return __SYSERRNUM__ (obj2, EEXIST); \
|
case EEXIST: return __SYSERRNUM__ (obj2, EEXIST); \
|
||||||
case EINTR: return __SYSERRNUM__ (obj2, EINTR); \
|
case EINTR: return __SYSERRNUM__ (obj2, EINTR); \
|
||||||
case EPIPE: return __SYSERRNUM__ (obj2, EPIPE); \
|
case EPIPE: return __SYSERRNUM__ (obj2, EPIPE); \
|
||||||
|
case EAGAIN: return __SYSERRNUM__ (obj2, EAGAIN); \
|
||||||
default: return __SYSERRNUM__ (obj2, ESYSERR); \
|
default: return __SYSERRNUM__ (obj2, ESYSERR); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
@ -123,6 +123,8 @@ struct server_xtn_t
|
|||||||
/* ------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#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)
|
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:
|
case ERROR_FILE_EXISTS:
|
||||||
return QSE_HTTPD_EEXIST;
|
return QSE_HTTPD_EEXIST;
|
||||||
|
|
||||||
|
case ERROR_BROKEN_PIPE:
|
||||||
|
return QSE_HTTPD_EPIPE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QSE_HTTPD_ESYSERR;
|
return QSE_HTTPD_ESYSERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(__OS2__)
|
#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)
|
switch (e)
|
||||||
{
|
{
|
||||||
case ERROR_NOT_ENOUGH_MEMORY:
|
#if defined(SOCENOMEM)
|
||||||
|
case SOCENOMEM:
|
||||||
return QSE_HTTPD_ENOMEM;
|
return QSE_HTTPD_ENOMEM;
|
||||||
|
#endif
|
||||||
|
|
||||||
case ERROR_INVALID_PARAMETER:
|
case SOCEINVAL:
|
||||||
case ERROR_INVALID_HANDLE:
|
|
||||||
case ERROR_INVALID_NAME:
|
|
||||||
return QSE_HTTPD_EINVAL;
|
return QSE_HTTPD_EINVAL;
|
||||||
|
|
||||||
case ERROR_ACCESS_DENIED:
|
case SOCEACCES:
|
||||||
case ERROR_SHARING_VIOLATION:
|
|
||||||
return QSE_HTTPD_EACCES;
|
return QSE_HTTPD_EACCES;
|
||||||
|
|
||||||
case ERROR_FILE_NOT_FOUND:
|
#if defined(SOCENOENT)
|
||||||
case ERROR_PATH_NOT_FOUND:
|
case SOCENOENT:
|
||||||
return QSE_HTTPD_ENOENT;
|
return QSE_HTTPD_ENOENT;
|
||||||
|
#endif
|
||||||
|
|
||||||
case ERROR_ALREADY_EXISTS:
|
#if defined(SOCEEXIST)
|
||||||
|
case SOCEEXIST:
|
||||||
return QSE_HTTPD_EEXIST;
|
return QSE_HTTPD_EEXIST;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case SOCEINTR:
|
||||||
|
return QSE_HTTPD_EINTR;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QSE_HTTPD_ESYSERR;
|
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:
|
case QSE_MUX_EINTR:
|
||||||
return QSE_HTTPD_EINTR;
|
return QSE_HTTPD_EINTR;
|
||||||
|
|
||||||
|
case QSE_MUX_EPIPE:
|
||||||
|
return QSE_HTTPD_EPIPE;
|
||||||
|
|
||||||
|
case QSE_MUX_EAGAIN:
|
||||||
|
return QSE_HTTPD_EAGAIN;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QSE_HTTPD_ESYSERR;
|
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:
|
case QSE_FIO_EINTR:
|
||||||
return QSE_HTTPD_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:
|
default:
|
||||||
return QSE_HTTPD_ESYSERR;
|
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)
|
static int dir_open (qse_httpd_t* httpd, const qse_mchar_t* path, qse_ubi_t* handle)
|
||||||
{
|
{
|
||||||
dir_t* d;
|
dir_t* d;
|
||||||
|
qse_dir_errnum_t direrrnum;
|
||||||
|
|
||||||
d = QSE_MMGR_ALLOC (httpd->mmgr, QSE_SIZEOF(*d));
|
d = QSE_MMGR_ALLOC (httpd->mmgr, QSE_SIZEOF(*d));
|
||||||
if (d == QSE_NULL)
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
d->dp = qse_dir_open (httpd->mmgr, 0,
|
d->dp = qse_dir_open (
|
||||||
(const qse_char_t*)d->path, QSE_DIR_MBSPATH | QSE_DIR_SORT);
|
httpd->mmgr, 0,
|
||||||
|
(const qse_char_t*)d->path,
|
||||||
|
QSE_DIR_MBSPATH | QSE_DIR_SORT,
|
||||||
|
&direrrnum
|
||||||
|
);
|
||||||
if (d->dp == QSE_NULL)
|
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->path);
|
||||||
QSE_MMGR_FREE (httpd->mmgr, d);
|
QSE_MMGR_FREE (httpd->mmgr, d);
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user