Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [PATCH] Ignore EACCES when doing non-pure globbing



Actually replied to the mailing list this time... 

>Have you considered just not unsetting caseglob?

Brilliant solution.
"Doctor, it hurts when I do this."
"Then don't do that."

As for the compliant version, here is a much more "polite" version which also avoids the awkward checks if lock != NULL (at the cost of reformatting O.o).

/* Check for search permissions. If we don't have them, get out. */
if (access(fn, X_OK) != 0) {
    return;
}
/* Check for read permissions. If we have them, try to open the directory. */
if (access(fn, R_OK) == 0) {
    DIR *lock = diropen(fn);
    if (lock == NULL)
        return;

    while (...) { ... }
    closedir(lock);
}
if (subdirs) { ... }


% chmod 111 ..
% echo $PWD/*
/tmp/inaccessible/a/a /tmp/inaccessible/a/b /tmp/inaccessible/a/c
% chmod 000 ..
% echo $PWD/*
zsh: no matches found: /tmp/inaccessible/a/*

This matches the POSIX behavior of requiring parent directories to be searchable, and is a little more respectful to filesystem permissions. 

On Tue, Jan 12, 2021, 8:58 PM Devin Hussey <husseydevin@xxxxxxxxx> wrote:
>Have you considered just not unsetting caseglob?

Brilliant solution.
"Doctor, it hurts when I do this."
"Then don't do that."

As for the compliant version, here is a much more "polite" version.

This matches the behavior of the POSIX globs: with a non searchable directory, it returns no match, but doesn't require read access for parent directories.

DIR *lock = NULL;

/* Check for search permissions. If we don't have them, get out. */
if (access(fn, X_OK) != 0) {
    return;
}
/* Check for read permissions. If we have them, try to open the directory. */
if (access(fn, R_OK) == 0) {
    lock = diropen(fn);
    /* Error */
    if (lock == NULL)
        return;
}
while (lock != NULL &&...

% chmod 111 ..
% echo $PWD/*
/tmp/inaccessible/a/a /tmp/inaccessible/a/b /tmp/inaccessible/a/c
% chmod 000 ..
% echo $PWD/*
zsh: no matches found: /tmp/inaccessible/a/*


Messages sorted by: Reverse Date, Date, Thread, Author