Pageant's command line handling now uses my new split_into_argv()
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 6 Aug 2002 17:57:37 +0000 (17:57 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 6 Aug 2002 17:57:37 +0000 (17:57 +0000)
function, because it's silly to have two (and because the old one
was not the same as the new one, violating the Principle of Least
Surprise).

git-svn-id: svn://svn.tartarus.org/sgt/putty@1811 cda61777-01e9-0310-a592-d414129be87e

pageant.c
puttygen.c
window.c
winstuff.h
winutils.c

index 0f423f2..d12e02b 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
@@ -1786,6 +1787,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 +1939,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;
        }
     }
 
index 072b7d0..4e2098e 100644 (file)
@@ -1384,7 +1384,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
     int argc;
     char **argv;
 
-    split_into_argv(cmdline, &argc, &argv);
+    split_into_argv(cmdline, &argc, &argv, NULL);
 
     if (argc > 0) {
        /*
index 987a845..42c42b5 100644 (file)
--- a/window.c
+++ b/window.c
@@ -312,7 +312,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
            int argc, i;
            char **argv;
            
-           split_into_argv(cmdline, &argc, &argv);
+           split_into_argv(cmdline, &argc, &argv, NULL);
 
            for (i = 0; i < argc; i++) {
                char *p = argv[i];
index 240dcb7..a2e4821 100644 (file)
@@ -32,7 +32,7 @@ struct ctlpos {
 /*
  * Exports from winutils.c.
  */
-void split_into_argv(char *, int *, char ***);
+void split_into_argv(char *, int *, char ***, char ***);
 
 /*
  * Private structure for prefslist state. Only in the header file
index f47eb1b..9d707ff 100644 (file)
@@ -4,8 +4,9 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <ctype.h>
 
-#define lenof(x) ( sizeof((x)) / sizeof(*(x)) )
+#include "misc.h"
 
 #ifdef TESTMODE
 /* Definitions to allow this module to be compiled standalone for testing. */
  * utilities which get a whole command line and must break it
  * themselves).
  * 
- * Does not modify the input command line (just in case).
+ * Does not modify the input command line.
+ * 
+ * The final parameter (argstart) is used to return a second array
+ * of char * pointers, the same length as argv, each one pointing
+ * at the start of the corresponding element of argv in the
+ * original command line. So if you get half way through processing
+ * your command line in argc/argv form and then decide you want to
+ * treat the rest as a raw string, you can. If you don't want to,
+ * `argstart' can be safely left NULL.
  */
-void split_into_argv(const char *cmdline, int *argc, char ***argv)
+void split_into_argv(char *cmdline, int *argc, char ***argv,
+                    char ***argstart)
 {
-    const char *p;
+    char *p;
     char *outputline, *q;
-    char **outputargv;
+    char **outputargv, **outputargstart;
     int outputargc;
 
     /*
@@ -124,8 +134,9 @@ void split_into_argv(const char *cmdline, int *argc, char ***argv)
      * This will guaranteeably be big enough; we can realloc it
      * down later.
      */
-    outputline = malloc(1+strlen(cmdline));
-    outputargv = malloc(sizeof(char *) * (strlen(cmdline)+1 / 2));
+    outputline = smalloc(1+strlen(cmdline));
+    outputargv = smalloc(sizeof(char *) * (strlen(cmdline)+1 / 2));
+    outputargstart = smalloc(sizeof(char *) * (strlen(cmdline)+1 / 2));
 
     p = cmdline; q = outputline; outputargc = 0;
 
@@ -137,7 +148,9 @@ void split_into_argv(const char *cmdline, int *argc, char ***argv)
        if (!*p) break;
 
        /* We have an argument; start it. */
-       outputargv[outputargc++] = q;
+       outputargv[outputargc] = q;
+       outputargstart[outputargc] = p;
+       outputargc++;
        quote = 0;
 
        /* Copy data into the argument until it's finished. */
@@ -190,10 +203,12 @@ void split_into_argv(const char *cmdline, int *argc, char ***argv)
        *q++ = '\0';
     }
 
-    outputargv = realloc(outputargv, sizeof(char *) * outputargc);
+    outputargv = srealloc(outputargv, sizeof(char *) * outputargc);
+    outputargstart = srealloc(outputargstart, sizeof(char *) * outputargc);
 
     if (argc) *argc = outputargc;
-    if (argv) *argv = outputargv;
+    if (argv) *argv = outputargv; else sfree(outputargv);
+    if (argstart) *argstart = outputargstart; else sfree(outputargstart);
 }
 
 #ifdef TESTMODE