40cf63de87af85ffdf288fdd0fdec9fc9c8ee861
[reactos.git] / lib / crtdll / stdio / popen.c
1
2 #include <windows.h>
3 #include <msvcrt/io.h>
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>
9
10
11 /*
12  * @unimplemented
13  */
14 FILE *_popen (const char *cm, const char *md) /* program name, pipe mode */
15 {
16   FILE *pf;
17   HANDLE hReadPipe, hWritePipe;
18   STARTUPINFOA StartupInfo;
19   PROCESS_INFORMATION ProcessInformation;
20
21   // fixme CreatePipe
22
23 //  if ( !CreatePipe(&hReadPipe,&hWritePipe,NULL,1024))
24 //              return NULL;    
25
26   StartupInfo.cb = sizeof(StartupInfo);
27   if ( md == "r" ) {
28         StartupInfo.hStdOutput = hWritePipe;
29   }
30   else if ( md == "w" ) {
31         StartupInfo.hStdInput = hReadPipe;
32   }
33         
34   if (CreateProcessA("cmd.exe",(char *)cm,NULL,NULL,TRUE,
35                      CREATE_NEW_CONSOLE,NULL,NULL,
36                      &StartupInfo,
37                      &ProcessInformation) == FALSE)
38     return NULL;
39
40
41   if ( *md == 'r' ) {
42         pf =  _fdopen( __fileno_alloc(hReadPipe,  _fmode) , "r" );
43   }
44   else {
45         pf =  _fdopen( __fileno_alloc(hWritePipe, _fmode) , "w" );
46   }
47
48   pf->_name_to_remove = ProcessInformation.hProcess;
49
50   return pf;
51         
52
53 }
54
55
56 /*
57  * @unimplemented
58  */
59 int
60 _pclose (FILE *pp)
61 {
62         
63         fclose(pp);
64         printf("Terminate Process\n");
65 //      if (!TerminateProcess(pp->_name_to_remove,0))
66 //              return -1;
67         return 0;
68 }