lsコマンドのソース(FreeBSD版)つづき

ファイル階層そのものを表現する FTS 構造体である。

「ファイル」と 「FTSENT 構造体」を一般に読み変えることができる。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fts.3.html
479   FTS *ftsp;
480   FTSENT *p, *chp;
481   int ch_options;
482 
483   if ((ftsp =
484       fts_open(argv, options, f_nosort ? NULL : mastercmp)) == NULL)
485     err(1, "fts_open");

fts_open() 関数は、他の fts 関数に供給される、ファイル階層の ``ハンドル''
を返すということです。

http://www.jp.freebsd.org/cgi/mroff.cgi?sect=3&cmd=&lc=1&subdir=man&dir=jpman-6.0.0%2Fman&subdir=man&man=fts#sect6
491   chp = fts_children(ftsp, 0);
492   if (chp != NULL) //ファイルを含んでいる場合
493     display(NULL, chp, options); //display関数をよぶ
494   if (f_listdir) //ディレクトリだけ表示するならtraverseをぬける
495     return;
504   while ((p = fts_read(ftsp)) != NULL)
505     switch (p->fts_info) {
506     case FTS_DC:

FTS *
fts_open(char * const *path_argv, int options,
int (*compar)(const FTSENT * const *, const FTSENT * const *));

第一引数のパスのハンドラのポインタを返す。
複数パスをいっぺんに渡しても1つのハンドラを返すのか・・
第三引数の関数ポインタは・・ソート用の関数を渡すらしい

FTSENT *
fts_read(FTS *ftsp);

渡したハンドラでファイル情報のポインタを1こ返す

FTSENT *
fts_children(FTS *ftsp, int options);

渡したハンドラでファイル情報のリンクリストの先頭のポインタを返す

int
fts_set(FTS *ftsp, FTSENT *f, int options);

該当のファイル(ディレクトリ)の子を探すのをスキップする設定とかできる



ためしに

  1 #include <stdio.h>
  2 #include <fts.h>
  3
  4 int main()
  5 {
  6   FTS *ftsp;
  7   FTSENT *p;
  8   char *dir[] = {"/home/teegee/packages",NULL};
  9   ftsp = fts_open(dir, 0, NULL);
 10
 11   while((p = fts_read(ftsp)) != NULL) {
 12    printf("%s\n", p->fts_path);
 13    printf("%s\n", p->fts_name);
 14   }
 15
 16  return 0;
 17 }

fts_readはディレクトリにぶつかったら、そのディレクトリを掘っていくことがわかった。
掘り切ったらまた戻ってくる。
掘られるディレクトリは2回登場する。