memory.c-Dateireferenz

#include <config.h>
#include <wizlevels.h>
#include <files.h>
Include-Abhängigkeitsdiagramm für memory.c:

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.

Dokumentation der Funktionen

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int HaveRights (  ) 

Pruefen, ob previous_object() Nutzungsrechte fuer den Memory hat.

Rückgabe:
Gibt 1 zurueck, wenn der Aufrufende berechtigt ist, das Objekt zu nutzen, sonst 0

Definiert in Zeile 157 der Datei memory.c.

Benutzt get_caller_hash().

00157                 {
00158   return stringp(get_caller_hash());
00159 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

mixed Load ( string  key  ) 

Daten ausgeben/referenzieren

Parameter:
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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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.

Parameter:
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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

varargs int Remove ( string  key  ) 

Ein Eintrag oder alle Eintraege werden geloescht

Parameter:
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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs int RereadProgramLists ( int  silent  ) 

Wenn die Liste mit Programmen geaendert wurde, kann sie hier per Hand neu eingelesen werden.

Parameter:
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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int Save ( string  key,
mixed  var 
)

Daten im Memory ablegen

Parameter:
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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void ShowData (  ) 

Variablen-Dokumentation

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().

Erzeugt am Thu Jun 3 14:41:39 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3