Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/teraterm/addsetting.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 10178 by zmatsuo, Wed Aug 24 13:42:14 2022 UTC revision 10179 by zmatsuo, Wed Aug 24 14:03:59 2022 UTC
# Line 1566  void CLogPropPageDlg::OnHelp() Line 1566  void CLogPropPageDlg::OnHelp()
1566  }  }
1567    
1568  /////////////////////////////  /////////////////////////////
1569    // cygterm.cfg 読み書き
1570    
1571    #define CYGTERM_FILE "cygterm.cfg"  // CygTerm configuration file
1572    #define CYGTERM_FILE_MAXLINE 100
1573    
1574    void ReadCygtermConfFile(const char *homedir, cygterm_t *psettings)
1575    {
1576            const char *cfgfile = CYGTERM_FILE; // CygTerm configuration file
1577            char cfg[MAX_PATH];
1578            FILE *fp;
1579            char buf[256], *head, *body;
1580            cygterm_t settings;
1581    
1582            // try to read CygTerm config file
1583            memset(&settings, 0, sizeof(settings));
1584            _snprintf_s(settings.term, sizeof(settings.term), _TRUNCATE, "ttermpro.exe %%s %%d /E /KR=SJIS /KT=SJIS /VTICON=CygTerm /nossh");
1585            _snprintf_s(settings.term_type, sizeof(settings.term_type), _TRUNCATE, "vt100");
1586            _snprintf_s(settings.port_start, sizeof(settings.port_start), _TRUNCATE, "20000");
1587            _snprintf_s(settings.port_range, sizeof(settings.port_range), _TRUNCATE, "40");
1588            _snprintf_s(settings.shell, sizeof(settings.shell), _TRUNCATE, "auto");
1589            _snprintf_s(settings.env1, sizeof(settings.env1), _TRUNCATE, "MAKE_MODE=unix");
1590            _snprintf_s(settings.env2, sizeof(settings.env2), _TRUNCATE, "");
1591            settings.login_shell = FALSE;
1592            settings.home_chdir = FALSE;
1593            settings.agent_proxy = FALSE;
1594    
1595            strncpy_s(cfg, sizeof(cfg), homedir, _TRUNCATE);
1596            AppendSlash(cfg, sizeof(cfg));
1597            strncat_s(cfg, sizeof(cfg), cfgfile, _TRUNCATE);
1598    
1599            fp = fopen(cfg, "r");
1600            if (fp != NULL) {
1601                    while (fgets(buf, sizeof(buf), fp) != NULL) {
1602                            size_t len = strlen(buf);
1603    
1604                            if (buf[len - 1] == '\n')
1605                                    buf[len - 1] = '\0';
1606    
1607                            split_buffer(buf, '=', &head, &body);
1608                            if (head == NULL || body == NULL)
1609                                    continue;
1610    
1611                            if (_stricmp(head, "TERM") == 0) {
1612                                    _snprintf_s(settings.term, sizeof(settings.term), _TRUNCATE, "%s", body);
1613    
1614                            }
1615                            else if (_stricmp(head, "TERM_TYPE") == 0) {
1616                                    _snprintf_s(settings.term_type, sizeof(settings.term_type), _TRUNCATE, "%s", body);
1617    
1618                            }
1619                            else if (_stricmp(head, "PORT_START") == 0) {
1620                                    _snprintf_s(settings.port_start, sizeof(settings.port_start), _TRUNCATE, "%s", body);
1621    
1622                            }
1623                            else if (_stricmp(head, "PORT_RANGE") == 0) {
1624                                    _snprintf_s(settings.port_range, sizeof(settings.port_range), _TRUNCATE, "%s", body);
1625    
1626                            }
1627                            else if (_stricmp(head, "SHELL") == 0) {
1628                                    _snprintf_s(settings.shell, sizeof(settings.shell), _TRUNCATE, "%s", body);
1629    
1630                            }
1631                            else if (_stricmp(head, "ENV_1") == 0) {
1632                                    _snprintf_s(settings.env1, sizeof(settings.env1), _TRUNCATE, "%s", body);
1633    
1634                            }
1635                            else if (_stricmp(head, "ENV_2") == 0) {
1636                                    _snprintf_s(settings.env2, sizeof(settings.env2), _TRUNCATE, "%s", body);
1637    
1638                            }
1639                            else if (_stricmp(head, "LOGIN_SHELL") == 0) {
1640                                    if (strchr("YyTt", *body)) {
1641                                            settings.login_shell = TRUE;
1642                                    }
1643    
1644                            }
1645                            else if (_stricmp(head, "HOME_CHDIR") == 0) {
1646                                    if (strchr("YyTt", *body)) {
1647                                            settings.home_chdir = TRUE;
1648                                    }
1649    
1650                            }
1651                            else if (_stricmp(head, "SSH_AGENT_PROXY") == 0) {
1652                                    if (strchr("YyTt", *body)) {
1653                                            settings.agent_proxy = TRUE;
1654                                    }
1655    
1656                            }
1657                            else {
1658                                    // TODO: error check
1659    
1660                            }
1661                    }
1662                    fclose(fp);
1663            }
1664    
1665            memcpy(psettings, &settings, sizeof(cygterm_t));
1666    }
1667    
1668    BOOL WriteCygtermConfFile(const char *homedir, cygterm_t *psettings)
1669    {
1670            const char *cfgfile = CYGTERM_FILE; // CygTerm configuration file
1671            const char *tmpfile = "cygterm.tmp";
1672            char cfg[MAX_PATH];
1673            char tmp[MAX_PATH];
1674            FILE *fp;
1675            FILE *tmp_fp;
1676            char buf[256], *head, *body;
1677            cygterm_t settings;
1678            char *line[CYGTERM_FILE_MAXLINE];
1679            int i, linenum;
1680    
1681            memcpy(&settings, psettings, sizeof(cygterm_t));
1682    
1683            strncpy_s(cfg, sizeof(cfg), homedir, _TRUNCATE);
1684            AppendSlash(cfg, sizeof(cfg));
1685            strncat_s(cfg, sizeof(cfg), cfgfile, _TRUNCATE);
1686    
1687            strncpy_s(tmp, sizeof(tmp), homedir, _TRUNCATE);
1688            AppendSlash(tmp, sizeof(tmp));
1689            strncat_s(tmp, sizeof(tmp), tmpfile, _TRUNCATE);
1690    
1691            // cygterm.cfg が存在すれば、いったんメモリにすべて読み込む。
1692            memset(line, 0, sizeof(line));
1693            linenum = 0;
1694            fp = fopen(cfg, "r");
1695            if (fp) {
1696                    i = 0;
1697                    while (fgets(buf, sizeof(buf), fp) != NULL) {
1698                            size_t len = strlen(buf);
1699                            if (buf[len - 1] == '\n')
1700                                    buf[len - 1] = '\0';
1701                            if (i < CYGTERM_FILE_MAXLINE)
1702                                    line[i++] = _strdup(buf);
1703                            else
1704                                    break;
1705                    }
1706                    linenum = i;
1707                    fclose(fp);
1708            }
1709    
1710            tmp_fp = fopen(cfg, "w");
1711            if (tmp_fp == NULL) {
1712                    return FALSE;
1713    #if 0
1714                    char uimsg[MAX_UIMSG];
1715                    get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts->UILanguageFile);
1716                    get_lang_msg("MSG_CYGTERM_CONF_WRITEFILE_ERROR", ts->UIMsg, sizeof(ts->UIMsg),
1717                            "Can't write CygTerm configuration file (%d).", ts->UILanguageFile);
1718                    _snprintf_s(buf, sizeof(buf), _TRUNCATE, ts->UIMsg, GetLastError());
1719                    MessageBox(NULL, buf, uimsg, MB_ICONEXCLAMATION);
1720    #endif
1721            }
1722            else {
1723                    if (linenum > 0) {
1724                            for (i = 0; i < linenum; i++) {
1725                                    split_buffer(line[i], '=', &head, &body);
1726                                    if (head == NULL || body == NULL) {
1727                                            fprintf(tmp_fp, "%s\n", line[i]);
1728                                    }
1729                                    else if (_stricmp(head, "TERM") == 0) {
1730                                            fprintf(tmp_fp, "TERM = %s\n", settings.term);
1731                                            settings.term[0] = '\0';
1732                                    }
1733                                    else if (_stricmp(head, "TERM_TYPE") == 0) {
1734                                            fprintf(tmp_fp, "TERM_TYPE = %s\n", settings.term_type);
1735                                            settings.term_type[0] = '\0';
1736                                    }
1737                                    else if (_stricmp(head, "PORT_START") == 0) {
1738                                            fprintf(tmp_fp, "PORT_START = %s\n", settings.port_start);
1739                                            settings.port_start[0] = '\0';
1740                                    }
1741                                    else if (_stricmp(head, "PORT_RANGE") == 0) {
1742                                            fprintf(tmp_fp, "PORT_RANGE = %s\n", settings.port_range);
1743                                            settings.port_range[0] = '\0';
1744                                    }
1745                                    else if (_stricmp(head, "SHELL") == 0) {
1746                                            fprintf(tmp_fp, "SHELL = %s\n", settings.shell);
1747                                            settings.shell[0] = '\0';
1748                                    }
1749                                    else if (_stricmp(head, "ENV_1") == 0) {
1750                                            fprintf(tmp_fp, "ENV_1 = %s\n", settings.env1);
1751                                            settings.env1[0] = '\0';
1752                                    }
1753                                    else if (_stricmp(head, "ENV_2") == 0) {
1754                                            fprintf(tmp_fp, "ENV_2 = %s\n", settings.env2);
1755                                            settings.env2[0] = '\0';
1756                                    }
1757                                    else if (_stricmp(head, "LOGIN_SHELL") == 0) {
1758                                            fprintf(tmp_fp, "LOGIN_SHELL = %s\n", (settings.login_shell == TRUE) ? "yes" : "no");
1759                                            settings.login_shell = FALSE;
1760                                    }
1761                                    else if (_stricmp(head, "HOME_CHDIR") == 0) {
1762                                            fprintf(tmp_fp, "HOME_CHDIR = %s\n", (settings.home_chdir == TRUE) ? "yes" : "no");
1763                                            settings.home_chdir = FALSE;
1764                                    }
1765                                    else if (_stricmp(head, "SSH_AGENT_PROXY") == 0) {
1766                                            fprintf(tmp_fp, "SSH_AGENT_PROXY = %s\n", (settings.agent_proxy == TRUE) ? "yes" : "no");
1767                                            settings.agent_proxy = FALSE;
1768                                    }
1769                                    else {
1770                                            fprintf(tmp_fp, "%s = %s\n", head, body);
1771                                    }
1772                            }
1773                    }
1774                    else {
1775                            fputs("# CygTerm setting\n", tmp_fp);
1776                            fputs("\n", tmp_fp);
1777                    }
1778                    if (settings.term[0] != '\0') {
1779                            fprintf(tmp_fp, "TERM = %s\n", settings.term);
1780                    }
1781                    if (settings.term_type[0] != '\0') {
1782                            fprintf(tmp_fp, "TERM_TYPE = %s\n", settings.term_type);
1783                    }
1784                    if (settings.port_start[0] != '\0') {
1785                            fprintf(tmp_fp, "PORT_START = %s\n", settings.port_start);
1786                    }
1787                    if (settings.port_range[0] != '\0') {
1788                            fprintf(tmp_fp, "PORT_RANGE = %s\n", settings.port_range);
1789                    }
1790                    if (settings.shell[0] != '\0') {
1791                            fprintf(tmp_fp, "SHELL = %s\n", settings.shell);
1792                    }
1793                    if (settings.env1[0] != '\0') {
1794                            fprintf(tmp_fp, "ENV_1 = %s\n", settings.env1);
1795                    }
1796                    if (settings.env2[0] != '\0') {
1797                            fprintf(tmp_fp, "ENV_2 = %s\n", settings.env2);
1798                    }
1799                    if (settings.login_shell) {
1800                            fprintf(tmp_fp, "LOGIN_SHELL = yes\n");
1801                    }
1802                    if (settings.home_chdir) {
1803                            fprintf(tmp_fp, "HOME_CHDIR = yes\n");
1804                    }
1805                    if (settings.agent_proxy) {
1806                            fprintf(tmp_fp, "SSH_AGENT_PROXY = yes\n");
1807                    }
1808                    fclose(tmp_fp);
1809    
1810                    // ダイレクトにファイルに書き込むようにしたので、下記処理は不要。
1811    #if 0
1812                    if (remove(cfg) != 0 && errno != ENOENT) {
1813                            get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts->UILanguageFile);
1814                            get_lang_msg("MSG_CYGTERM_CONF_REMOVEFILE_ERROR", ts->UIMsg, sizeof(ts->UIMsg),
1815                                    "Can't remove old CygTerm configuration file (%d).", ts->UILanguageFile);
1816                            _snprintf_s(buf, sizeof(buf), _TRUNCATE, ts->UIMsg, GetLastError());
1817                            MessageBox(NULL, buf, uimsg, MB_ICONEXCLAMATION);
1818                    }
1819                    else if (rename(tmp, cfg) != 0) {
1820                            get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts->UILanguageFile);
1821                            get_lang_msg("MSG_CYGTERM_CONF_RENAMEFILE_ERROR", ts->UIMsg, sizeof(ts->UIMsg),
1822                                    "Can't rename CygTerm configuration file (%d).", ts->UILanguageFile);
1823                            _snprintf_s(buf, sizeof(buf), _TRUNCATE, ts->UIMsg, GetLastError());
1824                            MessageBox(NULL, buf, uimsg, MB_ICONEXCLAMATION);
1825                    }
1826                    else {
1827                            // cygterm.cfg ファイルへの保存が成功したら、メッセージダイアログを表示する。
1828                            // 改めて、Save setupを実行する必要はないことを注意喚起する。
1829                            // (2012.5.1 yutaka)
1830                            // Save setup 実行時に、CygTermの設定を保存するようにしたことにより、
1831                            // ダイアログ表示が不要となるため、削除する。
1832                            // (2015.11.12 yutaka)
1833                            get_lang_msg("MSG_TT_NOTICE", uimsg, sizeof(uimsg), "MSG_TT_NOTICE", ts->UILanguageFile);
1834                            get_lang_msg("MSG_CYGTERM_CONF_SAVED_NOTICE", ts->UIMsg, sizeof(ts->UIMsg),
1835                                    "%s has been saved. Do not do save setup.", ts->UILanguageFile);
1836                            _snprintf_s(buf, sizeof(buf), _TRUNCATE, ts->UIMsg, CYGTERM_FILE);
1837                            MessageBox(NULL, buf, uimsg, MB_OK | MB_ICONINFORMATION);
1838                    }
1839    #endif
1840            }
1841    
1842            // 忘れずにメモリフリーしておく。
1843            for (i = 0; i < linenum; i++) {
1844                    free(line[i]);
1845            }
1846    
1847            return TRUE;
1848    }
1849    
1850    /////////////////////////////
1851    
1852  // CCygwinPropPageDlg ダイアログ  // CCygwinPropPageDlg ダイアログ
1853    
# Line 1595  void CCygwinPropPageDlg::OnInitDialog() Line 1877  void CCygwinPropPageDlg::OnInitDialog()
1877          };          };
1878          SetDlgTextsW(m_hWnd, TextInfos, _countof(TextInfos), ts.UILanguageFileW);          SetDlgTextsW(m_hWnd, TextInfos, _countof(TextInfos), ts.UILanguageFileW);
1879    
1880          memcpy(&settings, &ts.CygtermSettings, sizeof(cygterm_t));          ReadCygtermConfFile(ts.HomeDir, &settings);
1881    
1882          SetDlgItemTextA(IDC_TERM_EDIT, settings.term);          SetDlgItemTextA(IDC_TERM_EDIT, settings.term);
1883          SetDlgItemTextA(IDC_TERM_TYPE, settings.term_type);          SetDlgItemTextA(IDC_TERM_TYPE, settings.term_type);
# Line 1637  BOOL CCygwinPropPageDlg::OnCommand(WPARA Line 1919  BOOL CCygwinPropPageDlg::OnCommand(WPARA
1919          return TTCPropertyPage::OnCommand(wParam, lParam);          return TTCPropertyPage::OnCommand(wParam, lParam);
1920  }  }
1921    
1922  void CCygwinPropPageDlg::OnOK()  /**
1923     * @brief       cygterm_tを比較する
1924     * @param       a       cygterm_t
1925     * @param       b       cygterm_t
1926     * @retval      TRUE    同一
1927     * @retval      FALSE   異なる
1928     */
1929    BOOL CmpCygtermConfFile(const cygterm_t *a, const cygterm_t *b)
1930  {  {
1931          // writing to CygTerm config file          if ((strcmp(a->term, b->term) != 0) ||
1932          GetDlgItemTextA(IDC_TERM_EDIT, settings.term, sizeof(settings.term));                  (strcmp(a->term_type, b->term_type) != 0) ||
1933          GetDlgItemTextA(IDC_TERM_TYPE, settings.term_type, sizeof(settings.term_type));                  (strcmp(a->port_start, b->port_start) != 0) ||
1934          GetDlgItemTextA(IDC_PORT_START, settings.port_start, sizeof(settings.port_start));                  (strcmp(a->port_range, b->port_range) != 0) ||
1935          GetDlgItemTextA(IDC_PORT_RANGE, settings.port_range, sizeof(settings.port_range));                  (strcmp(a->shell, b->shell) != 0) ||
1936          GetDlgItemTextA(IDC_SHELL, settings.shell, sizeof(settings.shell));                  (strcmp(a->env1, b->env1) != 0) ||
1937          GetDlgItemTextA(IDC_ENV1, settings.env1, sizeof(settings.env1));                  (strcmp(a->env2, b->env2) != 0) ||
1938          GetDlgItemTextA(IDC_ENV2, settings.env2, sizeof(settings.env2));                  (a->login_shell != b->login_shell) ||
1939                    (a->home_chdir != b->home_chdir) ||
1940          settings.login_shell = GetCheck(IDC_LOGIN_SHELL);                  (a->agent_proxy != b->agent_proxy)) {
1941          settings.home_chdir = GetCheck(IDC_HOME_CHDIR);                  return FALSE;
1942          settings.agent_proxy = GetCheck(IDC_AGENT_PROXY);          }
1943            return TRUE;
1944    }
1945    
1946          memcpy(&ts.CygtermSettings, &settings, sizeof(cygterm_t));  void CCygwinPropPageDlg::OnOK()
1947    {
1948            cygterm_t settings_prop;
1949    
1950          // 設定を書き込むためフラグを立てておく。          // プロパティーシートから値を取り込む
1951          ts.CygtermSettings.update_flag = TRUE;          GetDlgItemTextA(IDC_TERM_EDIT, settings_prop.term, sizeof(settings_prop.term));
1952            GetDlgItemTextA(IDC_TERM_TYPE, settings_prop.term_type, sizeof(settings_prop.term_type));
1953            GetDlgItemTextA(IDC_PORT_START, settings_prop.port_start, sizeof(settings_prop.port_start));
1954            GetDlgItemTextA(IDC_PORT_RANGE, settings_prop.port_range, sizeof(settings_prop.port_range));
1955            GetDlgItemTextA(IDC_SHELL, settings_prop.shell, sizeof(settings_prop.shell));
1956            GetDlgItemTextA(IDC_ENV1, settings_prop.env1, sizeof(settings_prop.env1));
1957            GetDlgItemTextA(IDC_ENV2, settings_prop.env2, sizeof(settings_prop.env2));
1958    
1959            settings_prop.login_shell = GetCheck(IDC_LOGIN_SHELL);
1960            settings_prop.home_chdir = GetCheck(IDC_HOME_CHDIR);
1961            settings_prop.agent_proxy = GetCheck(IDC_AGENT_PROXY);
1962    
1963            // 変更されている場合 cygterm.cfg へ書き込む
1964            if (CmpCygtermConfFile(&settings_prop, &settings) == FALSE) {
1965                    if (WriteCygtermConfFile(ts.HomeDir, &settings_prop) == FALSE) {
1966                            char uimsg[MAX_UIMSG];
1967                            char buf[256];
1968                            get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
1969                            get_lang_msg("MSG_CYGTERM_CONF_WRITEFILE_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
1970                                                     "Can't write CygTerm configuration file (%d).", ts.UILanguageFile);
1971                            _snprintf_s(buf, sizeof(buf), _TRUNCATE, ts.UIMsg, GetLastError());
1972                            MessageBoxA(buf, uimsg, MB_ICONEXCLAMATION);
1973                    }
1974            }
1975    
1976          // Cygwin install path          // Cygwin install path
1977          GetDlgItemTextA(IDC_CYGWIN_PATH, ts.CygwinDirectory, sizeof(ts.CygwinDirectory));          GetDlgItemTextA(IDC_CYGWIN_PATH, ts.CygwinDirectory, sizeof(ts.CygwinDirectory));

Legend:
Removed from v.10178  
changed lines
  Added in v.10179

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26