各ディレクトリファイルには特別なディレクトリエントリが 2 つあります。 1 つはそのディレクトリ自身へのポインタで、ドット `.' と呼ばれます。 もう 1 つは自分の親ディレクトリへのポインタで、ドットドット `..' と呼ばれます。 ドットとドットドットは有効なパス名ですが、 システムのルートディレクトリ `/' には親ディレクトリがなく、ドットドットはドットと同じく自分自身を指します。
ファイルシステムノードは普通のディレクトリファイルであり、 その上に物理ディスクやそのディスク中の分割された領域といった ファイルシステムオブジェクトを接合します ( mount(2) および mount(8) 参照)。
ディレクトリエントリの形式はファイル In sys/dirent.h で定義されています (これは直接アプリケーションからはインクルードされません):
#ifndef _SYS_DIRENT_H_
#define _SYS_DIRENT_H_
#include <machine/ansi.h>
/*
* dirent 構造体は、getdirentries(2) システムコールで返される
* ディレクトリエントリのフォーマットを定義します。
*
* ディレクトリエントリはその先頭に dirent 構造体を持ちます。dirent
* 構造体は inode 番号、そのエントリの長さ、そのエントリに含まれる
* 名前の長さを保持します。その後に、ナルで 4 バイト境界までパディング
* した名前が続きます。名前は全てナルで終端していることが保証されます。
* ディレクトリ中の名前の長さの最大値は MAXNAMLEN です。
*/
struct dirent {
__uint32_t d_fileno; /* エントリのファイル番号 */
__uint16_t d_reclen; /* このレコードの長さ */
__uint8_t d_type; /* ファイルタイプ、以下参照 */
__uint8_t d_namlen; /* d_name の文字列長 */
#ifdef _POSIX_SOURCE
char d_name[255 + 1]; /* 名前はこの長さを越えてはならない */
#else
#define MAXNAMLEN 255
char d_name[MAXNAMLEN + 1]; /* 名前はこの長さを越えてはならない */
#endif
};
/*
* ファイルタイプ
*/
#define DT_UNKNOWN 0
#define DT_FIFO 1
#define DT_CHR 2
#define DT_DIR 4
#define DT_BLK 6
#define DT_REG 8
#define DT_LNK 10
#define DT_SOCK 12
#define DT_WHT 14
/*
* stat 構造体型とディレクトリ型との変換
*/
#define IFTODT(mode) (((mode) & 0170000) >> 12)
#define DTTOIF(dirtype) ((dirtype) << 12)
/*
* _GENERIC_DIRSIZ マクロはディレクトリエントリを保持する最小レコード長を
* 与えます。これは d_name フィールド以外の dirent 構造体の空間に、ナル
* バイトで終端される名前のために十分な空間 (dp->d_namlen+1) を加えたもの
* を、4 バイト単位で繰り上げたものです。
*/
#define _GENERIC_DIRSIZ(dp) ((sizeof (struct dirent) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))
#ifdef _KERNEL
#define GENERIC_DIRSIZ(dp) _GENERIC_DIRSIZ(dp)
#endif
#endif /* !_SYS_DIRENT_H_ */