static package bf_add_verb(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, info, args) */ Objid oid = arglist.v.list[1].v.obj; Var info = arglist.v.list[2]; Var args = arglist.v.list[3]; Objid owner; unsigned flags; const char *names; db_arg_spec dobj, iobj; db_prep_spec prep; enum error e; if ((e = validate_verb_info(info, &owner, &flags, &names)) != E_NONE); /* Already failed */ else if ((e = validate_verb_args(args, &dobj, &prep, &iobj)) != E_NONE) free_str(names); else if (!valid(oid)) { free_str(names); e = E_INVARG; } else if (!db_object_allows(oid, progr, FLAG_WRITE) || (progr != owner && !is_wizard(progr))) { free_str(names); e = E_PERM; } else db_add_verb(oid, names, owner, flags, dobj, prep, iobj); free_var(arglist); if (e == E_NONE) return no_var_pack(); else return make_error_pack(e); }
static package bf_set_verb_info(Var arglist, Byte next, void *vdata, Objid progr) { /* (object, verb-desc, {owner, flags, names}) */ Objid oid = arglist.v.list[1].v.obj; Var desc = arglist.v.list[2]; Var info = arglist.v.list[3]; Objid new_owner; unsigned new_flags; const char *new_names; enum error e; db_verb_handle h; if ((e = validate_verb_descriptor(desc)) != E_NONE); /* Do nothing; e is already set. */ else if (!valid(oid)) e = E_INVARG; else e = validate_verb_info(info, &new_owner, &new_flags, &new_names); if (e != E_NONE) { free_var(arglist); return make_error_pack(e); } h = find_described_verb(oid, desc); free_var(arglist); if (!h.ptr) { free_str(new_names); return make_error_pack(E_VERBNF); } else if (!db_verb_allows(h, progr, VF_WRITE) || (!is_wizard(progr) && db_verb_owner(h) != new_owner)) { free_str(new_names); return make_error_pack(E_PERM); } db_set_verb_owner(h, new_owner); db_set_verb_flags(h, new_flags); db_set_verb_names(h, new_names); return no_var_pack(); }