Vorbereitungen fuer leight-weight objects
UID-Vergabe durch den Master
Support durch seteuid()
Support in Fehlerbehandlung
Anpassungen simul_efuns
Change-Id: I37b49708440209b3ace693afc4613c1287c41064
diff --git a/secure/master.c b/secure/master.c
index 131c951..abba895 100644
--- a/secure/master.c
+++ b/secure/master.c
@@ -114,6 +114,11 @@
set_driver_hook(H_CREATE_CLONE, "create");
set_driver_hook(H_CREATE_OB, "create");
set_driver_hook(H_CREATE_SUPER, "create_super");
+#if MUDHOST != __HOST_NAME__
+ // LWOs sollen vorerst nur in Homemuds getestet werden.
+ set_driver_hook(H_CREATE_LWOBJECT, "create_lw");
+ set_driver_hook(H_LWOBJECT_UIDS, #'lwo_uid_hook);
+#endif
// Bei Reset reset() im Objekt aufrufen
set_driver_hook(H_RESET, "reset");
@@ -426,7 +431,8 @@
// #################
// Magier-ID fuer Datei str (als Objekt oder als String) ermitteln
-string creator_file(mixed str) {
+public string creator_file(mixed str)
+{
string *strs,tmp;
int s;
@@ -508,12 +514,12 @@
// UID und EUID an Objekt geben (oder eben nicht)
// Keine GD-Funktion, aber von Hooks aufgerufen
-protected mixed give_uid_to_object(string datei, object po)
+protected mixed give_uid_to_object(string datei, object|lwobject po)
{
string creator,pouid;
// Parameter testen
- if (!stringp(datei)||!objectp(po)) return 1;
+ if (!datei || !po) return 1;
// Keine Objekte in /log, /open oder /data
if (strstr(datei, "/"LIBDATADIR"/") == 0
@@ -535,7 +541,7 @@
// unten generieren.
// Ausserdem nur UID setzen, keine eUID.
if (pouid==ROOTID)
- return ({creator,NOBODY}); // root does not create root objects!
+ return ({creator,NOBODY});
// EUID mitsetzen, wenn PO und creator dieselbe UID sind.
// Wenn creator die BACKBONEID ist (im allg. liegt das Objekt dann in
@@ -547,6 +553,21 @@
return ({creator,NOBODY});
}
+// EUID und UID werden von give_uid_to_object() vergeben, diese sind in
+// inaugurate_master() als driver hooks angemeldet.
+
+protected mixed load_uid_hook(string datei) {
+ return(give_uid_to_object(datei, previous_object()));
+}
+
+protected mixed clone_uid_hook(object bluep, string new_name) {
+ return(give_uid_to_object(new_name, previous_object()));
+}
+
+protected mixed lwo_uid_hook(object bluep) {
+ return(give_uid_to_object(object_name(bluep), previous_object()));
+}
+
// Die System-IDs muessen bekannt sein
string get_master_uid() { return ROOTID;}
string get_bb_uid() { return BACKBONEID; }
@@ -772,9 +793,9 @@
mixed arg3)
{
- if (objectp(who) &&
+ if (objectp(who) &&
(who==this_object() || geteuid(who)==ROOTID))
- return 1;
+ return 1;
switch(op)
{
@@ -816,7 +837,6 @@
if (strstr(load_name(who), "/std/shells/") == 0
&& get_type_info(arg1, 2) == who
&& get_type_info(arg1, 3) == "/std/living/life"
-// && get_type_info(arg1, 4) == "die"
&& arg2[LIMIT_EVAL] <= 10000000 ) {
return 1;
}
@@ -840,6 +860,14 @@
case "sqlite_pragma":
return 1;
+
+ case "configure_lwobject":
+ // arg1: lwo to be configured, arg2: <what>, arg3: <data>
+ if (arg2 == LC_EUID) {
+ return who == arg1 // only the lwo itself for now (except of ROOT)
+ && getuid(arg1) == arg3; // and only to its own UID
+ }
+ return -1;
case "attach_erq_demon":
case "bind_lambda":
case "configure_interactive":
@@ -985,7 +1013,7 @@
Aufsplitten des Handlers und Nutzung von limited() */
//keine GD-Funktion
private void handle_runtime_error(string err, string prg, string curobj,
- int line, mixed culprit, int caught, object po, int issueid)
+ int line, mixed culprit, int caught, object|lwobject po, int issueid)
{
string code;
string debug_txt;
@@ -1037,7 +1065,7 @@
//Keine GD-Funktion, limitiert die Kosten fuer den handler
private void call_runtime_error(string err, string prg, string curobj,
- int line, mixed culprit, int caught, object po)
+ int line, mixed culprit, int caught, object|lwobject po)
{
if (handling_error == efun::driver_info(DI_EVAL_NUMBER))
{
@@ -1201,13 +1229,6 @@
return;
}
-// Keine Prepositionen in parse_command
-//string *parse_command_prepos_list() { return ({}); }
-
-// Wie lautet das Wort fuer 'alle' ?
-//string *parse_command_all_word() { return ({}); }
-
-
// Keine Besonderen Objektnamen
string printf_obj_name(object ob) { return 0; }
@@ -1230,14 +1251,3 @@
map(wizlist_info(),#'_save_wiz_file_loop),""));
}
-// EUID und UID werden von give_uid_to_object() vergeben, diese sind in
-// inaugurate_master() als driver hooks angemeldet.
-
-protected mixed load_uid_hook(string datei) {
- return(give_uid_to_object(datei, previous_object()));
-}
-
-protected mixed clone_uid_hook(object blueprint, string new_name) {
- return(give_uid_to_object(new_name, previous_object()));
-}
-