Eu não entendo completamente o que você está perguntando. Se eu não soubesse melhor, acho que você estava perguntando se havia uma maneira de detectar isso enquanto lidava com um arquivo. Eu não acredito que isso seja possível.
O único método que posso conceber é encontrar onde você começa especificamente a procurar por um ramo específico na árvore de diretórios.
Exemplo
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
O find
comando detectará esse loop, mas não informará muito sobre isso.
$ find -L . -mindepth 15
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Eu escolhi arbitrariamente 15 níveis para bloquear qualquer saída exibida pelo find
. No entanto, você pode soltar essa opção ( -mindepth
) se não se importar com a árvore de diretórios que está sendo exibida. O find
comando ainda detecta o loop e para:
$ find -L .
.
./a
./a/b
./a/b/c
./a/b/c/d
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Aliás, se você deseja substituir o padrão MAXSYMLINKS
que aparentemente é 40 no Linux (versões 3.x mais recentes do kernel), você pode ver estas perguntas e respostas sobre U&L intituladas: Como você aumenta o MAXSYMLINKS .
Usando o comando symlinks
Existe uma ferramenta que os mantenedores do site FTP podem usar chamada symlinks
que ajudará a expor problemas com as árvores longas ou pendentes da ferramenta causadas por links simbólicos.
Em certos casos, a symlinks
ferramenta também pode ser usada para excluir links incorretos.
Exemplo
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
A biblioteca glibc
A biblioteca glibc procura oferecer algumas funções C em torno disso, mas eu não conheço completamente o papel delas ou como usá-las. Então, eu apenas posso apontá-las para você.
A página do manual man symlink
mostra a definição de função para uma função chamada symlink()
. A descrição é assim:
symlink () cria um link simbólico chamado newpath que contém a cadeia oldpath.
Um dos erros afirma que essa função retorna:
ELOOP Muitos links simbólicos foram encontrados na resolução de novo caminho.
Também direcionarei você para a página de manual, man path_resolution
que discute como o Unix determina os caminhos para os itens no disco. Especificamente este parágrafo.
If the component is found and is a symbolic link (symlink), we first
resolve this symbolic link (with the current lookup directory as starting
lookup directory). Upon error, that error is returned. If the result is
not a directory, an ENOTDIR error is returned. If the resolution of the
symlink is successful and returns a directory, we set the current lookup
directory to that directory, and go to the next component. Note that the
resolution process here involves recursion. In order to protect the
kernel against stack overflow, and also to protect against denial of
service, there are limits on the maximum recursion depth, and on the maximum
number of symbolic links followed. An ELOOP error is returned when the
maximum is exceeded ("Too many levels of symbolic links").
readlink ...
diz sobre as situações acima?