X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/973612f5e86c9eaabc812a47d81c5cb14f672249..4858529b0c2a0d95e52f0afa32f59300e11344d1:/cmdline.c diff --git a/cmdline.c b/cmdline.c index 39f57bbf..033df64a 100644 --- a/cmdline.c +++ b/cmdline.c @@ -1,3 +1,8 @@ +/* + * cmdline.c - command-line parsing shared between many of the + * PuTTY applications + */ + #include #include #include @@ -244,6 +249,28 @@ int cmdline_process_param(char *p, char *value, int need_save, Config *cfg) cfg->portfwd[sizeof(cfg->portfwd) - 2] = '\0'; ptr[strlen(ptr)+1] = '\000'; /* append 2nd '\000' */ } + if ((!strcmp(p, "-nc"))) { + char *host, *portp; + + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + + host = portp = value; + while (*portp && *portp != ':') + portp++; + if (*portp) { + unsigned len = portp - host; + if (len >= sizeof(cfg->ssh_nc_host)) + len = sizeof(cfg->ssh_nc_host) - 1; + strncpy(cfg->ssh_nc_host, value, len); + cfg->ssh_nc_host[sizeof(cfg->ssh_nc_host) - 1] = '\0'; + cfg->ssh_nc_port = atoi(portp+1); + } else { + cmdline_error("-nc expects argument of form 'host:port'"); + return ret; + } + } if (!strcmp(p, "-m")) { char *filename, *command; int cmdlen, cmdsize; @@ -288,19 +315,33 @@ int cmdline_process_param(char *p, char *value, int need_save, Config *cfg) if (!strcmp(p, "-pw")) { RETURN(2); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - cmdline_password = value; + SAVEABLE(1); + /* We delay evaluating this until after the protocol is decided, + * so that we can warn if it's of no use with the selected protocol */ + if (cfg->protocol != PROT_SSH) + cmdline_error("the -pw option can only be used with the " + "SSH protocol"); + else { + cmdline_password = dupstr(value); + /* Assuming that `value' is directly from argv, make a good faith + * attempt to trample it, to stop it showing up in `ps' output + * on Unix-like systems. Not guaranteed, of course. */ + memset(value, 0, strlen(value)); + } } if (!strcmp(p, "-agent") || !strcmp(p, "-pagent") || !strcmp(p, "-pageant")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); cfg->tryagent = TRUE; } if (!strcmp(p, "-noagent") || !strcmp(p, "-nopagent") || !strcmp(p, "-nopageant")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); cfg->tryagent = FALSE; }