further fix for floating point primitives
[ghc-hetmet.git] / ghc / InstallShield / runexe.c
index c01f0b1..c1becfb 100644 (file)
@@ -1,11 +1,38 @@
+#include <stdarg.h>
+#include <stdio.h>
 #include <windows.h>
 
 const char *prog = "runexe";
 
+#define BUFLEN 65537
+
+void die(char *fmt, ...)
+{
+  va_list ap = va_start(ap, fmt);
+
+  fprintf(stderr, "%s: ", prog);
+  vfprintf(stderr, fmt, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+void warn(char *fmt, ...)
+{
+  va_list ap = va_start(ap, fmt);
+
+  fprintf(stderr, "%s: ", prog);
+  vfprintf(stderr, fmt, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
 {
   STARTUPINFO sInfo;
   PROCESS_INFORMATION pInfo;
+  TCHAR buf[BUFLEN];
+  DWORD retCode;
 
   sInfo.cb              = sizeof(STARTUPINFO);
   sInfo.lpReserved      = NULL;
@@ -14,11 +41,19 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmd
   sInfo.lpDesktop       = NULL;
   sInfo.lpTitle         = NULL;
   sInfo.dwFlags         = 0;
-  
-  if (strlen(lpszCmdParam) == 0) {
-    printf("%s: no parameters given\n", prog);
-    exit(1);
-  }
-  CreateProcess(NULL, lpszCmdParam, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo);
-  return 0;
+
+  if (GetCurrentDirectory(BUFLEN, buf) == 0) die("couldn't get current directory");
+  if (strlen(lpszCmdParam) == 0) die("no parameters given");
+  warn("cwd: %s\n", buf);
+  warn("runexing >>>%s<<<\n", lpszCmdParam);
+  if (!CreateProcess(NULL, lpszCmdParam, NULL, NULL, TRUE, 0, NULL, NULL, &sInfo, &pInfo))
+    die("could not create process");
+
+  WaitForSingleObject(pInfo.hProcess, INFINITE);
+  if (GetExitCodeProcess(pInfo.hProcess, &retCode) == 0) retCode = -1;
+  CloseHandle(pInfo.hProcess);
+  CloseHandle(pInfo.hThread);
+  printf("return code %ld\n", retCode);
+
+  return retCode;
 }