sefuns read_data und write_data erstellt
Diese entsprechen in der Funktion genau den efuns
read_file() und write_file(), stellen aber sicher,
dass das File immer unterhalb von /data/ liegt,
indem der Pfad ggf. angepasst wird.
Change-Id: Ibbe3cadc8d42ca2e83287d7c4893f5c3e3895837
diff --git a/secure/simul_efun/files.c b/secure/simul_efun/files.c
new file mode 100644
index 0000000..291bef6
--- /dev/null
+++ b/secure/simul_efun/files.c
@@ -0,0 +1,45 @@
+#include "/sys/files.h"
+
+public varargs string read_data(string file, int start, 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);
+}