summaryrefslogtreecommitdiff
path: root/trans
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2014-12-09 01:36:34 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2014-12-09 01:45:00 +0100
commit7f68a98c5cad19350f53b00203465c72641b8f58 (patch)
tree65af68947cf6d07bfca6dfc6263ee1e5d01f3f9d /trans
parentac30e16e8185883af52b4f45aad9f7a61e5c9911 (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.
Diffstat (limited to 'trans')
-rw-r--r--trans/fakeroot.c14
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;
}