else {
char fn[200];
get_cdir(c, fn);
- r = do_getxattr(fn, name, value, size);
+ char n[200];
+ get_attrname(name, n);
+ r = do_getxattr(fn, n, value, size);
}
return r < 0 ? -errno:r;
}
if (fake_attrs)
r = attrs.collection_getattr(c, name, bl);
else {
- char fn[200];
- get_cdir(c, fn);
- r = do_getxattr(fn, name, NULL, 0);
- if (r > 0) {
- bl.push_back(buffer::create(r));
- r = do_getxattr(fn, name, bl.c_str(), r);
- }
+ buffer::ptr bp;
+ r = collection_getattr(c, name, bp);
+ bl.push_back(bp);
+ }
+ return r;
+}
+
+int FileStore::collection_getattr(coll_t c, const char *name, buffer::ptr& bp)
+{
+ int r;
+ char fn[200];
+ get_cdir(c, fn);
+ char n[200];
+ get_attrname(name, n);
+ r = do_getxattr(fn, n, NULL, 0);
+ if (r > 0) {
+ bp = buffer::create(r);
+ r = do_getxattr(fn, n, bp.c_str(), r);
}
return r < 0 ? -errno:r;
}
char fn[100];
get_cdir(cid, fn);
- char val[1000];
char names[1000];
int num = do_listxattr(fn, names, 1000);
char *name = names;
for (int i=0; i<num; i++) {
dout(0) << "getattrs " << cid << " getting " << (i+1) << "/" << num << " '" << names << "'" << dendl;
- int l = do_getxattr(fn, name, val, 1000);
- dout(0) << "getattrs " << cid << " getting " << (i+1) << "/" << num << " '" << names << "' = " << l << " bytes" << dendl;
- if (parse_attrname(&name)) {
- aset[name] = buffer::create(l);
- memcpy(aset[name].c_str(), val, l);
- }
+ if (parse_attrname(&name))
+ collection_getattr(cid, name, aset[name]);
name += strlen(name) + 1;
}
r = 0;
else {
char fn[200];
get_cdir(c, fn);
- r = do_setxattr(fn, name, value, size);
+ char n[200];
+ get_attrname(name, n);
+ r = do_setxattr(fn, n, value, size);
}
return r < 0 ? -errno:r;
}
else {
char fn[200];
get_cdir(c, fn);
- r = do_removexattr(fn, name);
+ char n[200];
+ get_attrname(name, n);
+ r = do_removexattr(fn, n);
}
return r < 0 ? -errno:r;
}
for (map<string,bufferptr>::iterator p = aset.begin();
p != aset.end();
++p) {
- r = do_setxattr(fn, p->first.c_str(), p->second.c_str(), p->second.length());
+ char n[200];
+ get_attrname(p->first.c_str(), n);
+ r = do_setxattr(fn, n, p->second.c_str(), p->second.length());
if (r < 0) break;
}
}
struct dirent *de;
while ((de = ::readdir(dir)) != 0) {
- // parse
- if (strlen(de->d_name) != 16)
- continue;
- errno = 0;
coll_t c;
if (parse_coll(de->d_name, c))
ls.push_back(c);