2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
22 int alloc_fd(HANDLE hand
, int flag
); //FIXME: Remove
23 unsigned split_oflags(unsigned oflags
); //FIXME: Remove
28 FILE *_tpopen (const _TCHAR
*cm
, const _TCHAR
*md
) /* program name, pipe mode */
30 _TCHAR
*szCmdLine
=NULL
;
31 _TCHAR
*szComSpec
=NULL
;
34 HANDLE hReadPipe
, hWritePipe
;
36 STARTUPINFO StartupInfo
;
37 PROCESS_INFORMATION ProcessInformation
;
38 SECURITY_ATTRIBUTES sa
= {sizeof(SECURITY_ATTRIBUTES
), NULL
, TRUE
};
40 TRACE(MK_STR(_tpopen
)"('%"sT
"', '%"sT
"')\n", cm
, md
);
45 szComSpec
= _tgetenv(_T("COMSPEC"));
46 if (szComSpec
== NULL
)
48 szComSpec
= _T("cmd.exe");
51 s
= max(_tcsrchr(szComSpec
, '\\'), _tcsrchr(szComSpec
, '/'));
57 szCmdLine
= malloc((_tcslen(s
) + 4 + _tcslen(cm
) + 1) * sizeof(_TCHAR
));
58 if (szCmdLine
== NULL
)
63 _tcscpy(szCmdLine
, s
);
64 s
= _tcsrchr(szCmdLine
, '.');
67 _tcscat(szCmdLine
, _T(" /C "));
68 _tcscat(szCmdLine
, cm
);
70 if ( !CreatePipe(&hReadPipe
,&hWritePipe
,&sa
,1024))
76 memset(&StartupInfo
, 0, sizeof(STARTUPINFO
));
77 StartupInfo
.cb
= sizeof(STARTUPINFO
);
80 StartupInfo
.hStdInput
= GetStdHandle(STD_INPUT_HANDLE
);
81 StartupInfo
.hStdOutput
= hWritePipe
;
82 StartupInfo
.dwFlags
|= STARTF_USESTDHANDLES
;
84 else if ( *md
== 'w' ) {
85 StartupInfo
.hStdInput
= hReadPipe
;
86 StartupInfo
.hStdOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
87 StartupInfo
.dwFlags
|= STARTF_USESTDHANDLES
;
90 if (StartupInfo
.dwFlags
& STARTF_USESTDHANDLES
)
91 StartupInfo
.hStdError
= GetStdHandle(STD_ERROR_HANDLE
);
93 result
= CreateProcess(szComSpec
,
102 &ProcessInformation
);
107 CloseHandle(hReadPipe
);
108 CloseHandle(hWritePipe
);
112 CloseHandle(ProcessInformation
.hThread
);
116 pf
= _tfdopen(alloc_fd(hReadPipe
, split_oflags(_fmode
)) , _T("r"));
117 CloseHandle(hWritePipe
);
121 pf
= _tfdopen( alloc_fd(hWritePipe
, split_oflags(_fmode
)) , _T("w"));
122 CloseHandle(hReadPipe
);
133 int _pclose (FILE *pp
)
135 TRACE("_pclose(%x)",pp
);
138 //if (!TerminateProcess(pp->_tmpfname ,0))