On Fri, 2015-06-05 at 11:18 +0530, Samuel Thibault wrote: > Hello, > > It seems there is still a corner case which doesn't work: the pycorrfit > package fails to build with: > > chmod -R 644 > debian/pycorrfit/usr/share/doc/pycorrfit/examples/external_model_functions/ > chmod: cannot access > 'debian/pycorrfit/usr/share/doc/pycorrfit/examples/external_model_functions/ExampleFunc_CS_2D+2D+S+T.txt': > Permission denied > > etc. Could you have a look?
Done so now. Attached are two versions of a patch to fakeroot.c. In netfs_get_dirents(): call netfs_attempt_chmod() before dir_readdir() to make sure that directories are accessible (executable) before changing the underlying files. The resulting directory (and file) access permissions are the same as with fakeroot-tcp and Linux. The first patch adds S_IXUSR to real_mode, the other adds O_EXEC to nn->openmodes. Your choice (if OK, of course, maybe I've missed something.) Thanks!
Index: hurd-0.6.git20150523/trans/fakeroot.c =================================================================== --- hurd-0.6.git20150523.orig/trans/fakeroot.c +++ hurd-0.6.git20150523/trans/fakeroot.c @@ -796,8 +796,19 @@ netfs_get_dirents (struct iouser *cred, mach_msg_type_number_t *datacnt, vm_size_t bufsize, int *amt) { - return dir_readdir (netfs_node_netnode (dir)->file, data, datacnt, + struct netnode *nn = netfs_node_netnode (dir); + mode_t real_mode = dir->nn_stat.st_mode; + error_t err = 0; + + if ((real_mode & S_IFDIR) && ((real_mode & S_IXUSR) == 0)) + { + err = netfs_attempt_chmod (cred, dir, real_mode | S_IXUSR); + if (err) + return err; + } + err = dir_readdir (nn->file, data, datacnt, entry, nentries, bufsize, amt); + return err; } error_t
Index: hurd-0.6.git20150523/trans/fakeroot.c =================================================================== --- hurd-0.6.git20150523.orig/trans/fakeroot.c +++ hurd-0.6.git20150523/trans/fakeroot.c @@ -796,8 +796,20 @@ netfs_get_dirents (struct iouser *cred, mach_msg_type_number_t *datacnt, vm_size_t bufsize, int *amt) { - return dir_readdir (netfs_node_netnode (dir)->file, data, datacnt, + struct netnode *nn = netfs_node_netnode (dir); + mode_t real_mode = dir->nn_stat.st_mode; + error_t err = 0; + + if ((real_mode & S_IFDIR) && ((real_mode & S_IXUSR) == 0)) + { + nn->openmodes |= O_EXEC; + err = netfs_attempt_chmod (cred, dir, real_mode); + if (err) + return err; + } + err = dir_readdir (nn->file, data, datacnt, entry, nentries, bufsize, amt); + return err; } error_t