Aktualisierung der spare sefuns

Nachdem das Original laeuft, auch das Backup aktualisiert.

Change-Id: I6b1f1c2b02b3d93e7f3ed037cf466c7bbb45f768
diff --git a/secure/simul_efun/spare/files.c b/secure/simul_efun/spare/files.c
new file mode 100644
index 0000000..030b306
--- /dev/null
+++ b/secure/simul_efun/spare/files.c
@@ -0,0 +1,121 @@
+#include "/sys/files.h"
+
+#define PO        efun::previous_object(0)
+
+public varargs string read_data(string file, int start, int anzahl)
+{
+    if (!stringp(file))
+      raise_error("Bad arg 1 to read_data(): expected 'string'.\n");
+
+    // Wenn Pfad nicht absolut, ist das nen Fehler, daher wird das nicht
+    // korrigiert.
+
+    // wenn kein /data/ vorn steht, wird es vorangestellt.
+    if (strstr(file,"/"LIBDATADIR"/") != 0)
+    {
+      file = "/"LIBDATADIR + file;
+    }
+    // read_file() nicht direkt rufen, sondern vorher als closure ans
+    // aufrufende Objekt binden. Sonst laeuft die Rechtepruefung in
+    // valid_write() im Master unter der Annahme, dass die simul_efun.c mit
+    // ihrer root id was will.
+    return funcall(bind_lambda(#'efun::read_file, previous_object()),
+                   file, start, anzahl);
+}
+
+public varargs int write_data(string file, string str, int flags)
+{
+    if (!stringp(file))
+      raise_error("Bad arg 1 to write_data(): expected 'string'.\n");
+    if (!stringp(str))
+      raise_error("Bad arg 2 to write_data(): expected 'string'.\n");
+
+    // Wenn Pfad nicht absolut, ist das nen Fehler, daher wird das nicht
+    // korrigiert.
+
+    // wenn kein /data/ vorn steht, wird es vorangestellt.
+    if (strstr(file,"/"LIBDATADIR"/") != 0)
+    {
+      file = "/"LIBDATADIR + file;
+    }
+    // write_file() nicht direkt rufen, sondern vorher als closure ans
+    // aufrufende Objekt binden. Sonst laeuft die Rechtepruefung in
+    // valid_write() im Master unter der Annahme, dass die simul_efun.c mit
+    // ihrer root id was will.
+    return funcall(bind_lambda(#'efun::write_file, previous_object()),
+                   file, str, flags);
+}
+
+// * Bei 50k Groesse Log-File rotieren
+varargs int log_file(string file, string txt, int size_to_break)
+{
+    mixed *st;
+    // Wenn file schon mit /log/ anfaengt, schreiben wir nicht noch eins
+    // davor.
+    if (strstr(file,"/"LIBLOGDIR"/") != 0)
+    {
+      file="/log/"+file;
+    }
+
+    // Achtung: es ist verfuehrerisch, diese Pruefung zu entfernen und
+    // stattdessen, den Aufruf von write_file() an den Aufrufer zu binden.
+    // Dies funktioniert aber nicht, weil log_file gesonderte Behandlung in
+    // valid_write() erfaehrt.
+    file=implode((efun::explode(file,"/")-({".."})),"/");
+    if (!funcall(bind_lambda(#'efun::call_other,PO),"secure/master",//')
+                "valid_write",file,geteuid(PO),"log_file",PO))
+      return 0;
+
+    // Wenn zu gross, rotieren.
+    if ( size_to_break >= 0 & (
+        sizeof(st = get_dir(file,2) ) && st[0] >= (size_to_break|MAX_LOG_SIZE)))
+        catch(rename(file, file + ".old");publish); /* No panic if failure */
+
+    // Die Zugriffspruefung hier laeuft mit Rechten der simul_efuns...
+    // Rechtepruefung oben
+    return(write_file(file,txt));
+}
+
+#if !__EFUN_DEFINED__(copy_file)
+#define MAXLEN 50000
+public nomask int copy_file(string source, string dest)
+{
+
+    int ptr;
+    string bytes;
+
+    set_this_object(previous_object());
+    if (!sizeof(source)||!sizeof(dest)||source==dest||(file_size(source)==-1)||
+        (!call_other(master(),"valid_read",source,
+                     getuid(this_interactive()||
+                   previous_object()),"read_file",previous_object()))||
+        (!call_other(master(),"valid_read",source,
+                     getuid(this_interactive()||
+                   previous_object()),"write_file",previous_object())))
+      return 1;
+    switch (file_size(dest))
+    {
+    case -1:
+      break;
+    case -2:
+      if (dest[<1]!='/') dest+="/";
+      dest+=efun::explode(source,"/")[<1];
+      if (file_size(dest)==-2) return 1;
+      if (file_size(dest)!=-1) break;
+    default:
+      if (!rm(dest)) return 1;
+      break;
+    }
+    do
+    {
+      bytes = read_bytes(source, ptr, MAXLEN); ptr += MAXLEN;
+      if (!bytes) bytes="";
+      write_file(dest, bytes);
+    }
+    while(sizeof(bytes) == MAXLEN);
+    return 0;
+}
+#endif //!__EFUN_DEFINED__(copy_file)
+
+#undef PO
+
diff --git a/secure/simul_efun/spare/simul_efun.c b/secure/simul_efun/spare/simul_efun.c
index 2a89fcf..f5583db 100644
--- a/secure/simul_efun/spare/simul_efun.c
+++ b/secure/simul_efun/spare/simul_efun.c
@@ -86,6 +86,7 @@
 #include __DIR__"shadow.c"
 #include __DIR__"livings.c"
 #include __DIR__"comm.c"
+#include __DIR__"files.c"
 
 #define TO        efun::this_object()
 #define TI        efun::this_interactive()
@@ -391,22 +392,6 @@
   return(0); //sonst
 }
 
-// * Bei 50k Groesse Log-File rotieren
-varargs int log_file(string file, string txt, int size_to_break) {
-  mixed *st;
-
-  file="/log/"+file;
-  file=implode((efun::explode(file,"/")-({".."})),"/");
-//  tell_object(find_player("jof"),sprintf("LOG FILE: %O -> %O\n",previous_object(),file));
-  if (!funcall(bind_lambda(#'efun::call_other,PO),"secure/master",//')
-              "valid_write",file,geteuid(PO),"log_file",PO))
-      return 0;
-  if ( size_to_break >= 0 & (
-      sizeof(st = get_dir(file,2) ) && st[0] >= (size_to_break|MAX_LOG_SIZE)))
-      catch(rename(file, file + ".old");publish); /* No panic if failure */
-  return(write_file(file,txt));
-}
-
 // * Magier-Level abfragen
 int query_wiz_level(mixed player) {
   return (int)"/secure/master"->query_wiz_level(player);
@@ -930,12 +915,12 @@
   if (name[0] != '#')
   {
     // abs. Pfad erzeugen *seufz*
-    if (name[0] != '#' && name[0]!='/')
+    if (name[0]!='/')
       name = "/" + name;
 
     // wenn kein /data/ vorn steht, erstmal gucken, ob das Savefile unter
     // /data/ existiert. Wenn ja, wird das geladen.
-    if (name[0]!='#' && strstr(name,"/"LIBDATADIR"/") != 0)
+    if (strstr(name,"/"LIBDATADIR"/") != 0)
     {
       string path = "/"LIBDATADIR + name;
       if (file_size(path + ".o") >= 0)
@@ -1803,47 +1788,6 @@
 }
 
 
-#if !__EFUN_DEFINED__(copy_file)
-#define MAXLEN 50000
-nomask int copy_file(string source, string dest)
-{
-
-  int ptr;
-  string bytes;
-
-  set_this_object(previous_object());
-  if (!sizeof(source)||!sizeof(dest)||source==dest||(file_size(source)==-1)||
-      (!call_other(master(),"valid_read",source,
-                   getuid(this_interactive()||
-                 previous_object()),"read_file",previous_object()))||
-      (!call_other(master(),"valid_read",source,
-                   getuid(this_interactive()||
-                 previous_object()),"write_file",previous_object())))
-    return 1;
-  switch (file_size(dest))
-  {
-  case -1:
-    break;
-  case -2:
-    if (dest[<1]!='/') dest+="/";
-    dest+=efun::explode(source,"/")[<1];
-    if (file_size(dest)==-2) return 1;
-    if (file_size(dest)!=-1) break;
-  default:
-    if (!rm(dest)) return 1;
-    break;
-  }
-  do
-  {
-    bytes = read_bytes(source, ptr, MAXLEN); ptr += MAXLEN;
-    if (!bytes) bytes="";
-    write_file(dest, bytes);
-  }
-  while(sizeof(bytes) == MAXLEN);
-  return 0;
-}
-#endif //!__EFUN_DEFINED__(copy_file)
-
 
 // ### Ersatzaufloesung in Strings ###
 varargs string replace_personal(string str, mixed *obs, int caps) {