diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2013-12-04 10:53:15 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2013-12-04 12:10:03 +0100 |
commit | 6204a717fc63891839faefda75e95a364ec0434e (patch) | |
tree | 16e5fcbca14942650391abdc21fe8bb66b0c8257 /trans | |
parent | 93976a816e6d690a6c7d77801e31ce6ee5bc4899 (diff) |
trans: make the fakeroot environment more transparent
Previously fakeroot did not explicitly proxy io_identity requests, so
the default implementation from libnetfs handled them. But as the fsys
identity port returned was always netfs_fsys_identity, this broke the
getcwd logic (assuming /media/scratch is a translator):
% cd /media/scratch/foo && fakeroot-hurd pwd
/foo
Fix this by proxying io_identity requests. Since then no-one is
handing out our netfs_fsys_identity port anymore, an optimization in
netfs_fsys_identity is made obsolete by this change.
* trans/fakeroot.c (netfs_S_dir_lookup): Adjust code accordingly.
(netfs_S_io_identity): New function.
Diffstat (limited to 'trans')
-rw-r--r-- | trans/fakeroot.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/trans/fakeroot.c b/trans/fakeroot.c index 24d3a4f9..1342844b 100644 --- a/trans/fakeroot.c +++ b/trans/fakeroot.c @@ -290,16 +290,7 @@ netfs_S_dir_lookup (struct protid *diruser, { /* Talking to ourselves! We just looked up one of our own nodes. Find the node and return it. */ - struct protid *cred - = ports_lookup_port (netfs_port_bucket, file, - netfs_protid_class); - mach_port_deallocate (mach_task_self (), idport); - mach_port_deallocate (mach_task_self (), file); - if (cred == 0) - return EGRATUITOUS; - np = cred->po->np; - netfs_nref (np); - ports_port_deref (cred); + assert (! "reached"); } else { @@ -788,6 +779,27 @@ netfs_S_io_map_cntl (struct protid *user, return err; } +error_t +netfs_S_io_identity (struct protid *user, + mach_port_t *id, + mach_msg_type_name_t *idtype, + mach_port_t *fsys, + mach_msg_type_name_t *fsystype, + ino_t *fileno) +{ + error_t err; + + if (!user) + return EOPNOTSUPP; + + *idtype = *fsystype = MACH_MSG_TYPE_MOVE_SEND; + + pthread_mutex_lock (&user->po->np->lock); + err = io_identity (user->po->np->nn->file, id, fsys, fileno); + pthread_mutex_unlock (&user->po->np->lock); + return err; +} + #define NETFS_S_SIMPLE(name) \ error_t \ netfs_S_##name (struct protid *user) \ |