.\" .\" Copyright (c) 2000 Alfred Perlstein .\" .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" %FreeBSD: src/share/man/man9/accept_filter.9,v 1.13 2004/06/16 08:33:57 ru Exp % .\" $FreeBSD$ .\" " .Dd June 25, 2000 .Os .Dt ACCEPT_FILTER 9 .Sh 名称 .Nm accept_filter , .Nm accept_filt_add , .Nm accept_filt_del , .Nm accept_filt_generic_mod_event , .Nm accept_filt_get .Nd 入力接続フィルタ .Sh 書式 .In sys/types.h .In sys/module.h .In sys/socket.h .Fd #define ACCEPT_FILTER_MOD .In sys/socketvar.h .Ft int .Fn accept_filt_add "struct accept_filter *filt" .Ft int .Fn accept_filt_del "char *name" .Ft int .Fn accept_filt_generic_mod_event "module_t mod" "int event" "void *data" .Ft struct accept_filter * .Fn accept_filt_get "char *name" .Sh 解説 accept フィルタは、カーネルが入力接続を前処理することを、アプリケーションが 要求することを可能にします。 accept フィルタは、 .Dv SO_ACCEPTFILTER の .Fa optname で渡すことで、 .Xr setsockopt 2 システムコールを介して要求されます。 .Sh 実装に関する注 accept フィルタになりたいモジュールは、システムに .Vt "struct accept_filter" 構造体を提供しなければなりません。 .Bd -literal struct accept_filter { char accf_name[16]; void (*accf_callback)(struct socket *so, void *arg, int waitflag); void * (*accf_create)(struct socket *so, char *arg); void (*accf_destroy)(struct socket *so); SLIST_ENTRY(accept_filter) accf_next; /* リストの次のエントリ */ }; .Ed .Pp そのモジュールは、 .Xr malloc 9 で割当てられた .Vt "struct accept_filter" 構造体へのポインタを渡す関数 .Fn accept_filt_add を使用して、それを登録するべきです。 .Pp .Vt "struct accept_filter" のフィールドは以下の通りです。 .Bl -tag -width ".Va accf_callback" .It Va accf_name フィルタの名前です。 これはユーザ領域からアクセスされる方法です。 .It Va accf_callback 接続が確立されたときにカーネルが実行するコールバックです。 これは socket upcall と同等で、そのコールバックがソケットのフラグを 変更しない限りは、接続が確立したとき、 またソケットに新しいデータが届くたびに、呼出されます。 .It Va accf_create 監視しているソケット上に .Xr setsockopt 2 がフィルタをインストールするたびに呼出されます。 .It Va accf_destroy ユーザがそのソケット上の accept フィルタを取り除くたびに呼出されます。 .El .Pp .Fn accept_filt_add 関数を使用して登録されたときに .Va accept_filter.accf_name に使用された同じ文字列が .Fn accept_filt_del に渡されると、その後カーネルはそれ以上のユーザ領域の そのフィルタの使用を禁じます。 .Pp .Fn accept_filt_get 関数は .Xr setsockopt 2 システムコールを介して使用されるための accept フィルタを 見つけるために内部で使用されます。 .Pp .Fn accept_filt_generic_mod_event 関数は自分自身をロードおよびアンロードするための引数フィールドを使用 しない accept フィルタのために、コードの重複を避ける単純な方法を提供します。 この関数は .Fn DECLARE_MODULE マクロのために .Vt moduledata_t 構造体の中で使用されることが可能です。 .Sh 関連項目 .Xr setsockopt 2 , .Xr accf_data 9 , .Xr accf_http 9 , .Xr malloc 9 .Sh 歴史 accept フィルタ機構は .Fx 4.0 で導入されました。 .Sh 作者 このマニュアルページは .An -nosplit .An Alfred Perlstein , .An Sheldon Hearn および .An Jeroen Ruigrok van der Werven が書きました。 .Pp accept フィルタの構想は Yahoo!\& の .An David Filo によって開拓され、 .An Alfred Perlstein によってローダブルモジュールシステムに改良されました。