static package bf_is_clear_prop(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, prop-name) */ Objid oid = arglist.v.list[1].v.obj; const char *pname = arglist.v.list[2].v.str; Var r; db_prop_handle h; enum error e; if (!valid(oid)) e = E_INVARG; else { h = db_find_property(oid, pname, 0); if (!h.ptr) e = E_PROPNF; else if (!h.built_in && !db_property_allows(h, progr, PF_READ)) e = E_PERM; else { r.type = TYPE_INT; r.v.num = (!h.built_in && db_property_value(h).type == TYPE_CLEAR); e = E_NONE; } } free_var(arglist); if (e == E_NONE) return make_var_pack(r); else return make_error_pack(e); }
static package bf_clear_prop(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, prop-name) */ Objid oid = arglist.v.list[1].v.obj; const char *pname = arglist.v.list[2].v.str; db_prop_handle h; Var value; enum error e; if (!valid(oid)) e = E_INVARG; else { h = db_find_property(oid, pname, 0); if (!h.ptr) e = E_PROPNF; else if (h.built_in || (progr != db_property_owner(h) && !is_wizard(progr))) e = E_PERM; else if (h.definer == oid) e = E_INVARG; else { value.type = TYPE_CLEAR; db_set_property_value(h, value); e = E_NONE; } } free_var(arglist); if (e == E_NONE) return no_var_pack(); else return make_error_pack(e); }
static enum error set_prop_info(Objid oid, const char *pname, Var info, Objid progr) { Objid new_owner; unsigned new_flags; const char *new_name; enum error e; db_prop_handle h; if (!valid(oid)) e = E_INVARG; else e = validate_prop_info(info, &new_owner, &new_flags, &new_name); if (e != E_NONE) return e; h = db_find_property(oid, pname, 0); if (!h.ptr || h.built_in) return E_PROPNF; else if (!db_property_allows(h, progr, PF_WRITE) || (!is_wizard(progr) && db_property_owner(h) != new_owner)) return E_PERM; if (new_name) { if (!db_rename_propdef(oid, pname, new_name)) return E_INVARG; h = db_find_property(oid, new_name, 0); } db_set_property_owner(h, new_owner); db_set_property_flags(h, new_flags); return E_NONE; }
void incr_quota(Objid player) { db_prop_handle h; Var v; if (!valid(player)) return; h = db_find_property(player, quota_name, &v); if (!h.ptr) return; if (v.type != TYPE_INT) return; v.v.num++; db_set_property_value(h, v); }
static package bf_prop_info(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, prop-name) */ Objid oid = arglist.v.list[1].v.obj; const char *pname = arglist.v.list[2].v.str; db_prop_handle h; Var r; unsigned flags; char *s; if (!valid(oid)) { free_var(arglist); return make_error_pack(E_INVARG); } h = db_find_property(oid, pname, 0); free_var(arglist); if (!h.ptr || h.built_in) return make_error_pack(E_PROPNF); else if (!db_property_allows(h, progr, PF_READ)) return make_error_pack(E_PERM); r = new_list(2); r.v.list[1].type = TYPE_OBJ; r.v.list[1].v.obj = db_property_owner(h); r.v.list[2].type = TYPE_STR; r.v.list[2].v.str = s = str_dup("xxx"); flags = db_property_flags(h); if (flags & PF_READ) *s++ = 'r'; if (flags & PF_WRITE) *s++ = 'w'; if (flags & PF_CHOWN) *s++ = 'c'; if (flags & PF_PRIVATE) *s++ = 'p'; *s = '\0'; return make_var_pack(r); }
int db_add_propdef(Objid oid, const char *pname, Var value, Objid owner, unsigned flags) { Object *o; Pval pval; int i; db_prop_handle h; h = db_find_property(oid, pname, 0); if (h.ptr || property_defined_at_or_below(pname, str_hash(pname), oid)) return 0; o = dbpriv_find_object(oid); if (o->propdefs.cur_length == o->propdefs.max_length) { Propdef *old_props = o->propdefs.l; int new_size = (o->propdefs.max_length == 0 ? 8 : 2 * o->propdefs.max_length); o->propdefs.l = mymalloc(new_size * sizeof(Propdef), M_PROPDEF); for (i = 0; i < o->propdefs.max_length; i++) o->propdefs.l[i] = old_props[i]; o->propdefs.max_length = new_size; if (old_props) myfree(old_props, M_PROPDEF); } o->propdefs.l[o->propdefs.cur_length++] = dbpriv_new_propdef(pname); pval.var = value; pval.owner = owner; pval.perms = flags; insert_prop_recursively(oid, o->propdefs.cur_length - 1, pval); return 1; }
int decr_quota(Objid player) { db_prop_handle h; Var v; if (!valid(player)) return 1; h = db_find_property(player, quota_name, &v); if (!h.ptr) return 1; if (v.type != TYPE_INT) return 1; if (v.v.num <= 0) return 0; v.v.num--; db_set_property_value(h, v); return 1; }
static package bf_has_property(Var arglist, Byte next, void *vdata, Objid progr) { /* (object) */ Objid oid = arglist.v.list[1].v.obj; if (!valid(oid)) { free_var(arglist); return make_error_pack(E_INVARG); } else if (!db_object_allows(oid, progr, FLAG_READ)) { free_var(arglist); return make_error_pack(E_PERM); } else { Var result; result.type = TYPE_INT; if (db_find_property(oid, arglist.v.list[2].v.str, 0).ptr) { result.v.num = 1; } else { result.v.num = 0; } free_var(arglist); return make_var_pack(result); } }