/* -*- LPC -*- */ /* * $Locker: $ * $Id: loader.c,v 1.1 1998/01/06 04:03:45 ceres Exp $ * $Log: loader.c,v $ * Revision 1.1 1998/01/06 04:03:45 ceres * Initial revision * */ /** * This is the domain preloader that handles preloading important files for * the domains. * * When the mud boots this object loads each item in each domains preload * list. It will only load files which are within the domain that is being * preloaded. In other words you cannot have the AM loader load * /guilds/Ankh-Morpork/myfile this must be done in the guilds pre-loader. * * Functions are provided to enable domain leaders and deputies to add and * remove files from the domains preload list. * * @see add_pre_load, remove_pre_load, query_pre_load */ string *pre_load; /** @ignore yes */ void create() { int i; string domain; foreach(domain in "/secure/master"->query_domains()) { unguarded((: restore_object, "/d/"+ domain + "/loader" :)); if (!pre_load) pre_load = ({ }); for (i=0;i<sizeof(pre_load);i++) { if(pre_load[i] && explode(pre_load[i], "/")[1] != domain) printf("invalid " + domain + " preload: " + pre_load[i] + "\n"); else { printf(domain +" pre_loading "+pre_load[i]+".\n"); if(catch(call_other(pre_load[i], "??"))) call_out("do_load", 0, pre_load[i]); } } } } /** @ignore yes */ void do_load(string str) { call_other(str, "??"); } /** @ignore yes */ private int validate(string domain, object who) { string name; if(member_array(domain, "/secure/master"->query_domains()) == -1) return 0; if(!userp(who) || !interactive(who)) return 0; name = who->query_name(); if(!!"/secure/master"->query_trustee(name) && !"/secure/master"->is_leader_of(name, domain) && !"/secure/master"->is_deputy_of(name, domain)) return 0; return 1; } /** * This method adds a file to a domains preload list. * * @param domain The domain * @param str The basename of the file to be added. * @return 1 for success, 0 for failure. */ int add_pre_load(string domain, string str) { if(!validate(domain, previous_object(1))) return 0; if(explode(str, "/")[1] != domain) return 0; unguarded((: restore_object, "/d/"+ domain + "/loader" :)); if (!pre_load) pre_load = ({ }); if (member_array(str, pre_load) == -1) pre_load += ({ str }); save_object("/d/" + domain + "/loader"); return 1; } /** * This method removes a file from a domains preload list. * * @param domain The domain * @param str The basename of the file to be removed. * @return 1 for success, 0 for failure. */ int remove_pre_load(string domain, string str) { int i; if(!validate(domain, previous_object(1))) return 0; unguarded((: restore_object, "/d/"+ domain + "/loader" :)); if (!pre_load) pre_load = ({ }); if ((i=member_array(str, pre_load)) == -1) return 0; pre_load = delete(pre_load, i, 1); save_object("/d/" + domain + "/loader"); } /** * This method returns the domains preload list. * * @param domain The domain * @return A list of files to be preloaded */ string *query_pre_load(string domain) { if(member_array(domain, "/secure/master"->query_domains()) == -1) return ({ }); unguarded((: restore_object, "/d/"+ domain + "/loader" :)); if (!pre_load) pre_load = ({ }); return pre_load; }