From c5872e58339fb3fb4726610bd2ba4642d61b5657 Mon Sep 17 00:00:00 2001 From: wbaumann Date: Fri, 1 May 2009 11:23:03 +0000 Subject: [PATCH] llow for open(..., O_CREATE, 444) --- ChangeLog | 5 +++++ src/cache.c | 5 +++-- src/cache.h | 9 +++++++-- src/dav_coda.c | 2 +- src/dav_fuse.c | 4 ++-- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 07aad32..f62fae6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ ChangeLog for davfs2 -------------------- +2009-05-01 Werner Baumann (werner.baumann@onlinehome.de) + * cache.h, dav_open: + Add parameter open_create to allow + for open(..., O_CREATE, 444). + 2009-04-30 Werner Baumann (werner.baumann@onlinehome.de) * cache.c, dav_close: if delay_upload == 0 save to server immediately. diff --git a/src/cache.c b/src/cache.c index ec8005b..7e73db5 100644 --- a/src/cache.c +++ b/src/cache.c @@ -1062,7 +1062,8 @@ dav_mkdir(dav_node **nodep, dav_node *parent, const char *name, uid_t uid, int -dav_open(int *fd, dav_node *node, int flags, pid_t pid, pid_t pgid, uid_t uid) +dav_open(int *fd, dav_node *node, int flags, pid_t pid, pid_t pgid, uid_t uid, + int open_create) { if (!is_valid(node)) return ENOENT; @@ -1079,7 +1080,7 @@ dav_open(int *fd, dav_node *node, int flags, pid_t pid, pid_t pgid, uid_t uid) } else { how = R_OK | W_OK; } - if (!has_permission(node, uid, how)) + if (!open_create && !has_permission(node, uid, how)) return EACCES; if (is_dir(node)) { diff --git a/src/cache.h b/src/cache.h index b5329c7..cfa1f10 100644 --- a/src/cache.h +++ b/src/cache.h @@ -335,9 +335,14 @@ dav_mkdir(dav_node **nodep, dav_node *parent, const char *name, uid_t uid, Permissions: uid must have execute permission for parent and all of its ancestors, as as well as read and/or write permission for node, according to the - accessmode. */ + accessmode. + If open_create is set to 1, permissions will not be checked. This flag must + only be set when the call to dav_open is part of an open-call with flag + O_CREATE. It allows dav_open to succeed if when the file mode would not + allow this. */ int -dav_open(int *fd, dav_node *node, int flags, pid_t pid, pid_t pgid, uid_t uid); +dav_open(int *fd, dav_node *node, int flags, pid_t pid, pid_t pgid, uid_t uid, + int open_create); /* Reads size bytes from file descriptor fd, starting at position offset and copies them into buf. diff --git a/src/dav_coda.c b/src/dav_coda.c index ecaa1b4..38fcb51 100644 --- a/src/dav_coda.c +++ b/src/dav_coda.c @@ -603,7 +603,7 @@ coda_open_by_fd(void) } flags |= (in->flags & C_O_TRUNC) ? O_TRUNC : 0; - oh->result = dav_open(&out->fd, node, flags, ih->pid, ih->pgid, ih->uid); + oh->result = dav_open(&out->fd, node, flags, ih->pid, ih->pgid, ih->uid, 0); if (oh->result || !out->fd) { if (!oh->result) diff --git a/src/dav_fuse.c b/src/dav_fuse.c index f835a6b..4ffe5c6 100644 --- a/src/dav_fuse.c +++ b/src/dav_fuse.c @@ -479,7 +479,7 @@ fuse_create(void) int fd = 0; oh->error = dav_open(&fd, node, in->flags & ~(O_EXCL | O_CREAT), ih->pid, - 0, ih->uid); + 0, ih->uid, 1); if (oh->error || !fd) { if (created) @@ -806,7 +806,7 @@ fuse_open(void) int fd = 0; oh->error = dav_open(&fd, (dav_node *) ((size_t) ih->nodeid), in->flags, - ih->pid, 0, ih->uid); + ih->pid, 0, ih->uid, 0); if (oh->error || !fd) { if (!oh->error)