週刊mosh : win32 named pipeに対応

0.2.7は、まだまだopen for development。ただ、%getpidの追加に伴いバイトコードの互換性は失われたので、バージョンbumpをそのうち。

話題

  • port→fd

http://groups.google.com/group/mosh-developer-discuss/browse_thread/thread/f1331c61b42fddc9?hl=en
moshFFIからどうやってFILE構造体を取り扱うかという問題から、Scheme portに対応するfdを取り出す手続きを追加する話へ。
moshScheme portはPosix/Cygwinではfdを使い、Win32ではHANDLEを使っている。というわけで、port→fdのような手続きを用意してもWin32では使えないことになる。
逆の、fd→portに対応する手続きは他のSchemeにも見られる。chez schemeではopen-fd-input/output-port、Gaucheのような他のSchemeではfdを取り扱うためのAPIを準備している。
Win32に関してはそもそも標準libc自体が存在しないので、port→handleは用意するかもしれないがport→fdは作らない可能性が高い。
portはfdのスーパーセットなので、fd-backedなバイナリポートだけがport→fdできるようになる。fd-backedでないportには:

  • textual port
  • bytevector input/output port
  • カスタムポート

が有る。
カスタムポートをfdやHANDLEに見せるのは興味深い問題だが、通常のテクニックでは実現できない。

Win32 Named pipeに対応

Win32のNamed pipeを取り扱うライブラリ(nmosh win32 named-pipe)を実装した。
ここで実装されているのはpipeの"listen"動作で、逆に既にlistenされているpipeに接続するには、単にScheme側のopen-file-input/output-portでpipeを開けばOK。
Named pipeはpipe filesystemの下にしか作れないことに注意する。つまりNamed pipeの名前として"\\.\pipe\hoge"のようにpipeの下でないとエラーになる。
HANDLEをScheme portにはまだ変換できない。
UNIXfifoやDomain socketへの対応も検討中。
ユーザが直接これらのpipeを制御することは想定していなくて、qemuのchardev風のフレームワークを用意する予定。つまり、"pipe:hoge"のような文字列でlisten対象を指定し、"tcp:1000"のように他のトランスポートも同様に指定できるようにする。