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