On 12/14/2011 12:57 PM, Ken Brown wrote:
On 12/14/2011 12:30 PM, Eli Zaretskii wrote:
"Such cases" are those where UID and GID are returned as -1 (I think),
see the original report where Jari shows the result of
file-attributes.
OK, I could certainly change check_writable to return success if
euidaccess returns failure and UID and GID are both -1. I'll make a
patch when I get a chance and let Jari test it.
How does the following patch look?
=== modified file 'src/fileio.c'
--- src/fileio.c 2011-12-05 08:55:25 +0000
+++ src/fileio.c 2011-12-15 02:17:01 +0000
@@ -2416,15 +2416,27 @@
return (st.st_mode & S_IWRITE || S_ISDIR (st.st_mode));
#else /* not MSDOS */
#ifdef HAVE_EUIDACCESS
- return (euidaccess (filename, 2) >= 0);
-#else
+ int res = (euidaccess (filename, 2) >= 0);
+#ifdef CYGWIN
+ /* euidaccess may have returned failure because Cygwin couldn't
+ determine the file's UID and GID; if so, we return success. */
+ if (!res)
+ {
+ struct stat st;
+ if (stat (filename, &st) < 0)
+ return 0;
+ res = (st.st_uid == -1 && st.st_gid == -1);
+ }
+#endif /* CYGWIN */
+ return res;
+#else /* not HAVE_EUIDACCESS */
/* Access isn't quite right because it uses the real uid
and we really want to test with the effective uid.
But Unix doesn't give us a right way to do it.
Opening with O_WRONLY could work for an ordinary file,
but would lose for directories. */
return (access (filename, 2) >= 0);
-#endif
+#endif /* not HAVE_EUIDACCESS */
#endif /* not MSDOS */
}