From 86a1d88307aba6bed78a084508f45f9b2858042a Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 8 Jan 2009 08:14:06 +0000 Subject: [PATCH] interim commit - fixed wrong enum definitions of qse_pio_hid_t - changed code to use a static buffer if the command is short enough in qse_pio_init(). --- qse/include/qse/cmn/pio.h | 6 ++--- qse/lib/cmn/pio.c | 17 +++++++++++--- qse/lib/cmn/str_cnv.c | 2 +- qse/lib/cmn/syscall.h | 5 +++++ qse/test/cmn/pio.c | 47 +++++++++++++++++++++++++++++++++++++-- 5 files changed, 68 insertions(+), 9 deletions(-) diff --git a/qse/include/qse/cmn/pio.h b/qse/include/qse/cmn/pio.h index ec24e107..94bcb854 100644 --- a/qse/include/qse/cmn/pio.h +++ b/qse/include/qse/cmn/pio.h @@ -45,9 +45,9 @@ enum qse_pio_open_flag_t enum qse_pio_hid_t { - QSE_PIO_IN = (1 << 0), - QSE_PIO_OUT = (1 << 1), - QSE_PIO_ERR = (1 << 2) + QSE_PIO_IN = 0, + QSE_PIO_OUT = 1, + QSE_PIO_ERR = 2 }; #ifdef _WIN32 diff --git a/qse/lib/cmn/pio.c b/qse/lib/cmn/pio.c index 5d1c3aa8..c44532e5 100644 --- a/qse/lib/cmn/pio.c +++ b/qse/lib/cmn/pio.c @@ -179,6 +179,7 @@ qse_pio_t* qse_pio_init ( mcmd = cmd; #else qse_size_t n, mn; + qse_mchar_t buf[64]; n = qse_wcstombslen (cmd, &mn); if (cmd[n] != QSE_WT('\0')) @@ -188,9 +189,18 @@ qse_pio_t* qse_pio_init ( } mn = mn + 1; - mcmd = QSE_MMGR_ALLOC ( - pio->mmgr, mn*QSE_SIZEOF(*mcmd)); - if (mcmd == QSE_NULL) goto child_oops; + + if (mn <= QSE_COUNTOF(buf)) + { + mcmd = buf; + mn = QSE_COUNTOF(buf); + } + else + { + mcmd = QSE_MMGR_ALLOC ( + pio->mmgr, mn*QSE_SIZEOF(*mcmd)); + if (mcmd == QSE_NULL) goto child_oops; + } n = qse_wcstombs (cmd, mcmd, &mn); @@ -199,6 +209,7 @@ qse_pio_t* qse_pio_init ( else { /* TODO: need to parse the command in a simple manner */ + //execl ("full path needed", mcmd, marg1, marg2, QSE_NULL); } child_oops: diff --git a/qse/lib/cmn/str_cnv.c b/qse/lib/cmn/str_cnv.c index 2df48abb..2b29c122 100644 --- a/qse/lib/cmn/str_cnv.c +++ b/qse/lib/cmn/str_cnv.c @@ -224,7 +224,7 @@ qse_size_t qse_wcstombs ( qse_size_t qse_wcstombslen (const qse_wchar_t* wcs, qse_size_t* mbslen) { const qse_wchar_t* p = wcs; - qse_mchar_t mbs[128]; + qse_mchar_t mbs[32]; qse_size_t mlen = 0; while (*p != QSE_WT('\0')) diff --git a/qse/lib/cmn/syscall.h b/qse/lib/cmn/syscall.h index 98bf410a..16ceb166 100644 --- a/qse/lib/cmn/syscall.h +++ b/qse/lib/cmn/syscall.h @@ -105,6 +105,11 @@ #define QSE_FORK() fork() #endif +#ifdef SYS_execve + #define QSE_EXECVE(path,argv,envp) syscall(SYS_execve,path,argv,envp) +#else + #define QSE_EXECVE(path,argv,envp) execve(path,argv,envp) +#endif #ifdef SYS_waitpid #define QSE_WAITPID(pid,status,options) syscall(SYS_waitpid,pid,status,options) diff --git a/qse/test/cmn/pio.c b/qse/test/cmn/pio.c index 538df4e0..b40f9114 100644 --- a/qse/test/cmn/pio.c +++ b/qse/test/cmn/pio.c @@ -26,8 +26,6 @@ static int test1 (void) return -1; } - qse_pio_write (pio, "xxxxxxxxxxxx\n", 13, QSE_PIO_IN); - qse_pio_write (pio, QSE_NULL, 0, QSE_PIO_IN); while (1) { qse_byte_t buf[128]; @@ -41,6 +39,50 @@ static int test1 (void) break; } + qse_printf (QSE_T("N===> %d\n"), (int)n); + #ifdef QSE_CHAR_IS_MCHAR + qse_printf (QSE_T("buf => [%.*s]\n"), (int)n. buf); + #else + qse_printf (QSE_T("buf => [%.*S]\n"), (int)n, buf); + #endif + + } + + qse_pio_close (pio); + + return 0; +} + +static int test2 (void) +{ + qse_pio_t* pio; + + pio = qse_pio_open ( + QSE_NULL, + 0, + QSE_T("ls -laF"), + QSE_PIO_READERR|QSE_PIO_WRITEIN|QSE_PIO_OUTTOERR|QSE_PIO_SHELL + ); + if (pio == QSE_NULL) + { + qse_printf (QSE_T("cannot open program through pipe\n")); + return -1; + } + + while (1) + { + qse_byte_t buf[128]; + + /*qse_pio_canread (pio, QSE_PIO_ERR, 1000)*/ + qse_ssize_t n = qse_pio_read (pio, buf, sizeof(buf), QSE_PIO_ERR); + if (n == 0) break; + if (n < 0) + { + qse_printf (QSE_T("qse_pio_read() returned error\n")); + break; + } + + qse_printf (QSE_T("N===> %d\n"), (int)n); #ifdef QSE_CHAR_IS_MCHAR qse_printf (QSE_T("buf => [%.*s]\n"), (int)n. buf); #else @@ -93,6 +135,7 @@ int main () qse_printf (QSE_T("--------------------------------------------------------------------------------\n")); R (test1); + R (test2); return 0; }