xref: /inferno-os/utils/awk/missing95.c (revision 4a062f32e3dd93bf371feb27f3ccc28d7930099e)
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