defined sys::RC_XXX items in awk
This commit is contained in:
parent
b419965310
commit
cfd39c4280
@ -1429,8 +1429,8 @@ BEGIN {
|
|||||||
n = sys::read (p0, k, 3);
|
n = sys::read (p0, k, 3);
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
{
|
{
|
||||||
if (n == -2) continue;
|
if (n == sys::RC_EAGAIN) continue; ## nonblock but data not available
|
||||||
if (n <= -1) print "ERROR: " sys::errmsg();
|
if (n != 0) print "ERROR: " sys::errmsg();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
print k;
|
print k;
|
||||||
|
@ -567,5 +567,3 @@ int qse_awk_mod_dir (qse_awk_mod_t* mod, qse_awk_t* awk)
|
|||||||
mod->ctx = rbt;
|
mod->ctx = rbt;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <qse/si/nwad.h>
|
#include <qse/si/nwad.h>
|
||||||
#include <qse/si/nwif.h>
|
#include <qse/si/nwif.h>
|
||||||
#include <qse/si/sio.h>
|
#include <qse/si/sio.h>
|
||||||
|
#include <qse/si/dir.h>
|
||||||
#include "../cmn/mem-prv.h"
|
#include "../cmn/mem-prv.h"
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
@ -68,14 +69,21 @@
|
|||||||
|
|
||||||
#define DEFAULT_MODE (0777)
|
#define DEFAULT_MODE (0777)
|
||||||
|
|
||||||
#define RX_ERROR (-1)
|
enum sys_rc_t
|
||||||
#define RX_EAGAIN (-2)
|
{
|
||||||
#define RX_EINTR (-3)
|
RC_ERROR = -1,
|
||||||
#define RX_EINVAL (-4)
|
RC_ENOIMPL = -2,
|
||||||
#define RX_ECHILD (-5)
|
RC_ENOSYS = -3,
|
||||||
#define RX_EPERM (-6)
|
RC_ENOMEM = -4,
|
||||||
#define RX_ENOMEM (-7)
|
RC_EAGAIN = -5,
|
||||||
#define RX_ENOSYS (-7)
|
RC_EINTR = -6,
|
||||||
|
RC_EINVAL = -7,
|
||||||
|
RC_ECHILD = -8,
|
||||||
|
RC_EPERM = -9,
|
||||||
|
RC_EBADF = -10
|
||||||
|
|
||||||
|
};
|
||||||
|
typedef enum sys_rc_t sys_rc_t;
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
@ -106,9 +114,21 @@ typedef struct mod_ctx_t mod_ctx_t;
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
enum sys_node_data_type_t
|
||||||
|
{
|
||||||
|
SYS_NODE_DATA_FD,
|
||||||
|
SYS_NODE_DATA_DIR
|
||||||
|
};
|
||||||
|
typedef enum sys_node_data_type_t sys_node_data_type_t;
|
||||||
|
|
||||||
struct sys_node_data_t
|
struct sys_node_data_t
|
||||||
{
|
{
|
||||||
int fd;
|
sys_node_data_type_t type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
qse_dir_t* dir;
|
||||||
|
} u;
|
||||||
};
|
};
|
||||||
typedef struct sys_node_data_t sys_node_data_t;
|
typedef struct sys_node_data_t sys_node_data_t;
|
||||||
|
|
||||||
@ -136,29 +156,51 @@ typedef struct rtx_data_t rtx_data_t;
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int syserr_to_rx_code (int syserr)
|
static QSE_INLINE sys_rc_t syserr_to_rc (int syserr)
|
||||||
{
|
{
|
||||||
switch (syserr)
|
switch (syserr)
|
||||||
{
|
{
|
||||||
#if defined(EAGAIN) && defined(EWOULDBLOCK) && (EAGAIN == EWOULDBLOCK)
|
#if defined(EAGAIN) && defined(EWOULDBLOCK) && (EAGAIN == EWOULDBLOCK)
|
||||||
case EAGAIN: return RX_EAGAIN;
|
case EAGAIN: return RC_EAGAIN;
|
||||||
#elif defined(EAGAIN) && defined(EWOULDBLOCK) && (EAGAIN != EWOULDBLOCK)
|
#elif defined(EAGAIN) && defined(EWOULDBLOCK) && (EAGAIN != EWOULDBLOCK)
|
||||||
case EAGAIN: case EWOULDBLOCK: return RX_EAGAIN;
|
case EAGAIN: case EWOULDBLOCK: return RC_EAGAIN;
|
||||||
#elif defined(EAGAIN)
|
#elif defined(EAGAIN)
|
||||||
case EAGAIN: return RX_EAGAIN;
|
case EAGAIN: return RC_EAGAIN;
|
||||||
#elif defined(EWOULDBLOCK)
|
#elif defined(EWOULDBLOCK)
|
||||||
case EWOULDBLOCK: return RX_EAGAIN;
|
case EWOULDBLOCK: return RC_EAGAIN;
|
||||||
#endif
|
#endif
|
||||||
case EINTR: return RX_EINTR;
|
|
||||||
case EINVAL: return RX_EINVAL;
|
case EBADF: return RC_EBADF;
|
||||||
case ECHILD: return RX_ECHILD;
|
case ECHILD: return RC_ECHILD;
|
||||||
case EPERM: return RX_EPERM;
|
case EINTR: return RC_EINTR;
|
||||||
case ENOMEM: return RX_ENOMEM;
|
case EINVAL: return RC_EINVAL;
|
||||||
case ENOSYS: return RX_ENOSYS;
|
case ENOMEM: return RC_ENOMEM;
|
||||||
default: return RX_ERROR;
|
case ENOSYS: return RC_ENOSYS;
|
||||||
|
case EPERM: return RC_EPERM;
|
||||||
|
|
||||||
|
default: return RC_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void set_error_on_sys_list (qse_awk_rtx_t* rtx, sys_list_t* sys_list, const qse_char_t* errfmt, ...)
|
|
||||||
|
static const qse_char_t* rc_to_errstr (sys_rc_t rc)
|
||||||
|
{
|
||||||
|
switch (rc)
|
||||||
|
{
|
||||||
|
case RC_EAGAIN: return QSE_T("resource temporarily unavailable");
|
||||||
|
case RC_EBADF: return QSE_T("bad file descriptor");
|
||||||
|
case RC_ECHILD: return QSE_T("no child processes");
|
||||||
|
case RC_EINTR: return QSE_T("interrupted");
|
||||||
|
case RC_EINVAL: return QSE_T("invalid argument");
|
||||||
|
case RC_ENOIMPL: return QSE_T("not implemented"); /* not implemented in this module */
|
||||||
|
case RC_ENOMEM: return QSE_T("not enough space");
|
||||||
|
case RC_ENOSYS: return QSE_T("not implemented in system");
|
||||||
|
case RC_EPERM: return QSE_T("operation not permitted");
|
||||||
|
case RC_ERROR: return QSE_T("error");
|
||||||
|
default: return QSE_T("unknown error");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_errmsg_on_sys_list (qse_awk_rtx_t* rtx, sys_list_t* sys_list, const qse_char_t* errfmt, ...)
|
||||||
{
|
{
|
||||||
if (errfmt)
|
if (errfmt)
|
||||||
{
|
{
|
||||||
@ -173,30 +215,57 @@ static void set_error_on_sys_list (qse_awk_rtx_t* rtx, sys_list_t* sys_list, con
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static QSE_INLINE void set_error_on_sys_list_with_syserr (qse_awk_rtx_t* rtx, sys_list_t* sys_list)
|
static QSE_INLINE void set_errmsg_on_sys_list_with_syserr (qse_awk_rtx_t* rtx, sys_list_t* sys_list)
|
||||||
{
|
{
|
||||||
set_error_on_sys_list (rtx, sys_list, QSE_T("%hs"), strerror(errno));
|
set_errmsg_on_sys_list (rtx, sys_list, QSE_T("%hs"), strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static sys_node_t* new_sys_node (qse_awk_rtx_t* rtx, sys_list_t* list, int fd)
|
static sys_node_t* new_sys_node_fd (qse_awk_rtx_t* rtx, sys_list_t* list, int fd)
|
||||||
{
|
{
|
||||||
sys_node_t* node;
|
sys_node_t* node;
|
||||||
|
|
||||||
node = __new_sys_node(rtx, list);
|
node = __new_sys_node(rtx, list);
|
||||||
if (!node) return QSE_NULL;
|
if (!node) return QSE_NULL;
|
||||||
|
|
||||||
node->ctx.fd = fd;
|
node->ctx.type = SYS_NODE_DATA_FD;
|
||||||
|
node->ctx.u.fd = fd;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static sys_node_t* new_sys_node_dir (qse_awk_rtx_t* rtx, sys_list_t* list, qse_dir_t* dir)
|
||||||
|
{
|
||||||
|
sys_node_t* node;
|
||||||
|
|
||||||
|
node = __new_sys_node(rtx, list);
|
||||||
|
if (!node) return QSE_NULL;
|
||||||
|
|
||||||
|
node->ctx.type = SYS_NODE_DATA_DIR;
|
||||||
|
node->ctx.u.dir = dir;
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_sys_node (qse_awk_rtx_t* rtx, sys_list_t* list, sys_node_t* node)
|
static void free_sys_node (qse_awk_rtx_t* rtx, sys_list_t* list, sys_node_t* node)
|
||||||
{
|
{
|
||||||
if (node->ctx.fd >= 0)
|
switch (node->ctx.type)
|
||||||
{
|
{
|
||||||
close (node->ctx.fd);
|
case SYS_NODE_DATA_FD:
|
||||||
node->ctx.fd = -1;
|
if (node->ctx.u.fd >= 0)
|
||||||
|
{
|
||||||
|
close (node->ctx.u.fd);
|
||||||
|
node->ctx.u.fd = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SYS_NODE_DATA_DIR:
|
||||||
|
if (node->ctx.u.dir)
|
||||||
|
{
|
||||||
|
qse_dir_close (node->ctx.u.dir);
|
||||||
|
node->ctx.u.dir = QSE_NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
__free_sys_node (rtx, list, node);
|
__free_sys_node (rtx, list, node);
|
||||||
}
|
}
|
||||||
@ -221,7 +290,6 @@ static QSE_INLINE sys_node_t* get_sys_list_node (sys_list_t* sys_list, qse_awk_i
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
static sys_node_t* get_sys_list_node_with_arg (qse_awk_rtx_t* rtx, sys_list_t* sys_list, qse_awk_val_t* arg)
|
static sys_node_t* get_sys_list_node_with_arg (qse_awk_rtx_t* rtx, sys_list_t* sys_list, qse_awk_val_t* arg)
|
||||||
{
|
{
|
||||||
qse_awk_int_t id;
|
qse_awk_int_t id;
|
||||||
@ -229,31 +297,55 @@ static sys_node_t* get_sys_list_node_with_arg (qse_awk_rtx_t* rtx, sys_list_t* s
|
|||||||
|
|
||||||
if (qse_awk_rtx_valtoint(rtx, arg, &id) <= -1)
|
if (qse_awk_rtx_valtoint(rtx, arg, &id) <= -1)
|
||||||
{
|
{
|
||||||
set_error_on_sys_list (rtx, sys_list, QSE_T("illegal instance id"));
|
set_errmsg_on_sys_list (rtx, sys_list, QSE_T("illegal instance id"));
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
else if (!(sys_node = get_sys_list_node(sys_list, id)))
|
else if (!(sys_node = get_sys_list_node(sys_list, id)))
|
||||||
{
|
{
|
||||||
set_error_on_sys_list (rtx, sys_list, QSE_T("invalid instance id - %zd"), (qse_size_t)id);
|
set_errmsg_on_sys_list (rtx, sys_list, QSE_T("invalid instance id - %zd"), (qse_size_t)id);
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sys_node;
|
return sys_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
static int fnc_errmsg (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
|
{
|
||||||
|
sys_list_t* sys_list;
|
||||||
|
qse_awk_val_t* retv;
|
||||||
|
|
||||||
|
sys_list = rtx_to_sys_list(rtx, fi);
|
||||||
|
retv = qse_awk_rtx_makestrvalwithstr(rtx, sys_list->ctx.errmsg);
|
||||||
|
if (!retv) return -1;
|
||||||
|
|
||||||
|
qse_awk_rtx_setretval (rtx, retv);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
sys_list_t* sys_list;
|
sys_list_t* sys_list;
|
||||||
sys_node_t* sys_node;
|
sys_node_t* sys_node;
|
||||||
int rx = RX_ERROR;
|
int rx = RC_ERROR;
|
||||||
|
|
||||||
sys_list = rtx_to_sys_list(rtx, fi);
|
sys_list = rtx_to_sys_list(rtx, fi);
|
||||||
sys_node = get_sys_list_node_with_arg(rtx, sys_list, qse_awk_rtx_getarg(rtx, 0));
|
sys_node = get_sys_list_node_with_arg(rtx, sys_list, qse_awk_rtx_getarg(rtx, 0));
|
||||||
if (sys_node)
|
if (sys_node && sys_node->ctx.type == SYS_NODE_DATA_FD)
|
||||||
{
|
{
|
||||||
|
/* even if free_sys_node can handle other types, sys::close() is allowed to
|
||||||
|
* close nodes of the SYS_NODE_DATA_FD type only */
|
||||||
free_sys_node (rtx, sys_list, sys_node);
|
free_sys_node (rtx, sys_list, sys_node);
|
||||||
rx = 0;
|
rx = 0;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rx = RC_EINVAL;
|
||||||
|
set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx));
|
||||||
|
}
|
||||||
|
|
||||||
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, rx));
|
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, rx));
|
||||||
return 0;
|
return 0;
|
||||||
@ -271,8 +363,8 @@ static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
{
|
{
|
||||||
sys_list_t* sys_list;
|
sys_list_t* sys_list;
|
||||||
sys_node_t* sys_node = QSE_NULL;
|
sys_node_t* sys_node = QSE_NULL;
|
||||||
qse_awk_int_t rx = RX_ERROR, flags = 0, mode = DEFAULT_MODE;
|
qse_awk_int_t rx = RC_ERROR, flags = 0, mode = DEFAULT_MODE;
|
||||||
int fd = -1;
|
int fd = RC_ERROR;
|
||||||
qse_mchar_t* pstr;
|
qse_mchar_t* pstr;
|
||||||
qse_size_t plen;
|
qse_size_t plen;
|
||||||
qse_awk_val_t* a0;
|
qse_awk_val_t* a0;
|
||||||
@ -295,7 +387,7 @@ static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
sys_node = new_sys_node(rtx, sys_list, fd);
|
sys_node = new_sys_node_fd(rtx, sys_list, fd);
|
||||||
if (sys_node)
|
if (sys_node)
|
||||||
{
|
{
|
||||||
rx = sys_node->id;
|
rx = sys_node->id;
|
||||||
@ -303,13 +395,13 @@ static int fnc_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
fail:
|
fail:
|
||||||
set_error_on_sys_list (rtx, sys_list, QSE_NULL);
|
set_errmsg_on_sys_list (rtx, sys_list, QSE_NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rx = syserr_to_rx_code(errno);
|
rx = syserr_to_rc(errno);
|
||||||
set_error_on_sys_list_with_syserr (rtx, sys_list);
|
set_errmsg_on_sys_list_with_syserr (rtx, sys_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rx may not be a statically managed number.
|
/* rx may not be a statically managed number.
|
||||||
@ -329,7 +421,7 @@ static int fnc_read (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
{
|
{
|
||||||
sys_list_t* sys_list;
|
sys_list_t* sys_list;
|
||||||
sys_node_t* sys_node;
|
sys_node_t* sys_node;
|
||||||
qse_awk_int_t rx = RX_ERROR;
|
qse_awk_int_t rx = RC_ERROR;
|
||||||
qse_awk_int_t reqsize = 8192;
|
qse_awk_int_t reqsize = 8192;
|
||||||
|
|
||||||
if (qse_awk_rtx_getnargs(rtx) >= 3 && (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 2), &reqsize) <= -1 || reqsize <= 0)) reqsize = 8192;
|
if (qse_awk_rtx_getnargs(rtx) >= 3 && (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg(rtx, 2), &reqsize) <= -1 || reqsize <= 0)) reqsize = 8192;
|
||||||
@ -337,27 +429,27 @@ static int fnc_read (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
sys_list = rtx_to_sys_list(rtx, fi);
|
sys_list = rtx_to_sys_list(rtx, fi);
|
||||||
sys_node = get_sys_list_node_with_arg(rtx, sys_list, qse_awk_rtx_getarg(rtx, 0));
|
sys_node = get_sys_list_node_with_arg(rtx, sys_list, qse_awk_rtx_getarg(rtx, 0));
|
||||||
if (sys_node)
|
if (sys_node && sys_node->ctx.type == SYS_NODE_DATA_FD)
|
||||||
{
|
{
|
||||||
if (reqsize > sys_list->ctx.readbuf_capa)
|
if (reqsize > sys_list->ctx.readbuf_capa)
|
||||||
{
|
{
|
||||||
qse_mchar_t* tmp = qse_awk_rtx_reallocmem(rtx, sys_list->ctx.readbuf, reqsize);
|
qse_mchar_t* tmp = qse_awk_rtx_reallocmem(rtx, sys_list->ctx.readbuf, reqsize);
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
{
|
{
|
||||||
set_error_on_sys_list (rtx, sys_list, QSE_NULL);
|
set_errmsg_on_sys_list (rtx, sys_list, QSE_NULL);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
sys_list->ctx.readbuf = tmp;
|
sys_list->ctx.readbuf = tmp;
|
||||||
sys_list->ctx.readbuf_capa = reqsize;
|
sys_list->ctx.readbuf_capa = reqsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
rx = read(sys_node->ctx.fd, sys_list->ctx.readbuf, reqsize);
|
rx = read(sys_node->ctx.u.fd, sys_list->ctx.readbuf, reqsize);
|
||||||
if (rx <= 0)
|
if (rx <= 0)
|
||||||
{
|
{
|
||||||
if (rx <= -1)
|
if (rx <= -1)
|
||||||
{
|
{
|
||||||
rx = syserr_to_rx_code(errno);
|
rx = syserr_to_rc(errno);
|
||||||
set_error_on_sys_list_with_syserr(rtx, sys_list);
|
set_errmsg_on_sys_list_with_syserr(rtx, sys_list);
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@ -376,6 +468,11 @@ static int fnc_read (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
if (x <= -1) return -1;
|
if (x <= -1) return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rx = RC_EINVAL;
|
||||||
|
set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx));
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
/* the value in 'rx' never exceeds QSE_AWK_QUICKINT_MAX as 'reqsize' has been limited to
|
/* the value in 'rx' never exceeds QSE_AWK_QUICKINT_MAX as 'reqsize' has been limited to
|
||||||
@ -388,11 +485,11 @@ static int fnc_write (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
{
|
{
|
||||||
sys_list_t* sys_list;
|
sys_list_t* sys_list;
|
||||||
sys_node_t* sys_node;
|
sys_node_t* sys_node;
|
||||||
qse_awk_int_t rx = RX_ERROR;
|
qse_awk_int_t rx = RC_ERROR;
|
||||||
|
|
||||||
sys_list = rtx_to_sys_list(rtx, fi);
|
sys_list = rtx_to_sys_list(rtx, fi);
|
||||||
sys_node = get_sys_list_node_with_arg(rtx, sys_list, qse_awk_rtx_getarg(rtx, 0));
|
sys_node = get_sys_list_node_with_arg(rtx, sys_list, qse_awk_rtx_getarg(rtx, 0));
|
||||||
if (sys_node)
|
if (sys_node && sys_node->ctx.type == SYS_NODE_DATA_FD)
|
||||||
{
|
{
|
||||||
qse_mchar_t* dptr;
|
qse_mchar_t* dptr;
|
||||||
qse_size_t dlen;
|
qse_size_t dlen;
|
||||||
@ -402,19 +499,24 @@ static int fnc_write (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
dptr = qse_awk_rtx_getvalmbs(rtx, a1, &dlen);
|
dptr = qse_awk_rtx_getvalmbs(rtx, a1, &dlen);
|
||||||
if (dptr)
|
if (dptr)
|
||||||
{
|
{
|
||||||
rx = write(sys_node->ctx.fd, dptr, dlen);
|
rx = write(sys_node->ctx.u.fd, dptr, dlen);
|
||||||
if (rx <= -1)
|
if (rx <= -1)
|
||||||
{
|
{
|
||||||
rx = syserr_to_rx_code(errno);
|
rx = syserr_to_rc(errno);
|
||||||
set_error_on_sys_list_with_syserr(rtx, sys_list);
|
set_errmsg_on_sys_list_with_syserr(rtx, sys_list);
|
||||||
}
|
}
|
||||||
qse_awk_rtx_freevalmbs (rtx, a1, dptr);
|
qse_awk_rtx_freevalmbs (rtx, a1, dptr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_error_on_sys_list (rtx, sys_list, QSE_NULL);
|
set_errmsg_on_sys_list (rtx, sys_list, QSE_NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rx = RC_EINVAL;
|
||||||
|
set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx));
|
||||||
|
}
|
||||||
|
|
||||||
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, rx));
|
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, rx));
|
||||||
return 0;
|
return 0;
|
||||||
@ -446,10 +548,10 @@ static int fnc_write (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
n = sys::read (p0, k, 3);
|
n = sys::read (p0, k, 3);
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
{
|
{
|
||||||
if (n == -2) continue; ## nonblock but data not available
|
if (n == sys::RC_EAGAIN) continue; ## nonblock but data not available
|
||||||
if (n <= -1) print "ERROR: " sys::errmsg();
|
if (n != 0) print "ERROR: " sys::errmsg();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
print k;
|
print k;
|
||||||
}
|
}
|
||||||
sys::close (p0);
|
sys::close (p0);
|
||||||
@ -471,7 +573,7 @@ static int fnc_pipe (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
/* create low-level pipes */
|
/* create low-level pipes */
|
||||||
|
|
||||||
sys_list_t* sys_list;
|
sys_list_t* sys_list;
|
||||||
int rx = RX_ERROR;
|
int rx = RC_ERROR;
|
||||||
int fds[2];
|
int fds[2];
|
||||||
qse_awk_int_t flags = 0;
|
qse_awk_int_t flags = 0;
|
||||||
|
|
||||||
@ -509,8 +611,8 @@ static int fnc_pipe (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
node1 = new_sys_node(rtx, sys_list, fds[0]);
|
node1 = new_sys_node_fd(rtx, sys_list, fds[0]);
|
||||||
node2 = new_sys_node(rtx, sys_list, fds[1]);
|
node2 = new_sys_node_fd(rtx, sys_list, fds[1]);
|
||||||
if (node1 && node2)
|
if (node1 && node2)
|
||||||
{
|
{
|
||||||
qse_awk_val_t* v;
|
qse_awk_val_t* v;
|
||||||
@ -532,15 +634,15 @@ static int fnc_pipe (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_error_on_sys_list (rtx, sys_list, QSE_NULL);
|
set_errmsg_on_sys_list (rtx, sys_list, QSE_NULL);
|
||||||
if (node2) free_sys_node (rtx, sys_list, node2);
|
if (node2) free_sys_node (rtx, sys_list, node2);
|
||||||
if (node1) free_sys_node (rtx, sys_list, node1);
|
if (node1) free_sys_node (rtx, sys_list, node1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rx = syserr_to_rx_code(errno);
|
rx = syserr_to_rc(errno);
|
||||||
set_error_on_sys_list_with_syserr (rtx, sys_list);
|
set_errmsg_on_sys_list_with_syserr (rtx, sys_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, rx));
|
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, rx));
|
||||||
@ -549,21 +651,6 @@ static int fnc_pipe (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int fnc_errmsg (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|
||||||
{
|
|
||||||
sys_list_t* sys_list;
|
|
||||||
qse_awk_val_t* retv;
|
|
||||||
|
|
||||||
sys_list = rtx_to_sys_list(rtx, fi);
|
|
||||||
retv = qse_awk_rtx_makestrvalwithstr(rtx, sys_list->ctx.errmsg);
|
|
||||||
if (!retv) return -1;
|
|
||||||
|
|
||||||
qse_awk_rtx_setretval (rtx, retv);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
static int fnc_fork (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_fork (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
qse_awk_int_t pid;
|
qse_awk_int_t pid;
|
||||||
@ -571,24 +658,22 @@ static int fnc_fork (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
pid = RX_ERROR;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
pid = RX_ERROR;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
|
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
pid = RX_ERROR;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
|
|
||||||
#else
|
#else
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid <= -1)
|
if (pid <= -1)
|
||||||
{
|
{
|
||||||
pid = syserr_to_rx_code(errno);
|
pid = syserr_to_rc(errno);
|
||||||
set_error_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
set_errmsg_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -619,25 +704,25 @@ static int fnc_wait (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
rx = RX_ERROR;
|
rx = RC_ENOIMPL;
|
||||||
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(rx));
|
||||||
status = 0;
|
status = 0;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
rx = RX_ERROR;
|
rx = RC_ENOIMPL;
|
||||||
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(rx));
|
||||||
status = 0;
|
status = 0;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
rx = RX_ERROR;
|
rx = RC_ENOIMPL;
|
||||||
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(rx));
|
||||||
status = 0;
|
status = 0;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
|
||||||
#else
|
#else
|
||||||
rx = waitpid(pid, &status, opts);
|
rx = waitpid(pid, &status, opts);
|
||||||
if (rx <= -1)
|
if (rx <= -1)
|
||||||
{
|
{
|
||||||
rx = syserr_to_rx_code(errno);
|
rx = syserr_to_rc(errno);
|
||||||
set_error_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
set_errmsg_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -731,28 +816,28 @@ static int fnc_kill (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
if (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg (rtx, 0), &pid) <= -1 ||
|
if (qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg (rtx, 0), &pid) <= -1 ||
|
||||||
qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg (rtx, 1), &sig) <= -1)
|
qse_awk_rtx_valtoint(rtx, qse_awk_rtx_getarg (rtx, 1), &sig) <= -1)
|
||||||
{
|
{
|
||||||
rx = RX_ERROR;
|
rx = RC_ERROR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
rx = RX_ERROR;
|
rx = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(rx));
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
rx = RX_ERROR;
|
rx = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(rx));
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
rx = RX_ERROR;
|
rx = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(rx));
|
||||||
#else
|
#else
|
||||||
rx = kill(pid, sig);
|
rx = kill(pid, sig);
|
||||||
if (rx <= -1)
|
if (rx <= -1)
|
||||||
{
|
{
|
||||||
rx = syserr_to_rx_code(errno);
|
rx = syserr_to_rc(errno);
|
||||||
set_error_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
set_errmsg_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -771,27 +856,27 @@ static int fnc_getpgid (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
pid = -1;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
pid = -1;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
pid = -1;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
#else
|
#else
|
||||||
/* TODO: support specifing calling process id other than 0 */
|
/* TODO: support specifing calling process id other than 0 */
|
||||||
#if defined(HAVE_GETPGID)
|
#if defined(HAVE_GETPGID)
|
||||||
pid = getpgid(0);
|
pid = getpgid(0);
|
||||||
if (pid <= -1) set_error_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
if (pid <= -1) set_errmsg_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
||||||
#elif defined(HAVE_GETPGRP)
|
#elif defined(HAVE_GETPGRP)
|
||||||
pid = getpgrp();
|
pid = getpgrp();
|
||||||
if (pid <= -1) set_error_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
if (pid <= -1) set_errmsg_on_sys_list_with_syserr (rtx, rtx_to_sys_list(rtx, fi));
|
||||||
#else
|
#else
|
||||||
pid = -1;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not supported"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -818,8 +903,8 @@ static int fnc_getpid (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
/* TOOD: implement this*/
|
/* TOOD: implement this*/
|
||||||
pid = -1;
|
pid = RC_ENOIMPL;
|
||||||
set_error_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), QSE_T("not implemented"));
|
set_errmsg_on_sys_list (rtx, rtx_to_sys_list(rtx, fi), rc_to_errstr(pid));
|
||||||
|
|
||||||
#else
|
#else
|
||||||
pid = getpid ();
|
pid = getpid ();
|
||||||
@ -2168,6 +2253,17 @@ static inttab_t inttab[] =
|
|||||||
{ QSE_T("O_WRONLY"), { O_WRONLY } },
|
{ QSE_T("O_WRONLY"), { O_WRONLY } },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
{ QSE_T("RC_EAGAIN"), { RC_EAGAIN } },
|
||||||
|
{ QSE_T("RC_EBADF"), { RC_EBADF } },
|
||||||
|
{ QSE_T("RC_ECHILD"), { RC_ECHILD } },
|
||||||
|
{ QSE_T("RC_ENOIMPL"), { RC_ENOIMPL } },
|
||||||
|
{ QSE_T("RC_ENOMEM"), { RC_ENOMEM } },
|
||||||
|
{ QSE_T("RC_ENOSYS"), { RC_ENOSYS } },
|
||||||
|
{ QSE_T("RC_EINTR"), { RC_EINTR } },
|
||||||
|
{ QSE_T("RC_EINVAL"), { RC_EINVAL } },
|
||||||
|
{ QSE_T("RC_EPERM"), { RC_EPERM } },
|
||||||
|
{ QSE_T("RC_ERROR"), { RC_ERROR } },
|
||||||
|
|
||||||
{ QSE_T("SIGABRT"), { SIGABRT } },
|
{ QSE_T("SIGABRT"), { SIGABRT } },
|
||||||
{ QSE_T("SIGALRM"), { SIGALRM } },
|
{ QSE_T("SIGALRM"), { SIGALRM } },
|
||||||
{ QSE_T("SIGHUP"), { SIGHUP } },
|
{ QSE_T("SIGHUP"), { SIGHUP } },
|
||||||
@ -2355,4 +2451,3 @@ int qse_awk_mod_sys (qse_awk_mod_t* mod, qse_awk_t* awk)
|
|||||||
((mod_ctx_t*)mod->ctx)->rtxtab = rbt;
|
((mod_ctx_t*)mod->ctx)->rtxtab = rbt;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user