X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/46a3419bd5693b8b3e42290e370d10aa82c67b61..33f07e9636e80bb17f25f97145ca2e0eb262db30:/cmdline.c diff --git a/cmdline.c b/cmdline.c index 0038ad17..a67b0132 100644 --- a/cmdline.c +++ b/cmdline.c @@ -51,6 +51,14 @@ static void cmdline_save_param(char *p, char *value, int pri) saves[pri].nsaved++; } +void cmdline_cleanup(void) +{ + int pri; + + for (pri = 0; pri < NPRIORITIES; pri++) + sfree(saves[pri].params); +} + #define SAVEABLE(pri) do { \ if (need_save) { cmdline_save_param(p, value, pri); return ret; } \ } while (0) @@ -103,6 +111,12 @@ static int cmdline_check_unavailable(int flag, char *p) * Process a standard command-line parameter. `p' is the parameter * in question; `value' is the subsequent element of argv, which * may or may not be required as an operand to the parameter. + * If `need_save' is 1, arguments which need to be saved as + * described at this top of this file are, for later execution; + * if 0, they are processed normally. (-1 is a special value used + * by pterm to count arguments for a preliminary pass through the + * argument list; it causes immediate return with an appropriate + * value with no action taken.) * Return value is 2 if both arguments were used; 1 if only p was * used; 0 if the parameter wasn't one we recognised; -2 if it * should have been 2 but value was NULL. @@ -166,44 +180,47 @@ int cmdline_process_param(char *p, char *value, int need_save, Config *cfg) strncpy(cfg->username, value, sizeof(cfg->username)); cfg->username[sizeof(cfg->username) - 1] = '\0'; } - if ((!strcmp(p, "-L") || !strcmp(p, "-R"))) { + if ((!strcmp(p, "-L") || !strcmp(p, "-R") || !strcmp(p, "-D"))) { char *fwd, *ptr, *q, *qq; - int i=0; + int dynamic, i=0; RETURN(2); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); SAVEABLE(0); + dynamic = !strcmp(p, "-D"); fwd = value; ptr = cfg->portfwd; /* if multiple forwards, find end of list */ - if (ptr[0]=='R' || ptr[0]=='L') { + if (ptr[0]=='R' || ptr[0]=='L' || ptr[0] == 'D') { for (i = 0; i < sizeof(cfg->portfwd) - 2; i++) if (ptr[i]=='\000' && ptr[i+1]=='\000') break; ptr = ptr + i + 1; /* point to next forward slot */ } - ptr[0] = p[1]; /* insert a 'L' or 'R' at the start */ + ptr[0] = p[1]; /* insert a 'L', 'R' or 'D' at the start */ if (strlen(fwd) > sizeof(cfg->portfwd) - i - 2) { cmdline_error("out of space for port forwardings"); return ret; } strncpy(ptr+1, fwd, sizeof(cfg->portfwd) - i); - /* - * We expect _at least_ two colons in this string. The - * possible formats are `sourceport:desthost:destport', or - * `sourceip:sourceport:desthost:destport' if you're - * specifying a particular loopback address. We need to - * replace the one between source and dest with a \t; this - * means we must find the second-to-last colon in the - * string. - */ - q = qq = strchr(ptr, ':'); - while (qq) { - char *qqq = strchr(qq+1, ':'); - if (qqq) - q = qq; - qq = qqq; + if (!dynamic) { + /* + * We expect _at least_ two colons in this string. The + * possible formats are `sourceport:desthost:destport', + * or `sourceip:sourceport:desthost:destport' if you're + * specifying a particular loopback address. We need to + * replace the one between source and dest with a \t; + * this means we must find the second-to-last colon in + * the string. + */ + q = qq = strchr(ptr, ':'); + while (qq) { + char *qqq = strchr(qq+1, ':'); + if (qqq) + q = qq; + qq = qqq; + } + if (q) *q = '\t'; /* replace second-last colon with \t */ } - if (q) *q = '\t'; /* replace second-last colon with \t */ cfg->portfwd[sizeof(cfg->portfwd) - 1] = '\0'; cfg->portfwd[sizeof(cfg->portfwd) - 2] = '\0'; ptr[strlen(ptr)+1] = '\000'; /* append two '\000' */