return 0;
}
-int Client::xattr_permission(Inode *in, const char *name, unsigned want, int uid, int gid)
+int Client::xattr_permission(Inode *in, const char *name, unsigned want,
+ const UserPerm& perms)
{
- if (uid < 0)
- uid = get_uid();
- if (gid < 0)
- gid = get_gid();
- RequestUserGroups groups(this, uid, gid);
- UserPerm perms(uid, gid);
+ RequestUserGroups groups(this, perms.uid(), perms.gid());
int r = _getattr_for_perm(in, perms);
if (r < 0)
r = 0;
if (strncmp(name, "system.", 7) == 0) {
- if ((want & MAY_WRITE) && (uid != 0 && (uid_t)uid != in->uid))
+ if ((want & MAY_WRITE) && (perms.uid() != 0 && perms.uid() != in->uid))
r = -EPERM;
} else {
- r = inode_permission(in, uid, groups, want);
+ r = inode_permission(in, perms, want);
}
out:
ldout(cct, 3) << __func__ << " " << in << " = " << r << dendl;
};
int inode_permission(Inode *in, uid_t uid, UserGroups& groups, unsigned want);
- int xattr_permission(Inode *in, const char *name, unsigned want, int uid=-1, int gid=-1);
+ int xattr_permission(Inode *in, const char *name, unsigned want,
+ const UserPerm& perms);
int may_setattr(Inode *in, struct stat *st, int mask, const UserPerm& perms);
int may_open(Inode *in, int flags, const UserPerm& perms);
int may_lookup(Inode *dir, const UserPerm& perms);
RequestUserGroups groups(this, perms.uid(), perms.gid());
return inode_permission(in, perms.uid(), groups, want);
}
- int xattr_permission(Inode *in, const char *name, unsigned want,
- const UserPerm& perms) {
- return xattr_permission(in, name, want, perms.uid(), perms.gid());
+ int xattr_permission(Inode *in, const char *name, unsigned want, int uid=-1, int gid=-1) {
+ if (uid < 0) uid = get_uid();
+ if (gid < 0) gid = get_gid();
+ UserPerm perms(uid, gid);
+ return xattr_permission(in, name, want, perms);
}
int may_setattr(Inode *in, struct stat *st, int mask, int uid=-1, int gid=-1) {