return r;
}
+int Client::may_lookup(Inode *dir, int uid, int gid)
+{
+ if (uid < 0)
+ uid = get_uid();
+ if (gid < 0)
+ gid = get_gid();
+ RequestUserGroups groups(this, uid, gid);
+
+ int r = _getattr(dir, CEPH_STAT_CAP_MODE, uid, gid);
+ if (r < 0)
+ goto out;
+
+ r = inode_permission(dir, uid, groups, MAY_EXEC);
+out:
+ ldout(cct, 3) << __func__ << " " << dir << " = " << r << dendl;
+ return r;
+}
+
int Client::may_create(Inode *dir, int uid, int gid)
{
if (uid < 0)
tout(cct) << "ll_lookup" << std::endl;
tout(cct) << name << std::endl;
+ int r = 0;
+ if (!cct->_conf->fuse_default_permissions) {
+ r = may_lookup(parent, uid, gid);
+ if (r < 0)
+ return r;
+ }
+
string dname(name);
InodeRef in;
- int r = 0;
r = _lookup(parent, dname, &in, uid, gid);
if (r < 0) {
int inode_permission(Inode *in, uid_t uid, UserGroups& groups, unsigned want);
int may_setattr(Inode *in, struct stat *st, int mask, int uid=-1, int gid=-1);
int may_open(Inode *in, int flags, int uid=-1, int gid=-1);
+ int may_lookup(Inode *dir, int uid=-1, int gid=-1);
int may_create(Inode *dir, int uid=-1, int gid=-1);
int may_delete(Inode *dir, const char *name, int uid=-1, int gid=-1);
int _getgrouplist(gid_t **sgids, int uid=-1, int gid=-1);