#include "ssh.h"
#include "misc.h"
#include "tree234.h"
+#include "winstuff.h"
#define IDI_MAINICON 200
#define IDI_TRAYICON 201
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
/*
* 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;
}
}
#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;
/*
* 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;
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. */
*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