Closure access_cl nach Neuladen erzeugen.
Die Closures gehen nach Neuladen verloren, auch wenn
die Ebenen im MEMORY liegen. Daher muessen sie ggf.
neu erzeugt werden.
Change-Id: I4e3889d099ff569e893fa4e99632ae06b61270b7
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index b63e82c..443ad16 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -113,7 +113,7 @@
// Private Prototypen
public int join(string chname, object joining);
-
+private int assert_supervisor(struct channel_s ch);
/* CountUsers() zaehlt die Anzahl Abonnenten aller Ebenen. */
// TODO: Mapping- und Arrayvarianten bzgl. der Effizienz vergleichen
@@ -517,6 +517,16 @@
// haben, weil es ja neue Ebenen geben koennte, die dann erstellt werden
// muessen (verschwundete werden aber nicht aufgeraeumt!)
create_default_channels();
+ // Es muss fuer alle existierenden Ebenen die access_cl neu erstellt
+ // werden, die durch Neuladen des channeld verloren gingen, auch wenn die
+ // Ebenen im MEMORY lagen.
+ foreach(string chname, struct channel_s ch : channels)
+ {
+ if (ch.access_cl || !assert_supervisor(ch))
+ continue;
+ ch.access_cl = symbol_function("ch_check_access", ch.supervisor);
+ }
+
// <MasteR>-Ebene betreten, damit der channeld auf seine Kommandos auf
// dieser Ebene reagieren kann.
this_object()->join(CMNAME, this_object());