diff --git a/conf-enums.h b/conf-enums.h new file mode 100644 index 00000000..c76d43d8 --- /dev/null +++ b/conf-enums.h @@ -0,0 +1,178 @@ +/* + * Define various enumerations used in the storage format of PuTTY's + * settings. + * + * Each CONF_ENUM here defines an identifier that config options can + * cite using their STORAGE_ENUM property. Within each enum, the + * VALUE(x,y) records indicate that if the internal value of the + * integer Conf property in question is x, then it's stored in the + * saved settings as y. + * + * This allows the internal enumerations to be rearranged without + * breaking storage compatibility, and also allows for the fact that + * (for embarrassing historical reasons) the tri-state FORCE_OFF / + * FORCE_ON / AUTO enumeration has several different storage + * representations depending on the Conf option. + * + * VALUE_OBSOLETE(x,y) records only work one way: they indicate how a + * legacy value in saved session data should be interpreted, but also + * say that that value should no longer be generated in newly saved + * data. That is, they indicate that y maps to x, but not that x maps + * to y. + */ + +CONF_ENUM(addressfamily, + VALUE(ADDRTYPE_UNSPEC, 0), + VALUE(ADDRTYPE_IPV4, 1), + VALUE(ADDRTYPE_IPV6, 2), +) + +CONF_ENUM(on_off_auto, + VALUE(FORCE_ON, 0), + VALUE(FORCE_OFF, 1), + VALUE(AUTO, 2), +) + +CONF_ENUM(off_auto_on, + VALUE(FORCE_OFF, 0), + VALUE(AUTO, 1), + VALUE(FORCE_ON, 2), +) + +CONF_ENUM(auto_off_on, + VALUE(AUTO, 0), + VALUE(FORCE_OFF, 1), + VALUE(FORCE_ON, 2), +) + +CONF_ENUM(off1_on2, + VALUE(FORCE_OFF, 1), + VALUE(FORCE_ON, 2), +) + +CONF_ENUM(ssh_protocol, + VALUE(0, 0), + VALUE(3, 3), + /* Save value 1 used to mean 'prefer SSH-1 but allow 2'; 2 vice versa. + * We no longer support SSH-1 vs SSH-2 agnosticism, so we translate each + * to the preferred version only. */ + VALUE_OBSOLETE(0, 1), + VALUE_OBSOLETE(3, 2), +) + +CONF_ENUM(serparity, + VALUE(SER_PAR_NONE, 0), + VALUE(SER_PAR_ODD, 1), + VALUE(SER_PAR_EVEN, 2), + VALUE(SER_PAR_MARK, 3), + VALUE(SER_PAR_SPACE, 4), +) + +CONF_ENUM(serflow, + VALUE(SER_FLOW_NONE, 0), + VALUE(SER_FLOW_XONXOFF, 1), + VALUE(SER_FLOW_RTSCTS, 2), + VALUE(SER_FLOW_DSRDTR, 3), +) + +CONF_ENUM(supdup_charset, + VALUE(SUPDUP_CHARSET_ASCII, 0), + VALUE(SUPDUP_CHARSET_ITS, 1), + VALUE(SUPDUP_CHARSET_WAITS, 2), +) + +CONF_ENUM(funky_type, + VALUE(FUNKY_TILDE, 0), + VALUE(FUNKY_LINUX, 1), + VALUE(FUNKY_XTERM, 2), + VALUE(FUNKY_VT400, 3), + VALUE(FUNKY_VT100P, 4), + VALUE(FUNKY_SCO, 5), + VALUE(FUNKY_XTERM_216, 6), +) + +CONF_ENUM(sharrow_type, + VALUE(SHARROW_APPLICATION, 0), + VALUE(SHARROW_BITMAP, 1), +) + +CONF_ENUM(cursor_type, + VALUE(CURSOR_BLOCK, 0), + VALUE(CURSOR_UNDERLINE, 1), + VALUE(CURSOR_VERTICAL_LINE, 2), +) + +CONF_ENUM(beep, + VALUE(BELL_DISABLED, 0), + VALUE(BELL_DEFAULT, 1), + VALUE(BELL_VISUAL, 2), + VALUE(BELL_WAVEFILE, 3), + VALUE(BELL_PCSPEAKER, 4), +) + +CONF_ENUM(beep_indication, + VALUE(B_IND_DISABLED, 0), + VALUE(B_IND_FLASH, 1), + VALUE(B_IND_STEADY, 2), +) + +CONF_ENUM(resize_effect, + VALUE(RESIZE_TERM, 0), + VALUE(RESIZE_DISABLED, 1), + VALUE(RESIZE_FONT, 2), + VALUE(RESIZE_EITHER, 3), +) + +CONF_ENUM(font_quality, + VALUE(FQ_DEFAULT, 0), + VALUE(FQ_ANTIALIASED, 1), + VALUE(FQ_NONANTIALIASED, 2), + VALUE(FQ_CLEARTYPE, 3), +) + +CONF_ENUM(log_type, + VALUE(LGTYP_NONE, 0), + VALUE(LGTYP_ASCII, 1), + VALUE(LGTYP_DEBUG, 2), + VALUE(LGTYP_PACKETS, 3), + VALUE(LGTYP_SSHRAW, 4), +) + +CONF_ENUM(log_to_existing_file, + VALUE(LGXF_OVR, 1), + VALUE(LGXF_APN, 0), + VALUE(LGXF_ASK, -1), +) + +CONF_ENUM(bold_style, + VALUE(BOLD_STYLE_FONT, 0), + VALUE(BOLD_STYLE_COLOUR, 1), + VALUE(BOLD_STYLE_FONT | BOLD_STYLE_COLOUR, 2), +) + +CONF_ENUM(mouse_buttons, + VALUE(MOUSE_COMPROMISE, 0), + VALUE(MOUSE_XTERM, 1), + VALUE(MOUSE_WINDOWS, 2), +) + +CONF_ENUM(clipboard, + VALUE(CLIPUI_NONE, 0), + VALUE(CLIPUI_IMPLICIT, 1), + VALUE(CLIPUI_EXPLICIT, 2), + VALUE(CLIPUI_CUSTOM, 3), +) + +CONF_ENUM(line_drawing, + VALUE(VT_XWINDOWS, 0), + VALUE(VT_OEMANSI, 1), + VALUE(VT_OEMONLY, 2), + VALUE(VT_POORMAN, 3), + VALUE(VT_UNICODE, 4), +) + +CONF_ENUM(x11_auth, + VALUE(X11_NO_AUTH, 0), + VALUE(X11_MIT, 1), + VALUE(X11_XDM, 2), +) diff --git a/conf.h b/conf.h index d0f7ecd5..44d5d61a 100644 --- a/conf.h +++ b/conf.h @@ -13,124 +13,221 @@ CONF_OPTION(host, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("HostName"), ) CONF_OPTION(port, VALUE_TYPE(INT), + /* + * Notionally SAVE_KEYWORD("PortNumber"), but saving/loading is + * handled by custom code because the default value depends on the + * value of CONF_protocol. + */ ) CONF_OPTION(protocol, VALUE_TYPE(INT), /* PROT_SSH, PROT_TELNET etc */ + /* + * Notionally SAVE_KEYWORD("Protocol"), but saving/loading is handled by + * custom code because the stored value is a string representation + * of the protocol name. + */ ) CONF_OPTION(addressfamily, VALUE_TYPE(INT), + DEFAULT_INT(ADDRTYPE_UNSPEC), + SAVE_KEYWORD("AddressFamily"), + STORAGE_ENUM(addressfamily), ) CONF_OPTION(close_on_exit, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("CloseOnExit"), + STORAGE_ENUM(off_auto_on), ) CONF_OPTION(warn_on_close, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("WarnOnClose"), ) CONF_OPTION(ping_interval, VALUE_TYPE(INT), /* in seconds */ + /* + * Saving/loading is handled by custom code because for historical + * reasons this value corresponds to two save keywords, + * "PingInterval" (measured in minutes) and "PingIntervalSecs" + * (measured in seconds), which are added together on loading. + * Rationale: the value was once measured in minutes, and the + * seconds field was added later. + */ ) CONF_OPTION(tcp_nodelay, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("TCPNoDelay"), ) CONF_OPTION(tcp_keepalives, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("TCPKeepalives"), ) CONF_OPTION(loghost, /* logical host being contacted, for host key check */ VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("LogHost"), ) /* Proxy options */ CONF_OPTION(proxy_exclude_list, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("ProxyExcludeList"), ) CONF_OPTION(proxy_dns, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("ProxyDNS"), + STORAGE_ENUM(off_auto_on), ) CONF_OPTION(even_proxy_localhost, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ProxyLocalhost"), ) CONF_OPTION(proxy_type, VALUE_TYPE(INT), /* PROXY_NONE, PROXY_SOCKS4, ... */ + /* + * SAVE_KEYWORD("ProxyMethod"), for the current configuration + * format. But there was an earlier keyword "ProxyType" using a + * different enumeration, in which SOCKS4 and SOCKS5 shared a + * value, and a second keyword "ProxySOCKSVersion" disambiguated. + */ ) CONF_OPTION(proxy_host, VALUE_TYPE(STR), + DEFAULT_STR("proxy"), + SAVE_KEYWORD("ProxyHost"), ) CONF_OPTION(proxy_port, VALUE_TYPE(INT), + DEFAULT_INT(80), + SAVE_KEYWORD("ProxyPort"), ) CONF_OPTION(proxy_username, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("ProxyUsername"), ) CONF_OPTION(proxy_password, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("ProxyPassword"), ) CONF_OPTION(proxy_telnet_command, VALUE_TYPE(STR), + DEFAULT_STR("connect %host %port\\n"), + SAVE_KEYWORD("ProxyTelnetCommand"), ) CONF_OPTION(proxy_log_to_term, VALUE_TYPE(INT), + DEFAULT_INT(FORCE_OFF), + SAVE_KEYWORD("ProxyLogToTerm"), + STORAGE_ENUM(on_off_auto), ) /* SSH options */ CONF_OPTION(remote_cmd, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("RemoteCommand"), ) CONF_OPTION(remote_cmd2, /* - * Fallback command to try to run if remote_cmd fails. + * Fallback command to try to run if remote_cmd fails. Only set + * internally by PSCP and PSFTP (so that they can try multiple + * methods of running an SFTP server at the remote end); never set + * by user configuration, or loaded or saved. */ VALUE_TYPE(STR), ) CONF_OPTION(nopty, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoPTY"), ) CONF_OPTION(compression, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("Compression"), ) CONF_OPTION(ssh_kexlist, SUBKEY_TYPE(INT), /* indices in preference order: 0,...,KEX_MAX-1 * (lower is more preferred) */ VALUE_TYPE(INT), /* KEX_* enum values */ + /* + * Loading and saving is done by custom code for all preference + * lists + */ ) CONF_OPTION(ssh_hklist, SUBKEY_TYPE(INT), /* indices in preference order: 0,...,HK_MAX-1 * (lower is more preferred) */ VALUE_TYPE(INT), /* HK_* enum values */ + /* + * Loading and saving is done by custom code for all preference + * lists + */ ) CONF_OPTION(ssh_prefer_known_hostkeys, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("PreferKnownHostKeys"), ) CONF_OPTION(ssh_rekey_time, VALUE_TYPE(INT), /* in minutes */ + DEFAULT_INT(60), + SAVE_KEYWORD("RekeyTime"), ) CONF_OPTION(ssh_rekey_data, VALUE_TYPE(STR), /* string encoding e.g. "100K", "2M", "1G" */ + DEFAULT_STR("1G"), + SAVE_KEYWORD("RekeyBytes"), ) CONF_OPTION(tryagent, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("TryAgent"), ) CONF_OPTION(agentfwd, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("AgentFwd"), ) CONF_OPTION(change_username, /* allow username switching in SSH-2 */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ChangeUsername"), ) CONF_OPTION(ssh_cipherlist, SUBKEY_TYPE(INT), /* indices in preference order: 0,...,CIPHER_MAX-1 * (lower is more preferred) */ VALUE_TYPE(INT), /* CIPHER_* enum values */ + /* + * Loading and saving is done by custom code for all preference + * lists + */ ) CONF_OPTION(keyfile, VALUE_TYPE(FILENAME), + SAVE_KEYWORD("PublicKeyFile"), ) CONF_OPTION(detached_cert, VALUE_TYPE(FILENAME), + SAVE_KEYWORD("DetachedCertificate"), ) CONF_OPTION(auth_plugin, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("AuthPlugin"), ) CONF_OPTION(sshprot, /* @@ -150,23 +247,35 @@ CONF_OPTION(sshprot, * downgrades PuTTY. So it's easier to use these numbers internally too. */ VALUE_TYPE(INT), + DEFAULT_INT(3), + SAVE_KEYWORD("SshProt"), + STORAGE_ENUM(ssh_protocol), ) CONF_OPTION(ssh_simple, /* * This means that we promise never to open any channel other * than the main one, which means it can safely use a very large * window in SSH-2. + * + * Only ever set internally by file transfer tools; never set by + * user configuration, or loaded or saved. */ VALUE_TYPE(BOOL), ) CONF_OPTION(ssh_connection_sharing, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ConnectionSharing"), ) CONF_OPTION(ssh_connection_sharing_upstream, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("ConnectionSharingUpstream"), ) CONF_OPTION(ssh_connection_sharing_downstream, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("ConnectionSharingDownstream"), ) CONF_OPTION(ssh_manual_hostkeys, /* @@ -179,392 +288,696 @@ CONF_OPTION(ssh_manual_hostkeys, */ SUBKEY_TYPE(STR), VALUE_TYPE(STR), + /* + * Loading and saving is done by custom code for all mappings + */ ) CONF_OPTION(ssh2_des_cbc, /* "des-cbc" unrecommended SSH-2 cipher */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SSH2DES"), ) CONF_OPTION(ssh_no_userauth, /* bypass "ssh-userauth" (SSH-2 only) */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SshNoAuth"), ) CONF_OPTION(ssh_no_trivial_userauth, /* disable trivial types of auth */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SshNoTrivialAuth"), ) CONF_OPTION(ssh_show_banner, /* show USERAUTH_BANNERs (SSH-2 only) */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("SshBanner"), ) CONF_OPTION(try_tis_auth, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("AuthTIS"), ) CONF_OPTION(try_ki_auth, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("AuthKI"), ) CONF_OPTION(try_gssapi_auth, /* attempt gssapi via ssh userauth */ VALUE_TYPE(BOOL), + /* + * Loading and saving is done by custom code because it's under + * #ifndef NO_GSSAPI + */ ) CONF_OPTION(try_gssapi_kex, /* attempt gssapi via ssh kex */ VALUE_TYPE(BOOL), + /* + * Loading and saving is done by custom code because it's under + * #ifndef NO_GSSAPI + */ ) CONF_OPTION(gssapifwd, /* forward tgt via gss */ VALUE_TYPE(BOOL), + /* + * Loading and saving is done by custom code because it's under + * #ifndef NO_GSSAPI + */ ) CONF_OPTION(gssapirekey, /* KEXGSS refresh interval (mins) */ VALUE_TYPE(INT), + /* + * Loading and saving is done by custom code because it's under + * #ifndef NO_GSSAPI + */ ) CONF_OPTION(ssh_gsslist, SUBKEY_TYPE(INT), /* indices in preference order: 0,...,ngsslibs * (lower is more preferred; ngsslibs is a platform- * dependent value) */ VALUE_TYPE(INT), /* indices of GSSAPI lib types (platform-dependent) */ + /* + * Loading and saving is done by custom code because it's under + * #ifndef NO_GSSAPI, and also because all preference lists are + * handled by custom code + */ ) CONF_OPTION(ssh_gss_custom, VALUE_TYPE(FILENAME), + /* + * Loading and saving is done by custom code because it's under + * #ifndef NO_GSSAPI + */ ) CONF_OPTION(ssh_subsys, /* run a subsystem rather than a command */ + /* + * Only set internally by PSCP and PSFTP; never set by user + * configuration, or loaded or saved. + */ VALUE_TYPE(BOOL), ) CONF_OPTION(ssh_subsys2, /* fallback to go with remote_cmd_ptr2 */ + /* + * Only set internally by PSCP and PSFTP; never set by user + * configuration, or loaded or saved. + */ VALUE_TYPE(BOOL), ) CONF_OPTION(ssh_no_shell, /* avoid running a shell */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SshNoShell"), ) CONF_OPTION(ssh_nc_host, /* host to connect to in `nc' mode */ + /* + * Only set by the '-nc' command-line option and by the SSH proxy + * code. There's no GUI config option for this, and therefore it's + * also never loaded or saved. + */ VALUE_TYPE(STR), ) CONF_OPTION(ssh_nc_port, /* port to connect to in `nc' mode */ + /* + * Only set by the '-nc' command-line option and by the SSH proxy + * code. There's no GUI config option for this, and therefore it's + * also never loaded or saved. + */ VALUE_TYPE(INT), ) /* Telnet options */ CONF_OPTION(termtype, VALUE_TYPE(STR), + DEFAULT_STR("xterm"), + SAVE_KEYWORD("TerminalType"), ) CONF_OPTION(termspeed, VALUE_TYPE(STR), + DEFAULT_STR("38400,38400"), + SAVE_KEYWORD("TerminalSpeed"), ) CONF_OPTION(ttymodes, SUBKEY_TYPE(STR), /* subkeys are listed in ttymodes[] in settings.c */ VALUE_TYPE(STR), /* values are "Vvalue" or "A" */ + /* + * Loading and saving is done by custom code for all mappings + */ ) CONF_OPTION(environmt, SUBKEY_TYPE(STR), /* environment variable name */ VALUE_TYPE(STR), /* environment variable value */ + /* + * Loading and saving is done by custom code for all mappings + */ ) CONF_OPTION(username, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("UserName"), ) CONF_OPTION(username_from_env, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("UserNameFromEnvironment"), ) CONF_OPTION(localusername, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("LocalUserName"), ) CONF_OPTION(rfc_environ, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("RFCEnviron"), ) CONF_OPTION(passive_telnet, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("PassiveTelnet"), ) /* Serial port options */ CONF_OPTION(serline, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("SerialLine"), ) CONF_OPTION(serspeed, VALUE_TYPE(INT), + DEFAULT_INT(9600), + SAVE_KEYWORD("SerialSpeed"), ) CONF_OPTION(serdatabits, VALUE_TYPE(INT), + DEFAULT_INT(8), + SAVE_KEYWORD("SerialDataBits"), ) CONF_OPTION(serstopbits, VALUE_TYPE(INT), + DEFAULT_INT(2), + SAVE_KEYWORD("SerialStopHalfbits"), ) CONF_OPTION(serparity, VALUE_TYPE(INT), + DEFAULT_INT(SER_PAR_NONE), + SAVE_KEYWORD("SerialParity"), + STORAGE_ENUM(serparity), ) CONF_OPTION(serflow, VALUE_TYPE(INT), + DEFAULT_INT(SER_FLOW_XONXOFF), + SAVE_KEYWORD("SerialFlowControl"), + STORAGE_ENUM(serflow), ) /* SUPDUP options */ CONF_OPTION(supdup_location, VALUE_TYPE(STR), + DEFAULT_STR("The Internet"), + SAVE_KEYWORD("SUPDUPLocation"), ) CONF_OPTION(supdup_ascii_set, VALUE_TYPE(INT), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SUPDUPCharset"), + STORAGE_ENUM(supdup_charset), ) CONF_OPTION(supdup_more, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SUPDUPMoreProcessing"), ) CONF_OPTION(supdup_scroll, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SUPDUPScrolling"), ) /* Keyboard options */ CONF_OPTION(bksp_is_delete, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("BackspaceIsDelete"), ) CONF_OPTION(rxvt_homeend, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("RXVTHomeEnd"), ) CONF_OPTION(funky_type, VALUE_TYPE(INT), + DEFAULT_INT(FUNKY_TILDE), + SAVE_KEYWORD("LinuxFunctionKeys"), + STORAGE_ENUM(funky_type), ) CONF_OPTION(sharrow_type, VALUE_TYPE(INT), + DEFAULT_INT(SHARROW_APPLICATION), + SAVE_KEYWORD("ShiftedArrowKeys"), + STORAGE_ENUM(sharrow_type), ) CONF_OPTION(no_applic_c, /* totally disable app cursor keys */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoApplicationCursors"), ) CONF_OPTION(no_applic_k, /* totally disable app keypad */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoApplicationKeys"), ) CONF_OPTION(no_mouse_rep, /* totally disable mouse reporting */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoMouseReporting"), ) CONF_OPTION(no_remote_resize, /* disable remote resizing */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoRemoteResize"), ) CONF_OPTION(no_alt_screen, /* disable alternate screen */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoAltScreen"), ) CONF_OPTION(no_remote_wintitle, /* disable remote retitling */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoRemoteWinTitle"), ) CONF_OPTION(no_remote_clearscroll, /* disable ESC[3J */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoRemoteClearScroll"), ) CONF_OPTION(no_dbackspace, /* disable destructive backspace */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoDBackspace"), ) CONF_OPTION(no_remote_charset, /* disable remote charset config */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NoRemoteCharset"), ) CONF_OPTION(remote_qtitle_action, /* handling of remote window title queries */ VALUE_TYPE(INT), + /* + * SAVE_KEYWORD("RemoteQTitleAction"), but loading and saving is + * done in custom code, because older versions had a boolean + * "NoRemoteQTitle" before we ended up with three options. + */ ) CONF_OPTION(app_cursor, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ApplicationCursorKeys"), ) CONF_OPTION(app_keypad, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ApplicationKeypad"), ) CONF_OPTION(nethack_keypad, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("NetHackKeypad"), ) CONF_OPTION(telnet_keyboard, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("TelnetKey"), ) CONF_OPTION(telnet_newline, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("TelnetRet"), ) CONF_OPTION(alt_f4, /* is it special? */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("AltF4"), ) CONF_OPTION(alt_space, /* is it special? */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("AltSpace"), ) CONF_OPTION(alt_only, /* is it special? */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("AltOnly"), ) CONF_OPTION(localecho, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("LocalEcho"), + STORAGE_ENUM(on_off_auto), ) CONF_OPTION(localedit, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("LocalEdit"), + STORAGE_ENUM(on_off_auto), ) CONF_OPTION(alwaysontop, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("AlwaysOnTop"), ) CONF_OPTION(fullscreenonaltenter, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("FullScreenOnAltEnter"), ) CONF_OPTION(scroll_on_key, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ScrollOnKey"), ) CONF_OPTION(scroll_on_disp, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("ScrollOnDisp"), ) CONF_OPTION(erase_to_scrollback, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("EraseToScrollback"), ) CONF_OPTION(compose_key, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ComposeKey"), ) CONF_OPTION(ctrlaltkeys, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("CtrlAltKeys"), ) CONF_OPTION(osx_option_meta, VALUE_TYPE(BOOL), + /* + * Loading and saving is done in custom code because this is under + * #ifdef OSX_META_KEY_CONFIG + */ ) CONF_OPTION(osx_command_meta, VALUE_TYPE(BOOL), + /* + * Loading and saving is done in custom code because this is under + * #ifdef OSX_META_KEY_CONFIG + */ ) CONF_OPTION(wintitle, /* initial window title */ VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("WinTitle"), ) /* Terminal options */ CONF_OPTION(savelines, VALUE_TYPE(INT), + DEFAULT_INT(2000), + SAVE_KEYWORD("ScrollbackLines"), ) CONF_OPTION(dec_om, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("DECOriginMode"), ) CONF_OPTION(wrap_mode, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("AutoWrapMode"), ) CONF_OPTION(lfhascr, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("LFImpliesCR"), ) CONF_OPTION(cursor_type, VALUE_TYPE(INT), + DEFAULT_INT(0), + SAVE_KEYWORD("CurType"), + STORAGE_ENUM(cursor_type), ) CONF_OPTION(blink_cur, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("BlinkCur"), ) CONF_OPTION(beep, VALUE_TYPE(INT), + DEFAULT_INT(BELL_DEFAULT), + SAVE_KEYWORD("Beep"), + STORAGE_ENUM(beep), ) CONF_OPTION(beep_ind, VALUE_TYPE(INT), + DEFAULT_INT(B_IND_DISABLED), + SAVE_KEYWORD("BeepInd"), + STORAGE_ENUM(beep_indication), ) CONF_OPTION(bellovl, /* bell overload protection active? */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("BellOverload"), ) CONF_OPTION(bellovl_n, /* number of bells to cause overload */ VALUE_TYPE(INT), + DEFAULT_INT(5), + SAVE_KEYWORD("BellOverloadN"), ) CONF_OPTION(bellovl_t, /* time interval for overload (ticks) */ VALUE_TYPE(INT), + /* + * Loading and saving is done in custom code because the format is + * platform-dependent for historical reasons: on Unix, the stored + * value is multiplied by 1000. (And since TICKSPERSEC=1000 on + * that platform, it means the stored value is interpreted in + * microseconds.) + */ ) CONF_OPTION(bellovl_s, /* period of silence to re-enable bell (s) */ VALUE_TYPE(INT), + /* + * Loading and saving is done in custom code because the format is + * platform-dependent for historical reasons: on Unix, the stored + * value is multiplied by 1000. (And since TICKSPERSEC=1000 on + * that platform, it means the stored value is interpreted in + * microseconds.) + */ ) CONF_OPTION(bell_wavefile, VALUE_TYPE(FILENAME), + SAVE_KEYWORD("BellWaveFile"), ) CONF_OPTION(scrollbar, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("ScrollBar"), ) CONF_OPTION(scrollbar_in_fullscreen, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ScrollBarFullScreen"), ) CONF_OPTION(resize_action, VALUE_TYPE(INT), + DEFAULT_INT(RESIZE_TERM), + SAVE_KEYWORD("LockSize"), + STORAGE_ENUM(resize_effect), ) CONF_OPTION(bce, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("BCE"), ) CONF_OPTION(blinktext, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("BlinkText"), ) CONF_OPTION(win_name_always, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("WinNameAlways"), ) CONF_OPTION(width, VALUE_TYPE(INT), + DEFAULT_INT(80), + SAVE_KEYWORD("TermWidth"), ) CONF_OPTION(height, VALUE_TYPE(INT), + DEFAULT_INT(24), + SAVE_KEYWORD("TermHeight"), ) CONF_OPTION(font, VALUE_TYPE(FONT), + SAVE_KEYWORD("Font"), ) CONF_OPTION(font_quality, VALUE_TYPE(INT), + DEFAULT_INT(FQ_DEFAULT), + SAVE_KEYWORD("FontQuality"), + STORAGE_ENUM(font_quality), ) CONF_OPTION(logfilename, VALUE_TYPE(FILENAME), + SAVE_KEYWORD("LogFileName"), ) CONF_OPTION(logtype, VALUE_TYPE(INT), + DEFAULT_INT(LGTYP_NONE), + SAVE_KEYWORD("LogType"), + STORAGE_ENUM(log_type), ) CONF_OPTION(logxfovr, VALUE_TYPE(INT), + DEFAULT_INT(LGXF_ASK), + SAVE_KEYWORD("LogFileClash"), + STORAGE_ENUM(log_to_existing_file), ) CONF_OPTION(logflush, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("LogFlush"), ) CONF_OPTION(logheader, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("LogHeader"), ) CONF_OPTION(logomitpass, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("SSHLogOmitPasswords"), ) CONF_OPTION(logomitdata, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SSHLogOmitData"), ) CONF_OPTION(hide_mouseptr, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("HideMousePtr"), ) CONF_OPTION(sunken_edge, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("SunkenEdge"), ) CONF_OPTION(window_border, VALUE_TYPE(INT), /* in pixels */ + DEFAULT_INT(1), + SAVE_KEYWORD("WindowBorder"), ) CONF_OPTION(answerback, VALUE_TYPE(STR), + DEFAULT_STR("PuTTY"), + SAVE_KEYWORD("Answerback"), ) CONF_OPTION(printer, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("Printer"), ) CONF_OPTION(no_arabicshaping, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("DisableArabicShaping"), ) CONF_OPTION(no_bidi, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("DisableBidi"), ) /* Colour options */ CONF_OPTION(ansi_colour, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("ANSIColour"), ) CONF_OPTION(xterm_256_colour, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("Xterm256Colour"), ) CONF_OPTION(true_colour, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("TrueColour"), ) CONF_OPTION(system_colour, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("UseSystemColours"), ) CONF_OPTION(try_palette, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("TryPalette"), ) CONF_OPTION(bold_style, VALUE_TYPE(INT), + DEFAULT_INT(2), + SAVE_KEYWORD("BoldAsColour"), + STORAGE_ENUM(bold_style), ) CONF_OPTION(colours, SUBKEY_TYPE(INT), /* indexed by CONF_COLOUR_* enum encoding */ VALUE_TYPE(INT), + /* + * Loading and saving is done by custom code for all mappings + */ ) /* Selection options */ CONF_OPTION(mouse_is_xterm, VALUE_TYPE(INT), + DEFAULT_INT(0), + SAVE_KEYWORD("MouseIsXterm"), + STORAGE_ENUM(mouse_buttons), ) CONF_OPTION(rect_select, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("RectSelect"), ) CONF_OPTION(paste_controls, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("PasteControls"), ) CONF_OPTION(rawcnp, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("RawCNP"), ) CONF_OPTION(utf8linedraw, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("UTF8linedraw"), ) CONF_OPTION(rtf_paste, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("PasteRTF"), ) CONF_OPTION(mouse_override, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("MouseOverride"), ) CONF_OPTION(wordness, SUBKEY_TYPE(INT), /* ASCII character codes (literally, just 00-7F) */ VALUE_TYPE(INT), /* arbitrary equivalence-class value for that char */ + /* + * Loading and saving is done by custom code for all mappings + */ ) CONF_OPTION(mouseautocopy, /* @@ -572,66 +985,121 @@ CONF_OPTION(mouseautocopy, * selected with the mouse. */ VALUE_TYPE(BOOL), + DEFAULT_INT(CLIPUI_DEFAULT_AUTOCOPY), + SAVE_KEYWORD("MouseAutocopy"), ) CONF_OPTION(mousepaste, /* clipboard used by one-mouse-click paste actions */ VALUE_TYPE(INT), + STORAGE_ENUM(clipboard), + /* + * SAVE_KEYWORD("MousePaste"), but loading and saving is done by + * custom code, because the saved value is a string, and also sets + * CONF_mousepaste_custom + */ ) CONF_OPTION(ctrlshiftins, /* clipboard used by Ctrl+Ins and Shift+Ins */ VALUE_TYPE(INT), + STORAGE_ENUM(clipboard), + /* + * SAVE_KEYWORD("CtrlShiftIns"), but loading and saving is done by + * custom code, because the saved value is a string, and also sets + * CONF_ctrlshiftins_custom + */ ) CONF_OPTION(ctrlshiftcv, /* clipboard used by Ctrl+Shift+C and Ctrl+Shift+V */ VALUE_TYPE(INT), + STORAGE_ENUM(clipboard), + /* + * SAVE_KEYWORD("CtrlShiftCV"), but loading and saving is done by + * custom code, because the saved value is a string, and also sets + * CONF_ctrlshiftcv_custom + */ ) CONF_OPTION(mousepaste_custom, /* Custom clipboard name if CONF_mousepaste is set to CLIPUI_CUSTOM */ VALUE_TYPE(STR), + /* + * Loading and saving is handled by custom code in conjunction + * with CONF_mousepaste + */ ) CONF_OPTION(ctrlshiftins_custom, /* Custom clipboard name if CONF_ctrlshiftins is set to CLIPUI_CUSTOM */ VALUE_TYPE(STR), + /* + * Loading and saving is handled by custom code in conjunction + * with CONF_ctrlshiftins + */ ) CONF_OPTION(ctrlshiftcv_custom, /* Custom clipboard name if CONF_ctrlshiftcv is set to CLIPUI_CUSTOM */ VALUE_TYPE(STR), + /* + * Loading and saving is handled by custom code in conjunction + * with CONF_ctrlshiftcv + */ ) /* Character-set translation */ CONF_OPTION(vtmode, VALUE_TYPE(INT), + DEFAULT_INT(VT_UNICODE), + SAVE_KEYWORD("FontVTMode"), + STORAGE_ENUM(line_drawing), ) CONF_OPTION(line_codepage, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("LineCodePage"), ) CONF_OPTION(cjk_ambig_wide, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("CJKAmbigWide"), ) CONF_OPTION(utf8_override, VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("UTF8Override"), ) CONF_OPTION(xlat_capslockcyr, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("CapsLockCyr"), ) /* X11 forwarding */ CONF_OPTION(x11_forward, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("X11Forward"), ) CONF_OPTION(x11_display, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("X11Display"), ) CONF_OPTION(x11_auth, VALUE_TYPE(INT), + DEFAULT_INT(X11_MIT), + SAVE_KEYWORD("X11AuthType"), + STORAGE_ENUM(x11_auth), ) CONF_OPTION(xauthfile, VALUE_TYPE(FILENAME), + SAVE_KEYWORD("X11AuthFile"), ) /* Port forwarding */ CONF_OPTION(lport_acceptall, /* accept conns from hosts other than localhost */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("LocalPortAcceptAll"), ) CONF_OPTION(rport_acceptall, /* same for remote forwarded ports */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("RemotePortAcceptAll"), ) CONF_OPTION(portfwd, /* @@ -646,86 +1114,156 @@ CONF_OPTION(portfwd, */ SUBKEY_TYPE(STR), VALUE_TYPE(STR), + /* + * Loading and saving is done by custom code for all mappings + */ ) /* SSH bug compatibility modes. All FORCE_ON/FORCE_OFF/AUTO */ CONF_OPTION(sshbug_ignore1, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugIgnore1"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_plainpw1, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugPlainPW1"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_rsa1, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugRSA1"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_ignore2, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugIgnore2"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_derivekey2, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugDeriveKey2"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_rsapad2, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugRSAPad2"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_pksessid2, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugPKSessID2"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_rekey2, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugRekey2"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_maxpkt2, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugMaxPkt2"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_oldgex2, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugOldGex2"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_winadj, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugWinadj"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_chanreq, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugChanReq"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_dropstart, VALUE_TYPE(INT), + DEFAULT_INT(FORCE_OFF), + SAVE_KEYWORD("BugDropStart"), + STORAGE_ENUM(off1_on2), ) CONF_OPTION(sshbug_filter_kexinit, VALUE_TYPE(INT), + DEFAULT_INT(FORCE_OFF), + SAVE_KEYWORD("BugFilterKexinit"), + STORAGE_ENUM(off1_on2), ) CONF_OPTION(sshbug_rsa_sha2_cert_userauth, VALUE_TYPE(INT), + DEFAULT_INT(AUTO), + SAVE_KEYWORD("BugRSASHA2CertUserauth"), + STORAGE_ENUM(auto_off_on), ) CONF_OPTION(sshbug_hmac2, VALUE_TYPE(INT), + STORAGE_ENUM(auto_off_on), + /* + * Loading and saving is done by custom code because there was an + * earlier keyword called "BuggyMAC" + */ ) /* Options for Unix. Should split out into platform-dependent part. */ CONF_OPTION(stamp_utmp, /* used by Unix pterm */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("StampUtmp"), ) CONF_OPTION(login_shell, /* used by Unix pterm */ VALUE_TYPE(BOOL), + DEFAULT_BOOL(true), + SAVE_KEYWORD("LoginShell"), ) CONF_OPTION(scrollbar_on_left, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ScrollbarOnLeft"), ) CONF_OPTION(shadowbold, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("ShadowBold"), ) CONF_OPTION(boldfont, VALUE_TYPE(FONT), + SAVE_KEYWORD("BoldFont"), ) CONF_OPTION(widefont, VALUE_TYPE(FONT), + SAVE_KEYWORD("WideFont"), ) CONF_OPTION(wideboldfont, VALUE_TYPE(FONT), + SAVE_KEYWORD("WideBoldFont"), ) CONF_OPTION(shadowboldoffset, VALUE_TYPE(INT), /* in pixels */ + DEFAULT_INT(1), + SAVE_KEYWORD("ShadowBoldOffset"), ) CONF_OPTION(crhaslf, VALUE_TYPE(BOOL), + DEFAULT_BOOL(false), + SAVE_KEYWORD("CRImpliesLF"), ) CONF_OPTION(winclass, VALUE_TYPE(STR), + DEFAULT_STR(""), + SAVE_KEYWORD("WindowClass"), ) diff --git a/defs.h b/defs.h index 607edf88..58c3fb09 100644 --- a/defs.h +++ b/defs.h @@ -75,6 +75,8 @@ uintmax_t strtoumax(const char *nptr, char **endptr, int base); typedef struct conf_tag Conf; typedef struct ConfKeyInfo ConfKeyInfo; +typedef struct ConfSaveEnumValue ConfSaveEnumValue; +typedef struct ConfSaveEnumType ConfSaveEnumType; typedef struct terminal_tag Terminal; typedef struct term_utf8_decode term_utf8_decode; diff --git a/putty.h b/putty.h index 119a5e17..b6d43d92 100644 --- a/putty.h +++ b/putty.h @@ -1813,9 +1813,30 @@ enum { struct ConfKeyInfo { int subkey_type; int value_type; + + union { + bool bval; + int ival; + const char *sval; + } default_value; + + const char *save_keyword; + const ConfSaveEnumType *storage_enum; +}; +struct ConfSaveEnumType { + const ConfSaveEnumValue *values; + size_t nvalues; +}; +struct ConfSaveEnumValue { + int confval, storageval; + bool obsolete; }; extern const ConfKeyInfo conf_key_info[]; +bool conf_enum_map_to_storage(const ConfSaveEnumType *etype, + int confval, int *storageval_out); +bool conf_enum_map_from_storage(const ConfSaveEnumType *etype, + int storageval, int *confval_out); /* Functions handling configuration structures. */ Conf *conf_new(void); /* create an empty configuration */ diff --git a/settings.c b/settings.c index 0eecc579..e5e762f1 100644 --- a/settings.c +++ b/settings.c @@ -530,15 +530,46 @@ void save_open_settings(settings_w *sesskey, Conf *conf) int i; const char *p; + /* Save the settings simple enough to handle automatically */ + for (size_t key = 0; key < N_CONFIG_OPTIONS; key++) { + const ConfKeyInfo *info = &conf_key_info[key]; + if (info->save_keyword) { + /* Mappings are handled individually below */ + assert(info->subkey_type == CONF_TYPE_NONE); + switch (info->value_type) { + case CONF_TYPE_STR: + write_setting_s(sesskey, info->save_keyword, + conf_get_str(conf, key)); + break; + case CONF_TYPE_INT: { + int ival = conf_get_int(conf, key); + if (info->storage_enum) { + bool success = conf_enum_map_to_storage( + info->storage_enum, ival, &ival); + assert(success && "unmapped integer value"); + } + write_setting_i(sesskey, info->save_keyword, ival); + break; + } + case CONF_TYPE_BOOL: + write_setting_b(sesskey, info->save_keyword, + conf_get_bool(conf, key)); + break; + case CONF_TYPE_FILENAME: + write_setting_filename(sesskey, info->save_keyword, + conf_get_filename(conf, key)); + break; + case CONF_TYPE_FONT: + write_setting_fontspec(sesskey, info->save_keyword, + conf_get_fontspec(conf, key)); + break; + default: + unreachable("bad key type in save_open_settings"); + } + } + } + write_setting_i(sesskey, "Present", 1); - write_setting_s(sesskey, "HostName", conf_get_str(conf, CONF_host)); - write_setting_filename(sesskey, "LogFileName", conf_get_filename(conf, CONF_logfilename)); - write_setting_i(sesskey, "LogType", conf_get_int(conf, CONF_logtype)); - write_setting_i(sesskey, "LogFileClash", conf_get_int(conf, CONF_logxfovr)); - write_setting_b(sesskey, "LogFlush", conf_get_bool(conf, CONF_logflush)); - write_setting_b(sesskey, "LogHeader", conf_get_bool(conf, CONF_logheader)); - write_setting_b(sesskey, "SSHLogOmitPasswords", conf_get_bool(conf, CONF_logomitpass)); - write_setting_b(sesskey, "SSHLogOmitData", conf_get_bool(conf, CONF_logomitdata)); p = "raw"; { const struct BackendVtable *vt = @@ -548,117 +579,33 @@ void save_open_settings(settings_w *sesskey, Conf *conf) } write_setting_s(sesskey, "Protocol", p); write_setting_i(sesskey, "PortNumber", conf_get_int(conf, CONF_port)); - /* The CloseOnExit numbers are arranged in a different order from - * the standard FORCE_ON / FORCE_OFF / AUTO. */ - write_setting_i(sesskey, "CloseOnExit", (conf_get_int(conf, CONF_close_on_exit)+2)%3); - write_setting_b(sesskey, "WarnOnClose", !!conf_get_bool(conf, CONF_warn_on_close)); write_setting_i(sesskey, "PingInterval", conf_get_int(conf, CONF_ping_interval) / 60); /* minutes */ write_setting_i(sesskey, "PingIntervalSecs", conf_get_int(conf, CONF_ping_interval) % 60); /* seconds */ - write_setting_b(sesskey, "TCPNoDelay", conf_get_bool(conf, CONF_tcp_nodelay)); - write_setting_b(sesskey, "TCPKeepalives", conf_get_bool(conf, CONF_tcp_keepalives)); - write_setting_s(sesskey, "TerminalType", conf_get_str(conf, CONF_termtype)); - write_setting_s(sesskey, "TerminalSpeed", conf_get_str(conf, CONF_termspeed)); wmap(sesskey, "TerminalModes", conf, CONF_ttymodes, true); - /* Address family selection */ - write_setting_i(sesskey, "AddressFamily", conf_get_int(conf, CONF_addressfamily)); - /* proxy settings */ - write_setting_s(sesskey, "ProxyExcludeList", conf_get_str(conf, CONF_proxy_exclude_list)); - write_setting_i(sesskey, "ProxyDNS", (conf_get_int(conf, CONF_proxy_dns)+2)%3); - write_setting_b(sesskey, "ProxyLocalhost", conf_get_bool(conf, CONF_even_proxy_localhost)); write_setting_i(sesskey, "ProxyMethod", conf_get_int(conf, CONF_proxy_type)); - write_setting_s(sesskey, "ProxyHost", conf_get_str(conf, CONF_proxy_host)); - write_setting_i(sesskey, "ProxyPort", conf_get_int(conf, CONF_proxy_port)); - write_setting_s(sesskey, "ProxyUsername", conf_get_str(conf, CONF_proxy_username)); - write_setting_s(sesskey, "ProxyPassword", conf_get_str(conf, CONF_proxy_password)); - write_setting_s(sesskey, "ProxyTelnetCommand", conf_get_str(conf, CONF_proxy_telnet_command)); - write_setting_i(sesskey, "ProxyLogToTerm", conf_get_int(conf, CONF_proxy_log_to_term)); wmap(sesskey, "Environment", conf, CONF_environmt, true); - write_setting_s(sesskey, "UserName", conf_get_str(conf, CONF_username)); - write_setting_b(sesskey, "UserNameFromEnvironment", conf_get_bool(conf, CONF_username_from_env)); - write_setting_s(sesskey, "LocalUserName", conf_get_str(conf, CONF_localusername)); - write_setting_b(sesskey, "NoPTY", conf_get_bool(conf, CONF_nopty)); - write_setting_b(sesskey, "Compression", conf_get_bool(conf, CONF_compression)); - write_setting_b(sesskey, "TryAgent", conf_get_bool(conf, CONF_tryagent)); - write_setting_b(sesskey, "AgentFwd", conf_get_bool(conf, CONF_agentfwd)); #ifndef NO_GSSAPI write_setting_b(sesskey, "GssapiFwd", conf_get_bool(conf, CONF_gssapifwd)); #endif - write_setting_b(sesskey, "ChangeUsername", conf_get_bool(conf, CONF_change_username)); wprefs(sesskey, "Cipher", ciphernames, CIPHER_MAX, conf, CONF_ssh_cipherlist); wprefs(sesskey, "KEX", kexnames, KEX_MAX, conf, CONF_ssh_kexlist); wprefs(sesskey, "HostKey", hknames, HK_MAX, conf, CONF_ssh_hklist); - write_setting_b(sesskey, "PreferKnownHostKeys", conf_get_bool(conf, CONF_ssh_prefer_known_hostkeys)); - write_setting_i(sesskey, "RekeyTime", conf_get_int(conf, CONF_ssh_rekey_time)); #ifndef NO_GSSAPI write_setting_i(sesskey, "GssapiRekey", conf_get_int(conf, CONF_gssapirekey)); #endif - write_setting_s(sesskey, "RekeyBytes", conf_get_str(conf, CONF_ssh_rekey_data)); - write_setting_b(sesskey, "SshNoAuth", conf_get_bool(conf, CONF_ssh_no_userauth)); - write_setting_b(sesskey, "SshNoTrivialAuth", conf_get_bool(conf, CONF_ssh_no_trivial_userauth)); - write_setting_b(sesskey, "SshBanner", conf_get_bool(conf, CONF_ssh_show_banner)); - write_setting_b(sesskey, "AuthTIS", conf_get_bool(conf, CONF_try_tis_auth)); - write_setting_b(sesskey, "AuthKI", conf_get_bool(conf, CONF_try_ki_auth)); #ifndef NO_GSSAPI write_setting_b(sesskey, "AuthGSSAPI", conf_get_bool(conf, CONF_try_gssapi_auth)); write_setting_b(sesskey, "AuthGSSAPIKEX", conf_get_bool(conf, CONF_try_gssapi_kex)); wprefs(sesskey, "GSSLibs", gsslibkeywords, ngsslibs, conf, CONF_ssh_gsslist); write_setting_filename(sesskey, "GSSCustom", conf_get_filename(conf, CONF_ssh_gss_custom)); #endif - write_setting_b(sesskey, "SshNoShell", conf_get_bool(conf, CONF_ssh_no_shell)); - write_setting_i(sesskey, "SshProt", conf_get_int(conf, CONF_sshprot)); - write_setting_s(sesskey, "LogHost", conf_get_str(conf, CONF_loghost)); - write_setting_b(sesskey, "SSH2DES", conf_get_bool(conf, CONF_ssh2_des_cbc)); - write_setting_filename(sesskey, "PublicKeyFile", conf_get_filename(conf, CONF_keyfile)); - write_setting_filename(sesskey, "DetachedCertificate", conf_get_filename(conf, CONF_detached_cert)); - write_setting_s(sesskey, "AuthPlugin", conf_get_str(conf, CONF_auth_plugin)); - write_setting_s(sesskey, "RemoteCommand", conf_get_str(conf, CONF_remote_cmd)); - write_setting_b(sesskey, "RFCEnviron", conf_get_bool(conf, CONF_rfc_environ)); - write_setting_b(sesskey, "PassiveTelnet", conf_get_bool(conf, CONF_passive_telnet)); - write_setting_b(sesskey, "BackspaceIsDelete", conf_get_bool(conf, CONF_bksp_is_delete)); - write_setting_b(sesskey, "RXVTHomeEnd", conf_get_bool(conf, CONF_rxvt_homeend)); - write_setting_i(sesskey, "LinuxFunctionKeys", conf_get_int(conf, CONF_funky_type)); - write_setting_i(sesskey, "ShiftedArrowKeys", conf_get_int(conf, CONF_sharrow_type)); - write_setting_b(sesskey, "NoApplicationKeys", conf_get_bool(conf, CONF_no_applic_k)); - write_setting_b(sesskey, "NoApplicationCursors", conf_get_bool(conf, CONF_no_applic_c)); - write_setting_b(sesskey, "NoMouseReporting", conf_get_bool(conf, CONF_no_mouse_rep)); - write_setting_b(sesskey, "NoRemoteResize", conf_get_bool(conf, CONF_no_remote_resize)); - write_setting_b(sesskey, "NoAltScreen", conf_get_bool(conf, CONF_no_alt_screen)); - write_setting_b(sesskey, "NoRemoteWinTitle", conf_get_bool(conf, CONF_no_remote_wintitle)); - write_setting_b(sesskey, "NoRemoteClearScroll", conf_get_bool(conf, CONF_no_remote_clearscroll)); write_setting_i(sesskey, "RemoteQTitleAction", conf_get_int(conf, CONF_remote_qtitle_action)); - write_setting_b(sesskey, "NoDBackspace", conf_get_bool(conf, CONF_no_dbackspace)); - write_setting_b(sesskey, "NoRemoteCharset", conf_get_bool(conf, CONF_no_remote_charset)); - write_setting_b(sesskey, "ApplicationCursorKeys", conf_get_bool(conf, CONF_app_cursor)); - write_setting_b(sesskey, "ApplicationKeypad", conf_get_bool(conf, CONF_app_keypad)); - write_setting_b(sesskey, "NetHackKeypad", conf_get_bool(conf, CONF_nethack_keypad)); - write_setting_b(sesskey, "AltF4", conf_get_bool(conf, CONF_alt_f4)); - write_setting_b(sesskey, "AltSpace", conf_get_bool(conf, CONF_alt_space)); - write_setting_b(sesskey, "AltOnly", conf_get_bool(conf, CONF_alt_only)); - write_setting_b(sesskey, "ComposeKey", conf_get_bool(conf, CONF_compose_key)); - write_setting_b(sesskey, "CtrlAltKeys", conf_get_bool(conf, CONF_ctrlaltkeys)); #ifdef OSX_META_KEY_CONFIG write_setting_b(sesskey, "OSXOptionMeta", conf_get_bool(conf, CONF_osx_option_meta)); write_setting_b(sesskey, "OSXCommandMeta", conf_get_bool(conf, CONF_osx_command_meta)); #endif - write_setting_b(sesskey, "TelnetKey", conf_get_bool(conf, CONF_telnet_keyboard)); - write_setting_b(sesskey, "TelnetRet", conf_get_bool(conf, CONF_telnet_newline)); - write_setting_i(sesskey, "LocalEcho", conf_get_int(conf, CONF_localecho)); - write_setting_i(sesskey, "LocalEdit", conf_get_int(conf, CONF_localedit)); - write_setting_s(sesskey, "Answerback", conf_get_str(conf, CONF_answerback)); - write_setting_b(sesskey, "AlwaysOnTop", conf_get_bool(conf, CONF_alwaysontop)); - write_setting_b(sesskey, "FullScreenOnAltEnter", conf_get_bool(conf, CONF_fullscreenonaltenter)); - write_setting_b(sesskey, "HideMousePtr", conf_get_bool(conf, CONF_hide_mouseptr)); - write_setting_b(sesskey, "SunkenEdge", conf_get_bool(conf, CONF_sunken_edge)); - write_setting_i(sesskey, "WindowBorder", conf_get_int(conf, CONF_window_border)); - write_setting_i(sesskey, "CurType", conf_get_int(conf, CONF_cursor_type)); - write_setting_b(sesskey, "BlinkCur", conf_get_bool(conf, CONF_blink_cur)); - write_setting_i(sesskey, "Beep", conf_get_int(conf, CONF_beep)); - write_setting_i(sesskey, "BeepInd", conf_get_int(conf, CONF_beep_ind)); - write_setting_filename(sesskey, "BellWaveFile", conf_get_filename(conf, CONF_bell_wavefile)); - write_setting_b(sesskey, "BellOverload", conf_get_bool(conf, CONF_bellovl)); - write_setting_i(sesskey, "BellOverloadN", conf_get_int(conf, CONF_bellovl_n)); write_setting_i(sesskey, "BellOverloadT", conf_get_int(conf, CONF_bellovl_t) #ifdef PUTTY_UNIX_PLATFORM_H * 1000 @@ -669,26 +616,6 @@ void save_open_settings(settings_w *sesskey, Conf *conf) * 1000 #endif ); - write_setting_i(sesskey, "ScrollbackLines", conf_get_int(conf, CONF_savelines)); - write_setting_b(sesskey, "DECOriginMode", conf_get_bool(conf, CONF_dec_om)); - write_setting_b(sesskey, "AutoWrapMode", conf_get_bool(conf, CONF_wrap_mode)); - write_setting_b(sesskey, "LFImpliesCR", conf_get_bool(conf, CONF_lfhascr)); - write_setting_b(sesskey, "CRImpliesLF", conf_get_bool(conf, CONF_crhaslf)); - write_setting_b(sesskey, "DisableArabicShaping", conf_get_bool(conf, CONF_no_arabicshaping)); - write_setting_b(sesskey, "DisableBidi", conf_get_bool(conf, CONF_no_bidi)); - write_setting_b(sesskey, "WinNameAlways", conf_get_bool(conf, CONF_win_name_always)); - write_setting_s(sesskey, "WinTitle", conf_get_str(conf, CONF_wintitle)); - write_setting_i(sesskey, "TermWidth", conf_get_int(conf, CONF_width)); - write_setting_i(sesskey, "TermHeight", conf_get_int(conf, CONF_height)); - write_setting_fontspec(sesskey, "Font", conf_get_fontspec(conf, CONF_font)); - write_setting_i(sesskey, "FontQuality", conf_get_int(conf, CONF_font_quality)); - write_setting_i(sesskey, "FontVTMode", conf_get_int(conf, CONF_vtmode)); - write_setting_b(sesskey, "UseSystemColours", conf_get_bool(conf, CONF_system_colour)); - write_setting_b(sesskey, "TryPalette", conf_get_bool(conf, CONF_try_palette)); - write_setting_b(sesskey, "ANSIColour", conf_get_bool(conf, CONF_ansi_colour)); - write_setting_b(sesskey, "Xterm256Colour", conf_get_bool(conf, CONF_xterm_256_colour)); - write_setting_b(sesskey, "TrueColour", conf_get_bool(conf, CONF_true_colour)); - write_setting_i(sesskey, "BoldAsColour", conf_get_int(conf, CONF_bold_style)-1); for (i = 0; i < 22; i++) { char buf[20], buf2[30]; @@ -699,13 +626,6 @@ void save_open_settings(settings_w *sesskey, Conf *conf) conf_get_int_int(conf, CONF_colours, i*3+2)); write_setting_s(sesskey, buf, buf2); } - write_setting_b(sesskey, "RawCNP", conf_get_bool(conf, CONF_rawcnp)); - write_setting_b(sesskey, "UTF8linedraw", conf_get_bool(conf, CONF_utf8linedraw)); - write_setting_b(sesskey, "PasteRTF", conf_get_bool(conf, CONF_rtf_paste)); - write_setting_i(sesskey, "MouseIsXterm", conf_get_int(conf, CONF_mouse_is_xterm)); - write_setting_b(sesskey, "RectSelect", conf_get_bool(conf, CONF_rect_select)); - write_setting_b(sesskey, "PasteControls", conf_get_bool(conf, CONF_paste_controls)); - write_setting_b(sesskey, "MouseOverride", conf_get_bool(conf, CONF_mouse_override)); for (i = 0; i < 256; i += 32) { char buf[20], buf2[256]; int j; @@ -718,77 +638,15 @@ void save_open_settings(settings_w *sesskey, Conf *conf) } write_setting_s(sesskey, buf, buf2); } - write_setting_b(sesskey, "MouseAutocopy", - conf_get_bool(conf, CONF_mouseautocopy)); write_clip_setting(sesskey, "MousePaste", conf, CONF_mousepaste, CONF_mousepaste_custom); write_clip_setting(sesskey, "CtrlShiftIns", conf, CONF_ctrlshiftins, CONF_ctrlshiftins_custom); write_clip_setting(sesskey, "CtrlShiftCV", conf, CONF_ctrlshiftcv, CONF_ctrlshiftcv_custom); - write_setting_s(sesskey, "LineCodePage", conf_get_str(conf, CONF_line_codepage)); - write_setting_b(sesskey, "CJKAmbigWide", conf_get_bool(conf, CONF_cjk_ambig_wide)); - write_setting_b(sesskey, "UTF8Override", conf_get_bool(conf, CONF_utf8_override)); - write_setting_s(sesskey, "Printer", conf_get_str(conf, CONF_printer)); - write_setting_b(sesskey, "CapsLockCyr", conf_get_bool(conf, CONF_xlat_capslockcyr)); - write_setting_b(sesskey, "ScrollBar", conf_get_bool(conf, CONF_scrollbar)); - write_setting_b(sesskey, "ScrollBarFullScreen", conf_get_bool(conf, CONF_scrollbar_in_fullscreen)); - write_setting_b(sesskey, "ScrollOnKey", conf_get_bool(conf, CONF_scroll_on_key)); - write_setting_b(sesskey, "ScrollOnDisp", conf_get_bool(conf, CONF_scroll_on_disp)); - write_setting_b(sesskey, "EraseToScrollback", conf_get_bool(conf, CONF_erase_to_scrollback)); - write_setting_i(sesskey, "LockSize", conf_get_int(conf, CONF_resize_action)); - write_setting_b(sesskey, "BCE", conf_get_bool(conf, CONF_bce)); - write_setting_b(sesskey, "BlinkText", conf_get_bool(conf, CONF_blinktext)); - write_setting_b(sesskey, "X11Forward", conf_get_bool(conf, CONF_x11_forward)); - write_setting_s(sesskey, "X11Display", conf_get_str(conf, CONF_x11_display)); - write_setting_i(sesskey, "X11AuthType", conf_get_int(conf, CONF_x11_auth)); - write_setting_filename(sesskey, "X11AuthFile", conf_get_filename(conf, CONF_xauthfile)); - write_setting_b(sesskey, "LocalPortAcceptAll", conf_get_bool(conf, CONF_lport_acceptall)); - write_setting_b(sesskey, "RemotePortAcceptAll", conf_get_bool(conf, CONF_rport_acceptall)); wmap(sesskey, "PortForwardings", conf, CONF_portfwd, true); - write_setting_i(sesskey, "BugIgnore1", 2-conf_get_int(conf, CONF_sshbug_ignore1)); - write_setting_i(sesskey, "BugPlainPW1", 2-conf_get_int(conf, CONF_sshbug_plainpw1)); - write_setting_i(sesskey, "BugRSA1", 2-conf_get_int(conf, CONF_sshbug_rsa1)); - write_setting_i(sesskey, "BugIgnore2", 2-conf_get_int(conf, CONF_sshbug_ignore2)); write_setting_i(sesskey, "BugHMAC2", 2-conf_get_int(conf, CONF_sshbug_hmac2)); - write_setting_i(sesskey, "BugDeriveKey2", 2-conf_get_int(conf, CONF_sshbug_derivekey2)); - write_setting_i(sesskey, "BugRSAPad2", 2-conf_get_int(conf, CONF_sshbug_rsapad2)); - write_setting_i(sesskey, "BugPKSessID2", 2-conf_get_int(conf, CONF_sshbug_pksessid2)); - write_setting_i(sesskey, "BugRekey2", 2-conf_get_int(conf, CONF_sshbug_rekey2)); - write_setting_i(sesskey, "BugMaxPkt2", 2-conf_get_int(conf, CONF_sshbug_maxpkt2)); - write_setting_i(sesskey, "BugOldGex2", 2-conf_get_int(conf, CONF_sshbug_oldgex2)); - write_setting_i(sesskey, "BugWinadj", 2-conf_get_int(conf, CONF_sshbug_winadj)); - write_setting_i(sesskey, "BugChanReq", 2-conf_get_int(conf, CONF_sshbug_chanreq)); - write_setting_i(sesskey, "BugRSASHA2CertUserauth", 2-conf_get_int(conf, CONF_sshbug_rsa_sha2_cert_userauth)); - write_setting_i(sesskey, "BugDropStart", 2-conf_get_int(conf, CONF_sshbug_dropstart)); - write_setting_i(sesskey, "BugFilterKexinit", 2-conf_get_int(conf, CONF_sshbug_filter_kexinit)); - write_setting_b(sesskey, "StampUtmp", conf_get_bool(conf, CONF_stamp_utmp)); - write_setting_b(sesskey, "LoginShell", conf_get_bool(conf, CONF_login_shell)); - write_setting_b(sesskey, "ScrollbarOnLeft", conf_get_bool(conf, CONF_scrollbar_on_left)); - write_setting_fontspec(sesskey, "BoldFont", conf_get_fontspec(conf, CONF_boldfont)); - write_setting_fontspec(sesskey, "WideFont", conf_get_fontspec(conf, CONF_widefont)); - write_setting_fontspec(sesskey, "WideBoldFont", conf_get_fontspec(conf, CONF_wideboldfont)); - write_setting_b(sesskey, "ShadowBold", conf_get_bool(conf, CONF_shadowbold)); - write_setting_i(sesskey, "ShadowBoldOffset", conf_get_int(conf, CONF_shadowboldoffset)); - write_setting_s(sesskey, "SerialLine", conf_get_str(conf, CONF_serline)); - write_setting_i(sesskey, "SerialSpeed", conf_get_int(conf, CONF_serspeed)); - write_setting_i(sesskey, "SerialDataBits", conf_get_int(conf, CONF_serdatabits)); - write_setting_i(sesskey, "SerialStopHalfbits", conf_get_int(conf, CONF_serstopbits)); - write_setting_i(sesskey, "SerialParity", conf_get_int(conf, CONF_serparity)); - write_setting_i(sesskey, "SerialFlowControl", conf_get_int(conf, CONF_serflow)); - write_setting_s(sesskey, "WindowClass", conf_get_str(conf, CONF_winclass)); - write_setting_b(sesskey, "ConnectionSharing", conf_get_bool(conf, CONF_ssh_connection_sharing)); - write_setting_b(sesskey, "ConnectionSharingUpstream", conf_get_bool(conf, CONF_ssh_connection_sharing_upstream)); - write_setting_b(sesskey, "ConnectionSharingDownstream", conf_get_bool(conf, CONF_ssh_connection_sharing_downstream)); wmap(sesskey, "SSHManualHostKeys", conf, CONF_ssh_manual_hostkeys, false); - - /* - * SUPDUP settings - */ - write_setting_s(sesskey, "SUPDUPLocation", conf_get_str(conf, CONF_supdup_location)); - write_setting_i(sesskey, "SUPDUPCharset", conf_get_int(conf, CONF_supdup_ascii_set)); - write_setting_b(sesskey, "SUPDUPMoreProcessing", conf_get_bool(conf, CONF_supdup_more)); - write_setting_b(sesskey, "SUPDUPScrolling", conf_get_bool(conf, CONF_supdup_scroll)); } bool load_settings(const char *section, Conf *conf) @@ -816,14 +674,64 @@ void load_open_settings(settings_r *sesskey, Conf *conf) conf_set_str(conf, CONF_remote_cmd2, ""); conf_set_str(conf, CONF_ssh_nc_host, ""); - gpps(sesskey, "HostName", "", conf, CONF_host); - gppfile(sesskey, "LogFileName", conf, CONF_logfilename); - gppi(sesskey, "LogType", 0, conf, CONF_logtype); - gppi(sesskey, "LogFileClash", LGXF_ASK, conf, CONF_logxfovr); - gppb(sesskey, "LogFlush", true, conf, CONF_logflush); - gppb(sesskey, "LogHeader", true, conf, CONF_logheader); - gppb(sesskey, "SSHLogOmitPasswords", true, conf, CONF_logomitpass); - gppb(sesskey, "SSHLogOmitData", false, conf, CONF_logomitdata); + /* Load the settings simple enough to handle automatically */ + for (size_t key = 0; key < N_CONFIG_OPTIONS; key++) { + const ConfKeyInfo *info = &conf_key_info[key]; + if (info->save_keyword) { + /* Mappings are handled individually below */ + assert(info->subkey_type == CONF_TYPE_NONE); + switch (info->value_type) { + case CONF_TYPE_STR: + gpps(sesskey, info->save_keyword, info->default_value.sval, + conf, key); + break; + case CONF_TYPE_INT: + if (!info->storage_enum) { + gppi(sesskey, info->save_keyword, + info->default_value.ival, conf, key); + } else { + /* + * Because our internal defaults are stored as the + * value we want in Conf, but our API for + * retrieving integers from storage requires a + * default value to fill in if no record is found, + * we must first figure out the default _storage_ + * value, ugh. + */ + int defstorage; + bool success = conf_enum_map_to_storage( + info->storage_enum, info->default_value.ival, + &defstorage); + assert(success && "unmapped default"); + + /* Now retrieve the stored value */ + int storageval = gppi_raw(sesskey, info->save_keyword, + defstorage); + + /* And translate it back to Conf representation, + * replacing it with our Conf-rep default on failure */ + int confval; + if (!conf_enum_map_from_storage( + info->storage_enum, storageval, &confval)) + confval = info->default_value.ival; + conf_set_int(conf, key, confval); + } + break; + case CONF_TYPE_BOOL: + gppb(sesskey, info->save_keyword, info->default_value.bval, + conf, key); + break; + case CONF_TYPE_FILENAME: + gppfile(sesskey, info->save_keyword, conf, key); + break; + case CONF_TYPE_FONT: + gppfont(sesskey, info->save_keyword, conf, key); + break; + default: + unreachable("bad key type in load_open_settings"); + } + } + } prot = gpps_raw(sesskey, "Protocol", "default"); conf_set_int(conf, CONF_protocol, default_protocol); @@ -837,13 +745,6 @@ void load_open_settings(settings_r *sesskey, Conf *conf) } sfree(prot); - /* Address family selection */ - gppi(sesskey, "AddressFamily", ADDRTYPE_UNSPEC, conf, CONF_addressfamily); - - /* The CloseOnExit numbers are arranged in a different order from - * the standard FORCE_ON / FORCE_OFF / AUTO. */ - i = gppi_raw(sesskey, "CloseOnExit", 1); conf_set_int(conf, CONF_close_on_exit, (i+1)%3); - gppb(sesskey, "WarnOnClose", true, conf, CONF_warn_on_close); { /* This is two values for backward compatibility with 0.50/0.51 */ int pingmin, pingsec; @@ -851,10 +752,6 @@ void load_open_settings(settings_r *sesskey, Conf *conf) pingsec = gppi_raw(sesskey, "PingIntervalSecs", 0); conf_set_int(conf, CONF_ping_interval, pingmin * 60 + pingsec); } - gppb(sesskey, "TCPNoDelay", true, conf, CONF_tcp_nodelay); - gppb(sesskey, "TCPKeepalives", false, conf, CONF_tcp_keepalives); - gpps(sesskey, "TerminalType", "xterm", conf, CONF_termtype); - gpps(sesskey, "TerminalSpeed", "38400,38400", conf, CONF_termspeed); if (gppmap(sesskey, "TerminalModes", conf, CONF_ttymodes)) { /* * Backwards compatibility with old saved settings. @@ -907,9 +804,6 @@ void load_open_settings(settings_r *sesskey, Conf *conf) } /* proxy settings */ - gpps(sesskey, "ProxyExcludeList", "", conf, CONF_proxy_exclude_list); - i = gppi_raw(sesskey, "ProxyDNS", 1); conf_set_int(conf, CONF_proxy_dns, (i+1)%3); - gppb(sesskey, "ProxyLocalhost", false, conf, CONF_even_proxy_localhost); gppi(sesskey, "ProxyMethod", -1, conf, CONF_proxy_type); if (conf_get_int(conf, CONF_proxy_type) == -1) { int i; @@ -930,23 +824,7 @@ void load_open_settings(settings_r *sesskey, Conf *conf) conf_set_int(conf, CONF_proxy_type, PROXY_SOCKS4); } } - gpps(sesskey, "ProxyHost", "proxy", conf, CONF_proxy_host); - gppi(sesskey, "ProxyPort", 80, conf, CONF_proxy_port); - gpps(sesskey, "ProxyUsername", "", conf, CONF_proxy_username); - gpps(sesskey, "ProxyPassword", "", conf, CONF_proxy_password); - gpps(sesskey, "ProxyTelnetCommand", "connect %host %port\\n", - conf, CONF_proxy_telnet_command); - gppi(sesskey, "ProxyLogToTerm", FORCE_OFF, conf, CONF_proxy_log_to_term); gppmap(sesskey, "Environment", conf, CONF_environmt); - gpps(sesskey, "UserName", "", conf, CONF_username); - gppb(sesskey, "UserNameFromEnvironment", false, - conf, CONF_username_from_env); - gpps(sesskey, "LocalUserName", "", conf, CONF_localusername); - gppb(sesskey, "NoPTY", false, conf, CONF_nopty); - gppb(sesskey, "Compression", false, conf, CONF_compression); - gppb(sesskey, "TryAgent", true, conf, CONF_tryagent); - gppb(sesskey, "AgentFwd", false, conf, CONF_agentfwd); - gppb(sesskey, "ChangeUsername", false, conf, CONF_change_username); #ifndef NO_GSSAPI gppb(sesskey, "GssapiFwd", false, conf, CONF_gssapifwd); #endif @@ -1001,28 +879,9 @@ void load_open_settings(settings_r *sesskey, Conf *conf) } gprefs(sesskey, "HostKey", "ed25519,ecdsa,rsa,dsa,WARN", hknames, HK_MAX, conf, CONF_ssh_hklist); - gppb(sesskey, "PreferKnownHostKeys", true, conf, CONF_ssh_prefer_known_hostkeys); - gppi(sesskey, "RekeyTime", 60, conf, CONF_ssh_rekey_time); #ifndef NO_GSSAPI gppi(sesskey, "GssapiRekey", GSS_DEF_REKEY_MINS, conf, CONF_gssapirekey); #endif - gpps(sesskey, "RekeyBytes", "1G", conf, CONF_ssh_rekey_data); - { - /* SSH-2 only by default */ - int sshprot = gppi_raw(sesskey, "SshProt", 3); - /* Old sessions may contain the values corresponding to the fallbacks - * we used to allow; migrate them */ - if (sshprot == 1) sshprot = 0; /* => "SSH-1 only" */ - else if (sshprot == 2) sshprot = 3; /* => "SSH-2 only" */ - conf_set_int(conf, CONF_sshprot, sshprot); - } - gpps(sesskey, "LogHost", "", conf, CONF_loghost); - gppb(sesskey, "SSH2DES", false, conf, CONF_ssh2_des_cbc); - gppb(sesskey, "SshNoAuth", false, conf, CONF_ssh_no_userauth); - gppb(sesskey, "SshNoTrivialAuth", false, conf, CONF_ssh_no_trivial_userauth); - gppb(sesskey, "SshBanner", true, conf, CONF_ssh_show_banner); - gppb(sesskey, "AuthTIS", false, conf, CONF_try_tis_auth); - gppb(sesskey, "AuthKI", true, conf, CONF_try_ki_auth); #ifndef NO_GSSAPI gppb(sesskey, "AuthGSSAPI", true, conf, CONF_try_gssapi_auth); gppb(sesskey, "AuthGSSAPIKEX", true, conf, CONF_try_gssapi_kex); @@ -1030,26 +889,6 @@ void load_open_settings(settings_r *sesskey, Conf *conf) gsslibkeywords, ngsslibs, conf, CONF_ssh_gsslist); gppfile(sesskey, "GSSCustom", conf, CONF_ssh_gss_custom); #endif - gppb(sesskey, "SshNoShell", false, conf, CONF_ssh_no_shell); - gppfile(sesskey, "PublicKeyFile", conf, CONF_keyfile); - gppfile(sesskey, "DetachedCertificate", conf, CONF_detached_cert); - gpps(sesskey, "AuthPlugin", "", conf, CONF_auth_plugin); - gpps(sesskey, "RemoteCommand", "", conf, CONF_remote_cmd); - gppb(sesskey, "RFCEnviron", false, conf, CONF_rfc_environ); - gppb(sesskey, "PassiveTelnet", false, conf, CONF_passive_telnet); - gppb(sesskey, "BackspaceIsDelete", true, conf, CONF_bksp_is_delete); - gppb(sesskey, "RXVTHomeEnd", false, conf, CONF_rxvt_homeend); - gppi(sesskey, "LinuxFunctionKeys", 0, conf, CONF_funky_type); - gppi(sesskey, "ShiftedArrowKeys", SHARROW_APPLICATION, conf, - CONF_sharrow_type); - gppb(sesskey, "NoApplicationKeys", false, conf, CONF_no_applic_k); - gppb(sesskey, "NoApplicationCursors", false, conf, CONF_no_applic_c); - gppb(sesskey, "NoMouseReporting", false, conf, CONF_no_mouse_rep); - gppb(sesskey, "NoRemoteResize", false, conf, CONF_no_remote_resize); - gppb(sesskey, "NoAltScreen", false, conf, CONF_no_alt_screen); - gppb(sesskey, "NoRemoteWinTitle", false, conf, CONF_no_remote_wintitle); - gppb(sesskey, "NoRemoteClearScroll", false, - conf, CONF_no_remote_clearscroll); { /* Backward compatibility */ int no_remote_qtitle = gppi_raw(sesskey, "NoRemoteQTitle", 1); @@ -1060,39 +899,10 @@ void load_open_settings(settings_r *sesskey, Conf *conf) no_remote_qtitle ? TITLE_EMPTY : TITLE_REAL, conf, CONF_remote_qtitle_action); } - gppb(sesskey, "NoDBackspace", false, conf, CONF_no_dbackspace); - gppb(sesskey, "NoRemoteCharset", false, conf, CONF_no_remote_charset); - gppb(sesskey, "ApplicationCursorKeys", false, conf, CONF_app_cursor); - gppb(sesskey, "ApplicationKeypad", false, conf, CONF_app_keypad); - gppb(sesskey, "NetHackKeypad", false, conf, CONF_nethack_keypad); - gppb(sesskey, "AltF4", true, conf, CONF_alt_f4); - gppb(sesskey, "AltSpace", false, conf, CONF_alt_space); - gppb(sesskey, "AltOnly", false, conf, CONF_alt_only); - gppb(sesskey, "ComposeKey", false, conf, CONF_compose_key); - gppb(sesskey, "CtrlAltKeys", true, conf, CONF_ctrlaltkeys); #ifdef OSX_META_KEY_CONFIG gppb(sesskey, "OSXOptionMeta", true, conf, CONF_osx_option_meta); gppb(sesskey, "OSXCommandMeta", false, conf, CONF_osx_command_meta); #endif - gppb(sesskey, "TelnetKey", false, conf, CONF_telnet_keyboard); - gppb(sesskey, "TelnetRet", true, conf, CONF_telnet_newline); - gppi(sesskey, "LocalEcho", AUTO, conf, CONF_localecho); - gppi(sesskey, "LocalEdit", AUTO, conf, CONF_localedit); - gpps(sesskey, "Answerback", "PuTTY", conf, CONF_answerback); - gppb(sesskey, "AlwaysOnTop", false, conf, CONF_alwaysontop); - gppb(sesskey, "FullScreenOnAltEnter", false, - conf, CONF_fullscreenonaltenter); - gppb(sesskey, "HideMousePtr", false, conf, CONF_hide_mouseptr); - gppb(sesskey, "SunkenEdge", false, conf, CONF_sunken_edge); - gppi(sesskey, "WindowBorder", 1, conf, CONF_window_border); - gppi(sesskey, "CurType", 0, conf, CONF_cursor_type); - gppb(sesskey, "BlinkCur", false, conf, CONF_blink_cur); - /* pedantic compiler tells me I can't use conf, CONF_beep as an int * :-) */ - gppi(sesskey, "Beep", 1, conf, CONF_beep); - gppi(sesskey, "BeepInd", 0, conf, CONF_beep_ind); - gppfile(sesskey, "BellWaveFile", conf, CONF_bell_wavefile); - gppb(sesskey, "BellOverload", true, conf, CONF_bellovl); - gppi(sesskey, "BellOverloadN", 5, conf, CONF_bellovl_n); i = gppi_raw(sesskey, "BellOverloadT", 2*TICKSPERSEC #ifdef PUTTY_UNIX_PLATFORM_H *1000 @@ -1113,26 +923,6 @@ void load_open_settings(settings_r *sesskey, Conf *conf) / 1000 #endif ); - gppi(sesskey, "ScrollbackLines", 2000, conf, CONF_savelines); - gppb(sesskey, "DECOriginMode", false, conf, CONF_dec_om); - gppb(sesskey, "AutoWrapMode", true, conf, CONF_wrap_mode); - gppb(sesskey, "LFImpliesCR", false, conf, CONF_lfhascr); - gppb(sesskey, "CRImpliesLF", false, conf, CONF_crhaslf); - gppb(sesskey, "DisableArabicShaping", false, conf, CONF_no_arabicshaping); - gppb(sesskey, "DisableBidi", false, conf, CONF_no_bidi); - gppb(sesskey, "WinNameAlways", true, conf, CONF_win_name_always); - gpps(sesskey, "WinTitle", "", conf, CONF_wintitle); - gppi(sesskey, "TermWidth", 80, conf, CONF_width); - gppi(sesskey, "TermHeight", 24, conf, CONF_height); - gppfont(sesskey, "Font", conf, CONF_font); - gppi(sesskey, "FontQuality", FQ_DEFAULT, conf, CONF_font_quality); - gppi(sesskey, "FontVTMode", VT_UNICODE, conf, CONF_vtmode); - gppb(sesskey, "UseSystemColours", false, conf, CONF_system_colour); - gppb(sesskey, "TryPalette", false, conf, CONF_try_palette); - gppb(sesskey, "ANSIColour", true, conf, CONF_ansi_colour); - gppb(sesskey, "Xterm256Colour", true, conf, CONF_xterm_256_colour); - gppb(sesskey, "TrueColour", true, conf, CONF_true_colour); - i = gppi_raw(sesskey, "BoldAsColour", 1); conf_set_int(conf, CONF_bold_style, i+1); for (i = 0; i < 22; i++) { static const char *const defaults[] = { @@ -1153,13 +943,6 @@ void load_open_settings(settings_r *sesskey, Conf *conf) } sfree(buf2); } - gppb(sesskey, "RawCNP", false, conf, CONF_rawcnp); - gppb(sesskey, "UTF8linedraw", false, conf, CONF_utf8linedraw); - gppb(sesskey, "PasteRTF", false, conf, CONF_rtf_paste); - gppi(sesskey, "MouseIsXterm", 0, conf, CONF_mouse_is_xterm); - gppb(sesskey, "RectSelect", false, conf, CONF_rect_select); - gppb(sesskey, "PasteControls", false, conf, CONF_paste_controls); - gppb(sesskey, "MouseOverride", true, conf, CONF_mouse_override); for (i = 0; i < 256; i += 32) { static const char *const defaults[] = { "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", @@ -1186,8 +969,6 @@ void load_open_settings(settings_r *sesskey, Conf *conf) } sfree(buf2); } - gppb(sesskey, "MouseAutocopy", CLIPUI_DEFAULT_AUTOCOPY, - conf, CONF_mouseautocopy); read_clip_setting(sesskey, "MousePaste", CLIPUI_DEFAULT_MOUSE, conf, CONF_mousepaste, CONF_mousepaste_custom); read_clip_setting(sesskey, "CtrlShiftIns", CLIPUI_DEFAULT_INS, @@ -1198,32 +979,8 @@ void load_open_settings(settings_r *sesskey, Conf *conf) * The empty default for LineCodePage will be converted later * into a plausible default for the locale. */ - gpps(sesskey, "LineCodePage", "", conf, CONF_line_codepage); - gppb(sesskey, "CJKAmbigWide", false, conf, CONF_cjk_ambig_wide); - gppb(sesskey, "UTF8Override", true, conf, CONF_utf8_override); - gpps(sesskey, "Printer", "", conf, CONF_printer); - gppb(sesskey, "CapsLockCyr", false, conf, CONF_xlat_capslockcyr); - gppb(sesskey, "ScrollBar", true, conf, CONF_scrollbar); - gppb(sesskey, "ScrollBarFullScreen", false, - conf, CONF_scrollbar_in_fullscreen); - gppb(sesskey, "ScrollOnKey", false, conf, CONF_scroll_on_key); - gppb(sesskey, "ScrollOnDisp", true, conf, CONF_scroll_on_disp); - gppb(sesskey, "EraseToScrollback", true, conf, CONF_erase_to_scrollback); - gppi(sesskey, "LockSize", 0, conf, CONF_resize_action); - gppb(sesskey, "BCE", true, conf, CONF_bce); - gppb(sesskey, "BlinkText", false, conf, CONF_blinktext); - gppb(sesskey, "X11Forward", false, conf, CONF_x11_forward); - gpps(sesskey, "X11Display", "", conf, CONF_x11_display); - gppi(sesskey, "X11AuthType", X11_MIT, conf, CONF_x11_auth); - gppfile(sesskey, "X11AuthFile", conf, CONF_xauthfile); - gppb(sesskey, "LocalPortAcceptAll", false, conf, CONF_lport_acceptall); - gppb(sesskey, "RemotePortAcceptAll", false, conf, CONF_rport_acceptall); gppmap(sesskey, "PortForwardings", conf, CONF_portfwd); - i = gppi_raw(sesskey, "BugIgnore1", 0); conf_set_int(conf, CONF_sshbug_ignore1, 2-i); - i = gppi_raw(sesskey, "BugPlainPW1", 0); conf_set_int(conf, CONF_sshbug_plainpw1, 2-i); - i = gppi_raw(sesskey, "BugRSA1", 0); conf_set_int(conf, CONF_sshbug_rsa1, 2-i); - i = gppi_raw(sesskey, "BugIgnore2", 0); conf_set_int(conf, CONF_sshbug_ignore2, 2-i); { int i; i = gppi_raw(sesskey, "BugHMAC2", 0); conf_set_int(conf, CONF_sshbug_hmac2, 2-i); @@ -1233,48 +990,8 @@ void load_open_settings(settings_r *sesskey, Conf *conf) conf_set_int(conf, CONF_sshbug_hmac2, FORCE_ON); } } - i = gppi_raw(sesskey, "BugDeriveKey2", 0); conf_set_int(conf, CONF_sshbug_derivekey2, 2-i); - i = gppi_raw(sesskey, "BugRSAPad2", 0); conf_set_int(conf, CONF_sshbug_rsapad2, 2-i); - i = gppi_raw(sesskey, "BugPKSessID2", 0); conf_set_int(conf, CONF_sshbug_pksessid2, 2-i); - i = gppi_raw(sesskey, "BugRekey2", 0); conf_set_int(conf, CONF_sshbug_rekey2, 2-i); - i = gppi_raw(sesskey, "BugMaxPkt2", 0); conf_set_int(conf, CONF_sshbug_maxpkt2, 2-i); - i = gppi_raw(sesskey, "BugOldGex2", 0); conf_set_int(conf, CONF_sshbug_oldgex2, 2-i); - i = gppi_raw(sesskey, "BugWinadj", 0); conf_set_int(conf, CONF_sshbug_winadj, 2-i); - i = gppi_raw(sesskey, "BugChanReq", 0); conf_set_int(conf, CONF_sshbug_chanreq, 2-i); - i = gppi_raw(sesskey, "BugRSASHA2CertUserauth", 0); conf_set_int(conf, CONF_sshbug_rsa_sha2_cert_userauth, 2-i); - i = gppi_raw(sesskey, "BugDropStart", 1); conf_set_int(conf, CONF_sshbug_dropstart, 2-i); - i = gppi_raw(sesskey, "BugFilterKexinit", 1); conf_set_int(conf, CONF_sshbug_filter_kexinit, 2-i); conf_set_bool(conf, CONF_ssh_simple, false); - gppb(sesskey, "StampUtmp", true, conf, CONF_stamp_utmp); - gppb(sesskey, "LoginShell", true, conf, CONF_login_shell); - gppb(sesskey, "ScrollbarOnLeft", false, conf, CONF_scrollbar_on_left); - gppb(sesskey, "ShadowBold", false, conf, CONF_shadowbold); - gppfont(sesskey, "BoldFont", conf, CONF_boldfont); - gppfont(sesskey, "WideFont", conf, CONF_widefont); - gppfont(sesskey, "WideBoldFont", conf, CONF_wideboldfont); - gppi(sesskey, "ShadowBoldOffset", 1, conf, CONF_shadowboldoffset); - gpps(sesskey, "SerialLine", "", conf, CONF_serline); - gppi(sesskey, "SerialSpeed", 9600, conf, CONF_serspeed); - gppi(sesskey, "SerialDataBits", 8, conf, CONF_serdatabits); - gppi(sesskey, "SerialStopHalfbits", 2, conf, CONF_serstopbits); - gppi(sesskey, "SerialParity", SER_PAR_NONE, conf, CONF_serparity); - gppi(sesskey, "SerialFlowControl", SER_FLOW_XONXOFF, conf, CONF_serflow); - gpps(sesskey, "WindowClass", "", conf, CONF_winclass); - gppb(sesskey, "ConnectionSharing", false, - conf, CONF_ssh_connection_sharing); - gppb(sesskey, "ConnectionSharingUpstream", true, - conf, CONF_ssh_connection_sharing_upstream); - gppb(sesskey, "ConnectionSharingDownstream", true, - conf, CONF_ssh_connection_sharing_downstream); gppmap(sesskey, "SSHManualHostKeys", conf, CONF_ssh_manual_hostkeys); - - /* - * SUPDUP settings - */ - gpps(sesskey, "SUPDUPLocation", "The Internet", conf, CONF_supdup_location); - gppi(sesskey, "SUPDUPCharset", false, conf, CONF_supdup_ascii_set); - gppb(sesskey, "SUPDUPMoreProcessing", false, conf, CONF_supdup_more); - gppb(sesskey, "SUPDUPScrolling", false, conf, CONF_supdup_scroll); } bool do_defaults(const char *session, Conf *conf) diff --git a/utils/conf_data.c b/utils/conf_data.c index 80c2fa50..ab90a179 100644 --- a/utils/conf_data.c +++ b/utils/conf_data.c @@ -1,8 +1,49 @@ #include "putty.h" +#define CONF_ENUM(name, ...) \ + static const ConfSaveEnumValue enum_values_##name[] = { \ + __VA_ARGS__ \ + }; static const ConfSaveEnumType enum_##name = { \ + .values = enum_values_##name, \ + .nvalues = lenof(enum_values_##name), \ + }; + +#define VALUE(eval, sval) { eval, sval, false } +#define VALUE_OBSOLETE(eval, sval) { eval, sval, true } + +#include "conf-enums.h" + +bool conf_enum_map_to_storage(const ConfSaveEnumType *etype, + int confval, int *storageval_out) +{ + for (size_t i = 0; i < etype->nvalues; i++) + if (!etype->values[i].obsolete && + etype->values[i].confval == confval) { + *storageval_out = etype->values[i].storageval; + return true; + } + return false; +} + +bool conf_enum_map_from_storage(const ConfSaveEnumType *etype, + int storageval, int *confval_out) +{ + for (size_t i = 0; i < etype->nvalues; i++) + if (etype->values[i].storageval == storageval) { + *confval_out = etype->values[i].confval; + return true; + } + return false; +} + #define CONF_OPTION(id, ...) { __VA_ARGS__ }, #define VALUE_TYPE(x) .value_type = CONF_TYPE_ ## x #define SUBKEY_TYPE(x) .subkey_type = CONF_TYPE_ ## x +#define DEFAULT_INT(x) .default_value.ival = x +#define DEFAULT_STR(x) .default_value.sval = x +#define DEFAULT_BOOL(x) .default_value.bval = x +#define SAVE_KEYWORD(x) .save_keyword = x +#define STORAGE_ENUM(x) .storage_enum = &enum_ ## x const ConfKeyInfo conf_key_info[] = { #include "conf.h"