1 /* popen and pclose are not part of win 95 and nt,
2 but it appears that _popen and _pclose "work".
3 if this won't load, use the return NULL statements. */
4
5 #include <stdio.h>
popen(char * s,char * m)6 FILE *popen(char *s, char *m) {
7 return _popen(s, m); /* return NULL; */
8 }
9
pclose(FILE * f)10 int pclose(FILE *f) {
11 return _pclose(f); /* return NULL; */
12 }
13
14 #include <windows.h>
15 #include <winbase.h>
16 #include <winsock.h>
17
18 /* system doesn't work properly in some 32/64 (WoW64) combinations */
system(char * s)19 int system(char *s) {
20 int status, n;
21 PROCESS_INFORMATION pinfo;
22 STARTUPINFO si;
23 char *cmd;
24 char app[256];
25 static char cmdexe[] = "\\cmd.exe";
26
27 memset(&si, 0, sizeof(si));
28 si.cb = sizeof(si);
29 // si.dwFlags = STARTF_USESHOWWINDOW;
30 // si.wShowWindow = SW_SHOW;
31
32 n = GetSystemDirectory(app, sizeof(app)-sizeof(cmdexe));
33 if(n > sizeof(app))
34 return -1;
35 strcat_s(app, sizeof(app), cmdexe);
36 n = strlen(s)+20;
37 cmd = malloc(n);
38 if(cmd == NULL)
39 return -1;
40 strcpy_s(cmd, n, "cmd.exe /c");
41 strcat_s(cmd, n, s);
42 if(!CreateProcess(app, cmd, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE, NULL/* env*/, NULL /*wdir*/, &si, &pinfo)){
43 fprintf(stderr, "can't create process %s %d\n", s, GetLastError());
44 free(cmd);
45 return -1;
46 }
47 free(cmd);
48 if(WaitForSingleObject(pinfo.hProcess, INFINITE) == WAIT_FAILED)
49 return -1;
50 if(!GetExitCodeProcess(pinfo.hProcess, &status))
51 status = 1;
52 //fprintf(stderr, "status %d\n", status);
53 return status;
54 }
55