GETVFSENT(3)

名称
getvfsent, setvfsent, endvfsent, vfsisloadable, vfsload - 仮想ファイルシステムモジュールを管理

ライブラリ
libc

書式
<sys/param.h> <sys/mount.h> struct ovfsconf * getvfsent(void) void setvfsent(int cachelist) void endvfsent(void) int vfsisloadable(const char *name) int vfsload(const char *name)

解説
getvfsent() 関数によって、カーネルが管理するインストール済の仮想ファイルシステムモジュール のリストに、簡単にアクセスできます。リストのファイルシステムを 1 回に 1 つづつ段階的に処理します。利用できるデータがそれ以上なくなると、 ヌル ポインタが返ります。構造体 “struct ovfsconf” のフィールドは次のとおりです。

vfc_name
    ファイルシステムの名前。
vfc_index
    カーネルによって割り当てられ mount(2) の呼び出しに使用された、ファイルシステムのタイプ番号。
vfc_refcount
    このファイルシステムの参照数 (通常はマウント数ですが、 アンロードできないかカーネルに静的にリンクされている ファイルシステムでは、マウント数に 1 を加えたものになります)。
vfc_flags
    フラグビット。

フラグは次のように定義されています:

VFCF_STATIC
    カーネルに静的に組み込まれている
VFCF_NETWORK
    データをネットワーク経由で取得し得る
VFCF_READONLY
    書き込みは未実装
VFCF_SYNTHETIC
    データは実ファイルを表現しない
VFCF_LOOPBACK
    マウント済みのファイルシステムに対する別名
VFCF_UNICODE
    ファイル名を Unicode で格納

setvfsent() および endvfsent() 関数は、 sysctl(3) によってカーネル からまとめて取得されるファイルシステムリストの、キャッシング制御に 使用されます。 setvfsent() の cachelist パラメータが 0 でなければ、これら 検索関数のどれかを最初に呼び出した時点でリストはただ 1 回だけ取り出され、 キャッシュをクリアするために endvfsent() が呼び出されるまで保持されます。 一般に setvfsent(1) は、 getvfsent() を使用するプログラムによって呼び出される必要があり、 setvfsent(0) は (これもデフォルトの状態で)、 vfsload() 関数を使用するプログラムによって呼び出される必要があります。

vfsisloadable() 関数は、後で vfsload(name) の呼び出しが続きそうだと非 0 値を返します。ここで “そう” と言うのは、 vfsisloadable() は vfsload() が成功するための条件をチェックしないからです。

vfsload() 関数は、ファイルシステム name の実装カーネルモジュールをロード しようと試みます。ファイルシステムモジュールを無事に突き止めてロードした 場合は 0 が、その他の場合は非 0 が返ります。この関数を呼び出せるのは次に 示す状況だけです。

1.  getvfsbyname() を呼び出して非 0 値が返った場合。

2.  vfsisloadable() を呼び出して非 0 値が返った場合。

mount_cd9660(8) のソースから取った使用例を次に示します。

    struct vfsconf *vfc;
    int error;
    /* ここにセットアップコードが入る */
    error = getvfsbyname("cd9660", &vfc);
    if (error && vfsisloadable("cd9660")) {
    	if (vfsload("cd9660"))
    		err(EX_OSERR, "vfsload(cd9660)");
    	endvfsent();	/* flush cache */
    	error = getvfsbyname("cd9660", &vfc);
    }
    if (error)
    	errx(1, "cd9660 filesystem is not available");
    if (mount(vfc.vfc_name, dir, mntflags, &args) < 0)
    	err(1, NULL);

戻り値
getvfsent() ルーチンは、成功すると静的データ構造体のポインタを、失敗すると ヌル ポインタを返します。原因が sysctl(3) または malloc(3) で失敗した場合は、 errno がそれら関数用にドキュメントされた値の 1 つに 設定されることがあります。その他の場合 errno は改変されません。

vfsload() 関数は失敗すると非 0 値を、成功すると 0 を返します。 vfsload() が失敗した場合、 kldload(2) 用に記述された errno 値が設定され得ます。

関連項目
kldload(2), mount(2), mount(8)

作者
-nosplit このロード可能ファイルシステムサポートは、 Terry Lambert による汎用のロード可能カーネルモジュールサポートをベースに、 Garrett A. Wollman によって書かれました。

歴史
getvfsent() 関数ファミリは FreeBSD 2.0 ではじめて登場しました。