diff options
author | kmscode <kmscode@users.noreply.github.com> | 2021-07-03 16:51:10 +0300 |
---|---|---|
committer | kmscode <kmscode@users.noreply.github.com> | 2021-07-03 16:51:10 +0300 |
commit | 1b6701c760c21673e37013cfe3f065944489283e (patch) | |
tree | d69bdba7824a4ea1de1c5fb5798c183eb70f5323 /CMDLINE.C | |
parent | 445a934bb702450f6bb63824eb2b387511271749 (diff) |
PuTTY 0.75 from upstream
Diffstat (limited to 'CMDLINE.C')
-rw-r--r-- | CMDLINE.C | 742 |
1 files changed, 360 insertions, 382 deletions
@@ -14,14 +14,14 @@ * eventual running configuration. For this we use the macro * SAVEABLE, which notices if the `need_save' parameter is set and * saves the parameter and value on a list. - * + * * We also assign priorities to saved parameters, just to slightly * ameliorate silly ordering problems. For example, if you specify * a saved session to load, it will be loaded _before_ all your * local modifications such as -L are evaluated; and if you specify * a protocol and a port, the protocol is set up first so that the * port can override its choice of port number. - * + * * (In fact -load is not saved at all, since in at least Plink the * processing of further command-line options depends on whether or * not the loaded session contained a hostname. So it must be @@ -59,16 +59,16 @@ void cmdline_cleanup(void) int pri; if (cmdline_password) { - smemclr(cmdline_password, strlen(cmdline_password)); - sfree(cmdline_password); - cmdline_password = NULL; + smemclr(cmdline_password, strlen(cmdline_password)); + sfree(cmdline_password); + cmdline_password = NULL; } - + for (pri = 0; pri < NPRIORITIES; pri++) { - sfree(saves[pri].params); - saves[pri].params = NULL; - saves[pri].savesize = 0; - saves[pri].nsaved = 0; + sfree(saves[pri].params); + saves[pri].params = NULL; + saves[pri].savesize = 0; + saves[pri].nsaved = 0; } } @@ -91,7 +91,7 @@ int cmdline_get_passwd_input(prompts_t *p) * that comes in a prompt-set on its own. */ if (!cmdline_password || p->n_prompts != 1 || p->prompts[0]->echo) { - return -1; + return -1; } /* @@ -99,7 +99,7 @@ int cmdline_get_passwd_input(prompts_t *p) * to try). */ if (tried_once) - return 0; + return 0; prompt_set_result(p->prompts[0], cmdline_password); smemclr(cmdline_password, strlen(cmdline_password)); @@ -109,23 +109,11 @@ int cmdline_get_passwd_input(prompts_t *p) return 1; } -/* - * Here we have a flags word which describes the capabilities of - * the particular tool on whose behalf we're running. We will - * refuse certain command-line options if a particular tool - * inherently can't do anything sensible. For example, the file - * transfer tools (psftp, pscp) can't do a great deal with protocol - * selections (ever tried running scp over telnet?) or with port - * forwarding (even if it wasn't a hideously bad idea, they don't - * have the select/poll infrastructure to make them work). - */ -int cmdline_tooltype = 0; - static bool cmdline_check_unavailable(int flag, const char *p) { if (cmdline_tooltype & flag) { - cmdline_error("option \"%s\" not available in this tool", p); - return true; + cmdline_error("option \"%s\" not available in this tool", p); + return true; } return false; } @@ -157,6 +145,24 @@ static bool cmdline_check_unavailable(int flag, const char *p) static bool seen_hostname_argument = false; static bool seen_port_argument = false; +static bool seen_verbose_option = false; +static bool loaded_session = false; +bool cmdline_verbose(void) { return seen_verbose_option; } +bool cmdline_seat_verbose(Seat *seat) { return cmdline_verbose(); } +bool cmdline_lp_verbose(LogPolicy *lp) { return cmdline_verbose(); } +bool cmdline_loaded_session(void) { return loaded_session; } + +static void set_protocol(Conf *conf, int protocol) +{ + settings_set_default_protocol(protocol); + conf_set_int(conf, CONF_protocol, protocol); +} + +static void set_port(Conf *conf, int port) +{ + settings_set_default_port(port); + conf_set_int(conf, CONF_port, port); +} int cmdline_process_param(const char *p, char *value, int need_save, Conf *conf) @@ -275,9 +281,7 @@ int cmdline_process_param(const char *p, char *value, backend_vt_from_name(prefix); if (vt) { - default_protocol = vt->protocol; - conf_set_int(conf, CONF_protocol, - default_protocol); + set_protocol(conf, vt->protocol); port_override = vt->default_port; } else { cmdline_error("unrecognised protocol prefix '%s'", @@ -325,11 +329,11 @@ int cmdline_process_param(const char *p, char *value, !loaded_session) { /* * For some tools, we equivocate between a - * hostname argument and an argument naming a - * saved session. Here we attempt to load a - * session with the specified name, and if that - * session exists and is launchable, we overwrite - * the entire Conf with it. + * hostname argument and an argument naming a + * saved session. Here we attempt to load a + * session with the specified name, and if that + * session exists and is launchable, we overwrite + * the entire Conf with it. * * We skip this check if a -load option has * already happened, so that @@ -345,7 +349,7 @@ int cmdline_process_param(const char *p, char *value, * So if that was the behaviour someone wanted, * then they could get it by leaving off the * -load completely.) - */ + */ Conf *conf2 = conf_new(); if (do_defaults(hostname_after_user, conf2) && conf_launchable(conf2)) { @@ -393,92 +397,54 @@ int cmdline_process_param(const char *p, char *value, } } -#ifdef PUTTYNG - if (!stricmp(p, "-hwndparent")) { - RETURN(2); - hwnd_parent = atoi(value); - return 2; - } -#endif - if (!strcmp(p, "-load")) { - RETURN(2); - /* This parameter must be processed immediately rather than being - * saved. */ - do_defaults(value, conf); - loaded_session = true; - cmdline_session_name = dupstr(value); - return 2; - } - if (!strcmp(p, "-ssh")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - default_protocol = PROT_SSH; - default_port = 22; - conf_set_int(conf, CONF_protocol, default_protocol); - conf_set_int(conf, CONF_port, default_port); - return 1; - } - if (!strcmp(p, "-telnet")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - default_protocol = PROT_TELNET; - default_port = 23; - conf_set_int(conf, CONF_protocol, default_protocol); - conf_set_int(conf, CONF_port, default_port); - return 1; - } - if (!strcmp(p, "-rlogin")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - default_protocol = PROT_RLOGIN; - default_port = 513; - conf_set_int(conf, CONF_protocol, default_protocol); - conf_set_int(conf, CONF_port, default_port); - return 1; - } - if (!strcmp(p, "-raw")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - default_protocol = PROT_RAW; - conf_set_int(conf, CONF_protocol, default_protocol); - } - if (!strcmp(p, "-serial")) { - RETURN(1); - /* Serial is not NONNETWORK in an odd sense of the word */ - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - default_protocol = PROT_SERIAL; - conf_set_int(conf, CONF_protocol, default_protocol); - /* The host parameter will already be loaded into CONF_host, - * so copy it across */ - conf_set_str(conf, CONF_serline, conf_get_str(conf, CONF_host)); + RETURN(2); + /* This parameter must be processed immediately rather than being + * saved. */ + do_defaults(value, conf); + loaded_session = true; + return 2; + } + for (size_t i = 0; backends[i]; i++) { + if (p[0] == '-' && !strcmp(p+1, backends[i]->id)) { + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + set_protocol(conf, backends[i]->protocol); + if (backends[i]->default_port) + set_port(conf, backends[i]->default_port); + if (backends[i]->protocol == PROT_SERIAL) { + /* Special handling: the 'where to connect to' argument will + * have been placed into CONF_host, but for this protocol, it + * needs to be in CONF_serline */ + conf_set_str(conf, CONF_serline, + conf_get_str(conf, CONF_host)); + } + return 1; + } } if (!strcmp(p, "-v")) { - RETURN(1); - flags |= FLAG_VERBOSE; + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NO_VERBOSE_OPTION); + seen_verbose_option = true; } if (!strcmp(p, "-l")) { - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_str(conf, CONF_username, value); + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_str(conf, CONF_username, value); } if (!strcmp(p, "-loghost")) { - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_str(conf, CONF_loghost, value); + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_str(conf, CONF_loghost, value); } if (!strcmp(p, "-hostkey")) { char *dup; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); dup = dupstr(value); if (!validate_manual_hostkey(dup)) { cmdline_error("'%s' is not a valid format for a manual host " @@ -486,51 +452,51 @@ int cmdline_process_param(const char *p, char *value, sfree(dup); return ret; } - conf_set_str_str(conf, CONF_ssh_manual_hostkeys, dup, ""); + conf_set_str_str(conf, CONF_ssh_manual_hostkeys, dup, ""); sfree(dup); } if ((!strcmp(p, "-L") || !strcmp(p, "-R") || !strcmp(p, "-D"))) { - char type, *q, *qq, *key, *val; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - if (strcmp(p, "-D")) { - /* + char type, *q, *qq, *key, *val; + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + if (strcmp(p, "-D")) { + /* * For -L or -R forwarding types: * - * 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. - * - * (This looks like a foolish way of doing it given the - * existence of strrchr, but it's more efficient than - * two strrchrs - not to mention that the second strrchr - * would require us to modify the input string!) - */ + * 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. + * + * (This looks like a foolish way of doing it given the + * existence of strrchr, but it's more efficient than + * two strrchrs - not to mention that the second strrchr + * would require us to modify the input string!) + */ type = p[1]; /* 'L' or 'R' */ - q = qq = host_strchr(value, ':'); - while (qq) { - char *qqq = host_strchr(qq+1, ':'); - if (qqq) - q = qq; - qq = qqq; - } - - if (!q) { - cmdline_error("-%c expects at least two colons in its" - " argument", type); - return ret; - } - - key = dupprintf("%c%.*s", type, (int)(q - value), value); - val = dupstr(q+1); - } else { + q = qq = host_strchr(value, ':'); + while (qq) { + char *qqq = host_strchr(qq+1, ':'); + if (qqq) + q = qq; + qq = qqq; + } + + if (!q) { + cmdline_error("-%c expects at least two colons in its" + " argument", type); + return ret; + } + + key = dupprintf("%c%.*s", type, (int)(q - value), value); + val = dupstr(q+1); + } else { /* * Dynamic port forwardings are entered under the same key * as if they were local (because they occupy the same @@ -540,313 +506,327 @@ int cmdline_process_param(const char *p, char *value, * anything in the ordinary -L case by containing no * colon). */ - key = dupprintf("L%s", value); - val = dupstr("D"); - } - conf_set_str_str(conf, CONF_portfwd, key, val); - sfree(key); - sfree(val); + key = dupprintf("L%s", value); + val = dupstr("D"); + } + conf_set_str_str(conf, CONF_portfwd, key, val); + sfree(key); + sfree(val); } if ((!strcmp(p, "-nc"))) { - char *host, *portp; + char *host, *portp; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); - portp = host_strchr(value, ':'); - if (!portp) { - cmdline_error("-nc expects argument of form 'host:port'"); - return ret; - } + portp = host_strchr(value, ':'); + if (!portp) { + cmdline_error("-nc expects argument of form 'host:port'"); + return ret; + } - host = dupprintf("%.*s", (int)(portp - value), value); - conf_set_str(conf, CONF_ssh_nc_host, host); - conf_set_int(conf, CONF_ssh_nc_port, atoi(portp + 1)); + host = dupprintf("%.*s", (int)(portp - value), value); + conf_set_str(conf, CONF_ssh_nc_host, host); + conf_set_int(conf, CONF_ssh_nc_port, atoi(portp + 1)); sfree(host); } if (!strcmp(p, "-m")) { - const char *filename; - FILE *fp; + const char *filename; + FILE *fp; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); - filename = value; + filename = value; - fp = fopen(filename, "r"); - if (!fp) { - cmdline_error("unable to open command file \"%s\"", filename); - return ret; - } + fp = fopen(filename, "r"); + if (!fp) { + cmdline_error("unable to open command file \"%s\"", filename); + return ret; + } strbuf *command = strbuf_new(); char readbuf[4096]; - while (1) { + while (1) { size_t nread = fread(readbuf, 1, sizeof(readbuf), fp); if (nread == 0) break; put_data(command, readbuf, nread); - } - fclose(fp); - conf_set_str(conf, CONF_remote_cmd, command->s); - conf_set_str(conf, CONF_remote_cmd2, ""); - conf_set_bool(conf, CONF_nopty, true); /* command => no terminal */ - strbuf_free(command); + } + fclose(fp); + conf_set_str(conf, CONF_remote_cmd, command->s); + conf_set_str(conf, CONF_remote_cmd2, ""); + conf_set_bool(conf, CONF_nopty, true); /* command => no terminal */ + strbuf_free(command); } if (!strcmp(p, "-P")) { - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(1); /* lower priority than -ssh,-telnet */ - conf_set_int(conf, CONF_port, atoi(value)); + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(1); /* lower priority than -ssh, -telnet, etc */ + conf_set_int(conf, CONF_port, atoi(value)); } if (!strcmp(p, "-pw")) { - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - 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 (conf_get_int(conf, CONF_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. */ - smemclr(value, strlen(value)); - } + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + 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 (conf_get_int(conf, CONF_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. */ + smemclr(value, strlen(value)); + } } if (!strcmp(p, "-agent") || !strcmp(p, "-pagent") || - !strcmp(p, "-pageant")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_tryagent, true); + !strcmp(p, "-pageant")) { + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_tryagent, true); } if (!strcmp(p, "-noagent") || !strcmp(p, "-nopagent") || - !strcmp(p, "-nopageant")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_tryagent, false); + !strcmp(p, "-nopageant")) { + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_tryagent, false); } if (!strcmp(p, "-share")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_ssh_connection_sharing, true); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_ssh_connection_sharing, true); } if (!strcmp(p, "-noshare")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_ssh_connection_sharing, false); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_ssh_connection_sharing, false); } if (!strcmp(p, "-A")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_agentfwd, true); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_agentfwd, true); } if (!strcmp(p, "-a")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_agentfwd, false); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_agentfwd, false); } if (!strcmp(p, "-X")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_x11_forward, true); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_x11_forward, true); } if (!strcmp(p, "-x")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_x11_forward, false); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_x11_forward, false); } if (!strcmp(p, "-t")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(1); /* lower priority than -m */ - conf_set_bool(conf, CONF_nopty, false); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(1); /* lower priority than -m */ + conf_set_bool(conf, CONF_nopty, false); } if (!strcmp(p, "-T")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(1); - conf_set_bool(conf, CONF_nopty, true); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(1); + conf_set_bool(conf, CONF_nopty, true); } if (!strcmp(p, "-N")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_ssh_no_shell, true); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_ssh_no_shell, true); } if (!strcmp(p, "-C")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_bool(conf, CONF_compression, true); + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_bool(conf, CONF_compression, true); } if (!strcmp(p, "-1")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_int(conf, CONF_sshprot, 0); /* ssh protocol 1 only */ + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_int(conf, CONF_sshprot, 0); /* ssh protocol 1 only */ } if (!strcmp(p, "-2")) { - RETURN(1); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - conf_set_int(conf, CONF_sshprot, 3); /* ssh protocol 2 only */ + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_int(conf, CONF_sshprot, 3); /* ssh protocol 2 only */ } if (!strcmp(p, "-i")) { - Filename *fn; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - fn = filename_from_str(value); - conf_set_filename(conf, CONF_keyfile, fn); + Filename *fn; + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + fn = filename_from_str(value); + conf_set_filename(conf, CONF_keyfile, fn); filename_free(fn); } if (!strcmp(p, "-4") || !strcmp(p, "-ipv4")) { - RETURN(1); - SAVEABLE(1); - conf_set_int(conf, CONF_addressfamily, ADDRTYPE_IPV4); + RETURN(1); + SAVEABLE(1); + conf_set_int(conf, CONF_addressfamily, ADDRTYPE_IPV4); } if (!strcmp(p, "-6") || !strcmp(p, "-ipv6")) { - RETURN(1); - SAVEABLE(1); - conf_set_int(conf, CONF_addressfamily, ADDRTYPE_IPV6); + RETURN(1); + SAVEABLE(1); + conf_set_int(conf, CONF_addressfamily, ADDRTYPE_IPV6); } if (!strcmp(p, "-sercfg")) { - char* nextitem; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); - SAVEABLE(1); - if (conf_get_int(conf, CONF_protocol) != PROT_SERIAL) - cmdline_error("the -sercfg option can only be used with the " - "serial protocol"); - /* Value[0] contains one or more , separated values, like 19200,8,n,1,X */ - nextitem = value; - while (nextitem[0] != '\0') { - int length, skip; - char *end = strchr(nextitem, ','); - if (!end) { - length = strlen(nextitem); - skip = 0; - } else { - length = end - nextitem; - nextitem[length] = '\0'; - skip = 1; - } - if (length == 1) { - switch (*nextitem) { - case '1': - case '2': - conf_set_int(conf, CONF_serstopbits, 2 * (*nextitem-'0')); - break; - - case '5': - case '6': - case '7': - case '8': - case '9': - conf_set_int(conf, CONF_serdatabits, *nextitem-'0'); - break; - - case 'n': - conf_set_int(conf, CONF_serparity, SER_PAR_NONE); - break; - case 'o': - conf_set_int(conf, CONF_serparity, SER_PAR_ODD); - break; - case 'e': - conf_set_int(conf, CONF_serparity, SER_PAR_EVEN); - break; - case 'm': - conf_set_int(conf, CONF_serparity, SER_PAR_MARK); - break; - case 's': - conf_set_int(conf, CONF_serparity, SER_PAR_SPACE); - break; - - case 'N': - conf_set_int(conf, CONF_serflow, SER_FLOW_NONE); - break; - case 'X': - conf_set_int(conf, CONF_serflow, SER_FLOW_XONXOFF); - break; - case 'R': - conf_set_int(conf, CONF_serflow, SER_FLOW_RTSCTS); - break; - case 'D': - conf_set_int(conf, CONF_serflow, SER_FLOW_DSRDTR); - break; - - default: - cmdline_error("Unrecognised suboption \"-sercfg %c\"", - *nextitem); - } - } else if (length == 3 && !strncmp(nextitem,"1.5",3)) { - /* Messy special case */ - conf_set_int(conf, CONF_serstopbits, 3); - } else { - int serspeed = atoi(nextitem); - if (serspeed != 0) { - conf_set_int(conf, CONF_serspeed, serspeed); - } else { - cmdline_error("Unrecognised suboption \"-sercfg %s\"", - nextitem); - } - } - nextitem += length + skip; - } + char* nextitem; + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(1); + if (conf_get_int(conf, CONF_protocol) != PROT_SERIAL) + cmdline_error("the -sercfg option can only be used with the " + "serial protocol"); + /* Value[0] contains one or more , separated values, like 19200,8,n,1,X */ + nextitem = value; + while (nextitem[0] != '\0') { + int length, skip; + char *end = strchr(nextitem, ','); + if (!end) { + length = strlen(nextitem); + skip = 0; + } else { + length = end - nextitem; + nextitem[length] = '\0'; + skip = 1; + } + if (length == 1) { + switch (*nextitem) { + case '1': + case '2': + conf_set_int(conf, CONF_serstopbits, 2 * (*nextitem-'0')); + break; + + case '5': + case '6': + case '7': + case '8': + case '9': + conf_set_int(conf, CONF_serdatabits, *nextitem-'0'); + break; + + case 'n': + conf_set_int(conf, CONF_serparity, SER_PAR_NONE); + break; + case 'o': + conf_set_int(conf, CONF_serparity, SER_PAR_ODD); + break; + case 'e': + conf_set_int(conf, CONF_serparity, SER_PAR_EVEN); + break; + case 'm': + conf_set_int(conf, CONF_serparity, SER_PAR_MARK); + break; + case 's': + conf_set_int(conf, CONF_serparity, SER_PAR_SPACE); + break; + + case 'N': + conf_set_int(conf, CONF_serflow, SER_FLOW_NONE); + break; + case 'X': + conf_set_int(conf, CONF_serflow, SER_FLOW_XONXOFF); + break; + case 'R': + conf_set_int(conf, CONF_serflow, SER_FLOW_RTSCTS); + break; + case 'D': + conf_set_int(conf, CONF_serflow, SER_FLOW_DSRDTR); + break; + + default: + cmdline_error("Unrecognised suboption \"-sercfg %c\"", + *nextitem); + } + } else if (length == 3 && !strncmp(nextitem,"1.5",3)) { + /* Messy special case */ + conf_set_int(conf, CONF_serstopbits, 3); + } else { + int serspeed = atoi(nextitem); + if (serspeed != 0) { + conf_set_int(conf, CONF_serspeed, serspeed); + } else { + cmdline_error("Unrecognised suboption \"-sercfg %s\"", + nextitem); + } + } + nextitem += length + skip; + } } if (!strcmp(p, "-sessionlog")) { - Filename *fn; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); - /* but available even in TOOLTYPE_NONNETWORK, cf pterm "-log" */ - SAVEABLE(0); - fn = filename_from_str(value); - conf_set_filename(conf, CONF_logfilename, fn); - conf_set_int(conf, CONF_logtype, LGTYP_DEBUG); + Filename *fn; + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); + /* but available even in TOOLTYPE_NONNETWORK, cf pterm "-log" */ + SAVEABLE(0); + fn = filename_from_str(value); + conf_set_filename(conf, CONF_logfilename, fn); + conf_set_int(conf, CONF_logtype, LGTYP_DEBUG); filename_free(fn); } if (!strcmp(p, "-sshlog") || !strcmp(p, "-sshrawlog")) { - Filename *fn; - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); - fn = filename_from_str(value); - conf_set_filename(conf, CONF_logfilename, fn); - conf_set_int(conf, CONF_logtype, + Filename *fn; + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + fn = filename_from_str(value); + conf_set_filename(conf, CONF_logfilename, fn); + conf_set_int(conf, CONF_logtype, !strcmp(p, "-sshlog") ? LGTYP_PACKETS : /* !strcmp(p, "-sshrawlog") ? */ LGTYP_SSHRAW); filename_free(fn); } + if (!strcmp(p, "-logoverwrite")) { + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_int(conf, CONF_logxfovr, LGXF_OVR); + } + + if (!strcmp(p, "-logappend")) { + RETURN(1); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); + conf_set_int(conf, CONF_logxfovr, LGXF_APN); + } + if (!strcmp(p, "-proxycmd")) { - RETURN(2); - UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); - SAVEABLE(0); + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); + SAVEABLE(0); conf_set_int(conf, CONF_proxy_type, PROXY_CMD); - conf_set_str(conf, CONF_proxy_telnet_command, value); + conf_set_str(conf, CONF_proxy_telnet_command, value); } #ifdef _WINDOWS @@ -855,22 +835,20 @@ int cmdline_process_param(const char *p, char *value, */ if (!strcmp(p, "-restrict-acl") || !strcmp(p, "-restrict_acl") || !strcmp(p, "-restrictacl")) { - RETURN(1); + RETURN(1); restrict_process_acl(); - restricted_acl = true; } #endif - return ret; /* unrecognised */ + return ret; /* unrecognised */ } void cmdline_run_saved(Conf *conf) { - int pri, i; - for (pri = 0; pri < NPRIORITIES; pri++) { - for (i = 0; i < saves[pri].nsaved; i++) { - cmdline_process_param(saves[pri].params[i].p, - saves[pri].params[i].value, 0, conf); + for (size_t pri = 0; pri < NPRIORITIES; pri++) { + for (size_t i = 0; i < saves[pri].nsaved; i++) { + cmdline_process_param(saves[pri].params[i].p, + saves[pri].params[i].value, 0, conf); sfree(saves[pri].params[i].p); sfree(saves[pri].params[i].value); } |