ふと、select の errorfds がなんに使われているのか、BSD のソースを追いかけてみた
わかったこと:
- 4.2BSD (1983)
- select があり、errorfds も引数としては存在し、引数の数は現在と変わらない。
- select は kernel 内で関数へのポインタを使って分岐していて、ぜんぶ調べるのは面倒くさい
- kernel のソースをみるかぎり、ソケットについてはエラー状態になることはない
- character special device でもエラー状態を区別して扱っているものは見当たらない (r, w, e を区別せずに扱っていて、select でエラー状態が報告されるものはある)
- errorfds を使っているアプリケーションは見当たらない
- 4.3BSD (1986)
- ソケットの select の動作 (kernel 内の soo_select 関数) が拡張され、OOB data が来たときと、RCVATMARK なときにエラー状態として報告される感じ
- pty の select の動作 (ptcselect 関数) で、PF_PKT (packet mode) と PF_UCNTL (user control mode) のときの処理がある
- errorfds を使っているアプリケーションは telnet と telnetd が OOB のために使っていて、rlogind が pty の packet mode のために使っている
- ftpd は OOB を扱うが、select じゃなくて、シグナル (SIGURG) を使っている
前にも調べたことがあったような、と思ったら、5年前で、そのときはソースは読まなかったようだ