enhanced pio for WIN32
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fio.c 204 2009-06-18 12:08:06Z hyunghwan.chung $
|
||||
* $Id: fio.c 242 2009-07-23 13:01:52Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -392,7 +392,6 @@ qse_ssize_t qse_fio_flush (qse_fio_t* fio)
|
||||
static int get_devname_from_handle (
|
||||
HANDLE handle, qse_char_t* buf, qse_size_t len)
|
||||
{
|
||||
BOOL bSuccess = FALSE;
|
||||
HANDLE map = NULL;
|
||||
void* mem = NULL;
|
||||
DWORD olen;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: pio.c 241 2009-07-22 12:47:13Z hyunghwan.chung $
|
||||
* $Id: pio.c 242 2009-07-23 13:01:52Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -71,7 +71,6 @@ void qse_pio_close (qse_pio_t* pio)
|
||||
qse_pio_t* qse_pio_init (
|
||||
qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd, int flags)
|
||||
{
|
||||
qse_pio_pid_t pid;
|
||||
|
||||
qse_pio_hnd_t handle[6] =
|
||||
{
|
||||
@ -97,7 +96,10 @@ qse_pio_t* qse_pio_init (
|
||||
PROCESS_INFORMATION procinfo;
|
||||
STARTUPINFO startup;
|
||||
qse_char_t* dup = QSE_NULL;
|
||||
HANDLE windevnul = INVALID_HANDLE_VALUE;
|
||||
BOOL x;
|
||||
#else
|
||||
qse_pio_pid_t pid;
|
||||
#endif
|
||||
|
||||
QSE_MEMSET (pio, 0, QSE_SIZEOF(*pio));
|
||||
@ -108,7 +110,7 @@ qse_pio_t* qse_pio_init (
|
||||
|
||||
secattr.nLength = QSE_SIZEOF(secattr);
|
||||
secattr.bInheritHandle = TRUE;
|
||||
secattr.lpSecurityDescriptor = NULL;
|
||||
secattr.lpSecurityDescriptor = QSE_NULL;
|
||||
|
||||
if (flags & QSE_PIO_WRITEIN)
|
||||
{
|
||||
@ -154,32 +156,68 @@ qse_pio_t* qse_pio_init (
|
||||
maxidx = 5;
|
||||
}
|
||||
|
||||
/* TODO: handle QSE_PIO_DROPXXX , QSE_PIO_XXXTONUL
|
||||
if (flags & QSE_PIO_INTONUL) ...
|
||||
if (flags & QSE_PIO_OUTTONUL) ...
|
||||
if (flags & QSE_PIO_ERRTONUL) ...
|
||||
if (flags & QSE_PIO_DROPIN) ...
|
||||
if (flags & QSE_PIO_DROPOUT) ...
|
||||
if (flags & QSE_PIO_DROPERR) ...
|
||||
*/
|
||||
if ((flags & QSE_PIO_INTONUL) ||
|
||||
(flags & QSE_PIO_OUTTONUL) ||
|
||||
(flags & QSE_PIO_ERRTONUL))
|
||||
{
|
||||
windevnul = CreateFile(
|
||||
QSE_T("NUL"), GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
&secattr, OPEN_EXISTING, 0, NULL
|
||||
);
|
||||
if (windevnul == INVALID_HANDLE_VALUE) goto oops;
|
||||
}
|
||||
|
||||
QSE_MEMSET (&procinfo, 0, QSE_SIZEOF(procinfo));
|
||||
QSE_MEMSET (&startup, 0, QSE_SIZEOF(startup));
|
||||
|
||||
startup.cb = QSE_SIZEOF(startup);
|
||||
startup.hStdInput =
|
||||
(flags & QSE_PIO_WRITEIN)? handle[0]: INVALID_HANDLE_VALUE;
|
||||
startup.hStdOutput =
|
||||
(flags & QSE_PIO_READOUT)? handle[3]: INVALID_HANDLE_VALUE;
|
||||
startup.hStdError =
|
||||
(flags & QSE_PIO_READERR)? handle[5]: INVALID_HANDLE_VALUE;
|
||||
|
||||
startup.hStdInput = INVALID_HANDLE_VALUE;
|
||||
startup.hStdOutput = INVALID_HANDLE_VALUE;
|
||||
startup.hStdOutput = INVALID_HANDLE_VALUE;
|
||||
|
||||
if (flags & QSE_PIO_WRITEIN) startup.hStdInput = handle[0];
|
||||
|
||||
if (flags & QSE_PIO_READOUT)
|
||||
{
|
||||
startup.hStdOutput = handle[3];
|
||||
if (flags & QSE_PIO_ERRTOOUT) startup.hStdError = handle[3];
|
||||
}
|
||||
|
||||
if (flags & QSE_PIO_READERR)
|
||||
{
|
||||
startup.hStdError = handle[5];
|
||||
if (flags & QSE_PIO_OUTTOERR) startup.hStdOutput = handle[5];
|
||||
}
|
||||
|
||||
if (flags & QSE_PIO_INTONUL) startup.hStdOutput = windevnul;
|
||||
if (flags & QSE_PIO_OUTTONUL) startup.hStdOutput = windevnul;
|
||||
if (flags & QSE_PIO_ERRTONUL) startup.hStdError = windevnul;
|
||||
|
||||
if (flags & QSE_PIO_DROPIN) startup.hStdInput = INVALID_HANDLE_VALUE;
|
||||
if (flags & QSE_PIO_DROPOUT) startup.hStdOutput = INVALID_HANDLE_VALUE;
|
||||
if (flags & QSE_PIO_DROPERR) startup.hStdError = INVALID_HANDLE_VALUE;
|
||||
|
||||
startup.dwFlags |= STARTF_USESTDHANDLES;
|
||||
|
||||
/* there is nothing to do for QSE_PIO_SHELL as CreateProcess
|
||||
* takes the entire command line */
|
||||
|
||||
dup = qse_strdup (cmd, mmgr);
|
||||
if (dup == QSE_NULL) goto oops;
|
||||
if (flags & QSE_PIO_SHELL)
|
||||
{
|
||||
dup = QSE_MMGR_ALLOC (
|
||||
mmgr, (11+qse_strlen(cmd)+1 )*QSE_SIZEOF(qse_char_t));
|
||||
if (dup == QSE_NULL) goto oops;
|
||||
|
||||
qse_strcpy (dup, QSE_T("cmd.exe /c "));
|
||||
qse_strcpy (&dup[11], cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
dup = qse_strdup (cmd, mmgr);
|
||||
if (dup == QSE_NULL) goto oops;
|
||||
}
|
||||
|
||||
x = CreateProcess (
|
||||
NULL, /* LPCTSTR lpApplicationName */
|
||||
@ -194,6 +232,9 @@ qse_pio_t* qse_pio_init (
|
||||
&procinfo /* LPPROCESS_INFORMATION lpProcessInformation */
|
||||
);
|
||||
|
||||
QSE_MMGR_FREE (mmgr, dup); dup = QSE_NULL;
|
||||
CloseHandle (windevnul); windevnul = INVALID_HANDLE_VALUE;
|
||||
|
||||
if (x == FALSE) goto oops;
|
||||
|
||||
if (flags & QSE_PIO_WRITEIN)
|
||||
@ -213,7 +254,7 @@ qse_pio_t* qse_pio_init (
|
||||
}
|
||||
|
||||
CloseHandle (procinfo.hThread);
|
||||
pid = procinfo.hProcess;
|
||||
pio->child = procinfo.hProcess;
|
||||
#else
|
||||
|
||||
if (flags & QSE_PIO_WRITEIN)
|
||||
@ -333,7 +374,7 @@ qse_pio_t* qse_pio_init (
|
||||
#else
|
||||
devnull = QSE_OPEN ("/dev/null", O_RDWR, 0);
|
||||
#endif
|
||||
if (devnull == -1) goto oops;
|
||||
if (devnull == -1) goto child_oops;
|
||||
}
|
||||
|
||||
if ((flags & QSE_PIO_INTONUL) &&
|
||||
@ -536,6 +577,7 @@ qse_pio_t* qse_pio_init (
|
||||
|
||||
oops:
|
||||
#ifdef _WIN32
|
||||
if (windevnul != INVALID_HANDLE_VALUE) CloseHandle (windevnul);
|
||||
if (dup != QSE_NULL) QSE_MMGR_FREE (mmgr, dup);
|
||||
#endif
|
||||
|
||||
@ -635,8 +677,10 @@ static qse_ssize_t pio_read (
|
||||
if (size > QSE_TYPE_MAX(DWORD)) size = QSE_TYPE_MAX(DWORD);
|
||||
if (ReadFile(hnd, buf, size, &count, QSE_NULL) == FALSE)
|
||||
{
|
||||
pio->errnum = (GetLastError() == ERROR_BROKEN_PIPE)?
|
||||
QSE_PIO_EPIPE: QSE_PIO_ESUBSYS;
|
||||
/* ReadFile receives ERROR_BROKEN_PIPE when the write end
|
||||
* is closed in the child process */
|
||||
if (GetLastError() == ERROR_BROKEN_PIPE) return 0;
|
||||
pio->errnum = QSE_PIO_ESUBSYS;
|
||||
return -1;
|
||||
}
|
||||
return (qse_ssize_t)count;
|
||||
|
Reference in New Issue
Block a user