diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2014-12-09 01:36:34 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2014-12-09 01:45:00 +0100 |
commit | 7f68a98c5cad19350f53b00203465c72641b8f58 (patch) | |
tree | 65af68947cf6d07bfca6dfc6263ee1e5d01f3f9d | |
parent | ac30e16e8185883af52b4f45aad9f7a61e5c9911 (diff) |
Fix mode of nodes created with mkfile
Their faked field was not initialized.
Thanks a lot to Svante Signell for the investigation
* trans/fakeroot.c (new_node): Initialize faked field of nn to 0.
(netfs_attempt_mkfile): Call set_default_attributes on newly-allocated node,
and if the real mode is not the same as the requested mode, fake the mode.
-rw-r--r-- | trans/fakeroot.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/trans/fakeroot.c b/trans/fakeroot.c index 12173bdb..22759815 100644 --- a/trans/fakeroot.c +++ b/trans/fakeroot.c @@ -103,6 +103,7 @@ new_node (file_t file, mach_port_t idport, int locked, int openmodes, return err; } } + nn->faked = 0; if (!locked) pthread_mutex_lock (&idport_ihash_lock); @@ -679,13 +680,22 @@ netfs_attempt_mkfile (struct iouser *user, struct node *dir, mode_t mode, struct node **np) { file_t newfile; + mode_t real_mode = real_from_fake_mode (mode); error_t err = dir_mkfile (netfs_node_netnode (dir)->file, O_RDWR|O_EXEC, - real_from_fake_mode (mode), &newfile); + real_mode, &newfile); pthread_mutex_unlock (&dir->lock); if (err == 0) err = new_node (newfile, MACH_PORT_NULL, 0, O_RDWR|O_EXEC, np); if (err == 0) - pthread_mutex_unlock (&(*np)->lock); + { + pthread_mutex_unlock (&(*np)->lock); + set_default_attributes (*np); + if (real_mode != mode) + { + set_faked_attribute (*np, FAKE_MODE); + (*np)->nn_stat.st_mode = mode; + } + } return err; } |