ES2 MUD LIB :: 東方故事二(ES2) 天朝帝國 mudlib 瀏覽展示

/adm/daemons/daemond.c

HOME :: adm :: daemons :: daemond.c
/*  daemond.c

    Copyright (C) 1994-2000 Annihilator 

    This program is a part of ES2 mudlib. Permission is granted to use,
    modify, copy or distribute this program provided this copyright notice
    remains intact and subject to the restriction that this program MAY
    NOT be used in any way for monetary gain.

    Details of terms and conditions is available in the Copyright.ES2 file.
    If you don't receive this file along with this program, write to the
    primary author of ES2 mudlib: Annihilator 
*/

#pragma save_binary

inherit F_CLEAN_UP;
inherit F_SAVE;

mapping daemons = ([ ]);

void create()
{
    seteuid(getuid());
    restore();
}

string query_save_file() { return DATA_DIR + "daemon"; }

void remove()
{
    save();
}

object query_daemon(string id)
{
    object ob;
    string file;

    if( !stringp(file = daemons[id]) )
        file = "/daemon/" + replace_string(replace_string(id, " ", "_"), ":", "/");

    if( ob = find_object(file) ) return ob;

    if( !catch(ob = load_object(file)) && objectp(ob) ) return ob;
    // Delete the daemon entry to prevent later attemption of loading. Once
    // the daemon is loaded successfully, it is the skill daemon's duty
    // to register itself again.
    else map_delete(daemons, id);

    return this_object();
}

mapping query_daemons() { return daemons; }

int register_race_daemon(string race)
{
    if( !previous_object() || clonep(previous_object()) ) return 0;
    
    if( !undefinedp(daemons["race:"+race])
    && base_name(previous_object()) != daemons["race:"+race]
    && geteuid(previous_object()) != MUDLIB_UID
    && geteuid(previous_object()) != DOMAIN_UID )
error("DAEMON_D: registration conflict, and access denied.\n");

    daemons["race:"+race] = base_name(previous_object());
    return save();
}

int register_class_daemon(string class_name)
{
    if( !previous_object() || clonep(previous_object()) ) return 0;

    if( !undefinedp(daemons["class:"+class_name])
    && base_name(previous_object()) != daemons["class:"+class_name]
    && geteuid(previous_object()) != MUDLIB_UID
    && geteuid(previous_object()) != DOMAIN_UID )
error("DAEMON_D: registration conflict, and access denied.\n");

    daemons["class:"+class_name] = base_name(previous_object());
    return save();
}

int register_condition_daemon(string condition)
{
    if( !previous_object() || clonep(previous_object()) ) return 0;

    if( !undefinedp(daemons["condition:"+condition])
    && base_name(previous_object()) != daemons["condition:"+condition]
    && geteuid(previous_object()) != MUDLIB_UID
    && geteuid(previous_object()) != DOMAIN_UID )
error("DAEMON_D: registration conflict, and access denied.\n");

    daemons["condition:"+condition] = base_name(previous_object());
    return save();
}

int register_object_daemon(string domain)
{
    if( !previous_object() || clonep(previous_object()) ) return 0;

    if( !undefinedp(daemons["domain:"+domain])
    && base_name(previous_object()) != daemons["domain:"+domain]
    && geteuid(previous_object()) != MUDLIB_UID
    && geteuid(previous_object()) != DOMAIN_UID )
error("DAEMON_D: registration conflict, and access denied.\n");

    daemons["domain:"+domain] = base_name(previous_object());
    return save();
}

int register_skill_daemon(string skill)
{
    if( !previous_object() || clonep(previous_object()) ) return 0;

    if( !undefinedp(daemons["skill:"+skill])
    && base_name(previous_object()) != daemons["skill:"+skill]
    && geteuid(previous_object()) != MUDLIB_UID
    && geteuid(previous_object()) != DOMAIN_UID )
error("DAEMON_D: registration conflict, and access denied.\n");

    daemons["skill:"+skill] = base_name(previous_object());
    return save();
}

int unregister_daemon(string d)
{
    if( previous_object()
    && base_name(previous_object()) != daemons[d]
    && geteuid(previous_object()) != ROOT_UID )
return 0;

    map_delete( daemons, d );
    return 1;
}
HOME :: adm :: daemons :: daemond.c