FTW(3)

NOME
ftw, nftw - caminha pela árvore de arquivos

SINÓPSE
#include <ftw.h>

int ftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth);

int nftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int depth, int flags);

DESCRIÇÃO
ftw() caminha através da árvore de diretório, começando do diretório dir indicado. Para cada entrada encontrada na árvore, ela chama fn() com o caminho de diretório completo da entrada, um ponteiro para a estrutura stat(2) da entrada, e um int, cujo valor será um dos seguintes:

FTW_F
    O item é um arquivo normal

FTW_D
    O item é um diretório

FTW_DNR
    O item é um diretório que não pode ser lido

FTW_SL
    O item é uma ligação simbólica

FTW_NS
    O 'stat' falhou no item que não é uma ligação simbólica

Se o item é uma ligação simbólica e 'stat' falhou, XPG4v2 afirma que ele é indefinido se FTW_NS ou FTW_SL é usado.

ftw() chama recursivamente a si mesmo para atravessar diretórios encontrados, manipulando um diretório antes do seus arquivos ou subdiretórios. Para evitar o uso de todos os descritores de arquivos do programa, o depth especifica o número de diretórios abertos simultaneamente. Quando a profundidade é excedida, ftw() se tornará mais lenta porque os diretórios têm que ser fechados e reabertos. ftw() usa no máximo um descritor de arquivos para cada nível na hierarquia de arquivos.

Para parar a caminhada na árvore, fn() retorna um valor diferente de zero; este valor se tornará o valor de retorno de ftw(). Caso contrário, ftw() continuará até que tenha atravessado a árvore inteira, em cujo caso retornará zero, ou até que ele encontre um erro diferente de EACCES (tal como uma falha de malloc(3) ), em cujo caso retornará -1.

Como ftw() usa estruturas de dados dinâmicas, a única maneira segura de sair de uma caminhada na árvore é retornar um valor diferente de zero. Para manipular interrupções, por exemplo, indica que a interrupção ocorreu e retorna um valor diferente de zero —não use longjmp(3) a menos que o programa vá terminar. A função nftw() faz precisamente a mesma coisa que ftw(), exceto pelo fato de que ela tem um argumento adicional, flags (e chama a função fornecida com mais um argumento). Este argumento flags é uma operação OU de zero ou mais das seguintes flags:

FTW_CHDIR
    Se setado, faz um chdir() para cada diretório antes de manipular seu conteúdo.

FTW_DEPTH
    Se setado, faz uma busca primeiro por profundidade, ou seja, chama a função para o próprio diretório somente depois de manipular os conteúdos do diretório e seus subdiretórios.

FTW_MOUNT
    Se setado, fica dentro do mesmo sistema de arquivos.

FTW_PHYS
    Se setado, não segue ligações simbólicas. (Isto é o que você quer.) Se não setado, as ligações simbólicas são seguidas, mas nenhum arquivo é relatado duas vezes.

Se FTW_PHYS não é setado, mas FTW_DEPTH é setado, então a função fn() nunca é chamada para um diretório que seria um descendente dele mesmo.

A função fn() é chamada com quatro argumentos: o caminho de diretório da entrada relatada, um ponteiro para uma estrutura 'stat' desta entrada, um inteiro descrevendo seu tipo, e um ponteiro para uma estrutura FTW. O tipo será um dos seguintes: FTW_F, FTW_D, FTW_DNR, FTW_SL, FTW_NS (com o significado acima; FTW_SL ocorre somente com FTW_PHYS setado) ou

FTW_DP
    O item é um diretório e todos os seus descendentes já foram manipulados. (Isto ocorre somente com FTW_DEPTH setado.)

FTW_SLN
    O item é uma ligação simbólica apontando para um arquivo não existente. (Isto ocorre somente com FTW_PHYS não setado.)

A estrutura FTW apontada pelo quarto argumento para fn() tem pelo menos os campos base, o offset do nome de arquivo do item no caminho de diretório dado como primeiro argumento de fn(), e level, a profundidade do item em relação ao ponto inicial (que tem profundidade 0).

NOTAS
A função nftw() e o uso de FTW_SL com ftw() foram introduzidos em XPG4v2. Sob Linux, libc4, libc5 e glibc 2.0.6 usarão FTW_F para todos os objetos (arquivos, ligações simbólicas, fifos, etc) que podem ser receber um 'stat' mas não são diretórios. A primeira glibc 2.1 suporta FTW_SL e nftw().

DE ACORDO COM
AES, SVID2, SVID3, XPG2, XPG3, XPG4, XPG4v2.

VEJA TAMBÉM
stat(2).

TRADUZIDO POR LDP-BR em 21/08/2000.

  Tradução:
Rubens de Jesus Nogueira <darkseid99@usa.net>

  Revisão.:
André Luiz Fassone <lonely_wolf@ig.com.br>