2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
15 #include <internal/debug.h>
21 FILE *_tpopen (const _TCHAR
*cm
, const _TCHAR
*md
) /* program name, pipe mode */
23 _TCHAR
*szCmdLine
=NULL
;
24 _TCHAR
*szComSpec
=NULL
;
27 HANDLE hReadPipe
, hWritePipe
;
29 STARTUPINFO StartupInfo
;
30 PROCESS_INFORMATION ProcessInformation
;
31 SECURITY_ATTRIBUTES sa
= {sizeof(SECURITY_ATTRIBUTES
), NULL
, TRUE
};
33 TRACE(MK_STR(_tpopen
)"('%"sT
"', '%"sT
"')\n", cm
, md
);
38 szComSpec
= _tgetenv(_T("COMSPEC"));
39 if (szComSpec
== NULL
)
41 szComSpec
= _T("cmd.exe");
44 s
= max(_tcsrchr(szComSpec
, '\\'), _tcsrchr(szComSpec
, '/'));
50 szCmdLine
= malloc((_tcslen(s
) + 4 + _tcslen(cm
) + 1) * sizeof(_TCHAR
));
51 if (szCmdLine
== NULL
)
56 _tcscpy(szCmdLine
, s
);
57 s
= _tcsrchr(szCmdLine
, '.');
60 _tcscat(szCmdLine
, _T(" /C "));
61 _tcscat(szCmdLine
, cm
);
63 if ( !CreatePipe(&hReadPipe
,&hWritePipe
,&sa
,1024))
69 memset(&StartupInfo
, 0, sizeof(STARTUPINFO
));
70 StartupInfo
.cb
= sizeof(STARTUPINFO
);
73 StartupInfo
.hStdOutput
= hWritePipe
;
74 StartupInfo
.dwFlags
|= STARTF_USESTDHANDLES
;
76 else if ( *md
== 'w' ) {
77 StartupInfo
.hStdInput
= hReadPipe
;
78 StartupInfo
.dwFlags
|= STARTF_USESTDHANDLES
;
81 result
= CreateProcess(szComSpec
,
95 CloseHandle(hReadPipe
);
96 CloseHandle(hWritePipe
);
100 CloseHandle(ProcessInformation
.hThread
);
104 pf
= _tfdopen(alloc_fd(hReadPipe
, split_oflags(_fmode
)) , _T("r"));
105 CloseHandle(hWritePipe
);
109 pf
= _tfdopen( alloc_fd(hWritePipe
, split_oflags(_fmode
)) , _T("w"));
110 CloseHandle(hReadPipe
);
113 pf
->_tmpfname
= ProcessInformation
.hProcess
;
123 int _pclose (FILE *pp
)
125 TRACE("_pclose(%x)",pp
);
128 if (!TerminateProcess(pp
->_tmpfname
,0))