blob: 3db144cd998fad581c70535a3c887cd7680aabbc [file] [log] [blame]
Zesstra19d657d2017-01-29 21:40:38 +01001#include "/sys/files.h"
2
3public varargs string read_data(string file, int start, anzahl)
4{
5 if (!stringp(file))
6 raise_error("Bad arg 1 to read_data(): expected 'string'.\n");
7
8 // Wenn Pfad nicht absolut, ist das nen Fehler, daher wird das nicht
9 // korrigiert.
10
11 // wenn kein /data/ vorn steht, wird es vorangestellt.
12 if (strstr(file,"/"LIBDATADIR"/") != 0)
13 {
14 file = "/"LIBDATADIR + file;
15 }
16 // read_file() nicht direkt rufen, sondern vorher als closure ans
17 // aufrufende Objekt binden. Sonst laeuft die Rechtepruefung in
18 // valid_write() im Master unter der Annahme, dass die simul_efun.c mit
19 // ihrer root id was will.
20 return funcall(bind_lambda(#'efun::read_file, previous_object()),
21 file, start, anzahl);
22}
23
24public varargs int write_data(string file, string str, int flags)
25{
26 if (!stringp(file))
27 raise_error("Bad arg 1 to write_data(): expected 'string'.\n");
28 if (!stringp(str))
29 raise_error("Bad arg 2 to write_data(): expected 'string'.\n");
30
31 // Wenn Pfad nicht absolut, ist das nen Fehler, daher wird das nicht
32 // korrigiert.
33
34 // wenn kein /data/ vorn steht, wird es vorangestellt.
35 if (strstr(file,"/"LIBDATADIR"/") != 0)
36 {
37 file = "/"LIBDATADIR + file;
38 }
39 // write_file() nicht direkt rufen, sondern vorher als closure ans
40 // aufrufende Objekt binden. Sonst laeuft die Rechtepruefung in
41 // valid_write() im Master unter der Annahme, dass die simul_efun.c mit
42 // ihrer root id was will.
43 return funcall(bind_lambda(#'efun::write_file, previous_object()),
44 file, str, flags);
45}
Zesstra0fbf95d2017-01-29 21:48:02 +010046
47// * Bei 50k Groesse Log-File rotieren
48varargs int log_file(string file, string txt, int size_to_break)
49{
50 mixed *st;
Zesstrafa572c72017-01-29 22:09:30 +010051 // Wenn file schon mit /log/ anfaengt, schreiben wir nicht noch eins
52 // davor.
53 if (strstr(file,"/"LIBLOGDIR"/") != 0)
54 {
55 file="/log/"+file;
56 }
Zesstra0fbf95d2017-01-29 21:48:02 +010057
Zesstrafa572c72017-01-29 22:09:30 +010058 // Achtung: es ist verfuehrerisch, diese Pruefung zu entfernen und
59 // stattdessen, den Aufruf von write_file() an den Aufrufer zu binden.
60 // Dies funktioniert aber nicht, weil log_file gesonderte Behandlung in
61 // valid_write() erfaehrt.
Zesstra0fbf95d2017-01-29 21:48:02 +010062 file=implode((efun::explode(file,"/")-({".."})),"/");
Zesstra0fbf95d2017-01-29 21:48:02 +010063 if (!funcall(bind_lambda(#'efun::call_other,PO),"secure/master",//')
64 "valid_write",file,geteuid(PO),"log_file",PO))
65 return 0;
Zesstrafa572c72017-01-29 22:09:30 +010066
67 // Wenn zu gross, rotieren.
Zesstra0fbf95d2017-01-29 21:48:02 +010068 if ( size_to_break >= 0 & (
69 sizeof(st = get_dir(file,2) ) && st[0] >= (size_to_break|MAX_LOG_SIZE)))
70 catch(rename(file, file + ".old");publish); /* No panic if failure */
71
Zesstrafa572c72017-01-29 22:09:30 +010072 // Die Zugriffspruefung hier laeuft mit Rechten der simul_efuns...
73 // Rechtepruefung oben
Zesstra0fbf95d2017-01-29 21:48:02 +010074 return(write_file(file,txt));
75}
76
77#if !__EFUN_DEFINED__(copy_file)
78#define MAXLEN 50000
79public nomask int copy_file(string source, string dest)
80{
81
82 int ptr;
83 string bytes;
84
85 set_this_object(previous_object());
86 if (!sizeof(source)||!sizeof(dest)||source==dest||(file_size(source)==-1)||
87 (!call_other(master(),"valid_read",source,
88 getuid(this_interactive()||
89 previous_object()),"read_file",previous_object()))||
90 (!call_other(master(),"valid_read",source,
91 getuid(this_interactive()||
92 previous_object()),"write_file",previous_object())))
93 return 1;
94 switch (file_size(dest))
95 {
96 case -1:
97 break;
98 case -2:
99 if (dest[<1]!='/') dest+="/";
100 dest+=efun::explode(source,"/")[<1];
101 if (file_size(dest)==-2) return 1;
102 if (file_size(dest)!=-1) break;
103 default:
104 if (!rm(dest)) return 1;
105 break;
106 }
107 do
108 {
109 bytes = read_bytes(source, ptr, MAXLEN); ptr += MAXLEN;
110 if (!bytes) bytes="";
111 write_file(dest, bytes);
112 }
113 while(sizeof(bytes) == MAXLEN);
114 return 0;
115}
116#endif //!__EFUN_DEFINED__(copy_file)
117
118