svnno****@sourc*****
svnno****@sourc*****
2016年 8月 22日 (月) 17:33:50 JST
Revision: 6471 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6471 Author: doda Date: 2016-08-22 17:33:49 +0900 (Mon, 22 Aug 2016) Log Message: ----------- 使っていないコードブロックを削除 Modified Paths: -------------- trunk/ttssh2/ttxssh/ttxssh.c -------------- next part -------------- Modified: trunk/ttssh2/ttxssh/ttxssh.c =================================================================== --- trunk/ttssh2/ttxssh/ttxssh.c 2016-08-20 10:24:03 UTC (rev 6470) +++ trunk/ttssh2/ttxssh/ttxssh.c 2016-08-22 08:33:49 UTC (rev 6471) @@ -1778,7 +1778,6 @@ } } -#if 1 static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) { int param_len=strlen(param); int opt_len = param_len+1; @@ -2153,423 +2152,7 @@ (pvar->ParseParam) (param, ts, DDETopic); } -#else -/* returns 1 if the option text must be deleted */ -static int parse_option(PTInstVar pvar, char FAR * option) -{ - if ((option[0] == '-' || option[0] == '/')) { - if (MATCH_STR(option + 1, "ssh") == 0) { - if (option[4] == 0) { - pvar->settings.Enabled = 1; - } else if (MATCH_STR(option + 4, "-L") == 0 || - MATCH_STR(option + 4, "-R") == 0 || - _stricmp(option + 4, "-X") == 0) { - add_forward_param(pvar, option+5); - } else if (MATCH_STR(option + 4, "-X") == 0) { - add_forward_param(pvar, "X"); - strncpy_s(pvar->settings.X11Display, - sizeof(pvar->settings.X11Display), - option + 6, _TRUNCATE); - } else if (MATCH_STR(option + 4, "-f=") == 0) { - read_ssh_options_from_user_file(pvar, option + 7); - } else if (MATCH_STR(option + 4, "-v") == 0) { - pvar->settings.LogLevel = LOG_LEVEL_VERBOSE; - } else if (_stricmp(option + 4, "-autologin") == 0 || - _stricmp(option + 4, "-autologon") == 0) { - pvar->settings.TryDefaultAuth = TRUE; - } else if (MATCH_STR_I(option + 4, "-agentconfirm=") == 0) { - if ((_stricmp(option+18, "off") == 0) || - (_stricmp(option+18, "no") == 0) || - (_stricmp(option+18, "false") == 0) || - (_stricmp(option+18, "0") == 0) || - (_stricmp(option+18, "n") == 0)) { - pvar->settings.ForwardAgentConfirm = 0; - } - else { - pvar->settings.ForwardAgentConfirm = 1; - } - // -axx\x82\xE6\x82\xE8\x8F\xE3\x82ɂ\xB5\x82Ă͂\xBE\x82\xDF - } else if (MATCH_STR(option + 4, "-a") == 0) { - pvar->settings.ForwardAgent = FALSE; - } else if (MATCH_STR(option + 4, "-A") == 0) { - pvar->settings.ForwardAgent = TRUE; - - } else if (MATCH_STR(option + 4, "-consume=") == 0) { - read_ssh_options_from_user_file(pvar, option + 13); - DeleteFile(option + 13); - - } else if (MATCH_STR(option + 4, "-C=") == 0) { - pvar->settings.CompressionLevel = atoi(option+7); - if (pvar->settings.CompressionLevel < 0) { - pvar->settings.CompressionLevel = 0; - } - else if (pvar->settings.CompressionLevel > 9) { - pvar->settings.CompressionLevel = 9; - } - } else if (MATCH_STR(option + 4, "-C") == 0) { - pvar->settings.CompressionLevel = 6; - } else if (MATCH_STR(option + 4, "-c") == 0) { - pvar->settings.CompressionLevel = 0; - } else if (MATCH_STR_I(option + 4, "-icon=") == 0) { - if ((_stricmp(option+10, "old") == 0) || - (_stricmp(option+10, "yellow") == 0) || - (_stricmp(option+10, "securett_yellow") == 0)) { - pvar->settings.IconID = IDI_SECURETT_YELLOW; - } - else { - pvar->settings.IconID = IDI_SECURETT; - } - - // /ssh1 \x82\xC6 /ssh2 \x83I\x83v\x83V\x83\x87\x83\x93\x82̐V\x8BK\x92lj\xC1 (2006.9.16 maya) - } else if (MATCH_STR(option + 4, "1") == 0) { - pvar->settings.Enabled = 1; - pvar->settings.ssh_protocol_version = 1; - } else if (MATCH_STR(option + 4, "2") == 0) { - pvar->settings.Enabled = 1; - pvar->settings.ssh_protocol_version = 2; - - } else { - char buf[1024]; - - UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar, - "Unrecognized command-line option: %s"); - _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option); - - MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION); - } - - // ttermpro.exe \x82\xCC /T= \x8Ew\x92\xE8\x82̗\xAC\x97p\x82Ȃ̂ŁA\x91啶\x8E\x9A\x82\xE0\x8B\x96\x82\xB7 (2006.10.19 maya) - } else if (MATCH_STR_I(option + 1, "t=") == 0) { - if (strcmp(option + 3, "2") == 0) { - pvar->settings.Enabled = 1; - return OPTION_CLEAR; // /t=2\x82\xCDttssh\x91\xA4\x82ł̊g\x92\xA3\x82Ȃ̂ŏ\xC1\x82\xB7 - } else { - pvar->settings.Enabled = 0; - return OPTION_NONE; // Tera Term\x91\xA4\x82ʼn\xF0\x8E߂\xB7\x82\xE9\x82̂ŏ\xC1\x82\xB3\x82Ȃ\xA2 - } - - // ttermpro.exe \x82\xCC /F= \x8Ew\x92\xE8\x82ł\xE0 TTSSH \x82̐ݒ\xE8\x82\xF0\x93ǂ\xDE (2006.10.11 maya) - } else if (MATCH_STR_I(option + 1, "f=") == 0) { - read_ssh_options_from_user_file(pvar, option + 3); - return OPTION_NONE; // Tera Term\x91\xA4\x82ł\xE0\x89\xF0\x8E߂\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x82̂ŏ\xC1\x82\xB3\x82Ȃ\xA2 - - // /1 \x82\xA8\x82\xE6\x82\xD1 /2 \x83I\x83v\x83V\x83\x87\x83\x93\x82̐V\x8BK\x92lj\xC1 (2004.10.3 yutaka) - } else if (MATCH_STR(option + 1, "1") == 0) { - // command line: /ssh /1 is SSH1 only - pvar->settings.ssh_protocol_version = 1; - - } else if (MATCH_STR(option + 1, "2") == 0) { - // command line: /ssh /2 is SSH2 & SSH1 - pvar->settings.ssh_protocol_version = 2; - - } else if (MATCH_STR(option + 1, "nossh") == 0) { - // '/nossh' \x83I\x83v\x83V\x83\x87\x83\x93\x82̒lj\xC1\x81B - // TERATERM.INI \x82\xC5SSH\x82\xAA\x97L\x8C\xF8\x82ɂȂ\xC1\x82Ă\xA2\x82\xE9\x8Fꍇ\x81A\x82\xA4\x82܂\xADCygterm\x82\xAA\x8BN\x93\xAE\x82\xB5\x82Ȃ\xA2\x82\xB1\x82Ƃ\xAA - // \x82\xA0\x82邱\x82Ƃւ̑Ώ\x88\x81B(2004.10.11 yutaka) - pvar->settings.Enabled = 0; - - } else if (MATCH_STR(option + 1, "telnet") == 0) { - // '/telnet' \x82\xAA\x8Ew\x92肳\x82\xEA\x82Ă\xA2\x82\xE9\x82Ƃ\xAB\x82ɂ\xCD '/nossh' \x82Ɠ\xAF\x82\xB6\x82\xAD - // SSH\x82\xF8\x82ɂ\xB7\x82\xE9 (2006.9.16 maya) - pvar->settings.Enabled = 0; - // Tera Term \x82\xCC Telnet \x83t\x83\x89\x83O\x82\xE0\x95t\x82\xAF\x82\xE9 - pvar->ts->Telnet = 1; - - } else if (MATCH_STR(option + 1, "auth") == 0) { - // SSH2\x8E\xA9\x93\xAE\x83\x8D\x83O\x83C\x83\x93\x83I\x83v\x83V\x83\x87\x83\x93\x82̒lj\xC1 - // - // SYNOPSIS: /ssh /auth=passowrd /user=\x83\x86\x81[\x83U\x96\xBC /passwd=\x83p\x83X\x83\x8F\x81[\x83h - // /ssh /auth=publickey /user=\x83\x86\x81[\x83U\x96\xBC /passwd=\x83p\x83X\x83\x8F\x81[\x83h /keyfile=\x83p\x83X - // EXAMPLE: /ssh /auth=password /user=nike /passwd=a @ bc - // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa - // NOTICE: \x83p\x83X\x83\x8F\x81[\x83h\x82\xE2\x83p\x83X\x82ɋ\xAA\x8A܂ޏꍇ\x82́A\x83u\x83\x89\x83\x93\x83N\x82̑\xE3\x82\xED\x82\xE8\x82\xC9 @ \x82\xF0\x8Eg\x82\xA4\x82\xB1\x82ƁB - // - // (2004.11.30 yutaka) - // (2005.1.26 yutaka) \x8BΉ\x9E\x81B\x8C\xF6\x8AJ\x8C\xAE\x94F\x8FT\x83|\x81[\x83g\x81B - // - pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka) - - if (MATCH_STR(option + 5, "=password") == 0) { // \x83p\x83X\x83\x8F\x81[\x83h - //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD; - pvar->ssh2_authmethod = SSH_AUTH_PASSWORD; - - // /auth=challenge \x82\xF0\x92lj\xC1 (2007.10.5 maya) - } else if (MATCH_STR(option + 5, "=challenge") == 0) { // keyboard-interactive\x94F\x8F\xD8 - //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS; - pvar->ssh2_authmethod = SSH_AUTH_TIS; - - } else if (MATCH_STR(option + 5, "=publickey") == 0) { // \x8C\xF6\x8AJ\x8C\xAE\x94F\x8F\xD8 - //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA; - pvar->ssh2_authmethod = SSH_AUTH_RSA; - - } else if (MATCH_STR(option + 5, "=pageant") == 0) { // \x8C\xF6\x8AJ\x8C\xAE\x94F\x8F\xD8 by Pageant - //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA; - pvar->ssh2_authmethod = SSH_AUTH_PAGEANT; - - } else { - // TODO: - - } - - } else if (MATCH_STR(option + 1, "user=") == 0) { - _snprintf_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), _TRUNCATE, "%s", option + 6); - - } else if (MATCH_STR(option + 1, "passwd=") == 0) { - _snprintf_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), _TRUNCATE, "%s", option + 8); - - } else if (MATCH_STR(option + 1, "keyfile=") == 0) { - _snprintf_s(pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile), _TRUNCATE, "%s", option + 9); - - } else if (MATCH_STR(option + 1, "ask4passwd") == 0) { - // \x83p\x83X\x83\x8F\x81[\x83h\x82\xAD (2006.9.18 maya) - pvar->ask4passwd = 1; - - } else if (MATCH_STR(option + 1, "nosecuritywarning") == 0) { - // known_hosts\x83`\x83F\x83b\x83N\x82\xF0\x82\xB5\x82Ȃ\xA2\x81B\x93\x96\x8AY\x83I\x83v\x83V\x83\x87\x83\x93\x82\xF0\x8Eg\x82\xA4\x82ƁA\x83Z\x83L\x83\x85\x83\x8A\x83e\x83B\x90\xAB\x82\xAA\x92ቺ\x82\xB7\x82\xE9 - // \x82\xBD\x82߁A\x89B\x82\xB5\x83I\x83v\x83V\x83\x87\x83\x93\x88\xB5\x82\xA2\x82Ƃ\xB7\x82\xE9\x81B - // (2009.10.4 yutaka) - pvar->nocheck_known_hosts = TRUE; - - } - else { // Other (not ttssh) option - return OPTION_NONE; // ttssh\x82̃I\x83v\x83V\x83\x87\x83\x93\x82ł͂Ȃ\xA2\x82̂ŏ\xC1\x82\xB3\x82Ȃ\xA2 - } - - // \x83p\x83X\x83\x8F\x81[\x83h\x82\xAD\x8Fꍇ\x82͎\xA9\x93\xAE\x83\x8D\x83O\x83C\x83\x93\x82\xAA\x96\xB3\x8C\xF8\x82ɂȂ\xE9 - // /auth \x82͔F\x8F\x81\x83\\x83b\x83h\x82̎w\x92\xE8\x82Ƃ\xB5\x82Ă͗\x98\x97p\x82\xB3\x82\xEA\x82\xE9 (2006.9.18 maya) - if (pvar->ask4passwd == 1) { - pvar->ssh2_autologin = 0; - } - return OPTION_CLEAR; - - } - else if ((MATCH_STR_I(option, "ssh://") == 0) || - (MATCH_STR_I(option, "ssh1://") == 0) || - (MATCH_STR_I(option, "ssh2://") == 0) || - (MATCH_STR_I(option, "slogin://") == 0) || - (MATCH_STR_I(option, "slogin1://") == 0) || - (MATCH_STR_I(option, "slogin2://") == 0)) { - // - // ssh://user@host/ \x93\x99\x82\xCCURL\x8C`\x8E\xAE\x82̃T\x83|\x81[\x83g - // \x8A\xEE\x96{\x93I\x82ȏ\x91\x8E\xAE\x82\xCD telnet:// URL\x82ɏ\x87\x82\xB8\x82\xE9 - // - // \x8EQ\x8Dl: - // RFC3986: Uniform Resource Identifier (URI): Generic Syntax - // RFC4248: The telnet URI Scheme - // - char *p, *p2, *p3; - int optlen, hostlen; - - optlen = strlen(option); - - // \x8Dŏ\x89\x82\xCC':'\x82̑O\x82̕\xB6\x8E\x9A\x82\xAA\x90\x94\x8E\x9A\x82\xBE\x82\xC1\x82\xBD\x8Fꍇ\x81A\x82\xBB\x82\xEA\x82\xF0ssh\x83v\x83\x8D\x83g\x83R\x83\x8B\x83o\x81[\x83W\x83\x87\x83\x93\x82Ƃ݂Ȃ\xB7 - p = _mbschr(option, ':'); - switch (*(p-1)) { - case '1': - pvar->settings.ssh_protocol_version = 1; - break; - case '2': - pvar->settings.ssh_protocol_version = 2; - break; - } - - // authority part \x82܂Ń|\x83C\x83\x93\x83^\x82\xF0\x88ړ\xAE - p += 3; - - // path part \x82\xF0\x90\xE8\x8ÊĂ\xE9 - if ((p2 = _mbschr(p, '/')) != NULL) { - *p2 = 0; - } - - // '@'\x82\xAA\x82\xA0\x82\xC1\x82\xBD\x8Fꍇ\x81A\x82\xBB\x82\xEA\x82\xE6\x82\xE8\x91O\x82̓\x86\x81[\x83U\x8F\xEE\x95\xF1 - if ((p2 = _mbschr(p, '@')) != NULL) { - *p2 = 0; - // ':'\x88ȍ~\x82̓p\x83X\x83\x8F\x81[\x83h - if ((p3 = _mbschr(p, ':')) != NULL) { - *p3 = 0; - percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1); - } - percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p); - // p \x82\xAA host part \x82̐擪('@'\x82̎\x9F\x82̕\xB6\x8E\x9A)\x82\xF0\x8D\xB7\x82\xB7\x82悤\x82ɂ\xB7\x82\xE9 - p = p2 + 1; - } - - // host part \x82\xF0 option \x82̐擪\x82Ɉړ\xAE\x82\xB5\x82āAscheme part \x82\xF0\x92ׂ\xB7 - // port\x8Ew\x92肪\x96\xB3\x82\xA9\x82\xC1\x82\xBD\x8E\x9E\x82\xC9port\x94ԍ\x86\x82𑫂\xB7\x82\xBD\x82߂̗̈\xE6\x8Am\x95ۂ̈Ӗ\xA1\x82\xE0\x82\xA0\x82\xE9 - hostlen = strlen(p); - memmove_s(option, optlen, p, hostlen); - option[hostlen] = 0; - - // \x83|\x81[\x83g\x8Ew\x92肪\x96\xB3\x82\xA2\x8E\x9E\x82\xCD":22"\x82𑫂\xB7 -#ifndef NO_INET6 - if (option[0] == '[' && option[hostlen-1] == ']' || // IPv6 raw address without port - option[0] != '[' && _mbschr(option, ':') == NULL) { // hostname or IPv4 raw address without port -#else - if (_mbschr(option, ':') == NULL) { -#endif /* NO_INET6 */ - memcpy_s(option+hostlen, optlen-hostlen, ":22", 3); - hostlen += 3; - } - - // \x83|\x81[\x83g\x8Ew\x92\xE8\x82\xE6\x82\xE8\x8C\xE3\x82\xF0\x82\xB7\x82ׂăX\x83y\x81[\x83X\x82Œׂ\xB7 - memset(option+hostlen, ' ', optlen-hostlen); - - pvar->settings.Enabled = 1; - - return OPTION_REPLACE; - } - else if (_mbschr(option, '@') != NULL) { - // - // user @ host \x8C`\x8E\xAE\x82̃T\x83|\x81[\x83g - // \x8E\xE6\x82荇\x82\xA6\x82\xB8ssh\x82ł̂݃T\x83|\x81[\x83g\x82ׁ̈A\x83\x86\x81[\x83U\x96\xBC\x82\xCDttssh\x93\xE0\x82Œׂ\xB7\x81B - // (ssh\x90ڑ\xB1\x88ȊO -- ttssh\x82ɂ͊W\x82Ȃ\xA2\x8Fꍇ\x82ł\xE0) - // \x8F\xAB\x97\x88\x93I\x82\xC9telnet authentication option\x82\xF0\x83T\x83|\x81[\x83g\x82\xB5\x82\xBD\x8E\x9E\x82\xCD - // Tera Term\x96{\x91̂ŏ\x88\x97\x9D\x82\xB7\x82\xE9\x82悤\x82ɂ\xB7\x82\xE9\x97\\x92\xE8\x81B - // - char *p; - p = _mbschr(option, '@'); - *p = 0; - - strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE); - - // \x83\x86\x81[\x83U\x96\xBC\x95\x94\x95\xAA\x82\xF0\x83X\x83y\x81[\x83X\x82Œׂ\xB7\x81B - // \x8C㑱\x82\xCCTTX\x82\xE2Tera Term\x96{\x91̂ʼn\xF0\x8E߂\xB7\x82鎞\x82ɂ̓X\x83y\x81[\x83X\x82\xF0\x93ǂݔ\xF2\x82\xB7\x82̂ŁA - // \x83z\x83X\x83g\x96\xBC\x82\xF0\x90擪\x82ɋl\x82߂\xE9\x95K\x97v\x82͖\xB3\x82\xA2\x81B - memset(option, ' ', p-option+1); - - return OPTION_REPLACE; - } - - return OPTION_NONE; -} - -static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts, - PCHAR DDETopic) -{ - int i; - BOOL inParam = FALSE; - BOOL inQuotes = FALSE; - BOOL inEqual = FALSE; - int param_len=strlen(param); - PCHAR start = NULL; - char *buf = (char *)calloc(param_len+1, sizeof(char)); - int buflen = 0; - - if (pvar->hostdlg_activated) { - pvar->settings.Enabled = pvar->hostdlg_Enabled; - } - - for (i = 0; i < param_len; i++) { - if (inQuotes) { - // \x8C\xBB\x8D݈ʒu\x82\xAA"\x82̒\x86 - if (param[i] == '"') { - if (param[i+1] == '"') { - buf[buflen] = param[i]; - buflen++; - i++; - } - else { - // \x83N\x83H\x81[\x83g\x82\xB5\x82Ă\xA2\x82\xE9\x82Ƃ\xAB\x82͂\xB1\x82\xB1\x82ŏI\x82\xED\x82\xE8 - // "\x82\xF0buf\x82ɓ\xFC\x82ꂸ\x82ɉ\xF0\x90͂ɓn\x82\xB7 - switch (parse_option(pvar, buf)) { - case OPTION_CLEAR: - memset(start, ' ', (param + i) - start + 1); - break; - case OPTION_REPLACE: - memset(start, ' ', (param + i) - start + 1); - buflen = strlen(buf); - memcpy(start, buf, buflen); - break; - } - inParam = FALSE; - inEqual = FALSE; - start = NULL; - memset(buf, 0, param_len); - buflen = 0; - inQuotes = FALSE; - } - } - else { - buf[buflen] = param[i]; - buflen++; - } - } - else { - if (!inParam) { - // \x82܂\xBE\x83p\x83\x89\x83\x81\x81[\x83^\x82̒\x86\x82ɂ\xA2\x82Ȃ\xA2 - if (param[i] == '"') { - // " \x82Ŏn\x82܂\xE9 - start = param + i; - inParam = TRUE; - inQuotes = TRUE; - } - else if (param[i] != ' ' && param[i] != '\t') { - // \x95\x81\x92ʂɎn\x82܂\xE9 - buf[buflen] = param[i]; - buflen++; - start = param + i; - inParam = TRUE; - } - } - else { - // \x8C\xBB\x8D݈ʒu\x82\xAA\x83p\x83\x89\x83\x81\x81[\x83^\x82̒\x86 - if (param[i] == ' ' || param[i] == '\t') { - // \x83N\x83H\x81[\x83g\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x82Ƃ\xAB\x82͂\xB1\x82\xB1\x82ŏI\x82\xED\x82\xE8 - switch (parse_option(pvar, buf)) { - case OPTION_CLEAR: - memset(start, ' ', (param + i) - start + 1); - break; - case OPTION_REPLACE: - memset(start, ' ', (param + i) - start + 1); - buflen = strlen(buf); - memcpy(start, buf, buflen); - break; - } - inParam = FALSE; - inEqual = FALSE; - start = NULL; - memset(buf, 0, param_len); - buflen = 0; - } - else { - buf[buflen] = param[i]; - buflen++; - if (!inEqual && param[i] == '=') { - inEqual = TRUE; - if (param[i+1] == '"') { - inQuotes = TRUE; - i++; - } - } - } - } - } - } - - // buf \x82Ɏc\x82肪\x82\xA0\x82\xEA\x82Ή\xF0\x90͂ɓn\x82\xB7 - // +1\x82\xB7\x82\xE9\x82ƍŌ\xE3\x82\xCC'\0'\x82\xE0\x8F\xC1\x82\xB5\x82Ă\xB5\x82܂\xA4\x82̂ŁA\x8F\xE3\x82Ɠ\xAF\x82\xB6\x82ł͂\xA2\x82\xAF\x82Ȃ\xA2 - if (strlen(buf) > 0) { - switch (parse_option(pvar, buf)) { - case OPTION_CLEAR: - memset(start, ' ', (param + i) - start); - break; - case OPTION_REPLACE: - memset(start, ' ', (param + i) - start); - buflen = strlen(buf); - memcpy(start, buf, buflen); - break; - } - } - free(buf); - - FWDUI_load_settings(pvar); - - (pvar->ParseParam) (param, ts, DDETopic); - -} -#endif - static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks) { pvar->ReadIniFile = *hooks->ReadIniFile;