4 #include <msvcrt/errno.h>
5 #include <msvcrt/stdio.h>
6 #include <msvcrt/stdlib.h>
7 #include <msvcrt/string.h>
8 #include <msvcrt/internal/file.h>
10 #include <msvcrt/msvcrtdbg.h>
16 FILE *_popen (const char *cm, const char *md) /* program name, pipe mode */
22 HANDLE hReadPipe, hWritePipe;
24 STARTUPINFOA StartupInfo;
25 PROCESS_INFORMATION ProcessInformation;
26 SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
28 DPRINT("_popen('%s', '%s')\n", cm, md);
33 szComSpec = getenv("COMSPEC");
35 if (szComSpec == NULL)
37 szComSpec = strdup("cmd.exe");
38 if (szComSpec == NULL)
42 s = max(strrchr(szComSpec, '\\'), strrchr(szComSpec, '/'));
48 szCmdLine = malloc(strlen(s) + 4 + strlen(cm) + 1);
49 if (szCmdLine == NULL)
56 s = strrchr(szCmdLine, '.');
59 strcat(szCmdLine, " /C ");
60 strcat(szCmdLine, cm);
62 if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024))
69 memset(&StartupInfo, 0, sizeof(STARTUPINFOA));
70 StartupInfo.cb = sizeof(STARTUPINFOA);
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 = CreateProcessA(szComSpec,
96 CloseHandle(hReadPipe);
97 CloseHandle(hWritePipe);
101 CloseHandle(ProcessInformation.hThread);
105 pf = _fdopen(__fileno_alloc(hReadPipe, _fmode) , "r");
106 CloseHandle(hWritePipe);
110 pf = _fdopen( __fileno_alloc(hWritePipe, _fmode) , "w");
111 CloseHandle(hReadPipe);
114 pf->_name_to_remove = ProcessInformation.hProcess;
123 int _pclose (FILE *pp)
126 if (!TerminateProcess(pp->_name_to_remove,0))
135 FILE *_wpopen (const wchar_t *cm, const wchar_t *md) /* program name, pipe mode */
137 wchar_t *szCmdLine=NULL;
138 wchar_t *szComSpec=NULL;
141 HANDLE hReadPipe, hWritePipe;
143 STARTUPINFOW StartupInfo;
144 PROCESS_INFORMATION ProcessInformation;
145 SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
147 DPRINT("_wpopen('%S', '%S')\n", cm, md);
152 szComSpec = _wgetenv(L"COMSPEC");
154 if (szComSpec == NULL)
156 szComSpec = _wcsdup(L"cmd.exe");
157 if (szComSpec == NULL)
161 s = max(wcsrchr(szComSpec, L'\\'), wcsrchr(szComSpec, L'/'));
167 szCmdLine = malloc((wcslen(s) + 4 + wcslen(cm) + 1) * sizeof(wchar_t));
168 if (szCmdLine == NULL)
174 wcscpy(szCmdLine, s);
175 s = wcsrchr(szCmdLine, L'.');
178 wcscat(szCmdLine, L" /C ");
179 wcscat(szCmdLine, cm);
181 if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024))
188 memset(&StartupInfo, 0, sizeof(STARTUPINFOW));
189 StartupInfo.cb = sizeof(STARTUPINFOW);
192 StartupInfo.hStdOutput = hWritePipe;
193 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
195 else if ( *md == L'w' ) {
196 StartupInfo.hStdInput = hReadPipe;
197 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
200 result = CreateProcessW(szComSpec,
209 &ProcessInformation);
215 CloseHandle(hReadPipe);
216 CloseHandle(hWritePipe);
220 CloseHandle(ProcessInformation.hThread);
224 pf = _wfdopen(__fileno_alloc(hReadPipe, _fmode) , L"r");
225 CloseHandle(hWritePipe);
229 pf = _wfdopen( __fileno_alloc(hWritePipe, _fmode) , L"w");
230 CloseHandle(hReadPipe);
233 pf->_name_to_remove = ProcessInformation.hProcess;