return -ENOSYS;
}
-static int getgroups_cb(void *handle, gid_t **sgids)
+static void get_fuse_groups(UserPerm& perms, fuse_req_t req)
{
- CephFuse::Handle *cfuse = (CephFuse::Handle *) handle;
- fuse_req_t req = cfuse->get_fuse_req();
- return getgroups(req, sgids);
-}
+ if (g_conf->get_val<bool>("fuse_set_user_groups")) {
+ gid_t *gids = NULL;
+ int count = getgroups(req, &gids);
-#define GET_GROUPS(perms, req) { \
- if (g_conf->get_val<bool>("fuse_set_user_groups")) { \
- gid_t *gids = NULL; \
- int count = getgroups(req, &gids); \
- perms.init_gids(gids, count); \
- perms.take_gids(); \
- } }
+ if (count > 0) {
+ perms.init_gids(gids, count);
+ } else if (count < 0) {
+ derr << __func__ << ": getgroups failed: " << cpp_strerror(-count)
+ << dendl;
+ }
+ }
+}
static CephFuse::Handle *fuse_ll_req_prepare(fuse_req_t req)
Inode *i2, *i1 = cfuse->iget(parent); // see below
int r;
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
memset(&fe, 0, sizeof(fe));
r = cfuse->client->ll_lookup(i1, name, &fe.attr, &i2, perms);
Inode *in = cfuse->iget(ino);
struct stat stbuf;
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
(void) fi; // XXX
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int mask = 0;
if (to_set & FUSE_SET_ATTR_MODE) mask |= CEPH_SETATTR_MODE;
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_setxattr(in, name, value, size, flags, perms);
fuse_reply_err(req, -r);
Inode *in = cfuse->iget(ino);
char buf[size];
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_listxattr(in, buf, size, perms);
if (size == 0 && r >= 0)
Inode *in = cfuse->iget(ino);
char buf[size];
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_getxattr(in, name, buf, size, perms);
if (size == 0 && r >= 0)
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_removexattr(in, name, perms);
fuse_reply_err(req, -r);
void *dirp;
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_opendir(in, fi->flags, (dir_result_t **)&dirp,
perms);
Inode *in = cfuse->iget(ino);
char buf[PATH_MAX + 1]; // leave room for a null terminator
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_readlink(in, buf, sizeof(buf) - 1, perms);
if (r >= 0) {
Inode *i2, *i1 = cfuse->iget(parent);
struct fuse_entry_param fe;
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
memset(&fe, 0, sizeof(fe));
memset(&fe, 0, sizeof(fe));
UserPerm perm(ctx->uid, ctx->gid);
- GET_GROUPS(perm, req);
+ get_fuse_groups(perm, req);
#ifdef HAVE_SYS_SYNCFS
if (cfuse->fino_snap(parent) == CEPH_SNAPDIR &&
cfuse->client->cct->_conf->fuse_multithreaded &&
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(parent);
UserPerm perm(ctx->uid, ctx->gid);
- GET_GROUPS(perm, req);
+ get_fuse_groups(perm, req);
int r = cfuse->client->ll_unlink(in, name, perm);
fuse_reply_err(req, -r);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(parent);
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_rmdir(in, name, perms);
fuse_reply_err(req, -r);
Inode *i2, *i1 = cfuse->iget(parent);
struct fuse_entry_param fe;
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
memset(&fe, 0, sizeof(fe));
Inode *in = cfuse->iget(parent);
Inode *nin = cfuse->iget(newparent);
UserPerm perm(ctx->uid, ctx->gid);
- GET_GROUPS(perm, req);
+ get_fuse_groups(perm, req);
int r = cfuse->client->ll_rename(in, name, nin, newname, perm);
fuse_reply_err(req, -r);
memset(&fe, 0, sizeof(fe));
UserPerm perm(ctx->uid, ctx->gid);
- GET_GROUPS(perm, req);
+ get_fuse_groups(perm, req);
/*
* Note that we could successfully link, but then fail the subsequent
Inode *in = cfuse->iget(ino);
Fh *fh = NULL;
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_open(in, fi->flags, &fh, perms);
if (r == 0) {
static void fuse_ll_access(fuse_req_t req, fuse_ino_t ino, int mask)
{
- fuse_reply_err(req, 0);
+ CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
+ const struct fuse_ctx *ctx = fuse_req_ctx(req);
+ Inode *in = cfuse->iget(ino);
+ UserPerm perms(ctx->uid, ctx->gid);
+ get_fuse_groups(perms, req);
+
+ int r = cfuse->client->inode_permission(in, perms, mask);
+ fuse_reply_err(req, -r);
+ cfuse->iput(in);
}
static void fuse_ll_create(fuse_req_t req, fuse_ino_t parent, const char *name,
struct fuse_entry_param fe;
Fh *fh = NULL;
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
memset(&fe, 0, sizeof(fe));
Inode *in = cfuse->iget(ino);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
UserPerm perms(ctx->uid, ctx->gid);
- GET_GROUPS(perms, req);
+ get_fuse_groups(perms, req);
int r = cfuse->client->ll_statfs(in, &stbuf, perms);
if (r == 0)
#if defined(__linux__)
remount_cb: remount_cb,
#endif
- getgroups_cb: getgroups_cb,
#if !defined(DARWIN)
umask_cb: umask_cb,
#endif