mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
Change type of CONF_username to the new CONF_TYPE_STR_AMBI.
This is the pathfinding change that proves it's possible for _one_ Conf setting to become Unicode-capable. That seems like quite a small reward for all the refactoring in the previous patches this week! But changing over one configuration setting is enough to get started with: once all the bugs are out of this one, we can try switching over some more. Changing the type to CONF_TYPE_STR_AMBI is enough by itself to make the configuration dialog box write it into Conf as UTF-8, because conf_editbox_handler automatically checks whether that possibility is available. However, setting the same Conf entry from the command line isn't automatic: I had to add code in the handler for the -l command-line option in cmdline.c. This commit also doesn't yet handle the _other_ way to specify a username on the command line: including it as part of the hostname argument via "putty user@host" or similar. That's more difficult, because it also requires deciding what to do about UTF-8 in the actual hostname. (That looks as if it ought to be possible: Windows should be able to handle looking up Unicode hostnames if you use GetAddrInfoW() in place of getaddrinfo(). But plumbing it through everything in between cmdline.c and windows/network.c is a bigger job than I'm prepared to do in this proof-of-concept commit.)
This commit is contained in:
parent
841bf321d4
commit
b57fb48b27
@ -195,6 +195,7 @@ int cmdline_process_param(CmdlineArg *arg, CmdlineArg *nextarg,
|
||||
{
|
||||
int ret = 0;
|
||||
const char *p = cmdline_arg_to_str(arg);
|
||||
const char *value_utf8 = cmdline_arg_to_utf8(nextarg);
|
||||
const char *value = cmdline_arg_to_str(nextarg);
|
||||
|
||||
if (p[0] != '-') {
|
||||
@ -459,6 +460,9 @@ int cmdline_process_param(CmdlineArg *arg, CmdlineArg *nextarg,
|
||||
RETURN(2);
|
||||
UNAVAILABLE_IN(TOOLTYPE_NONNETWORK);
|
||||
SAVEABLE(0);
|
||||
if (value_utf8)
|
||||
conf_set_utf8(conf, CONF_username, value_utf8);
|
||||
else
|
||||
conf_set_str(conf, CONF_username, value);
|
||||
}
|
||||
if (!strcmp(p, "-loghost")) {
|
||||
|
2
conf.h
2
conf.h
@ -444,7 +444,7 @@ CONF_OPTION(environmt,
|
||||
LOAD_CUSTOM, SAVE_CUSTOM, /* necessary for mappings */
|
||||
)
|
||||
CONF_OPTION(username,
|
||||
VALUE_TYPE(STR),
|
||||
VALUE_TYPE(STR_AMBI),
|
||||
DEFAULT_STR(""),
|
||||
SAVE_KEYWORD("UserName"),
|
||||
)
|
||||
|
2
pscp.c
2
pscp.c
@ -391,7 +391,7 @@ static void do_cmd(char *host, char *user, char *cmd)
|
||||
/* Set username */
|
||||
if (user != NULL && user[0] != '\0') {
|
||||
conf_set_str(conf, CONF_username, user);
|
||||
} else if (conf_get_str(conf, CONF_username)[0] == '\0') {
|
||||
} else if (conf_get_str_ambi(conf, CONF_username, NULL)[0] == '\0') {
|
||||
user = get_username();
|
||||
if (!user)
|
||||
bump("Empty user name");
|
||||
|
@ -112,7 +112,9 @@ const struct BackendVtable *backend_vt_from_proto(int proto)
|
||||
|
||||
char *get_remote_username(Conf *conf)
|
||||
{
|
||||
char *username = conf_get_str(conf, CONF_username);
|
||||
/* We don't worry about whether the username is stored as UTF-8,
|
||||
* because SSH wants it as UTF-8 */
|
||||
char *username = conf_get_str_ambi(conf, CONF_username, NULL);
|
||||
if (*username) {
|
||||
return dupstr(username);
|
||||
} else if (conf_get_bool(conf, CONF_username_from_env)) {
|
||||
|
@ -717,7 +717,7 @@ void test_simple(void)
|
||||
test_bool_simple(CONF_ssh_no_shell, "SshNoShell", false);
|
||||
test_str_simple(CONF_termtype, "TerminalType", "xterm");
|
||||
test_str_simple(CONF_termspeed, "TerminalSpeed", "38400,38400");
|
||||
test_str_simple(CONF_username, "UserName", "");
|
||||
test_str_ambi_simple(CONF_username, "UserName", "", false);
|
||||
test_bool_simple(CONF_username_from_env, "UserNameFromEnvironment", false);
|
||||
test_str_simple(CONF_localusername, "LocalUserName", "");
|
||||
test_bool_simple(CONF_rfc_environ, "RFCEnviron", false);
|
||||
|
@ -823,7 +823,7 @@ int main(int argc, char **argv)
|
||||
* If we have no better ideas for the remote username, use the local
|
||||
* one, as 'ssh' does.
|
||||
*/
|
||||
if (conf_get_str(conf, CONF_username)[0] == '\0') {
|
||||
if (conf_get_str_ambi(conf, CONF_username, NULL)[0] == '\0') {
|
||||
char *user = get_username();
|
||||
if (user) {
|
||||
conf_set_str(conf, CONF_username, user);
|
||||
|
Loading…
Reference in New Issue
Block a user