2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS C runtime library
4 * FILE: lib/sdk/crt/stdio/popen.c
5 * PURPOSE: Pipe Functions
6 * PROGRAMERS: Eric Kohl
21 int alloc_fd(HANDLE hand
, int flag
); //FIXME: Remove
22 unsigned split_oflags(unsigned oflags
); //FIXME: Remove
27 FILE *_tpopen (const _TCHAR
*cm
, const _TCHAR
*md
) /* program name, pipe mode */
29 _TCHAR
*szCmdLine
=NULL
;
30 _TCHAR
*szComSpec
=NULL
;
33 HANDLE hReadPipe
, hWritePipe
;
35 STARTUPINFO StartupInfo
;
36 PROCESS_INFORMATION ProcessInformation
;
37 SECURITY_ATTRIBUTES sa
= {sizeof(SECURITY_ATTRIBUTES
), NULL
, TRUE
};
39 TRACE(MK_STR(_tpopen
)"('%"sT
"', '%"sT
"')\n", cm
, md
);
44 szComSpec
= _tgetenv(_T("COMSPEC"));
45 if (szComSpec
== NULL
)
47 szComSpec
= _T("cmd.exe");
50 s
= max(_tcsrchr(szComSpec
, '\\'), _tcsrchr(szComSpec
, '/'));
56 szCmdLine
= malloc((_tcslen(s
) + 4 + _tcslen(cm
) + 1) * sizeof(_TCHAR
));
57 if (szCmdLine
== NULL
)
62 _tcscpy(szCmdLine
, s
);
63 s
= _tcsrchr(szCmdLine
, '.');
66 _tcscat(szCmdLine
, _T(" /C "));
67 _tcscat(szCmdLine
, cm
);
69 if ( !CreatePipe(&hReadPipe
,&hWritePipe
,&sa
,1024))
75 memset(&StartupInfo
, 0, sizeof(STARTUPINFO
));
76 StartupInfo
.cb
= sizeof(STARTUPINFO
);
79 StartupInfo
.hStdInput
= GetStdHandle(STD_INPUT_HANDLE
);
80 StartupInfo
.hStdOutput
= hWritePipe
;
81 StartupInfo
.dwFlags
|= STARTF_USESTDHANDLES
;
83 else if ( *md
== 'w' ) {
84 StartupInfo
.hStdInput
= hReadPipe
;
85 StartupInfo
.hStdOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
86 StartupInfo
.dwFlags
|= STARTF_USESTDHANDLES
;
89 if (StartupInfo
.dwFlags
& STARTF_USESTDHANDLES
)
90 StartupInfo
.hStdError
= GetStdHandle(STD_ERROR_HANDLE
);
92 result
= CreateProcess(szComSpec
,
101 &ProcessInformation
);
106 CloseHandle(hReadPipe
);
107 CloseHandle(hWritePipe
);
111 CloseHandle(ProcessInformation
.hThread
);
115 pf
= _tfdopen(alloc_fd(hReadPipe
, split_oflags(_fmode
)) , _T("r"));
116 CloseHandle(hWritePipe
);
120 pf
= _tfdopen( alloc_fd(hWritePipe
, split_oflags(_fmode
)) , _T("w"));
121 CloseHandle(hReadPipe
);
132 int _pclose (FILE *pp
)
134 TRACE("_pclose(%x)",pp
);
137 //if (!TerminateProcess(pp->_tmpfname ,0))