runmdn
概要
runmdn は gethostbyname
などの
標準的なリゾルバ関数を用いて名前解決を行う UNIX クライアントを、
再コンパイルなしに多言語ドメイン名を扱えるようにするためのコマンドです。
runmdn は 環境変数 MDN_DISABLE の設定を明示的に無視するため、 MDN_DISABLE が設定されているかどうかにかかわらず、ドメイン名の変換処理を 行います。
起動
% runmdn [オプション...] コマンド [引数...]
例えばtelnet
コマンドで多言語ドメイン名を扱うためには、
次のようにします。
% runmdn telnet ログイン.どこかの会社.jp
オプション
runmdn は次のオプションを認識します。
-
-e
ローカルエンコーディング - アプリケーションのローカルエンコーディングを指定します。 このオプションを指定しなかった場合、ロケールや環境変数から ローカルエンコーディングの自動判定を行います。 判定方法について詳しくは mDNkit 設定ファイル の ローカルエンコーディングについて の項をご覧ください。
実装
runmdn は共有ライブラリのプリロード機構を用いて、標準的な名前解決用の 関数を、多言語ドメイン名の処理機能を持つ別のバージョンのものに動的に 置き換えることで、クライアントでの多言語ドメイン名の処理を実現します。
多くのシステムでは、共有ライブラリのプリロードは
環境変数LD_PRELOAD
を用いて実現されています。
この環境変数にプリロードしたい共有ライブラリファイルのパス名を指定すると、
アプリケーションの実行時にアプリケーションに標準の共有ライブラリがリンク
される前に指定したライブラリがリンクされます。
これによって標準のライブラリ関数を置換えることができます。
runmdnの実体はこの環境変数LD_PRELOAD
を設定して引数で
指定されたコマンドを起動するだけのシェルスクリプトであり、実際に
多言語ドメイン名の処理を行うのはアプリケーションにリンクされる
共有ライブラリ libmdnresolv
です。
libmdnresolv
をリンクすることにより、多くのシステムで標準的に
用意されている次の名前解決関数が置き換わります。
gethostbyname gethostbyname_r gethostbyname2 gethostbyname2_r gethostbyaddr gethostbyaddr_r getipnodebyname getipnodebyaddr getaddrinfo getnameinfo
またメモリ管理等の都合により、これらの名前解決関数の置換えにしたがって、 次の関数も置き換わります。
freehostent freeaddrinfo
これらの関数にはオリジナルと比較して次のような機能が追加されています。
- 引数で指定されたドメイン名をローカルコードセットから国際化 DNS で用いられる エンコーディングに変換するとともに NAMEPREP 等の正規化を行います。
- DNS から返ってきたドメイン名のエンコーディングをローカルコードセットに 変換します。
エンコーディング変換や正規化等の処理はすべて MDN ライブラリ (libmdn) の res モジュールを使用しています。
現在の実装では libmdnresolv
は MDN ライブラリ (libmdn) を
呼び出すのではなく、libmdn 自体を内部に抱え込むような形態になっていますが、
これは単なる実装上の都合からそうなっているだけで、論理的には MDNライブラリ
の機能を呼び出しているといってよいでしょう。
また使用するエンコーディングや正規化の設定は mDNkit設定ファイルの設定を利用します。
制限
runmdnにはいくつかの制限があり、どんなシステムでも使えるわけでは ありません。
- runmdn は共有ライブラリの動的リンク機構を用いているので、 共有ライブラリが使用できるシステムでなければなりません。
- また環境変数 LD_PRELOAD または類似の機構による ライブラリのプリロード機能を持つシステムでなければなりません。
- runmdn の対象となるコマンドはリゾルバライブラリを動的リンク していなくてはなりません
- システムのライブラリが iconv() 関数を提供していない場合、外部の ライブラリを用いることになりますが、そのライブラリも共有ライブラリで なければなりません。
- アプリケーションは名前解決に上記の関数を使用していなければなりません。
- セキュリティ上の理由から一般に setuid されたコマンドはプリロード機能が 使えないようになっているので、setuid されたコマンドであってはなりません。