save/restore_object: LIBDATADIR beruecksichtigen.
save_object() speichert jetzt Savefiles automatisch unter dem gleichen
Pfad unter /data/ und loescht ggf. das Savefile, was im Rest der Mudlib
liegt. Der noetige Pfad unterhalb von /data/ wird automatisch angelegt,
falls noetig.
restore_object() schaut zuerst nach dem gewuenschten Savefile unter /data/
und laedt ggf. das. Existiert es nicht unter /data/, wird es im restlichen
Teil der Lib gesucht.
Change-Id: Idfee23906972606371c0c0054a2167bc4c2e25ad
diff --git a/secure/simul_efun/simul_efun.c b/secure/simul_efun/simul_efun.c
index f27bdea..7bf096c 100644
--- a/secure/simul_efun/simul_efun.c
+++ b/secure/simul_efun/simul_efun.c
@@ -829,6 +829,7 @@
mapping save;
mixed index, res;
int i;
+ string oldpath;
// nur Strings und 0 zulassen
if ((!stringp(name) || !sizeof(name)) &&
@@ -839,6 +840,24 @@
"sefun::save_object()! Argument was %O\n",name));
}
+ if (stringp(name)) {
+ // abs. Pfad erzeugen. *seufz*
+ if (name[0]!='/')
+ name = "/" + name;
+ oldpath = name;
+ // automatisch in LIBDATADIR speichern
+ if (strstr(name,"/"LIBDATADIR"/") != 0) {
+ name = "/"LIBDATADIR + name;
+ // wenn das Verzeichnis nicht existiert, ggf. anlegen
+ string dir = name[0..strrstr(name,"/")-1];
+ if (file_size(dir) != FSIZE_DIR) {
+ if (mkdirp(dir) != 1)
+ raise_error("save_object(): kann Verzeichnis " + dir
+ + " nicht anlegen!");
+ }
+ }
+ }
+
save = m_allocate(0, 2);
properties = (mapping)previous_object()->QueryProperties();
@@ -862,12 +881,19 @@
// save object!
previous_object()->_set_save_data(save);
// format: wie definiert in config.h
- if (stringp(name))
+ if (stringp(name)) {
res = funcall(bind_lambda(#'efun::save_object, previous_object()), name,
__LIB__SAVE_FORMAT_VERSION__);
+ // wenn erfolgreich und noch nen Savefile existiert, was nicht unter
+ // /data/ liegt, wird das geloescht.
+ if (!res && oldpath
+ && file_size(oldpath+".o") >= 0)
+ rm(oldpath+".o");
+ }
else
res = funcall(bind_lambda(#'efun::save_object, previous_object()),
__LIB__SAVE_FORMAT_VERSION__);
+
previous_object()->_set_save_data(0);
#ifdef IOSTATS
@@ -900,6 +926,18 @@
int i;
closure cl;
+ // abs. Pfad erzeugen. *seufz*
+ if (name[0]!='/')
+ name = "/" + name;
+
+ // wenn kein /data/ vorn steht, erstmal gucken, ob das Savefile unter /data/
+ // existiert. Wenn ja, wird das geladen.
+ if (strstr(name,"/"LIBDATADIR"/") != 0) {
+ string path = "/"LIBDATADIR + name;
+ if (file_size(path + ".o") >= 0)
+ name = path;
+ }
+
// get actual property settings (by create())
properties = (mapping)previous_object()->QueryProperties();