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();