Bring back ext2 code from branch
[reactos.git] / reactos / lib / sdk / crt / stdio / popen.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/crt/??????
5 * PURPOSE: Unknown
6 * PROGRAMER: Unknown
7 * UPDATE HISTORY:
8 * 25/11/05: Created
9 */
10
11 #include <precomp.h>
12 #include <tchar.h>
13
14 #define NDEBUG
15 #include <internal/debug.h>
16
17
18 /*
19 * @implemented
20 */
21 FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */
22 {
23 _TCHAR *szCmdLine=NULL;
24 _TCHAR *szComSpec=NULL;
25 _TCHAR *s;
26 FILE *pf;
27 HANDLE hReadPipe, hWritePipe;
28 BOOL result;
29 STARTUPINFO StartupInfo;
30 PROCESS_INFORMATION ProcessInformation;
31 SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
32
33 TRACE(MK_STR(_tpopen)"('%"sT"', '%"sT"')\n", cm, md);
34
35 if (cm == NULL)
36 return( NULL );
37
38 szComSpec = _tgetenv(_T("COMSPEC"));
39 if (szComSpec == NULL)
40 {
41 szComSpec = _T("cmd.exe");
42 }
43
44 s = max(_tcsrchr(szComSpec, '\\'), _tcsrchr(szComSpec, '/'));
45 if (s == NULL)
46 s = szComSpec;
47 else
48 s++;
49
50 szCmdLine = malloc((_tcslen(s) + 4 + _tcslen(cm) + 1) * sizeof(_TCHAR));
51 if (szCmdLine == NULL)
52 {
53 return NULL;
54 }
55
56 _tcscpy(szCmdLine, s);
57 s = _tcsrchr(szCmdLine, '.');
58 if (s)
59 *s = 0;
60 _tcscat(szCmdLine, _T(" /C "));
61 _tcscat(szCmdLine, cm);
62
63 if ( !CreatePipe(&hReadPipe,&hWritePipe,&sa,1024))
64 {
65 free (szCmdLine);
66 return NULL;
67 }
68
69 memset(&StartupInfo, 0, sizeof(STARTUPINFO));
70 StartupInfo.cb = sizeof(STARTUPINFO);
71
72 if (*md == 'r' ) {
73 StartupInfo.hStdOutput = hWritePipe;
74 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
75 }
76 else if ( *md == 'w' ) {
77 StartupInfo.hStdInput = hReadPipe;
78 StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
79 }
80
81 result = CreateProcess(szComSpec,
82 szCmdLine,
83 NULL,
84 NULL,
85 TRUE,
86 0,
87 NULL,
88 NULL,
89 &StartupInfo,
90 &ProcessInformation);
91 free (szCmdLine);
92
93 if (result == FALSE)
94 {
95 CloseHandle(hReadPipe);
96 CloseHandle(hWritePipe);
97 return NULL;
98 }
99
100 CloseHandle(ProcessInformation.hThread);
101
102 if ( *md == 'r' )
103 {
104 pf = _tfdopen(alloc_fd(hReadPipe, split_oflags(_fmode)) , _T("r"));
105 CloseHandle(hWritePipe);
106 }
107 else
108 {
109 pf = _tfdopen( alloc_fd(hWritePipe, split_oflags(_fmode)) , _T("w"));
110 CloseHandle(hReadPipe);
111 }
112
113 pf->_tmpfname = ProcessInformation.hProcess;
114
115 return( pf );
116 }
117
118 #ifndef _UNICODE
119
120 /*
121 * @implemented
122 */
123 int _pclose (FILE *pp)
124 {
125 TRACE("_pclose(%x)",pp);
126
127 fclose(pp);
128 if (!TerminateProcess(pp->_tmpfname ,0))
129 return( -1 );
130 return( 0 );
131 }
132
133 #endif
134