log_file(): auch /log/... akzeptieren

Sollte der uebergebene Pfad bereits absolut sein
und mit einem /log/ beginnen, wird kein erneutes
/log/ am Anfang eingefuegt.

Change-Id: I8c5ab55db1488810419d0b462baa32826dcc62b2
diff --git a/doc/sefun/log_file b/doc/sefun/log_file
index cf7e03b..6cdab31 100644
--- a/doc/sefun/log_file
+++ b/doc/sefun/log_file
@@ -9,6 +9,8 @@
 
 BESCHREIBUNG:
 	log_file schreibt den Text text in die Datei /log/file.
+	Sollte file schon mit einem /log/ beginnen, wird kein erneutes /log/ davor
+	eingefuegt.
 
 RUECKGABEWERT:
 	1 bei Erfolg oder 0, falls ein Fehler beim Schreiben auftrat.
@@ -23,9 +25,11 @@
 BEISPIELE:
 	log_file( "report/wargon.rep", "TYPO von bla in blubb:\ntest\n");
 	In /log/report/wargon.rep finde ich nun die neueste Typomeldung... ;)
+	log_file( "/log/report/wargon.rep", "TYPO von bla in blubb:\ntest\n");
+	Gleiches Ergebnis. ;-)
 
 SIEHE AUCH:
 	write_file(E)
 
-09.06.2014, Zesstra
+29.01.2017, Zesstra
 
diff --git a/secure/simul_efun/files.c b/secure/simul_efun/files.c
index d2b81a5..3db144c 100644
--- a/secure/simul_efun/files.c
+++ b/secure/simul_efun/files.c
@@ -48,17 +48,29 @@
 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;
+    }
 
-    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));
 }