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