Open4

WasmLinux: ブラウザ用に簡易telnetクライアントの製作

okuokuokuoku

いろいろ考えたけど、とりあえず stdin stdout stderr はPTYにあげて、WasmLinux側のdebug printを別のロジックに移すほうが簡単なので、telnet実装はxterm-pty https://github.com/mame/xterm-pty を前提にC言語側で用意することにした。

xterm-ptyはEmscriptenをパッチして標準入出力をのっとる実装になっていて、TTY側のfdを変更できない。

okuokuokuoku

xterm-ptyの仕様調査

xterm-pty (xtermjs-pty じゃないのか。。) の仕様は特に明記されていないようだ。というわけでコードを呼んで何をサポートしているのかを確認する。

シグナル類

https://github.com/mame/xterm-pty/blob/cfcbc7e2145d03a0afef45939e3971becb2b4443/emscripten-pty.js#L61-L64

SIGINT SIGQUIT SIGTSTP SIGWINCH 。内部では _raise しているだけ。なのでemscriptenのランタイム側に受信方法がある。。はず。

https://github.com/emscripten-core/emscripten/blob/587c9b678d163c3cb8e82f36ca84ad57c2fb737b/test/core/test_signals.c#L133

Emscriptenのテストには sigaction が普通に存在するので、とりあえずこれで受信する方向で。。

tcsetattr / tcgetattr

要は termios 構造体の読み書きをPOSIX APIで行えるようだ。

https://github.com/mame/xterm-pty/blob/cfcbc7e2145d03a0afef45939e3971becb2b4443/demo/build/example.c#L24-L26

これと ioctlTIOCGWINSZ に対応している。

https://github.com/mame/xterm-pty/blob/cfcbc7e2145d03a0afef45939e3971becb2b4443/emscripten-pty.js#L262

okuokuokuoku

libtelnet

簡単なクライアントサンプルが付属している。

https://github.com/seanmiddleditch/libtelnet/blob/5f5ecee776b9bdaa4e981e5f807079a9c79d633e/util/telnet-client.c

ただしオプション類はほぼ実装していない(ECHOのみ)。

Suppress go ahead RFC858TELNET_TELOPT_SGA 、 Window size RFC1073TELNET_TELOPT_NAWS として定義されているので、それらのハンドリングは足す必要がありそう。

設定に関してはBusyboxのtelnetに合わせるのが良いかな。WONT ECHO、WILL NAWS、DO SGA。

https://github.com/mirror/busybox/blob/2d4a3d9e6c1493a9520b907e07a41aca90cdfd94/networking/telnetd.c#L235

https://github.com/mirror/busybox/blob/2d4a3d9e6c1493a9520b907e07a41aca90cdfd94/networking/telnetd.c#L471-L483