Eric Blake wrote: > Jim, what do you think of this patch, so that lchmodat only fails with > ENOSYS when called on a symlink (when called on other file types, it would > now succeed)? > > Also, should "openat.h" provide shortcuts named: > > accessat() => faccessat(,0) > euidaccessat() => faccessat(,AT_EACCESS) > statat() => fstatat(,0) > lstatat() => fstatat(,AT_SYMLINK_NOFOLLOW) > > to match the existing shortcuts of chownat, lchownat, etc.
Good idea. I hesitated to appropriate the names initially, but the combination of increased readability and orthogonality make it worthwhile. > diff --git a/ChangeLog b/ChangeLog > index 06287d4..03e91c9 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,5 +1,9 @@ > 2009-09-06 Eric Blake <e...@byu.net> > > + openat: with no lchmod, only fail lchmodat on symlinks > + * lib/fchmodat.c (lchmod) [!HAVE_LCHMOD]: Perform lstat first, to > + minimize failure cases. > + > renameat: new module > * modules/renameat: New file. > * lib/at-func2.c: Likewise. > diff --git a/lib/fchmodat.c b/lib/fchmodat.c > index 53cafe0..11ace83 100644 > --- a/lib/fchmodat.c > +++ b/lib/fchmodat.c > @@ -30,7 +30,16 @@ > system-supplied declaration. */ > # undef lchmod > # define lchmod lchmod_rpl > -static int lchmod (char const *f, mode_t m) { errno = ENOSYS; return -1; } > +static int > +lchmod (char const *f, mode_t m) > +{ > + /* This is slightly racy, but better than nothing. */ > + struct stat st; > + if (lstat (f, &st) == -1 || !S_ISLNK (st.st_mode)) > + return chmod (f, m); > + errno = ENOSYS; > + return -1; > +} Is this useful to you on Cygwin? Fewer diagnostics? If so, go ahead. The drawback is that it makes it harder to perform a run-time test for lchmod support. The test requires a symlink. More importantly, the test writer would need to know about this half-functional implementation. Otherwise, an application that doesn't know about this new feature/requirement risks determining that lchmod support is available when it is not. So maybe a word in NEWS or documentation.