getdirentries(2) FreeBSD 一般コマンドマニュアル

getdirentries

前のページ 上に戻る 次のページ

getdirentries


     Standard C Library (libc, -lc)


書式

     #include <sys/types.h>
     #include <dirent.h>

     int
     getdirentries(int fd, char *buf, int nbytes, long *basep);

     int
     getdents(int fd, char *buf, int nbytes);


解説

     getdirentries() 関数と getdents() 関数は、ファイル記述子 fd が参照する
     ディレクトリから buf が指すバッファ内に、ファイルシステムに独立なフォー
     マットのディレクトリエントリを読取ります。最高で nbytes までのデータが転
     送されます。 nbytes 引数は、ファイルに対応するブロックサイズ以上である必
     要があります。 stat(2) を参照してください。このサイズより小さいバッファで
     は、これらの関数をサポートしない可能性のあるファイルシステムがあります。

     バッファ内のデータは dirent 構造体の連続で、それぞれ次のエントリが入って
     います。

           u_int32_t d_fileno;
           u_int16_t d_reclen;
           u_int8_t  d_type;
           u_int8_t  d_namlen;
           char    d_name[MAXNAMELEN + 1]; /* 下記を参照 */

     d_fileno エントリは、ファイルシステム内の異なるファイル毎に一意の数値で
     す。ハードリンクでリンクされたファイル (link(2) を参照) は同じ d_fileno
     を持ちます。 d_reclen エントリは、ディレクトリレコードの長さ (バイト単位)
     です。 d_type エントリは、ディレクトリレコードが指すファイルのタイプで
     す。ファイルタイプの値は <sys/dirent.h> 内に定義されます。 d_name エント
     リにはヌルで終端されたファイル名が入っています。 d_namlen エントリは、ヌ
     ルバイトを除いたファイル名の長さを示します。それゆえ、 d_name の実際のサ
     イズは 1 から MAXNAMELEN + 1 の間のいずれかの値になります。

     エントリは余分のスペースで分離されているかもしれません。 d_reclen エント
     リは、 dirent 構造体の開始点から次の構造体がある場合はその構造体へのオフ
     セットとして使用されます。

     実際に転送されたバイト数が返されます。 fd に関連づけられた現在の位置を示
     すポインタは、エントリの次のブロックに設定されます。ポインタは
     getdirentries() または getdents() によって返されるバイト数分だけ進められ
     るとは限りません。ディレクトリの終わりに到達した場合は、値 0 が返されま
     す。

     getdirentries() 関数は、読み込まれたブロック位置を basep が指す場所に書込
     みます。代わりに lseek(2) によって現在の位置ポインタを設定、取得できま
     す。現在の位置ポインタは、 lseek(2) が返す値、 basep が指す場所に返される
     値 (getdirentries() のみ)、または 0 のいずれかにのみ設定するべきです。
     す。


エラー

     getdirentries() は次の場合に失敗します。

     [EBADF]            fd が読取り用に開かれた有効なファイル記述子ではありま
                        せん。

     [EFAULT]           buf または basep のどちらかが、割り当てられたアドレス
                        空間の範囲外を指しています。

     [EINVAL]           fd によって参照されるファイルがディレクトリでないか、
                        nbytes がディレクトリエントリまたはエントリのブロック
                        を返すのには小さすぎます。あるいは、現在の位置ポインタ
                        が無効です。

     [EIO]              ファイルシステムに読み書きしている間に I/O (入出力)エ
                        ラーが発生しました。


関連項目

     lseek(2), open(2)


歴史

     getdirentries() 関数は 4.4BSD ではじめて登場しました。 getdents() 関数は
     FreeBSD 3.0 ではじめて登場しました。

FreeBSD 4.4                       May 3, 1995                      FreeBSD 4.4

ABELNET VPSサービス