| #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; |
| |
| // pruefen, ob das Verzeichnis existiert - sonst anlegen |
| string dir=file[..strrstr(file,"/")-1]; |
| if (file_size(dir) != -2) // FSIZE_DIR |
| { |
| if (!mkdirp(dir)) |
| 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; |
| bytes byte_seq; |
| |
| 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 |
| { |
| byte_seq = read_bytes(source, ptr, MAXLEN); ptr += MAXLEN; |
| if (!byte_seq) byte_seq=""; |
| write_file(dest, byte_seq); |
| } |
| while(sizeof(byte_seq) == MAXLEN); |
| return 0; |
| } |
| #endif //!__EFUN_DEFINED__(copy_file) |
| |
| #undef PO |
| |