
                CygTerm+  -  yet another Cygwin console

                ターミナル・エミュレータで Cygwin を使う。

                (C) 2006- TeraTerm Project
                https://ttssh2.osdn.jp/

                Based on CygTerm by Original developer:
                Copyright (C) 2000-2006 NSym
                nsym@dd.iij4u.or.jp


// は じ め に //

    CygwinコンソールであるDOS窓をターミナル・エミュレータで置き替えてみよう、
    という試みです。 ただし『リモートログインのしくみを利用せずに』という
    前提です。 したがって inetd とか in.telnetd とか login 等は使用しません。

// 考 え 方 //

    ターミナル・エミュレータとCygwin上のシェルを起動し、両者を中継する。
    これを行うプログラムを作ればよい。

// 仕 様 //

    1. このプログラムを実行すると、ターミナル・エミュレータが立ち上がり、
       そこにシェルのプロンプトが現れ、Cygwinコンソールとして使えること。

    2. 起動するターミナル・エミュレータとシェルは選択可能であること。

    3. シェル側の画面制御が正常に動作し、ターミナル・エミュレータ側の
       画面サイズ変更にも追随すること。

// 設 計 //

    cygterm.exe 処理詳細

      [1] TELNET接続を待ち受けるリスナーソケットを用意する。
          ソケットに割り当てる未使用ポート番号は指定範囲内から探し出す。

      [2] 別スレッドでターミナル・エミュレータを起動する。
          このとき起動引数に IPアドレス 127.0.0.1 と [1]のポート番号を指定する。

      [3] ターミナル・エミュレータからの接続を受け入れる。
          セキュリティー上 127.0.0.1 以外からの接続は却下する。

      [4] fork()した子プロセス上、PTY(擬似端末)スレーブ側でシェルを起動する。

      [5] [3]の TELNET接続ソケットと [4]の PTYマスター側の入出力を橋渡しする。

    TELNETプロトコルへの対応 (option negotiation)

        ターミナル・エミュレータからターミナルタイプの通知を受け、
        シェル上 TERM 環境変数にセットする。

        ターミナル・エミュレータからターミナルサイズの通知を受け、
        PTYのウィンドウサイズを同サイズに変更する。

        自分が Go Ahead を使わない事の許可をターミナルエミュレータに要求する。

        ターミナルエミュレータが Go Ahead を使用しないように要求する。

        ターミナルエミュレータの送信内容をエコーバックする許可を要求する。

        [参照: RFC854 TELNET PROTOCOL SPECIFICATION]

    cygterm.exe はウィンドウを持たない Win32アプリとして実装する。

// ソ ー ス //

    README-j     -  このファイル
    README       -  README-j英訳
    COPYING      -  GNU General Public License (GPL) Version 2
    Makefile     -  メイクファイル
    cygterm.cc   -  ソースコード
    cygterm.cfg  -  設定ファイル

    ※ Free Software Foundation 発行 GNU General Public License (GPL)
       に準拠するフリーソフトウェアとして配布します。
       COPYING 参照。(https://www.gnu.org/licenses/old-licenses/gpl-2.0.html)

       補足: 他プログラムが CygTerm実行形式(cygterm.exe)を起動し通信して
             使用することは、それが非GPLプログラムの場合でも許可されます。

// イ ン ス ト ー ル //

    Cygwin環境下で make install を実行します。

    ※ インストール先ディレクトリは Makefile 中 BINDIR で設定しておきます。
       BINDIR に cygterm.exe と cygterm.cfg がインストールされます。
       cygterm.cfg は上書きされません。

// 動作モード //

    cygterm.exe と同じフォルダに portable.ini がある場合ポータブル版と
    して動作します。portable.ini がない場合は通常版として動作します。

// 設 定 フ ァ イ ル //

    cygterm.cfg は設定ファイルです。 使用する端末エミュレータのコマンドライン
    や起動するシェルのコマンドライン等を設定します。

    cygterm.cfg は次の順序で読みます。

    - exeと同じフォルダの cygterm.cfg
    - /etc/cygterm.conf
    - $APPDATA/teraterm5/cygterm.cfg
    - ~/.cygtermrc

    $SHELL と $USER は、設定ファイル読み込み前に設定されます。
    後から読み込んだ値で上書きされます。
    設定ファイルを読み込んだのちコマンドラインオプションで指定で上書きされます。

    ポータブル版のときは、次のファイルのみを読み込みます。

    - $APPDATA/teraterm5/cygterm.cfg

    cygterm.cfg の例
      +-----------------------------------------------------------------------
      | TERM = C:\program files\ttermpro\ttermpro.exe %s %d /KR=SJIS /KT=SJIS
      | TERM_TYPE = vt100
      | PORT_START = 20000
      | PORT_RANGE = 40
      | SHELL = /bin/bash

    設定ファイルの文字コードはUTF-8です。
    (Cygwin 1.5環境では Shift_JIS です。)

    TERM
    ----
        ターミナル・エミュレータの起動コマンドラインです。
        コマンド名は Windows環境でパスが通ってなければフルパスで書きます。
        ホスト指定のところは %s とし、ポート指定のところは %d とします。

    TERM_TYPE
    ---------
        ターミナル・エミュレータがターミナルタイプを与えてくれなかった
        場合に採用するターミナルタイプです。 (デフォルト:vt100)
        シェル上、環境変数 TERM にセットされます。

    PORT_START
    ----------
        使い始める (使ってよい最小の) ポート番号です。 (デフォルト:20000)

    PORT_RANGE
    ----------
        使ってよいポート番号の個数です。 (デフォルト:40)

        PORT_START 〜 PORT_START+PORT_RANGE の範囲で空きポートを探します。
        この数だけ同時実行できることになります。

    SHELL
    -----
        Cygwin側シェル (通常 /bin/bash) の起動コマンドラインです。
        (デフォルト: /etc/passwdの情報を使用)
        コマンド名のフルパスか、"AUTO"を指定します。

    LOGIN_SHELL
    -----------
        シェルをログインシェルとして起動するかどうかを指定します。
        デフォルトは無効です。

        一般的なシェルではログインシェルとして起動されると、.profileや
        .loginなどのログイン時のみ読み込むスタートアップファイルを実行
        します。
        これらのファイルでは、通常、以下のような事が行われます。
        ・PATHやUSER等の各種環境変数の設定を行う
        ・端末の設定を適切に行う
        ・カレントディレクトリをユーザのホームディレクトリに変更する。

        一部のシェル(tclshなど)やシェル以外のプログラムを起動する場合は
        効果がありません。

    HOME_CHDIR
    ----------
        patch level 01 に含まれる"ホームディレクトリへの移動"を機能させるか
        どうかを指定します。デフォルトは無効です。

    SOCKET_TIMEOUT
    --------------
        ターミナル・エミュレータからのtelnet接続を待ち受けるソケットが
        タイムアウトするまでの時間を指定します。 (デフォルト: 5秒)

    SSH_AGENT_PROXY
    ---------------
        ssh認証エージェント転送機能を提供するかを指定します。
        有効にすると、OpenSSHのssh認証エージェントに対応したプログラムが、
        CygTerm+を通してPageantにアクセスできるようになります。
        デフォルトは無効です。

    ENV_X
    -----
        シェル起動時に設定しておきたい環境変数です。「変数名=値」の形式
        (putenv形式) で記述します。 ENV_ で始めればいくつでも記述できます。


// 起 動 方 法 //

    コマンドライン・オプション

        cygterm.exe [-t 'terminal-emulator'] [-p port-number] [-dumb]
                    [-s 'shell'] [-ls | -nols] [-cd | -nocd] [-a | -A]
                    [-v 'env-var' ...] [-d 'directory'] [-o 'parameter']

        -t 'terminal-emulator'
                ターミナル・エミュレータを指定します。
                指定形式は設定ファイルの TERM と同じです。
                空白文字を含む場合は必ずクォートで囲みます。

        -p port-number
                ターミナル・エミュレータを起動するのではなく、
                ローカルホストのこのポート番号への接続を試みます。
                他のアプリケーション・プログラムが -p オプションを使って、
                cygterm.exe 経由で Cygwinを利用する、等が考えられます。

        -dumb
                TELNETオプション・ネゴシエーションを行いません。
                さらに TELNETコマンドが送信されてきても無視します。
                シェル側の環境変数 TERM は 'dumb' となります。

        -s 'shell'
                Cygwin上のシェルを指定します。
                指定形式は設定ファイルの SHELL と同じです。
                空白文字を含む場合は必ずクォートで囲みます。
                必ずしもシェルコマンドである必要はありません。

        -ls
                シェルをログインシェルとして起動します。

        -nols
                シェルを(ログインシェルではなく)通常のシェルとして起動します。

        -cd
                カレントディレクトリをホームディレクトリに移動してから
                シェルを起動します。

        -nocd
                カレントディレクトリを移動せずにシェルを起動します。

        -A
                ssh認証エージェント転送機能を有効にします。

        -a
                ssh認証エージェント転送機能を無効にします。

        -v 'env-var'
                シェル起動時に設定しておきたい環境変数を指定します。
                指定形式は設定ファイルの ENV_X と同じです。
                空白文字を含む場合は必ずクォートで囲みます。
                -v オプションはいくつでも指定できます。

        -d 'directory'
                カレントディレクトリを指定されたディレクトリに移動してから
                シェルを起動します。

        -o 'parameter'
                ターミナル・エミュレータへの追加のパラメータを指定します。
                TERMを変えずに追加のパラメータを指定したい時に使います。

    ターミナル・エミュレータもしくは接続先ポート番号、と Cygwin側シェルの
    指定が最低必要となります。 これらがコマンドライン・オプションによって
    与えられるならば、設定ファイル cygterm.cfg が無くても実行できます。

    cygterm.exe は cygwin1.dll を利用する Win32アプリケーションです。
    Cygwin上から実行することも、Windows上のショートカットから実行することも
    できます。

    ※ Windows上から実行するには cygwin1.dll のディレクトリパスが
       Windows環境変数 PATH に追加されている必要があります。
       (通常 Cygwinルートディレクトリ\bin)

// 注 意 事 項 //

    * Tera Term使用時の注意

    ターミナル・エミュレータが Tera Term の場合、cygterm.exe から起動された
    状態で設定保存 [Setup][Save setup] を行わないよう注意してください。
    TCP/IP設定の Telnetポート番号が 23 以外で保存され、通常の Telnet目的の
    実行時に接続できず、慌てることになってしまいます。
    TCP/IP Port# に 23 を指定して設定保存し直せば元に戻ります。

// 変 更 履 歴 //
v1.07_30 2022/02/06
        * 読み込む設定ファイルを追加
          $APPDATA/teraterm5/cygterm.cfg
        * Unicode対応
        * ポータブル版対応

v1.07_29 2016/11/26 (by maya)
        * アイコンを変更した。

v1.07_28 2016/02/17 (by doda)
        * デバッグモードを追加した。

v1.07_27 2016/02/09 (by doda)
        * -cd オプション(HOME_CHDIR=y) より -d オプションでのディレク
          トリ指定を優先するようにした。
        * -ls オプション(LOGIN_SHELL=y) の指定時に -d オプションを指定
          した場合、CHERE_INVOKING=y をセットするようにした。

v1.07_26 2015/12/14 (by doda)
        * ssh 認証エージェント転送で複数コネクションに対応した。

v1.07_25 2015/02/21 (by doda)
        * TERM 環境変数が正しく設定されるようにした。

v1.07_24 2013/08/15 (by maya)
        * 64bit Cygwin でも動作するようにした。 (cyglaunch)

v1.07_23 2011/04/18 (by doda)
        * -d オプションで指定されたディレクトリへの移動が失敗した時、
          エラーメッセージを表示するようにした。

v1.07_22 2011/03/03 (by maya)
        * インストーラから起動チェックをするための mutex を削除した。

v1.07_21 2011/02/28 (by maya)
        * インストーラから起動チェックをするための mutex を追加した。

v1.07_20 2010/10/20 (by doda)
        * '-d' オプションでのディレクトリ変更のタイミングを遅らせた。
          (security fix)

v1.07_19 2010/01/28 (by doda)
        * '-s' オプションの引数に 'AUTO' を受け付けるようにした。

v1.07_18 2010/01/19 (by doda)
        * '-d' オプションの引数から二重引用符を削除するようにした。

v1.07_17 2009/06/16 (by doda)
        * TELNET SGA/ECHOオプションのネゴシエーションを行うようにした。

v1.07_16 2008/11/21 (by doda)
        * ssh 認証エージェント転送機能を有効にするオプションを '-a' から
          '-A' に変更した。
        * ssh 認証エージェント転送機能を無効にするオプション '-a' を追加した。

v1.07_15 2008/11/01 (by doda)
        * ssh 認証エージェント転送機能をサポートした。

v1.07_14 2007/12/17 (by doda)
        * ターミナル・エミュレータの追加のパラメータを指定するオプション
          '-o' を追加した。

v1.07_13 2007/08/03 (by maya)
        * 開始ディレクトリを指定する '-d' オプションを追加した。

v1.07_12 2007/06/10 (by doda)
        * telnet の待ち受けソケットのタイムアウトを設定するオプション
          SOCKET_TIMEOUT を追加した。

          SOCKET_TIMEOUT = 秒数

v1.07_11 2007/01/31 (import from cygterm v1.07)
        * gcc 3.4 での WinMainCRTStartup() 再定義エラー回避
        * 連続出力時でもキーボード割り込みが入るように。

v1.06_11 2006/09/29 (by maya)
        * 環境変数と /etc/passwd の HOME を使わないようにした。
          Cygwin によってセットされた HOME が利用される。関連項目 /etc/profile
        * 設定ファイルの優先順位を変更した。
          コマンドライン引数 > ~/.cygtermrc > /etc/cygterm.conf > cygterm.cfg
          > /etc/passwd

v1.06_10 2006/09/28 (by doda)
        * ユーザ名を得るのに、環境変数 USERNAME の代わりに getlogin() を使う
          ようにした。

v1.06_09 2006/09/25 (by doda)
        * SHELLが設定されていない場合は、/etc/passwd からシェルの情報を得る
          ようにした。

v1.06_08 2006/08/30 (by maya)
        * cygterm.cfg を設定ファイルの中で最優先されるようにした。

v1.06_07 2006/08/19 (by maya)
        * Windows の 環境変数 HOME が設定されていれば使うようにした。

v1.06_06 2006/08/18 (by doda)
        * -sと-tオプションのパラメータの長さを制限した。

v1.06_05 2006/08/18 (by maya)
        * インストーラから起動チェックをするため、mutex を作成した。

v1.06_04 2006/08/15 (by doda)
        * シェルをログインシェルとして呼び出すオプション LOGIN_SHELL を
          追加した。

          LOGIN_SHELL: yes | no

v1.06_03 2006/08/15 (by doda)
        * ホームディレクトリで起動するのを選択するオプション HOME_CHDIR を
          追加した。

          HOME_CHDIR: yes | no

v1.06_02 2006/02/09 (by babydamons@yahoo.co.jp)
        * CygTermのアイコンが作成されました。（"DotWork 2.50"にて作成）
          "DotWork 2.50" は右記のURLより入手可能です。
          http://www5a.biglobe.ne.jp/~suuta/
          すばらしいソフトウェアを公開していただき、
          "suuta at hamal dot freemal dot ne dot jp"に感謝致します。

        * Makefile が修正されました。"clean" ターゲットで cygterm.ico を削除
          しないように。

v1.06_01 2006/02/08 (by babydamons@yahoo.co.jp)
        * 以下の設定ファイルの読み込みをサポート:
            + /etc/cygterm.conf
            + ~/.cygtermrc

        * シェルがユーザのホームディレクトリで起動されるように。

        * アカウントの設定情報を /etc/passwd から getpwnam(3) で読み込むように。
          アカウント名は環境変数 USERNAME からgetenv(3) で取得してます。

        * Makefile 修正：ディフォルトでアイコンつきの .exe をビルドします。

v1.06 2004/01/24
        * コマンドライン・オプションを追加。
            -t 'terminal-emulator' (ターミナル・エミュレータ指定)
            -p port-number (接続先ポート番号指定)
            -dumb (ダムターミナル指定)
            -s 'shell' (シェル指定)
            -v 'env-var' (環境変数指定)

        * Makefile修正
          make install で BINDIR が存在しなければエラーになるように。

        * ソースファイル英文化 (cygterm.cc, README.txt)

v1.05 2003/01/14
        * Ctrl+SPACE(NUL)が送信できるように修正。
          改行コード CR+NUL を処理する方法として単純に NUL文字を無視していた
          ため、Ctrl+SPACE 押下時でも NUL が送信されなかった。

v1.04 2002/12/08
        * ターミナル・エミュレータおよびシェルの起動に失敗したときに
          エラーメッセージを表示するようにした。

        * Makefile修正
          make install で cygterm.cfg を上書きしないように。
          gccオプションに -fno-exceptions を追加、GCC-3のリンクエラー回避。

v1.03 2002/07/24
        * ターミナル・エミュレータが通知してくるターミナルタイプに、大文字が
          含まれていれば、それを小文字に変換するように修正。
          ターミナル・エミュレータによっては環境変数 TERM の値が 'ANSI' 'VT100'
          のように大文字なり terminfo にマッチしないため。
          (Windows 2000 telnet.exe 等)

v1.02 2002/07/22
        * ターミナル・エミュレータがコンソール・アプリケーションのときに起動
          できなかったのを修正。(Windows 2000 telnet.exe 等)
          CreateProcess()呼出しミス。

        * ターミナル・エミュレータから CR+LF が送られてきたら LF は転送しない
          ようにし、改行が２回発生するのを修正。(Windows 98 telnet.exe 等)

        * バージョン番号を cygterm.exe に埋め込むようにした。
          確認方法は $ strings cygterm.exe | grep version

v1.01 2002/07/19
        * zsh, tcsh で動作しなかったのを修正。擬似端末のオープン方法が悪く、
          zsh, tcsh では起動とともに入力がブロックされた。

v1.00 2000/12/17
        * 初期バージョン完成

