diff --git a/reactos/lib/sdk/crt/stdio/popen.c b/reactos/lib/sdk/crt/stdio/popen.c index a9624796add..ab5efa83bfa 100644 --- a/reactos/lib/sdk/crt/stdio/popen.c +++ b/reactos/lib/sdk/crt/stdio/popen.c @@ -1,20 +1,20 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/crt/?????? - * PURPOSE: Unknown - * PROGRAMER: Unknown - * UPDATE HISTORY: - * 25/11/05: Created - */ +* COPYRIGHT: See COPYING in the top level directory +* PROJECT: ReactOS system libraries +* FILE: lib/crt/?????? +* PURPOSE: Unknown +* PROGRAMER: Unknown +* UPDATE HISTORY: +* 25/11/05: Created +*/ #include #include #ifdef _UNICODE - #define sT "S" +#define sT "S" #else - #define sT "s" +#define sT "s" #endif #define MK_STR(s) #s @@ -27,104 +27,102 @@ unsigned split_oflags(unsigned oflags); //FIXME: Remove */ FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */ { - _TCHAR *szCmdLine=NULL; - _TCHAR *szComSpec=NULL; - _TCHAR *s; - FILE *pf; - HANDLE hReadPipe, hWritePipe; - BOOL result; - STARTUPINFO StartupInfo; - PROCESS_INFORMATION ProcessInformation; - SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + _TCHAR *szCmdLine=NULL; + _TCHAR *szComSpec=NULL; + _TCHAR *s; + FILE *pf; + HANDLE hReadPipe, hWritePipe; + BOOL result; + STARTUPINFO StartupInfo; + PROCESS_INFORMATION ProcessInformation; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; - TRACE(MK_STR(_tpopen)"('%"sT"', '%"sT"')\n", cm, md); + TRACE(MK_STR(_tpopen)"('%"sT"', '%"sT"')\n", cm, md); - if (cm == NULL) - return( NULL ); + if (cm == NULL) + return( NULL ); - szComSpec = _tgetenv(_T("COMSPEC")); - if (szComSpec == NULL) - { - szComSpec = _T("cmd.exe"); - } + szComSpec = _tgetenv(_T("COMSPEC")); + if (szComSpec == NULL) + { + szComSpec = _T("cmd.exe"); + } - s = max(_tcsrchr(szComSpec, '\\'), _tcsrchr(szComSpec, '/')); - if (s == NULL) - s = szComSpec; - else - s++; + s = max(_tcsrchr(szComSpec, '\\'), _tcsrchr(szComSpec, '/')); + if (s == NULL) + s = szComSpec; + else + s++; - szCmdLine = malloc((_tcslen(s) + 4 + _tcslen(cm) + 1) * sizeof(_TCHAR)); - if (szCmdLine == NULL) - { - return NULL; - } + szCmdLine = malloc((_tcslen(s) + 4 + _tcslen(cm) + 1) * sizeof(_TCHAR)); + if (szCmdLine == NULL) + { + return NULL; + } - _tcscpy(szCmdLine, s); - s = _tcsrchr(szCmdLine, '.'); - if (s) - *s = 0; - _tcscat(szCmdLine, _T(" /C ")); - _tcscat(szCmdLine, cm); + _tcscpy(szCmdLine, s); + s = _tcsrchr(szCmdLine, '.'); + if (s) + *s = 0; + _tcscat(szCmdLine, _T(" /C ")); + _tcscat(szCmdLine, cm); - if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024)) - { + if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024)) + { + free (szCmdLine); + return NULL; + } + + memset(&StartupInfo, 0, sizeof(STARTUPINFO)); + StartupInfo.cb = sizeof(STARTUPINFO); + + if (*md == 'r' ) { + StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + StartupInfo.hStdOutput = hWritePipe; + StartupInfo.dwFlags |= STARTF_USESTDHANDLES; + } + else if ( *md == 'w' ) { + StartupInfo.hStdInput = hReadPipe; + StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); + StartupInfo.dwFlags |= STARTF_USESTDHANDLES; + } + + if (StartupInfo.dwFlags & STARTF_USESTDHANDLES) + StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); + + result = CreateProcess(szComSpec, + szCmdLine, + NULL, + NULL, + TRUE, + 0, + NULL, + NULL, + &StartupInfo, + &ProcessInformation); free (szCmdLine); - return NULL; - } - memset(&StartupInfo, 0, sizeof(STARTUPINFO)); - StartupInfo.cb = sizeof(STARTUPINFO); - - if (*md == 'r' ) { - StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); - StartupInfo.hStdOutput = hWritePipe; - StartupInfo.dwFlags |= STARTF_USESTDHANDLES; - } - else if ( *md == 'w' ) { - StartupInfo.hStdInput = hReadPipe; - StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); - StartupInfo.dwFlags |= STARTF_USESTDHANDLES; - } - - if (StartupInfo.dwFlags & STARTF_USESTDHANDLES) - StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); - - result = CreateProcess(szComSpec, - szCmdLine, - NULL, - NULL, - TRUE, - 0, - NULL, - NULL, - &StartupInfo, - &ProcessInformation); - free (szCmdLine); - - if (result == FALSE) - { - CloseHandle(hReadPipe); - CloseHandle(hWritePipe); - return NULL; - } - - CloseHandle(ProcessInformation.hThread); - - if ( *md == 'r' ) + if (result == FALSE) { - pf = _tfdopen(alloc_fd(hReadPipe, split_oflags(_fmode)) , _T("r")); - CloseHandle(hWritePipe); - } - else - { - pf = _tfdopen( alloc_fd(hWritePipe, split_oflags(_fmode)) , _T("w")); - CloseHandle(hReadPipe); + CloseHandle(hReadPipe); + CloseHandle(hWritePipe); + return NULL; } - //pf->_tmpfname = ProcessInformation.hProcess; + CloseHandle(ProcessInformation.hThread); - return( pf ); + if ( *md == 'r' ) + { + pf = _tfdopen(alloc_fd(hReadPipe, split_oflags(_fmode)) , _T("r")); + CloseHandle(hWritePipe); + } + else + { + pf = _tfdopen( alloc_fd(hWritePipe, split_oflags(_fmode)) , _T("w")); + CloseHandle(hReadPipe); + } + + return( pf ); } #ifndef _UNICODE @@ -134,12 +132,12 @@ FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */ */ int _pclose (FILE *pp) { - TRACE("_pclose(%x)",pp); + TRACE("_pclose(%x)",pp); - fclose(pp); - //if (!TerminateProcess(pp->_tmpfname ,0)) - // return( -1 ); - return( 0 ); + fclose(pp); + //if (!TerminateProcess(pp->_tmpfname ,0)) + // return( -1 ); + return( 0 ); } #endif