#include #include #include #include int main(int argc, char **argv) { if (argc < 5) { fprintf(stdout, "Usage: %s CONFIGURATION_FILE POOL_NAME OBJ_NAME " "ONE_EXISTING_XATTRIBUTE \n", argv[0]); return EINVAL; } librados::Rados rados; char *conf = argv[1]; char *pool = argv[2]; char *obj = argv[3]; char *xattr = argv[4]; rados.init(0); rados.conf_read_file(conf); rados.connect(); librados::IoCtx ioctx; rados.ioctx_create(pool, ioctx); const size_t numXAttrs(5); librados::bufferlist buffs[numXAttrs]; int xattrRets[numXAttrs]; librados::ObjectReadOperation op; fprintf(stdout, "Ret codes before the op: \n"); for (size_t i = 0; i < numXAttrs; i++) { xattrRets[i] = -1; fprintf(stdout, " RET#%d: %d\n", i, xattrRets[i]); } fprintf(stdout, "\n--------\nData and ret codes after the op: \n"); for (size_t i = 0; i < numXAttrs; i++) { std::stringstream stream; if (i == 0) stream << xattr; else stream << "nonexistent-xattr" << i; op.getxattr(stream.str().c_str(), &buffs[i], &xattrRets[i]); } ioctx.operate(obj, &op, 0); for (size_t i = 0; i < numXAttrs; i++) { librados::bufferlist *buff = &buffs[i]; std::string value; if (buff->length() > 0) value = std::string(buff->c_str(), buff->length()); fprintf(stdout, " RET#%d: %s %d\n", i, value.c_str(), xattrRets[i]); } rados.shutdown(); return 0; }