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