A chamada do sistema Linux access() mostra comportamento inconsistente

A chamada do sistema Linux access() mostra comportamento inconsistente

A chamada do sistema access() relata: "Esse arquivo ou diretório não existe", para alguns arquivos/diretórios. Todos os diretórios/arquivos possuem as permissões solicitadas. Seu proprietário/grupo é meu ID de login, assim como o programa postado abaixo. Além disso, o gerenciador de arquivos mostra todos os arquivos/diretórios com permissões corretas, proprietário/grupo.

Especificamente, para alguns subdiretórios/arquivos, recebo o erro. Mas para os mesmos subdiretórios em que obtive erro, todos os arquivos (e subdiretórios) são exibidos sem erros.

O que estou perdendo, por favor?

struct dirent *pDirent;

int principal(int c, char** v) {

DIR *pDir = opendir(v[1]);
if (!pDir) {
    cout << "Could not open: " << v[1] << endl;
    return 0;
}

while ((pDirent = readdir(pDir)) != NULL) {
    if (pDirent->d_name[0] == '.') continue;

    if (pDirent->d_type == DT_DIR) {
        if (access(pDirent->d_name, X_OK)) {
            cout << pDirent->d_name << " Error: " << dec << errno << ' ' << strerror(errno) << endl;
        }
        else cout << pDirent->d_name << endl;
    }
    else if (pDirent->d_type == DT_REG) {
        if (access(pDirent->d_name, R_OK | W_OK)) {
            cout << pDirent->d_name << " Error: " << dec << errno << ' ' << strerror(errno) << endl;
        }
        else cout << pDirent->d_name << endl;
    }
    else continue;
}

return 0;

}

Responder1

O nome passado para access() deve ser absoluto. Neste caso, será a concatenação de v[1], "/" e pDirent->d_name em vez de apenas pDirent->d_name.

informação relacionada