First phase of porting. pterm now compiles and runs under Linux+gtk.
[u/mdw/putty] / pageant.c
index 0f423f2..71753c0 100644 (file)
--- a/pageant.c
+++ b/pageant.c
@@ -15,6 +15,7 @@
 #include "ssh.h"
 #include "misc.h"
 #include "tree234.h"
+#include "winstuff.h"
 
 #define IDI_MAINICON 200
 #define IDI_TRAYICON 201
@@ -58,6 +59,22 @@ static char *putty_path;
 #define PUTTY_DEFAULT     "Default%20Settings"
 static int initial_menuitems_count;
 
+/*
+ * Print a modal (Really Bad) message box and perform a fatal exit.
+ */
+void modalfatalbox(char *fmt, ...)
+{
+    va_list ap;
+    char stuff[200];
+
+    va_start(ap, fmt);
+    vsprintf(stuff, fmt, ap);
+    va_end(ap);
+    MessageBox(main_hwnd, stuff, "Pageant Fatal Error",
+              MB_SYSTEMMODAL | MB_ICONERROR | MB_OK);
+    exit(1);
+}
+
 /* Un-munge session names out of the registry. */
 static void unmungestr(char *in, char *out, int outlen)
 {
@@ -606,7 +623,7 @@ static void add_keyfile(char *filename)
            agent_query(request, reqlen, &vresponse, &resplen);
            response = vresponse;
            if (resplen < 5 || response[4] != SSH_AGENT_SUCCESS)
-               MessageBox(NULL, "The already running Pageant"
+               MessageBox(NULL, "The already running Pageant "
                           "refused to add the key.", APPNAME,
                           MB_OK | MB_ICONERROR);
 
@@ -1595,14 +1612,17 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                keylist = CreateDialog(instance, MAKEINTRESOURCE(211),
                                       NULL, KeyListProc);
                ShowWindow(keylist, SW_SHOWNORMAL);
-               /* 
-                * Sometimes the window comes up minimised / hidden
-                * for no obvious reason. Prevent this.
-                */
-               SetForegroundWindow(keylist);
-               SetWindowPos(keylist, HWND_TOP, 0, 0, 0, 0,
-                            SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
            }
+           /* 
+            * Sometimes the window comes up minimised / hidden for
+            * no obvious reason. Prevent this. This also brings it
+            * to the front if it's already present (the user
+            * selected View Keys because they wanted to _see_ the
+            * thing).
+            */
+           SetForegroundWindow(keylist);
+           SetWindowPos(keylist, HWND_TOP, 0, 0, 0, 0,
+                        SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
            break;
          case IDM_ADDKEY:
            if (passphrase_box) {
@@ -1786,6 +1806,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
     HMODULE advapi;
     char *command = NULL;
     int added_keys = 0;
+    int argc, i;
+    char **argv, **argstart;
 
     /*
      * Determine whether we're an NT system (should have security
@@ -1936,46 +1958,23 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
 
     /*
      * Process the command line and add keys as listed on it.
-     * If we already determined that we need to spawn a program from above we
-     * need to ignore the first two arguments. [DBW]
      */
-    {
-       char *p;
-       int inquotes = 0;
-       p = cmdline;
-       while (*p) {
-           while (*p && isspace(*p))
-               p++;
-               if (*p && !isspace(*p)) {
-               char *q = p, *pp = p;
-               while (*p && (inquotes || !isspace(*p))) {
-                       if (*p == '"') {
-                       inquotes = !inquotes;
-                       p++;
-                       continue;
-                   }
-                   *pp++ = *p++;
-               }
-               if (*pp) {
-                   if (*p)
-                       p++;
-                   *pp++ = '\0';
-               }
-               if (!strcmp(q, "-c")) {
-                   /*
-                    * If we see `-c', then the rest of the
-                    * command line should be treated as a
-                    * command to be spawned.
-                    */
-                   while (*p && isspace(*p))
-                       p++;
-                   command = p;
-                   break;
-               } else {
-                   add_keyfile(q);
-                   added_keys = TRUE;
-               }
-           }
+    split_into_argv(cmdline, &argc, &argv, &argstart);
+    for (i = 0; i < argc; i++) {
+       if (!strcmp(argv[i], "-c")) {
+           /*
+            * If we see `-c', then the rest of the
+            * command line should be treated as a
+            * command to be spawned.
+            */
+           if (i < argc-1)
+               command = argstart[i+1];
+           else
+               command = "";
+           break;
+       } else {
+           add_keyfile(argv[i]);
+           added_keys = TRUE;
        }
     }
 
@@ -2017,8 +2016,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
      * Main message loop.
      */
     while (GetMessage(&msg, NULL, 0, 0) == 1) {
-       TranslateMessage(&msg);
-       DispatchMessage(&msg);
+       if (!(IsWindow(keylist) && IsDialogMessage(keylist, &msg)) &&
+           !(IsWindow(aboutbox) && IsDialogMessage(aboutbox, &msg))) {
+           TranslateMessage(&msg);
+           DispatchMessage(&msg);
+       }
     }
 
     /* Clean up the system tray icon */