GETDENTS(2) — NEWS-OS Programmer’s Manual
名称
getdents − ディレクトリエントリをファイルシステムに依存しないフォーマットで取り出す
形式
#include <sys/types.h>
#include <sys/dirent.h>
int getdents(fd, buf, nbytes)
int fd;
char ∗buf;
int nbytes;
解説
getdents() は、ファイルディスクリプタ fd で参照されるディレクトリから、 buf によって指し示されたバッファへ、 ファイルシステムに依存しないフォーマットで ディレクトリエントリを コピーします。 最大 nbytes バイトまでのデータが転送されます。 バッファ内のデータは、 一連の dirent 構造体で、 各構造体には次のエントリが収められています。
off_td_off;
u_longd_fileno;
u_shortd_reclen;
u_shortd_namlen;
chard_name[MAXNAMLEN + 1]; /∗ 下記参照 ∗/
d_off エントリの値は、 その値を生成したファイルシステムのみ 解釈できます。 この値は、 lseek(2) のオフセットで、 ディレクトリ内で現在のエントリに続く次のエントリを捜すのに 使われます。 d_fileno エントリは、 ファイルシステム内にある各ファイルに固有の番号です。 ハードリンクを 用いてリンクされているファイル ( link(2) 参照)は、 同じ d_fileno になります。 d_reclen エントリは、 ディレクトリレコードの長さ (バイト) です。 d_name エントリは、ナルで終了したファイル名を示します。 d_namlen エントリは、ナルで終了したファイル名の長さを示します。 実際の d_name の値は、1 から MAXNAMLEN + 1 の間の値です。 構造体は、 必ずしもきっちりとデータが詰められていなくても構いません。 d_reclen エントリは、もし dirent 構造体があれば、その構造体の初めから次の構造体までの オフセットとして使われます。 リターン時に、 転送された実際のバイト数が返されます。 fd に対する現在位置を示すポインタは、 最後に返ったエントリに続く次のディレクトリエントリを 指し示すようにセットされます。 このポインタは、 必ずしも getdents によって返されたバイト数ずつ増加されるとは限りません。 返された値がゼロの場合は、最後のディレクトリに達したことを示します。 現在位置のポインタは lseek(2) を用いてセットし、 取り出すことができます。 ただし、 lseek(2) によって以前に返された以外の値か、 getdents によって返された dirent 構造体の d_off エントリ 以外の値か、 ゼロ以外の値に 現在位置を示すポインタを設定することは安全ではありません。
リターン値
成功した場合には、実際に転送されたバイト数が返されます。 そうでない場合には、 −1 が返され、 エラーを示すグローバル変数 errno がセットされます。
エラー
以下のコンディションが一つでも当てはまる時、 getdents() はエラーとなります。
EINVAL nbytes のサイズが、ディレクトリエントリに対して十分でない。
EBADF fd が、読み取りのためにオープンされた 有効なファイルディスクリプタではない。
ENOTDIR fd が参照しているファイルがディレクトリでない。
EFAULT buf が割り当て外のアドレスを指している。
EIO ファイルシステムへの書き込みまたはファイルシステムからの読み取りを 行っている間に入出力エラーが発生した。
EINTR データが到着する前に、 遅いデバイスからの読み取りがシグナルによって割り込まれた。
関連事項
link(2), lseek(2), open(2V), directory(3)
備考
互換性のため、ディレクトリエントリに関わるプログラムは 直接 getdents を呼ぶのではなく directory (3) インターフェースを使用することをお勧めします。
NEWS-OSRelease 4.2.1R