Hello, Svante Signell, le Tue 12 May 2015 22:09:33 +0200, a écrit : > netfs_attempt_chmod() returns an error of EOPNOTSUPP and hits the > fallback case calling the stub in > libnetfs/set-get-trans.c:netfs_set_translator() returning EOPNOTSUPP. > > Implementing netfs_S_file_set_translator() calling file_set_translator() > in trans/fakeroot.c overrides this call and solves the problem.
Err, no, see what I wrote earlier: “implement the netfs_set_translator stub by just calling file_set_translator on the underlying node to set the passive translator.” Do not overwrite netfs_S_file_set_translator, it'd disable everything that is done in the netfs_S_file_set_translator provided by libnetfs... > - Are the checks in the beginning really needed doesn't > file_set_translator() take care of that? It seems you are seeing things backwards. It's libnetfs' netfs_S_file_set_translator which is called first, does checks, and calls file_set_translator, which you'd implement in fakeroot. As another example, see libnetfs' netfs_S_dir_rmdir which does checks, and calls netfs_attempt_rmdir, which in fakeroot.c just calls dir_rmdir on the underlying node. > - Is the explanation really OK? Yes, it's the sort of things a reviewer needs, to be able to answer you promptly without spending hours trying to figure out what you tried to do. > +netfs_S_file_set_translator (struct protid *user, > + int passive_flags, int active_flags, > + int killtrans_flags, char *passive, > + mach_msg_type_number_t passivelen, > + mach_port_t active) > +{ ... > + > + if (passivelen && passive[passivelen - 1]) > + return EINVAL; > + > + char trans[sizeof _HURD_IFSOCK + passivelen]; > + memcpy (trans, _HURD_IFSOCK, sizeof _HURD_IFSOCK); > + memcpy (&trans[sizeof _HURD_IFSOCK], passive, passivelen); Err, no, don't build the translator path by hand, it's already given to you in the "passive" parameter! Simply pass passive and passivelen to file_set_translator. Samuel