Open4

WasmLinux: Telnetしたい

okuokuokuoku

とりあえず socketpair して渡してみる

https://github.com/okuoku/wasmlinux-runner/commit/e907d6db2a592fbfbd93e61a858222475a1b42b3

https://github.com/okuoku/wasmlinux-runner/blob/e907d6db2a592fbfbd93e61a858222475a1b42b3/hostrunner/runner.cpp#L1488-L1496

しかし上手くいかない。。

sendto connect に失敗している

Thread: 91 Call = 206 Ret = -107
USERTLS[91] = 3e26fb0c
(user) syscall = 203
Override syscall args (203: 6 => 3)
TLS[91]: 1 -> 38a38000
Thread: 91 Call = 203 Ret = -2

このあたりが怪しいな。。 -107ENOTCONN-2ENOENT 。特に後者は一般的なエラーでないので何か間違っていることが起きていそう。

前者 w2c_kernel_0x5F_sys_sendto にブレークポイントを貼ると ... gdbでブレークできない! ちょっとソースコードがでかすぎるか。。?

w2c_busybox__base__w2c_make_new_session はちゃんと 0 に対して呼ばれているので、inetdとして動作しているのは間違いないが、そこから先に socket とかで追加のsocketを生成する要因が見あたらない。

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

okuokuokuoku

/dev/ptmx が無い

[stdout]: drwxr-xr-x    2 0        0                0 Feb  5 21:31 .
[stdout]: drwxr-xr-x    9 0        0                0 Feb  5 21:31 ..
[stdout]: crw-------    1 0        0           5,   1 Feb  5 21:31 console

というか /dev/console しか無いのかよ。。

... これもしかしてudevとか必要なコースか。。?とりあえず mknod/dev/pts とかをマウントしてお茶を濁す方向で。。

okuokuokuoku

動いた

https://twitter.com/okuoku/status/1754807732266467383

なんとPTYを確保してないだけだった。。

https://github.com/okuoku/wasmlinux-runner/commit/e0563acdee619cfd9adfd331d766ccacee740219

というわけで、 mknod して、 /bin/login の代わりに /bin/sh を実行すればとりあえずプロンプトに入ることはできた。

https://github.com/okuoku/wasmlinux-runner/blob/e0563acdee619cfd9adfd331d766ccacee740219/hostrunner/runner.cpp#L873-L884

https://github.com/okuoku/wasmlinux-runner/blob/e0563acdee619cfd9adfd331d766ccacee740219/hostrunner/runner.cpp#L1422

ただ数秒操作すると死ぬので、その辺はデバッグしないといけない。。