From d3a1a808f65812c591ef0de3e61a94b13aa73160 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 6 Aug 2002 17:57:37 +0000 Subject: [PATCH] Pageant's command line handling now uses my new split_into_argv() 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 | 58 +++++++++++++++++++--------------------------------------- puttygen.c | 2 +- window.c | 2 +- winstuff.h | 2 +- winutils.c | 35 +++++++++++++++++++++++++---------- 5 files changed, 47 insertions(+), 52 deletions(-) diff --git a/pageant.c b/pageant.c index 0f423f2d..d12e02b4 100644 --- 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; } } diff --git a/puttygen.c b/puttygen.c index 072b7d05..4e2098e2 100644 --- a/puttygen.c +++ b/puttygen.c @@ -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) { /* diff --git a/window.c b/window.c index 987a8450..42c42b5b 100644 --- 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]; diff --git a/winstuff.h b/winstuff.h index 240dcb7b..a2e48218 100644 --- a/winstuff.h +++ b/winstuff.h @@ -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 diff --git a/winutils.c b/winutils.c index f47eb1b5..9d707ff1 100644 --- a/winutils.c +++ b/winutils.c @@ -4,8 +4,9 @@ #include #include +#include -#define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) +#include "misc.h" #ifdef TESTMODE /* Definitions to allow this module to be compiled standalone for testing. */ @@ -20,13 +21,22 @@ * 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 -- 2.11.0