new(): immer auf inaktive Ebene pruefen.

Bislang wurden alte Daten nur uebernommen, wenn keine
Beschreibung angegeben wurde. Jetzt werden immer die
Stammdaten der alten, inaktiven Ebene als Default benutzt
und immer der creator und die Flags beibehalten.

Und wenn bei Reaktivierung von Ebenen (auch mit neuer
Beschreibung *g*) der neue supervisor != dem
urspruenglichen Ersteller der Ebene ist und das Flag
CHF_FIXED_SUPERVISOR gesetzt ist, wird die Reaktivierung
abgebrochen, damit niemand inaktive Ebenen und deren
History auf diesem Wege uebernehmen kann, d.h. den
Supervisor ersetzen kann.

Change-Id: If11c7939212629bd61ed436fa97acf02220aa66e
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index 781906f..facb554 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -844,22 +844,37 @@
   if (IsBanned(owner,C_NEW) || regmatch(object_name(owner), IGNORE))
     return E_ACCESS_DENIED;
 
+  // Zunaechst pruefen, ob eine alte, inaktive Ebene mit dem Namen noch
+  // existiert.
+  struct channel_base_s cbase = channelC[lower_case(ch_name)];
   struct channel_s ch;
-  // Keine Beschreibung mitgeliefert? Dann holen wir sie aus dem Cache.
-  if (!desc)
+  if (cbase)
   {
-    struct channel_base_s cbase = channelC[lower_case(ch_name)];
-    if (cbase)
-    {
-      ch = to_struct(cbase, (<channel_s>));
-    }
-    else
-    {
+    // Wenn bei Reaktivierung von Ebenen (auch mit neuer Beschreibung *g*) der
+    // neue owner != dem urspruenglichen Ersteller der Ebene ist und das Flag
+    // CHF_FIXED_SUPERVISOR gesetzt ist, wird die Reaktivierung abgebrochen,
+    // damit niemand inaktive Ebenen und deren History auf diesem Wege
+    // uebernehmen kann, d.h. den Supervisor ersetzen kann.
+    if ((cbase.flags & CHF_FIXED_SUPERVISOR)
+        && object_name(owner) != cbase.creator)
       return E_ACCESS_DENIED;
-    }
+    // Alte Daten der Ebene uebernehmen
+    ch = to_struct(cbase, (<channel_s>));
+    // Wenn eine Beschreibung uebergeben, dann ersetzt sie jetzt die alte
+    if (desc)
+      ch.desc = desc;
+    // creator bleibt natuerlich bestehen. Die Flags auch. Wir behalten auch
+    // die Schreibweise (Gross-/Kleinschreibung) des Namens aus
+    // Konsistenzgruenden bei.
   }
   else
   {
+    // Wenn keine Beschreibung und keine inaktive Ebene da ist, wirds nen
+    // Fehler...
+    if (!desc)
+      return E_ACCESS_DENIED;
+    // prima, alles da. Dann wird ein ganz frische neue Ebenenstruktur
+    // erzeugt.
     ch = (<channel_s> name: ch_name, desc: desc, creator: object_name(owner),
           flags: channel_flags);
   }
@@ -885,6 +900,11 @@
   if (!pointerp(channelH[ch_name]))
     channelH[ch_name] = ({});
 
+  // Datenstruktur einer ggf. inaktiven Ebene mit dem Namen in channelC kann
+  // jetzt auch weg.
+  if (cbase)
+    m_delete(channelC, ch_name);
+
   // Erstellen neuer Ebenen loggen, wenn wir nicht selbst der Ersteller sind.
   if (owner != this_object())
     log_file("CHANNEL.new", sprintf("[%s] Neue Ebene %s: %O %O\n",