return getgroups(req, sgids);
}
-#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(); \
- } }
+static void get_fuse_groups(UserPerm& perms, fuse_req_t req)
+{
+ if (g_conf->get_val<bool>("fuse_set_user_groups")) {
+ gid_t *gids = NULL;
+ int count = getgroups(req, &gids);
+
+ if (count > 0) {
+ perms.init_gids(gids, count);
+ perms.take_gids();
+ } 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);
if (!i1)
{
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
auto fuse_multithreaded = cfuse->client->cct->_conf->get_val<bool>(
"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) {
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)