• R/O
  • SSH
  • HTTPS

ttssh2: 提交


Commit MetaInfo

修订版5869 (tree)
时间2015-05-16 11:58:33
作者(del#1144)

Log Message

http://osdn.jp/ticket/browse.php?group_id=1412&tid=33895 /F=inifileオプションが処理されるタイミング

設定ファイルを先に読み込むようにした

http://osdn.jp/ticket/browse.php?group_id=1412&tid=34353 コマンドラインで";"以降をコメントとして扱わない

コメントとして扱うようにした

セッションを複製するとき、パスワード・秘密鍵ファイルに";"が含まれているときも"でクォートするようにした

更改概述

差异

--- trunk/ttssh2/ttxssh/ttxssh.c (revision 5868)
+++ trunk/ttssh2/ttxssh/ttxssh.c (revision 5869)
@@ -1632,6 +1632,379 @@
16321632 }
16331633 }
16341634
1635+#if 1
1636+// TTXSamples/TTXCommandLineOpt/TTXCommandLineOpt.c と同じ
1637+static PCHAR GetParam(PCHAR buff, int size, PCHAR param) {
1638+ int i = 0;
1639+ BOOL quoted = FALSE;
1640+
1641+ while (*param == ' ' || *param == '\t') {
1642+ param++;
1643+ }
1644+
1645+ if (*param == '\0' || *param == ';') {
1646+ return NULL;
1647+ }
1648+
1649+ while (*param != '\0' && (quoted || (*param != ';' && *param != ' ' && *param != '\t'))) {
1650+ if (*param == '"' && (*++param != '"' || !quoted)) {
1651+ quoted = !quoted;
1652+ continue;
1653+ }
1654+ else if (i < size - 1) {
1655+ buff[i++] = *param;
1656+ }
1657+ param++;
1658+ }
1659+
1660+ buff[i] = '\0';
1661+ return (param);
1662+}
1663+
1664+static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
1665+ int param_len=strlen(param);
1666+ int opt_len = param_len+1;
1667+ char *option = (char *)calloc(opt_len, sizeof(char));
1668+ int action;
1669+ PCHAR cur, next;
1670+
1671+ if (pvar->hostdlg_activated) {
1672+ pvar->settings.Enabled = pvar->hostdlg_Enabled;
1673+ }
1674+
1675+ cur = param;
1676+ while (next = GetParam(option, opt_len, cur)) {
1677+ action = OPTION_NONE;
1678+
1679+ if ((option[0] == '-' || option[0] == '/')) {
1680+ if (MATCH_STR(option + 1, "ssh") == 0) {
1681+ if (MATCH_STR(option + 4, "-f=") == 0) {
1682+ read_ssh_options_from_user_file(pvar, option + 7);
1683+ action = OPTION_CLEAR;
1684+ } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1685+ read_ssh_options_from_user_file(pvar, option + 13);
1686+ DeleteFile(option + 13);
1687+ action = OPTION_CLEAR;
1688+ }
1689+
1690+ // ttermpro.exe の /F= 指定でも TTSSH の設定を読む (2006.10.11 maya)
1691+ } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1692+ read_ssh_options_from_user_file(pvar, option + 3);
1693+ // Tera Term側でも解釈する必要があるので消さない
1694+ }
1695+ }
1696+
1697+ switch (action) {
1698+ case OPTION_CLEAR:
1699+ memset(cur, ' ', next-cur);
1700+ break;
1701+ case OPTION_REPLACE:
1702+ memset(cur, ' ', next-cur);
1703+ memcpy(cur+1, option, strlen(option));
1704+ break;
1705+ }
1706+
1707+ cur = next;
1708+ }
1709+
1710+ cur = param;
1711+ while (next = GetParam(option, opt_len, cur)) {
1712+ action = OPTION_NONE;
1713+
1714+ if ((option[0] == '-' || option[0] == '/')) {
1715+ action = OPTION_CLEAR;
1716+ if (MATCH_STR(option + 1, "ssh") == 0) {
1717+ if (option[4] == 0) {
1718+ pvar->settings.Enabled = 1;
1719+ } else if (MATCH_STR(option + 4, "-L") == 0 ||
1720+ MATCH_STR(option + 4, "-R") == 0 ||
1721+ _stricmp(option + 4, "-X") == 0) {
1722+ add_forward_param(pvar, option+5);
1723+ } else if (MATCH_STR(option + 4, "-X") == 0) {
1724+ add_forward_param(pvar, "X");
1725+ strncpy_s(pvar->settings.X11Display,
1726+ sizeof(pvar->settings.X11Display),
1727+ option + 6, _TRUNCATE);
1728+ } else if (MATCH_STR(option + 4, "-v") == 0) {
1729+ pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1730+ } else if (_stricmp(option + 4, "-autologin") == 0 ||
1731+ _stricmp(option + 4, "-autologon") == 0) {
1732+ pvar->settings.TryDefaultAuth = TRUE;
1733+ } else if (MATCH_STR_I(option + 4, "-agentconfirm=") == 0) {
1734+ if ((_stricmp(option+18, "off") == 0) ||
1735+ (_stricmp(option+18, "no") == 0) ||
1736+ (_stricmp(option+18, "false") == 0) ||
1737+ (_stricmp(option+18, "0") == 0) ||
1738+ (_stricmp(option+18, "n") == 0)) {
1739+ pvar->settings.ForwardAgentConfirm = 0;
1740+ }
1741+ else {
1742+ pvar->settings.ForwardAgentConfirm = 1;
1743+ }
1744+
1745+ // -axxより上にしてはだめ
1746+ } else if (MATCH_STR(option + 4, "-a") == 0) {
1747+ pvar->settings.ForwardAgent = FALSE;
1748+ } else if (MATCH_STR(option + 4, "-A") == 0) {
1749+ pvar->settings.ForwardAgent = TRUE;
1750+
1751+ } else if (MATCH_STR(option + 4, "-C=") == 0) {
1752+ pvar->settings.CompressionLevel = atoi(option+7);
1753+ if (pvar->settings.CompressionLevel < 0) {
1754+ pvar->settings.CompressionLevel = 0;
1755+ }
1756+ else if (pvar->settings.CompressionLevel > 9) {
1757+ pvar->settings.CompressionLevel = 9;
1758+ }
1759+ } else if (MATCH_STR(option + 4, "-C") == 0) {
1760+ pvar->settings.CompressionLevel = 6;
1761+ } else if (MATCH_STR(option + 4, "-c") == 0) {
1762+ pvar->settings.CompressionLevel = 0;
1763+ } else if (MATCH_STR_I(option + 4, "-icon=") == 0) {
1764+ if ((_stricmp(option+10, "old") == 0) ||
1765+ (_stricmp(option+10, "yellow") == 0) ||
1766+ (_stricmp(option+10, "securett_yellow") == 0)) {
1767+ pvar->settings.IconID = IDI_SECURETT_YELLOW;
1768+ }
1769+ else {
1770+ pvar->settings.IconID = IDI_SECURETT;
1771+ }
1772+
1773+ // /ssh1 と /ssh2 オプションの新規追加 (2006.9.16 maya)
1774+ } else if (MATCH_STR(option + 4, "1") == 0) {
1775+ pvar->settings.Enabled = 1;
1776+ pvar->settings.ssh_protocol_version = 1;
1777+ } else if (MATCH_STR(option + 4, "2") == 0) {
1778+ pvar->settings.Enabled = 1;
1779+ pvar->settings.ssh_protocol_version = 2;
1780+
1781+ } else {
1782+ char buf[1024];
1783+
1784+ UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1785+ "Unrecognized command-line option: %s");
1786+ _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1787+
1788+ MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1789+ }
1790+
1791+ // ttermpro.exe の /T= 指定の流用なので、大文字も許す (2006.10.19 maya)
1792+ } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1793+ if (strcmp(option + 3, "2") == 0) {
1794+ pvar->settings.Enabled = 1;
1795+ // /t=2はttssh側での拡張なので消す
1796+ } else {
1797+ pvar->settings.Enabled = 0;
1798+ action = OPTION_NONE; // Tera Term側で解釈するので消さない
1799+ }
1800+
1801+ // /1 および /2 オプションの新規追加 (2004.10.3 yutaka)
1802+ } else if (MATCH_STR(option + 1, "1") == 0) {
1803+ // command line: /ssh /1 is SSH1 only
1804+ pvar->settings.ssh_protocol_version = 1;
1805+
1806+ } else if (MATCH_STR(option + 1, "2") == 0) {
1807+ // command line: /ssh /2 is SSH2 & SSH1
1808+ pvar->settings.ssh_protocol_version = 2;
1809+
1810+ } else if (MATCH_STR(option + 1, "nossh") == 0) {
1811+ // '/nossh' オプションの追加。
1812+ // TERATERM.INI でSSHが有効になっている場合、うまくCygtermが起動しないことが
1813+ // あることへの対処。(2004.10.11 yutaka)
1814+ pvar->settings.Enabled = 0;
1815+
1816+ } else if (MATCH_STR(option + 1, "telnet") == 0) {
1817+ // '/telnet' が指定されているときには '/nossh' と同じく
1818+ // SSHを無効にする (2006.9.16 maya)
1819+ pvar->settings.Enabled = 0;
1820+ // Tera Term の Telnet フラグも付ける
1821+ pvar->ts->Telnet = 1;
1822+
1823+ } else if (MATCH_STR(option + 1, "auth") == 0) {
1824+ // SSH2自動ログインオプションの追加
1825+ //
1826+ // SYNOPSIS: /ssh /auth=passowrd /user=ユーザ名 /passwd=パスワード
1827+ // /ssh /auth=publickey /user=ユーザ名 /passwd=パスワード /keyfile=パス
1828+ // EXAMPLE: /ssh /auth=password /user=nike /passwd=a@bc
1829+ // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1830+ // NOTICE: パスワードやパスに空白が含む場合は、ブランクの代わりに @ を使うこと。
1831+ //
1832+ // (2004.11.30 yutaka)
1833+ // (2005.1.26 yutaka) 空白対応。公開鍵認証サポート。
1834+ //
1835+ pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1836+
1837+ if (MATCH_STR(option + 5, "=password") == 0) { // パスワード
1838+ //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1839+ pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1840+
1841+ // /auth=challenge を追加 (2007.10.5 maya)
1842+ } else if (MATCH_STR(option + 5, "=challenge") == 0) { // keyboard-interactive認証
1843+ //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1844+ pvar->ssh2_authmethod = SSH_AUTH_TIS;
1845+
1846+ } else if (MATCH_STR(option + 5, "=publickey") == 0) { // 公開鍵認証
1847+ //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1848+ pvar->ssh2_authmethod = SSH_AUTH_RSA;
1849+
1850+ } else if (MATCH_STR(option + 5, "=pageant") == 0) { // 公開鍵認証 by Pageant
1851+ //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1852+ pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;
1853+
1854+ } else {
1855+ // TODO:
1856+
1857+ }
1858+
1859+ } else if (MATCH_STR(option + 1, "user=") == 0) {
1860+ _snprintf_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), _TRUNCATE, "%s", option + 6);
1861+
1862+ } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1863+ _snprintf_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), _TRUNCATE, "%s", option + 8);
1864+
1865+ } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
1866+ _snprintf_s(pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile), _TRUNCATE, "%s", option + 9);
1867+
1868+ } else if (MATCH_STR(option + 1, "ask4passwd") == 0) {
1869+ // パスワードを聞く (2006.9.18 maya)
1870+ pvar->ask4passwd = 1;
1871+
1872+ } else if (MATCH_STR(option + 1, "nosecuritywarning") == 0) {
1873+ // known_hostsチェックをしない。当該オプションを使うと、セキュリティ性が低下する
1874+ // ため、隠しオプション扱いとする。
1875+ // (2009.10.4 yutaka)
1876+ pvar->nocheck_known_hosts = TRUE;
1877+
1878+ }
1879+ else { // Other (not ttssh) option
1880+ action = OPTION_NONE; // ttsshのオプションではないので消さない
1881+ }
1882+
1883+ // パスワードを聞く場合は自動ログインが無効になる
1884+ // /auth は認証メソッドの指定としては利用される (2006.9.18 maya)
1885+ if (pvar->ask4passwd == 1) {
1886+ pvar->ssh2_autologin = 0;
1887+ }
1888+
1889+ }
1890+ else if ((MATCH_STR_I(option, "ssh://") == 0) ||
1891+ (MATCH_STR_I(option, "ssh1://") == 0) ||
1892+ (MATCH_STR_I(option, "ssh2://") == 0) ||
1893+ (MATCH_STR_I(option, "slogin://") == 0) ||
1894+ (MATCH_STR_I(option, "slogin1://") == 0) ||
1895+ (MATCH_STR_I(option, "slogin2://") == 0)) {
1896+ //
1897+ // ssh://user@host/ 等のURL形式のサポート
1898+ // 基本的な書式は telnet:// URLに順ずる
1899+ //
1900+ // 参考:
1901+ // RFC3986: Uniform Resource Identifier (URI): Generic Syntax
1902+ // RFC4248: The telnet URI Scheme
1903+ //
1904+ char *p, *p2, *p3;
1905+ int optlen, hostlen;
1906+
1907+ optlen = strlen(option);
1908+
1909+ // 最初の':'の前の文字が数字だった場合、それをsshプロトコルバージョンとみなす
1910+ p = _mbschr(option, ':');
1911+ switch (*(p-1)) {
1912+ case '1':
1913+ pvar->settings.ssh_protocol_version = 1;
1914+ break;
1915+ case '2':
1916+ pvar->settings.ssh_protocol_version = 2;
1917+ break;
1918+ }
1919+
1920+ // authority part までポインタを移動
1921+ p += 3;
1922+
1923+ // path part を切り捨てる
1924+ if ((p2 = _mbschr(p, '/')) != NULL) {
1925+ *p2 = 0;
1926+ }
1927+
1928+ // '@'があった場合、それより前はユーザ情報
1929+ if ((p2 = _mbschr(p, '@')) != NULL) {
1930+ *p2 = 0;
1931+ // ':'以降はパスワード
1932+ if ((p3 = _mbschr(p, ':')) != NULL) {
1933+ *p3 = 0;
1934+ percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);
1935+ }
1936+ percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p);
1937+ // p が host part の先頭('@'の次の文字)を差すようにする
1938+ p = p2 + 1;
1939+ }
1940+
1941+ // host part を option の先頭に移動して、scheme part を潰す
1942+ // port指定が無かった時にport番号を足すための領域確保の意味もある
1943+ hostlen = strlen(p);
1944+ memmove_s(option, optlen, p, hostlen);
1945+ option[hostlen] = 0;
1946+
1947+ // ポート指定が無い時は":22"を足す
1948+#ifndef NO_INET6
1949+ if (option[0] == '[' && option[hostlen-1] == ']' || // IPv6 raw address without port
1950+ option[0] != '[' && _mbschr(option, ':') == NULL) { // hostname or IPv4 raw address without port
1951+#else
1952+ if (_mbschr(option, ':') == NULL) {
1953+#endif /* NO_INET6 */
1954+ memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);
1955+ hostlen += 3;
1956+ }
1957+
1958+ // ポート指定より後をすべてスペースで潰す
1959+ memset(option+hostlen, ' ', optlen-hostlen);
1960+
1961+ pvar->settings.Enabled = 1;
1962+
1963+ action = OPTION_REPLACE;
1964+ }
1965+ else if (_mbschr(option, '@') != NULL) {
1966+ //
1967+ // user@host 形式のサポート
1968+ // 取り合えずsshでのみサポートの為、ユーザ名はttssh内で潰す。
1969+ // (ssh接続以外 -- ttsshには関係ない場合でも)
1970+ // 将来的にtelnet authentication optionをサポートした時は
1971+ // Tera Term本体で処理するようにする予定。
1972+ //
1973+ char *p;
1974+ p = _mbschr(option, '@');
1975+ *p = 0;
1976+
1977+ strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);
1978+
1979+ // ユーザ名部分をスペースで潰す。
1980+ // 後続のTTXやTera Term本体で解釈する時にはスペースを読み飛ばすので、
1981+ // ホスト名を先頭に詰める必要は無い。
1982+ memset(option, ' ', p-option+1);
1983+
1984+ action = OPTION_REPLACE;
1985+ }
1986+
1987+
1988+ switch (action) {
1989+ case OPTION_CLEAR:
1990+ memset(cur, ' ', next-cur);
1991+ break;
1992+ case OPTION_REPLACE:
1993+ memset(cur, ' ', next-cur);
1994+ memcpy(cur+1, option, strlen(option));
1995+ break;
1996+ }
1997+
1998+ cur = next;
1999+ }
2000+
2001+ free(option);
2002+
2003+ FWDUI_load_settings(pvar);
2004+
2005+ (pvar->ParseParam) (param, ts, DDETopic);
2006+}
2007+#else
16352008 /* returns 1 if the option text must be deleted */
16362009 static int parse_option(PTInstVar pvar, char FAR * option)
16372010 {
@@ -2046,6 +2419,7 @@
20462419 (pvar->ParseParam) (param, ts, DDETopic);
20472420
20482421 }
2422+#endif
20492423
20502424 static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks)
20512425 {
@@ -5184,9 +5558,10 @@
51845558
51855559 static void dquote_string(char *str, char *dst, int dst_len)
51865560 {
5187- // ",スペース,^A-^_ が含まれる場合にはクオートする
5561+ // ",スペース,;,^A-^_ が含まれる場合にはクオートする
51885562 if (strchr(str, '"') != NULL ||
51895563 strchr(str, ' ') != NULL ||
5564+ strchr(str, ';') != NULL ||
51905565 strchr(str, 0x01) != NULL ||
51915566 strchr(str, 0x02) != NULL ||
51925567 strchr(str, 0x03) != NULL ||
--- trunk/TTProxy/TTProxy.h (revision 5868)
+++ trunk/TTProxy/TTProxy.h (revision 5869)
@@ -16,6 +16,11 @@
1616 ID_PROXYSETUPMENU = 53310,
1717 ID_ASYNCMESSAGEBOX = 63001,
1818 };
19+ enum {
20+ OPTION_NONE = 0,
21+ OPTION_CLEAR = 1,
22+ OPTION_REPLACE = 2,
23+ };
1924 public:
2025 TTProxy():initialized(false), showing_error_message(false) {
2126 }
@@ -81,7 +86,35 @@
8186 buffer.append(basename);
8287 return buffer.toString();
8388 }
89+#if 1
90+ // TTXSamples/TTXCommandLineOpt/TTXCommandLineOpt.c と同じ
91+ static PCHAR GetParam(PCHAR buff, int size, PCHAR param) {
92+ int i = 0;
93+ BOOL quoted = FALSE;
8494
95+ while (*param == ' ' || *param == '\t') {
96+ param++;
97+ }
98+
99+ if (*param == '\0' || *param == ';') {
100+ return NULL;
101+ }
102+
103+ while (*param != '\0' && (quoted || (*param != ';' && *param != ' ' && *param != '\t'))) {
104+ if (*param == '"' && (*++param != '"' || !quoted)) {
105+ quoted = !quoted;
106+ continue;
107+ }
108+ else if (i < size - 1) {
109+ buff[i++] = *param;
110+ }
111+ param++;
112+ }
113+
114+ buff[i] = '\0';
115+ return (param);
116+ }
117+#else
85118 static int parse_option(char* option) {
86119 if ((*option == '/' || *option == '-')) {
87120 if ((option[1] == 'F' || option[1] == 'f') && option[2] == '=') {
@@ -111,6 +144,7 @@
111144 }
112145 return 0;
113146 }
147+#endif
114148 static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts) {
115149 getInstance().ORIG_ReadIniFile(fileName, ts);
116150 read_options(fileName);
@@ -119,7 +153,88 @@
119153 getInstance().ORIG_WriteIniFile(fileName, ts);
120154 write_options(fileName);
121155 }
156+#if 1
122157 static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
158+ int param_len=strlen(param);
159+ char option[1024];
160+ int opt_len = sizeof(option);
161+ int action;
162+ PCHAR cur, next;
163+
164+ memset(&option, '\0', opt_len);
165+
166+ cur = param;
167+ while (next = GetParam(option, opt_len, cur)) {
168+ action = OPTION_NONE;
169+
170+ if ((option[0] == '-' || option[0] == '/')) {
171+ if ((option[1] == 'F' || option[1] == 'f') && option[2] == '=') {
172+ read_options(get_teraterm_dir_relative_name(option + 3));
173+ }
174+ }
175+
176+ switch (action) {
177+ case OPTION_CLEAR:
178+ memset(cur, ' ', next-cur);
179+ break;
180+ case OPTION_REPLACE:
181+ memset(cur, ' ', next-cur);
182+ memcpy(cur+1, option, strlen(option));
183+ break;
184+ }
185+
186+ cur = next;
187+ }
188+
189+ cur = param;
190+ while (next = GetParam(option, opt_len, cur)) {
191+ action = OPTION_NONE;
192+
193+ if ((option[0] == '-' || option[0] == '/')) {
194+ if (strlen(option + 1) >= 6 && option[6] == '=') {
195+ option[6] = '\0';
196+ if (_stricmp(option + 1, "proxy") == 0) {
197+ ProxyWSockHook::parseURL(option + 7, TRUE);
198+ action = OPTION_CLEAR;
199+ }else{
200+ option[6] = '=';
201+ }
202+ }
203+ }else{
204+ String realhost = ProxyWSockHook::parseURL(option, FALSE);
205+ if (realhost != NULL) {
206+ getInstance().realhost = realhost;
207+ if (realhost.indexOf("://") == -1) {
208+ action = OPTION_CLEAR;
209+ }
210+ else {
211+ // -proxy= なしで、proto://proxy:port/ 以降の実ホストが含まれていない
212+ // ttermpro で処理してもらうため、TTXParseParam で消さない
213+ action = OPTION_REPLACE;
214+ }
215+ }
216+ }
217+
218+ switch (action) {
219+ case OPTION_CLEAR:
220+ memset(cur, ' ', next-cur);
221+ break;
222+ case OPTION_REPLACE:
223+ memset(cur, ' ', next-cur);
224+ memcpy(cur+1, option, strlen(option));
225+ break;
226+ }
227+
228+ cur = next;
229+ }
230+
231+ getInstance().ORIG_ParseParam(param, ts, DDETopic);
232+ if (getInstance().ts->HostName[0] == '\0' && getInstance().realhost != NULL) {
233+ strcpy_s(getInstance().ts->HostName, sizeof getInstance().ts->HostName, getInstance().realhost);
234+ }
235+ }
236+#else
237+ static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
123238 char* p = param;
124239 bool inParam = false;
125240 bool inQuotes = false;
@@ -278,6 +393,7 @@
278393 strcpy_s(getInstance().ts->HostName, sizeof getInstance().ts->HostName, getInstance().realhost);
279394 }
280395 }
396+#endif
281397
282398 static void copy_UILanguageFile() {
283399 strncpy_s(UILanguageFile, sizeof(UILanguageFile),
Show on old repository browser