#include <config.h>#include <wizlevels.h>#include <files.h>
gehe zum Quellcode dieser Datei
Funktionen | |
| void | create () |
| int | Save (string key, mixed data) |
| mixed | Load (string key) |
| int | Remove (string key) |
| int | HaveRights () |
| varargs int | RereadProgramLists (int silent) |
| void | ShowData () |
| private string | allowed () |
| private string | get_caller_hash () |
| private mixed | read_list (string file) |
| private mapping | get_memory_pointer () |
| varargs void | ShowData (int verbose) |
Variablen | |
| string * | known_programs |
| Liste mit Programmen, die den Memory nutzen duerfen Die Variable wird entweder im create() oder durch manuellen Aufruf von RereadProgramLists() aus /secure/memory_lib und /secure/memory_nolib befuellt. | |
| private string allowed | ( | ) |
Definiert in Zeile 80 der Datei scoremaster.c.
Benutzt ARCH_SECURITY, IS_ARCH, process_call() und ROOTID.
00081 { 00082 if (previous_object() && geteuid(previous_object())==ROOTID) 00083 return 1; 00084 if (!process_call() && previous_object() && this_interactive() && ARCH_SECURITY) 00085 return 1; 00086 return 0; 00087 }

| void create | ( | ) |
Objekt initialisieren
Definiert in Zeile 63 der Datei memory.c.
Benutzt info, MEMORY_BUFF und RereadProgramLists().
00063 { 00064 mapping info; 00065 seteuid(getuid(this_object())); 00066 00067 // Wizinfo-Pointer holen 00068 if(!pointerp(info=get_extra_wizinfo(0))) 00069 raise_error("WIZINFO nicht lesbar. secure/simul_efun muss neu geladen werden.!\n"); 00070 00071 // Mein Feld der Wizinfo bei Bedarf initialisieren 00072 if(!mappingp(info[MEMORY_BUFF])) 00073 info[MEMORY_BUFF]=([]); 00074 00075 RereadProgramLists(1); 00076 }

| private string get_caller_hash | ( | ) |
Wenn das aufrufende Programm fuer die Speichernutzung zugelassen ist, wird hier der Hash zurueckgegeben unter dem seine Daten abgespeichert sind. Der Hash ist derzeit der Filename des Blueprint.
Definiert in Zeile 83 der Datei memory.c.
Benutzt known_programs.
Wird benutzt von HaveRights(), Load(), Remove() und Save().
00083 { 00084 if (member(known_programs, program_name(previous_object())[..<3]) != -1) 00085 return program_name(previous_object())[..<3]; 00086 else 00087 return 0; 00088 }

| private mapping get_memory_pointer | ( | ) |
Zeiger auf den Speicher holen
Definiert in Zeile 133 der Datei memory.c.
Benutzt info und MEMORY_BUFF.
Wird benutzt von Load(), Remove(), Save() und ShowData().
00133 { 00134 mixed info; 00135 00136 // Die Fehlermeldungen sind etwas ausfuehrlicher, um dem Debugger 00137 // einen Hinweis auf Reparaturmoeglichkeiten zu geben 00138 if(!pointerp(info=get_extra_wizinfo(0))) 00139 raise_error("Wizinfo nicht ladbar. Entweder ich hab keine Rechte " 00140 "oder das Mud hat ein echtes Problem!\n"); 00141 00142 if(!mappingp(info[MEMORY_BUFF])) 00143 raise_error("Ich finde meine Daten in der Wizinfo nicht. Ein EM kann " 00144 "versuchen, mich neu zu laden, aber was die alten Daten " 00145 "betrifft, frei nach Catty: Keine Arme, keine Kekse!\n"); 00146 // Da info[MEMORY_BUFF] immer ein Mapping ist (siehe Create), wird hier ein 00147 // Pointer uebergeben. Dadurch werden Details zum Aufbau der extra_wizinfo 00148 // nur in dieser Funktion benoetigt. 00149 return info[MEMORY_BUFF]; 00150 }

| int HaveRights | ( | ) |
Pruefen, ob previous_object() Nutzungsrechte fuer den Memory hat.
Definiert in Zeile 157 der Datei memory.c.
Benutzt get_caller_hash().
00157 { 00158 return stringp(get_caller_hash()); 00159 }

| mixed Load | ( | string | key | ) |
Daten ausgeben/referenzieren
| key | Id unter der die Daten gespeichert sind. |
Definiert in Zeile 202 der Datei memory.c.
Benutzt get_caller_hash(), get_memory_pointer(), memory und who.
00202 { 00203 string who; 00204 mapping memory; 00205 00206 // Hash des Aufrufers holen. Hat der keinen, ist er nicht befugt, 00207 // den Memory zu nutzen. 00208 if(!stringp(who=get_caller_hash())) return 0; 00209 00210 // Wenn kein Key uebergeben wird, kann auch nichts gespeichert werden. 00211 if(!stringp(key)) return 0; 00212 00213 // (hoffentlich) globalen memory_pointer holen 00214 memory = get_memory_pointer(); 00215 00216 // Das Objekt hat noch nie Save() aufgerufen. 00217 if(!member(memory,who)) 00218 return 0; 00219 00220 // Unter diesem Key ist noch nichts gespeichert. 00221 if(!member(memory[who],key)) 00222 return 0; 00223 00224 // Gespeicherten Wert zurueckgeben 00225 return memory[who][key]; 00226 }

| private mixed read_list | ( | string | file | ) |
Die Hilfsfunktion liest eine Liste mit Dateinamen und gibt die Programme als Array of Strings zurueck. Alle Zeilen die nicht mit einem Slash anfangen, werden dabei ignoriert.
| file | Die auszulesende Datei. |
Definiert in Zeile 96 der Datei memory.c.
Benutzt data, FSIZE_NOFILE und x.
Wird benutzt von RereadProgramLists().
00097 { 00098 mixed data; 00099 if (!stringp(file) || file_size(file) == FSIZE_NOFILE ) 00100 return ({}); 00101 00102 // Daten laden 00103 data = explode(read_file(file)||"", "\n"); 00104 00105 // Alle Zeilen die nicht mit / beginnen entfernen ... 00106 data=regexp(data,"^/.+"); 00107 00108 // ".c" und eventuelle Leerzeichen in jeder Zeile werden entfernt 00109 data= map(data, 00110 function string (string x) {return regreplace(x,"(.c)* *$","",1);}); 00111 return data; 00112 }

| varargs int Remove | ( | string | key | ) |
Ein Eintrag oder alle Eintraege werden geloescht
| key | Id unter der die Daten gespeichert sind. Wird kein Key uebergeben, werden alle Daten des Objekts geloescht. |
Definiert in Zeile 234 der Datei memory.c.
Benutzt get_caller_hash(), get_memory_pointer(), m_delete(), memory und who.
00234 { 00235 string who; 00236 mapping memory; 00237 00238 // Hash des Aufrufers holen. Hat der keinen, ist er nicht befugt, 00239 // den Memory zu nutzen. 00240 if(!stringp(who=get_caller_hash())) return 0; 00241 00242 // (hoffentlich) globalen memory_pointer holen 00243 memory = get_memory_pointer(); 00244 00245 // Das Objekt hat noch nie Save() aufgerufen. 00246 if(!member(memory,who)) return 0; 00247 00248 // Wenn kein Key uebergeben wird, wird alles zum Objekt gehoerende geloescht. 00249 if(stringp(key)){ 00250 // Unter diesem Key ist nichts gespeichert. 00251 if(!member(memory[who],key)) return 0; 00252 00253 // Wert unter Key fuer das File loeschen 00254 efun::m_delete(memory[who], key); 00255 00256 } else { 00257 // Alles fuer das File loeschen 00258 efun::m_delete(memory, who); 00259 } 00260 00261 return 1; 00262 }

| varargs int RereadProgramLists | ( | int | silent | ) |
Wenn die Liste mit Programmen geaendert wurde, kann sie hier per Hand neu eingelesen werden.
| silent | Varargs Flag, um Bildschirmausgabe zu unterdruecken |
Definiert in Zeile 119 der Datei memory.c.
Benutzt known_programs und read_list().
Wird benutzt von create().
00120 { 00121 // Objekte laden, die zur Mudlib gehoeren 00122 known_programs = read_list("/secure/memory_lib"); 00123 00124 // Objekte laden, die nicht zur Mudlib gehoeren 00125 known_programs+=read_list("/secure/memory_nolib"); 00126 00127 if(!silent) printf ("%O\n", known_programs); 00128 00129 return sizeof(known_programs); 00130 }


| int Save | ( | string | key, | |
| mixed | var | |||
| ) |
Daten im Memory ablegen
| key | ID unter der die Daten gespeichert werden | |
| var | Zu speicherndes Datum |
Definiert in Zeile 166 der Datei memory.c.
Benutzt get_caller_hash(), get_memory_pointer(), memory und who.
00166 { 00167 string who; 00168 mapping memory; 00169 00170 // Hash des Aufrufers holen. Hat der keinen, ist er nicht befugt, 00171 // den Memory zu nutzen. 00172 if(!stringp(who=get_caller_hash())) return 0; 00173 00174 // Wenn kein Key uebergeben wird, kann auch nichts gespeichert werden. 00175 if(!stringp(key)) return 0; 00176 00177 // (hoffentlich) globalen memory_pointer holen 00178 memory = get_memory_pointer(); 00179 00180 // Wenn keine Daten da sind, muss man auch nichts anlegen. Rueckgabewert 00181 // ist dennoch 1, weil Load bei unbekannten Keys auch 0 liefert, die 00182 // Null wird also korrekt gespeichert, irgendwie. Das muss aber nach dem 00183 // get_memory_pointer() passieren, da sonst das Korrekte Funktionieren von 00184 // Load nicht sichergestellt ist. 00185 if(var==0) return 1; 00186 00187 // Erster Aufruf durch PO? Dann muss sein Speicherbereich initialisiert 00188 // werden 00189 if(!member(memory,who)) 00190 memory[who]=([]); 00191 00192 // Endlich! Daten koennen gespeichert werden. 00193 memory[who][key]=var; 00194 00195 return 1; 00196 }

| varargs void ShowData | ( | int | verbose | ) |
Definiert in Zeile 264 der Datei memory.c.
Benutzt ARCH_SECURITY, break_string(), data, ELDER_SECURITY, get_memory_pointer(), known_programs, memory und program.
00264 { 00265 // Bekannte Objekte 00266 if (!ELDER_SECURITY ) 00267 printf("I'm fine. Thanks for asking.\n"); 00268 else { 00269 printf("known_programs:\n%O\n\n", known_programs); 00270 // EM duerfen sich auch noch zuscrollen lassen, wenn sie wollen 00271 if (ARCH_SECURITY && verbose) 00272 printf("memory: (Verbose)\n%O\n", get_memory_pointer()); 00273 else { 00274 mapping memory; 00275 memory = get_memory_pointer(); 00276 // Andere bekommen eine anonymisierte Version 00277 printf("memory: (Nur Feldnamen, keine Daten)\n"); 00278 foreach (string program, mapping data: memory ) { 00279 if ( mappingp(data) && sizeof(data) ){ 00280 printf(break_string( 00281 implode(m_indices(data),";\n"), 78, 00282 sprintf(" %-50s: ",program)),1); 00283 } 00284 else 00285 printf(" %-50s: - leer -\n", program); 00286 } 00287 } 00288 } 00289 return; 00290 }

| void ShowData | ( | ) |
| string* known_programs |
Liste mit Programmen, die den Memory nutzen duerfen Die Variable wird entweder im create() oder durch manuellen Aufruf von RereadProgramLists() aus /secure/memory_lib und /secure/memory_nolib befuellt.
MorgenGrauen Mudlib
secure/memory.c -- zum Speichern von Daten ueber die gesamte Mud-Uptime
Memory speichert seine Daten als Pointer in der extra-wizinfo. Andere Programme koennen Ihre Daten im Memory ablegen. Die Daten bleiben dadurch auch ueber ein Update/Reload der Blueprint erhalten.
Die Daten werden auf Klassenebene behandelt. Jeder Clone eines Programms (Blueprint) darf auf die gespeicherten Daten des Programms schreibend und lesend zugreifen. Andere Programme haben keinen Zugriff auf diese Daten.
Nur Objekte in /secure/memory_lib bzw. /secure/memory_nolib eingetragen sind, haben Rechte den Memory zu nutzen.
Die Idee, sensible Daten in der extra_wizinfo abzuspeichern entstammt /secure/memory.c aus der Wunderland Mudlib von Holger
Definiert in Zeile 41 der Datei memory.c.
Wird benutzt von get_caller_hash(), RereadProgramLists() und ShowData().
1.6.3