dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
/*
 * uid.c
 *
 * Created by: Erik Kay
 * Description: new uid / euid data structures and security
 * Modification:
 *   11-1-92 - Erik Kay - initial creation
 *   94.07.14 - Robocoder - replaced linked list with AVL tree, and
 *                made uids into shared strings
 */
#ifdef LATTICE
#include "/lpc_incl.h"
#include "/eoperators.h"
#include "/avltree.h"
#include "/md.h"
#include "/uids.h"
#include "/master.h"
#else
#include "../lpc_incl.h"
#include "../eoperators.h"
#include "../avltree.h"
#include "../md.h"
#include "uids.h"
#include "../master.h"
#include "../efun_protos.h"
#endif

static object_t *ob;

#ifdef F_EXPORT_UID
void
f_export_uid PROT((void))
{
    if (current_object->euid == NULL)
        error("Illegal to export uid 0\n");
    ob = sp->u.ob;
    if (ob->euid) {
        free_object(ob, "f_export_uid:1");
        *sp = const0;
    }
    else {
        ob->uid = current_object->euid;
        free_object(ob, "f_export_uid:2");
        *sp = const1;
    }
}
#endif

#ifdef F_GETEUID
void
f_geteuid PROT((void))
{
    if (sp->type & T_OBJECT) {
        ob = sp->u.ob;
        if (ob->euid) {
            put_constant_string(ob->euid->name);
            free_object(ob, "f_geteuid:1");
            return;
	} else {
            free_object(ob, "f_geteuid:2");
            *sp = const0;
            return;
	}
    } else if (sp->type & T_FUNCTION) {
        funptr_t *fp;
        if ((fp = sp->u.fp)->hdr.owner && fp->hdr.owner->euid) {
            put_constant_string(fp->hdr.owner->euid->name);
            free_funp(fp);
            return;
	} 
	free_funp(fp);
	*sp = const0;
    }
}
#endif

#ifdef F_GETUID
void
f_getuid PROT((void))
{
    ob = sp->u.ob;

    DEBUG_CHECK(ob->uid == NULL, "UID is a null pointer\n");
    put_constant_string(ob->uid->name);
    free_object(ob, "f_getuid");
}
#endif

#ifdef F_SETEUID
void
f_seteuid PROT((void))
{
    svalue_t *arg;
    svalue_t *ret;

    if (sp->type & T_NUMBER) {
        if (sp->u.number)
            bad_arg(1, F_SETEUID);
        current_object->euid = NULL;
	sp->u.number = 1;
        return;
    }
    arg = sp;
    push_object(current_object);
    push_svalue(arg);
    ret = apply_master_ob(APPLY_VALID_SETEUID, 2);
    if (!MASTER_APPROVED(ret)) {
	free_string_svalue(sp);
        *sp = const0;
        return;
    }
    current_object->euid = add_uid(sp->u.string);
    free_string_svalue(sp);
    *sp = const1;
}
#endif

/* Support functions */
static tree *uids = NULL;
userid_t *backbone_uid = NULL;
userid_t *root_uid = NULL;

#ifdef DEBUGMALLOC_EXTENSIONS
static void mark_uid_tree P1(tree *, tr) {
    DO_MARK(tr, TAG_UID);
    DO_MARK(tr->tree_p, TAG_UID);
    
    EXTRA_REF(BLOCK(((userid_t *)tr->tree_p)->name))++;
    if (tr->tree_l)
	mark_uid_tree(tr->tree_l);
    if (tr->tree_r)
	mark_uid_tree(tr->tree_r);
}

void mark_all_uid_nodes() {
    if (uids)
	mark_uid_tree(uids);
}
#endif

static int uidcmp PROT((userid_t *, userid_t *));

static int uidcmp P2(userid_t *, uid1, userid_t *, uid2)
{
    register char *name1, *name2;

    name1 = uid1->name;
    name2 = uid2->name;
    return (name1 < name2 ? -1 : (name1 > name2 ? 1 : 0));
}

userid_t *add_uid P1(char *, name)
{
    userid_t *uid, t_uid;
    char *sname;

    sname = make_shared_string(name);
    t_uid.name = sname;
    if ((uid = (userid_t *) tree_srch(uids, uidcmp, (char *) &t_uid))) {
	free_string(sname);
    } else {
	uid = ALLOCATE(userid_t, TAG_UID, "add_uid");
	uid->name = sname;
	tree_add(&uids, uidcmp, (char *) uid, NULL);
    }
    return uid;
}

userid_t *set_root_uid P1(char *, name)
{
    if (!root_uid)
	return root_uid = add_uid(name);

    tree_delete(&uids, uidcmp, (char *) root_uid, NULL);
    root_uid->name = make_shared_string(name);
    tree_add(&uids, uidcmp, (char *) root_uid, NULL);
    return root_uid;
}

userid_t *set_backbone_uid P1(char *, name)
{
    if (!backbone_uid)
	return backbone_uid = add_uid(name);

    tree_delete(&uids, uidcmp, (char *) backbone_uid, NULL);
    backbone_uid->name = make_shared_string(name);
    tree_add(&uids, uidcmp, (char *) backbone_uid, NULL);
    return backbone_uid;
}