法楽日記

デジタル散策記&マインド探訪記

FreeBSD 11.1R: kern_xxx() と getsock_cap()

FreeBSD 11.1R の sys/kern/uipc_syscalls.c では kern_xxx() がいくつか定義されていますが、そのうちの kern_socket() と kern_socketpair() 以外の関数では、システムコール xxx() の引数で指定された file descriptor に対応する file 構造体を入手するために、getsock_cap() を呼び出しています。

getsock_cap() は sys/kern/uipc_syscalls.c で定義されている関数で、fget_cap() を呼び出して指定された file descriptor に対応する file 構造体を入手して、file 構造体の型が DTYPE_SOCKET かどうかを確認した上で返しています。

fget_cap() は sys/kern/kern_descrip.c で定義されている関数で、file 構造体の reference counter である f_count の値を 1 つ増やした上で、file 構造体を返します。

そのため、getsock_cap() を呼び出した kern_xxx() では、関数終了時に fdrop() を呼び出して、file 構造体の f_count の値を 1 つ減らしています。