added the errnum field to qse_pio_t
This commit is contained in:
parent
8d794c7c73
commit
31efbc7ecf
@ -13,7 +13,7 @@
|
|||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitapions under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _QSE_CMN_PIO_H_
|
#ifndef _QSE_CMN_PIO_H_
|
||||||
@ -40,12 +40,15 @@ enum qse_pio_open_flag_t
|
|||||||
QSE_PIO_DROPERR = (1 << 10),
|
QSE_PIO_DROPERR = (1 << 10),
|
||||||
|
|
||||||
/* invoke the command through a default system shell */
|
/* invoke the command through a default system shell */
|
||||||
QSE_PIO_SHELL = (1 << 11)
|
QSE_PIO_SHELL = (1 << 11),
|
||||||
|
|
||||||
|
/* enable ase_char_t based IO */
|
||||||
|
QSE_PIO_TEXT = (1 << 12)
|
||||||
};
|
};
|
||||||
|
|
||||||
enum qse_pio_wait_flag_t
|
enum qse_pio_wait_flag_t
|
||||||
{
|
{
|
||||||
QSE_PIO_NOWAIT = (1 << 0),
|
QSE_PIO_NOHANG = (1 << 0),
|
||||||
QSE_PIO_IGNINTR = (1 << 1)
|
QSE_PIO_IGNINTR = (1 << 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -56,7 +59,15 @@ enum qse_pio_hid_t
|
|||||||
QSE_PIO_ERR = 2
|
QSE_PIO_ERR = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum qse_pio_err_t
|
||||||
|
{
|
||||||
|
QSE_PIO_ENOERR = 0,
|
||||||
|
QSE_PIO_ENOMEM, /* out of memory */
|
||||||
|
QSE_PIO_ECHILD /* the child is not valid */
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum qse_pio_hid_t qse_pio_hid_t;
|
typedef enum qse_pio_hid_t qse_pio_hid_t;
|
||||||
|
typedef enum qse_pio_err_t qse_pio_err_t;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/* <winnt.h> => typedef PVOID HANDLE; */
|
/* <winnt.h> => typedef PVOID HANDLE; */
|
||||||
@ -78,9 +89,11 @@ struct qse_pio_t
|
|||||||
qse_mmgr_t* mmgr;
|
qse_mmgr_t* mmgr;
|
||||||
qse_pio_pid_t child;
|
qse_pio_pid_t child;
|
||||||
qse_pio_hnd_t handle[3];
|
qse_pio_hnd_t handle[3];
|
||||||
|
qse_pio_err_t errnum;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define QSE_PIO_MMGR(pio) ((pio)->mmgr)
|
#define QSE_PIO_MMGR(pio) ((pio)->mmgr)
|
||||||
|
#define QSE_PIO_XTN(pio) ((void*)(((qse_pio_t*)pio) + 1))
|
||||||
#define QSE_PIO_HANDLE(pio,hid) ((pio)->handle[hid])
|
#define QSE_PIO_HANDLE(pio,hid) ((pio)->handle[hid])
|
||||||
#define QSE_PIO_CHILD(pio) ((pio)->child)
|
#define QSE_PIO_CHILD(pio) ((pio)->child)
|
||||||
|
|
||||||
@ -93,7 +106,7 @@ extern "C" {
|
|||||||
* qse_pio_open - open pipes to a child process
|
* qse_pio_open - open pipes to a child process
|
||||||
*
|
*
|
||||||
* DESCRIPTION
|
* DESCRIPTION
|
||||||
* QSE_PIO_SHELL drives the function to execute the command via /bin/sh.
|
* QSE_PIO_SHELL drives the funcpion to execute the command via /bin/sh.
|
||||||
* If flags is clear of QSE_PIO_SHELL, you should pass the full program path.
|
* If flags is clear of QSE_PIO_SHELL, you should pass the full program path.
|
||||||
*
|
*
|
||||||
* SYNOPSIS
|
* SYNOPSIS
|
||||||
@ -142,6 +155,49 @@ void qse_pio_fini (
|
|||||||
);
|
);
|
||||||
/******/
|
/******/
|
||||||
|
|
||||||
|
|
||||||
|
void* qse_pio_getxtn (
|
||||||
|
qse_pio_t* pio
|
||||||
|
);
|
||||||
|
|
||||||
|
qse_mmgr_t* qse_pio_getmmgr (
|
||||||
|
qse_pio_t* pio
|
||||||
|
);
|
||||||
|
|
||||||
|
void qse_pio_setmmgr (
|
||||||
|
qse_pio_t* pio,
|
||||||
|
qse_mmgr_t* mmgr
|
||||||
|
);
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
QSE_OBJECT_DEFINE_BASIC_MACROS(pio)
|
||||||
|
QSE_OBJEcT_DEFINE_BASIC_FIELDS(pio)
|
||||||
|
QSE_OBJECT_DEFINE_BASIC_FUNCTION(pio)
|
||||||
|
QSE_OBJECT_IMPLEMENT_BASIC_FUNCTION(pio)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****f* qse.cmn.pio/qse_pio_geterrnum
|
||||||
|
* NAME
|
||||||
|
* qse_pio_geterrnum - get an error code
|
||||||
|
*
|
||||||
|
* SYNOPSIS
|
||||||
|
*/
|
||||||
|
qse_pio_err_t qse_pio_geterrnum (qse_pio_t* pio);
|
||||||
|
/******/
|
||||||
|
|
||||||
|
/****f* qse.cmn.pio/qse_pio_geterrstr
|
||||||
|
* NAME
|
||||||
|
* qse_pio_geterrstr - transllate an error code to a string
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* The qse_pio_geterrstr() funcpion returns the pointer to a constant string
|
||||||
|
* describing the last error occurred.
|
||||||
|
*
|
||||||
|
* SYNOPSIS
|
||||||
|
*/
|
||||||
|
const qse_char_t* qse_pio_geterrstr (qse_pio_t* pio);
|
||||||
|
/******/
|
||||||
|
|
||||||
/****f* qse.cmn.pio/qse_pio_gethandle
|
/****f* qse.cmn.pio/qse_pio_gethandle
|
||||||
* NAME
|
* NAME
|
||||||
* qse_pio_gethandle - get native handle
|
* qse_pio_gethandle - get native handle
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#include <qse/macros.h>
|
#include <qse/macros.h>
|
||||||
#include <qse/cmn/str.h>
|
#include <qse/cmn/str.h>
|
||||||
|
|
||||||
enum
|
enum qse_tio_err_t
|
||||||
{
|
{
|
||||||
QSE_TIO_ENOERR = 0,
|
QSE_TIO_ENOERR = 0,
|
||||||
QSE_TIO_ENOMEM, /* out of memory */
|
QSE_TIO_ENOMEM, /* out of memory */
|
||||||
@ -41,6 +41,8 @@ enum
|
|||||||
QSE_TIO_EOUTCL /* output function failed to close */
|
QSE_TIO_EOUTCL /* output function failed to close */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum qse_tio_err_t qse_tio_err_t;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
/* the size of input buffer should be at least equal to or greater
|
/* the size of input buffer should be at least equal to or greater
|
||||||
@ -84,7 +86,7 @@ typedef qse_ssize_t (*qse_tio_io_t) (
|
|||||||
struct qse_tio_t
|
struct qse_tio_t
|
||||||
{
|
{
|
||||||
qse_mmgr_t* mmgr;
|
qse_mmgr_t* mmgr;
|
||||||
int errnum;
|
qse_tio_err_t errnum;
|
||||||
|
|
||||||
/* io functions */
|
/* io functions */
|
||||||
qse_tio_io_t input_func;
|
qse_tio_io_t input_func;
|
||||||
@ -143,17 +145,14 @@ void qse_tio_setmmgr (
|
|||||||
qse_mmgr_t* mmgr
|
qse_mmgr_t* mmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/****f* qse.cmn.tio/qse_tio_geterrnum
|
||||||
* FUNCTION: qse_tio_geterrnum
|
* NAME
|
||||||
* Returns an error code
|
* qse_tio_geterrnum - get an error code
|
||||||
*
|
*
|
||||||
* PARAMETERS:
|
* SYNOPSIS
|
||||||
* grep - a grep object
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* Error code set by the last tio function called
|
|
||||||
*/
|
*/
|
||||||
int qse_tio_geterrnum (qse_tio_t* tio);
|
qse_tio_err_t qse_tio_geterrnum (qse_tio_t* tio);
|
||||||
|
/******/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: qse_tio_geterrstr
|
* FUNCTION: qse_tio_geterrstr
|
||||||
|
@ -449,23 +449,25 @@ int qse_pio_wait (qse_pio_t* pio, int flags)
|
|||||||
|
|
||||||
if (pio->child == QSE_PIO_PID_NIL) return -1;
|
if (pio->child == QSE_PIO_PID_NIL) return -1;
|
||||||
|
|
||||||
if (flags & QSE_PIO_NOWAIT) opt |= WNOHANG;
|
if (flags & QSE_PIO_NOHANG) opt |= WNOHANG;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
int n = QSE_WAITPID (pio->child, &status, opt);
|
int n = QSE_WAITPID (pio->child, &status, opt);
|
||||||
|
|
||||||
qse_printf (QSE_T("n=%d,pio->child=%d,errno=%d,ECHILD=%d\n"), n, pio->child, errno, ECHILD);
|
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
{
|
{
|
||||||
if (errno == ECHILD)
|
if (errno == ECHILD)
|
||||||
{
|
{
|
||||||
/* most likely, the process has already been waitpid()ed on. */
|
/* most likely, the process has already been
|
||||||
|
* waitpid()ed on. */
|
||||||
|
|
||||||
/* TODO: what should we do... ? */
|
/* TODO: what should we do... ? */
|
||||||
/* ??? TREAT AS NORMAL??? => cannot know exit code => TREAT AS ERROR but reset pio->child */
|
/* ??? TREAT AS NORMAL??? => cannot know exit code => TREAT AS ERROR but reset pio->child */
|
||||||
|
|
||||||
pio->child = QSE_PIO_PID_NIL;
|
pio->child = QSE_PIO_PID_NIL;
|
||||||
ret = -1; /* OR ECHILD / QSE_PIO_ECHILD */
|
pio->errnum = QSE_PIO_ECHILD;
|
||||||
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,7 +477,7 @@ qse_printf (QSE_T("n=%d,pio->child=%d,errno=%d,ECHILD=%d\n"), n, pio->child, err
|
|||||||
if (n == 0)
|
if (n == 0)
|
||||||
{
|
{
|
||||||
/* when WNOHANG is not specified, 0 can't be returned */
|
/* when WNOHANG is not specified, 0 can't be returned */
|
||||||
QSE_ASSERT (flags & QSE_PIO_NOWAIT);
|
QSE_ASSERT (flags & QSE_PIO_NOHANG);
|
||||||
|
|
||||||
ret = -2;
|
ret = -2;
|
||||||
/* the child process is still alive */
|
/* the child process is still alive */
|
||||||
|
@ -98,7 +98,7 @@ void qse_tio_setmmgr (qse_tio_t* tio, qse_mmgr_t* mmgr)
|
|||||||
tio->mmgr = mmgr;
|
tio->mmgr = mmgr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_tio_geterrnum (qse_tio_t* tio)
|
qse_tio_err_t qse_tio_geterrnum (qse_tio_t* tio)
|
||||||
{
|
{
|
||||||
return tio->errnum;
|
return tio->errnum;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user