#include "mfs-utils/mfs.h" #include int mfs_init_done = 0; void mfs_check_init() { if (mfs_init_done == 0) { mfs_init(); mfs_init_done = 1; } } int mfs_fsid(const char *pathin) { mfs_check_init(); return mfs_resolve(pathin); } int mfs_attr_set_int(char *object, char *attribute, int value) { mfs_check_init(); return mfs_attr_set(object, attribute, &value); } int mfs_attr_set_str(char *object, char *attribute, char *value) { mfs_check_init(); return mfs_attr_set(object, attribute, value); } int mfs_attr_get_int(char *object, char *attribute) { int fsid; mfs_check_init(); fsid = mfs_resolve(object); return query_int(fsid, attribute); } char *mfs_attr_get_str(char *object, char *attribute) { int fsid; mfs_check_init(); fsid = mfs_resolve(object); return query_string(fsid, attribute); } int mfs_attr_set(char *object, char *attribute, void *value) { int fsid; int found = 0; char *err = NULL; static void callback(int fsid, struct mfs_subobj_header *obj, struct mfs_attr_header *attr, void *data) { char *p = data; if(obj && attr) { if (attr->attr == 1) { // Version int ver = ntohl(*(int *)data); *(int *)p = htonl(++ver); } else if (!strcmp(schema_attrib(obj->obj_type,attr->attr), attribute)) { //Specified attribute switch (attr->eltype>>6) { case TYPE_STRING: strcpy((char *)&p[0], (char *)value); found = 1; break; case TYPE_FILE: break; case TYPE_INT: *(int *)p = htonl( *(int *)value ); found = 1; break; case TYPE_OBJECT: break; } } } } mfs_check_init(); if (!object) err = "object is null"; else if (!strcmp(object, "")) err = "object is an empty string"; else if (!attribute) err = "attribute is null"; else if (!strcmp(attribute, "")) err = "attribute is an empty string"; else if (!value) err = "value is null"; if (err) { fprintf(stderr, "dbset error: %s (Object: '%s', Attribute: '%s', Value: '%s')\n", err, object, attribute, value); return 0; } fsid = mfs_resolve(object); if (fsid > 0) { u32 size = mfs_fsid_size(fsid); char *buf=alloca(size); mfs_fsid_pread(fsid, buf, 0, size ); parse_object(fsid, buf, callback); if (found) mfs_fsid_pwrite(fsid, buf, 0, size); } return found; }