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>
13 FILE *_popen (const char *cm, const char *md) /* program name, pipe mode */
19 HANDLE hReadPipe, hWritePipe;
21 STARTUPINFOA StartupInfo;
22 PROCESS_INFORMATION ProcessInformation;
23 SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
25 DPRINT("_popen('%s', '%s')\n", cm, md);
30 szComSpec = getenv("COMSPEC");
32 if (szComSpec == NULL)
34 szComSpec = strdup("cmd.exe");
35 if (szComSpec == NULL)
39 s = max(strrchr(szComSpec, '\\'), strrchr(szComSpec, '/'));
45 szCmdLine = malloc(strlen(s) + 4 + strlen(cm) + 1);
46 if (szCmdLine == NULL)
53 s = strrchr(szCmdLine, '.');
56 strcat(szCmdLine, " /C ");
57 strcat(szCmdLine, cm);
59 if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024))
66 memset(&StartupInfo, 0, sizeof(STARTUPINFOA));
67 StartupInfo.cb = sizeof(STARTUPINFOA);
70 StartupInfo.hStdOutput = hWritePipe;
71 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
73 else if ( *md == 'w' ) {
74 StartupInfo.hStdInput = hReadPipe;
75 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
78 result = CreateProcessA(szComSpec,
93 CloseHandle(hReadPipe);
94 CloseHandle(hWritePipe);
98 CloseHandle(ProcessInformation.hThread);
102 pf = _fdopen(__fileno_alloc(hReadPipe, _fmode) , "r");
103 CloseHandle(hWritePipe);
107 pf = _fdopen( __fileno_alloc(hWritePipe, _fmode) , "w");
108 CloseHandle(hReadPipe);
111 pf->_name_to_remove = ProcessInformation.hProcess;
117 int _pclose (FILE *pp)
120 if (!TerminateProcess(pp->_name_to_remove,0))
126 FILE *_wpopen (const wchar_t *cm, const wchar_t *md) /* program name, pipe mode */
128 wchar_t *szCmdLine=NULL;
129 wchar_t *szComSpec=NULL;
132 HANDLE hReadPipe, hWritePipe;
134 STARTUPINFOW StartupInfo;
135 PROCESS_INFORMATION ProcessInformation;
136 SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
138 DPRINT("_wpopen('%S', '%S')\n", cm, md);
143 szComSpec = _wgetenv(L"COMSPEC");
145 if (szComSpec == NULL)
147 szComSpec = _wcsdup(L"cmd.exe");
148 if (szComSpec == NULL)
152 s = max(wcsrchr(szComSpec, L'\\'), wcsrchr(szComSpec, L'/'));
158 szCmdLine = malloc((wcslen(s) + 4 + wcslen(cm) + 1) * sizeof(wchar_t));
159 if (szCmdLine == NULL)
165 wcscpy(szCmdLine, s);
166 s = wcsrchr(szCmdLine, L'.');
169 wcscat(szCmdLine, L" /C ");
170 wcscat(szCmdLine, cm);
172 if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024))
179 memset(&StartupInfo, 0, sizeof(STARTUPINFOW));
180 StartupInfo.cb = sizeof(STARTUPINFOW);
183 StartupInfo.hStdOutput = hWritePipe;
184 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
186 else if ( *md == L'w' ) {
187 StartupInfo.hStdInput = hReadPipe;
188 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
191 result = CreateProcessW(szComSpec,
200 &ProcessInformation);
206 CloseHandle(hReadPipe);
207 CloseHandle(hWritePipe);
211 CloseHandle(ProcessInformation.hThread);
215 pf = _wfdopen(__fileno_alloc(hReadPipe, _fmode) , L"r");
216 CloseHandle(hWritePipe);
220 pf = _wfdopen( __fileno_alloc(hWritePipe, _fmode) , L"w");
221 CloseHandle(hReadPipe);
224 pf->_name_to_remove = ProcessInformation.hProcess;