Kommentare und ToDos ergaenzt.

Einige erlaeuternde Kommentare, insb. zum Wertebereich
von access() ergaenzt und einige ToDos festgehalten.

Change-Id: I8abc2a20ac2750d0c35fcf8acbb43b854a0c16c3
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index 931222a..47ce0e9 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -458,7 +458,8 @@
     case 5:
       if (stringp(chinfo[4]) || closurep(chinfo[4]))
         desc = chinfo[4];
-
+    // Die admin-Daten sind nicht fuer die Ebene wichtig, nur fuer die
+    // check_ch_access().
     case 4:
       admin[lower_case(chinfo[0]), FLAG] = to_int(chinfo[3]);
 
@@ -512,6 +513,8 @@
   seteuid(getuid());
   restore_object(CHANNEL_SAVE);
 
+  //TODO: weitere Mappings im MEMORY speichern, Savefile ersetzen.
+
   /* Die Channel-History wird nicht nur lokal sondern auch noch im Memory
      gespeichert, dadurch bleibt sie auch ueber ein Reload erhalten.
      Der folgende Code versucht, den Zeiger aus dem Memory zu holen. Falls
@@ -563,7 +566,12 @@
 
 varargs void reset()
 {
-  // Cache bereinigen entsprechend dessen Timeout-Zeit (12 h).
+  //TODO reset nur 1-2mal am Tag mit etwas random.
+
+  // Cache bereinigen entsprechend dessen Timeout-Zeit (12 h)
+  // TODO: Zeit auf 2-3 Tage erhoehen.
+  // TODO 2: Zeit dynamisch machen und nur expiren, wenn mehr als n Eintraege.
+  // Zeit reduzieren, bis nur noch n/2 Eintraege verbleiben.
   channelC = filter_indices(channelC, function int (string ch_name)
   {
     return (channelC[ch_name][2] + 43200 > time());
@@ -596,6 +604,9 @@
 // SEE: new, join, leave, send, list, users
 // Note: <pl> is usually an object, only the master supplies a string during
 //       runtime error handling.
+// Wertebereich: 0 fuer Zugriff verweigert, 1 fuer Zugriff erlaubt, 2 fuer
+// Zugriff erlaubt fuer privilegierte Objekte, die senden duerfen ohne
+// Zuhoerer zu sein.
 varargs private int access(string ch, object|string pl, string cmd,
                            string txt)
 {
@@ -873,9 +884,11 @@
   if (!a)
     return E_ACCESS_DENIED;
 
-  // TODO: Wertebereich von <a> klaeren.
-  // a<2 bedeutet effektiv a==1, was dem Rueckgabewert von check_ch_access()
-  // entspricht, wenn die Aktion zugelassen wird.
+  // a<2 bedeutet effektiv a==1 (weil a==0 oben rausfaellt), was dem
+  // Rueckgabewert von check_ch_access() entspricht, wenn die Aktion zugelassen
+  // wird. access() allerdings 2 fuer "privilegierte" Objekte (z.B.
+  // ROOT-Objekte oder den channeld selber). Der Effekt ist, dass diese
+  // Objekte auf Ebenen senden duerfen, auf denen sie nicht zuhoeren.
   if (a < 2 && !IsChannelMember(ch, pl))
     return E_NOT_MEMBER;
 
@@ -990,6 +1003,7 @@
 // Wird aus der Shell gerufen, fuer das Erzmagier-Kommando "kill".
 public int remove_channel(string ch, object pl)
 {
+  //TODO: integrieren in access()?
   if (previous_object() != this_object())
   {
     if (!stringp(ch) ||
@@ -1037,6 +1051,7 @@
 // Wird aus der Shell aufgerufen, fuer das Erzmagier-Kommando "clear".
 public int clear_history(string ch)
 {
+  //TODO: mit access() vereinigen?
   // Sicherheitsabfragen
   if (previous_object() != this_object())
   {
@@ -1047,7 +1062,8 @@
       return E_ACCESS_DENIED;
   }
 
-  // History des Channels loeschen
+  // History des Channels loeschen (ohne die ebene als ganzes, daher Key nicht
+  // aus dem mapping loeschen.)
   if (pointerp(channelH[lower_case(ch)]))
     channelH[lower_case(ch)] = ({});