Ebenenflags eingefuehrt.
Die Ebenenflags koennen zukuenftig bestimmtes Verhalten
steuern. Diese werden aus dem channeld.init ausgelesen,
und via setup() an new() durchgereicht. Sie koennen aber
auch bei direktem Aufruf von new() angegeben werden.
Zunaechst ist ein Flag CHF_FIXED_SUPERVISOR vorgesehen,
welches verhindert, dass der Supervisor wechseln kann.
Das CHF_FIXED_SUPERVISOR haben zunaechst alle Ebenen im
channeld.init gesetzt bekommen, welche irgendwelchen
Zugriffslevel oder -flags definieren.
Change-Id: Id9e4e012d8060316e51d2fa8c505a33ec578d7be
diff --git a/p/daemon/channel.h b/p/daemon/channel.h
index 8c42ca9..c86d6c6 100644
--- a/p/daemon/channel.h
+++ b/p/daemon/channel.h
@@ -33,6 +33,9 @@
#define C_LIST "list"
#define C_FIND "find"
+// Flags
+#define CHF_FIXED_SUPERVISOR 1 // Kein Wechsel des SV erlaubt
+
#endif //__DAEMON_CHANNEL_H__
// prototypes
@@ -40,7 +43,8 @@
#ifndef __CHANNEL_H_PROTO__
#define __CHANNEL_H_PROTO__
-public varargs int new(string ch_name, object owner, string|closure info);
+public varargs int new(string ch_name, object owner, string|closure desc,
+ int channel_flags);
public varargs int send(string chname, object pl, string msg, int type);
#endif //__CHANNEL_H_PROTO__
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index 15bdddf..25a0a7a 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -36,8 +36,8 @@
struct channel_base_s {
string name; // readable channelname, case-sensitive
string|closure desc; // stat. oder dyn. Beschreibung
- string creator; // Ersteller der Ebene (Objektname)
-// int flags; // Flags, die weiteres Verhalten steuern.
+ string creator; // Ersteller der Ebene (Objektname), Original-SV
+ int flags; // Flags, die bestimmtes Verhalten steuern.
};
// Basisdaten + die von aktiven Ebenen
@@ -367,12 +367,13 @@
// setup() -- set up a channel and register it
// arguments are stored in the following order:
// string* chinfo = ({ channel_name, receive_level, send_level,
-// adminflags, description, supervisor })
+// adminflags, channelflags, description,supervisor })
private void setup(string* chinfo)
{
string desc = "- Keine Beschreibung -";
object supervisor = this_object();
int sv_recv, sv_send, sv_flags; // an den Supervisor weiterreichen
+ int chflags;
if (sizeof(chinfo) && sizeof(chinfo[0]) > 1 && chinfo[0][0] == '\\')
chinfo[0] = chinfo[0][1..];
@@ -381,13 +382,15 @@
{
// Alle Fallthroughs in dem switch() sind Absicht.
default:
- if (stringp(chinfo[5]) && sizeof(chinfo[5]))
- catch(supervisor = load_object(chinfo[5]); publish);
+ if (stringp(chinfo[6]) && sizeof(chinfo[6]))
+ catch(supervisor = load_object(chinfo[6]); publish);
if (!objectp(supervisor))
supervisor = this_object();
+ case 6:
+ if (stringp(chinfo[5]))
+ desc = chinfo[5];
case 5:
- if (stringp(chinfo[4]) || closurep(chinfo[4]))
- desc = chinfo[4];
+ chflags = to_int(chinfo[4]);
case 4:
sv_flags = to_int(chinfo[3]);
case 3:
@@ -405,7 +408,7 @@
supervisor->ch_supervisor_setup(lower_case(chinfo[0]), sv_recv,
sv_send, sv_flags);
- if (new(chinfo[0], supervisor, desc) == E_ACCESS_DENIED)
+ if (new(chinfo[0], supervisor, desc, chflags) == E_ACCESS_DENIED)
{
log_file("CHANNEL", sprintf("[%s] %s: %O: error, access denied\n",
dtime(time()), chinfo[0], supervisor));
@@ -814,14 +817,9 @@
// Das Objekt <owner> kann eine Funktion check_ch_access() definieren, die
// gerufen wird, wenn eine Ebenenaktion vom Typ join/leave/send/list/users
// eingeht.
-// check_ch_access() dient der Zugriffskontrolle und entscheidet, ob die
-// Nachricht gesendet werden darf oder nicht.
#define IGNORE "^/xx"
-
-// TODO: KOMMENTAR
-//check may contain a closure
-// called when a join/leave/send/list/users message is received
-public varargs int new(string ch_name, object owner, string|closure desc)
+public varargs int new(string ch_name, object owner, string|closure desc,
+ int channel_flags)
{
// Kein Channelmaster angegeben, oder wir sind es selbst, aber der Aufruf
// kam von ausserhalb. (Nur der channeld selbst darf sich als Channelmaster
@@ -859,8 +857,8 @@
}
else
{
- ch = (<channel_s> name: ch_name, desc: desc, creator: object_name(owner)
- );
+ ch = (<channel_s> name: ch_name, desc: desc, creator: object_name(owner),
+ flags: channel_flags);
}
ch_name = lower_case(ch_name);
@@ -873,6 +871,8 @@
//bauen, die *nicht* im Supervisor liegt? IMHO nein! Es ist ein
//merkwuerdiges Konzept, dass der channeld Rechte fuer ne Ebene
//pruefen soll, die nen anderes Objekt als Supervisor haben.
+ // check_ch_access() dient der Zugriffskontrolle und entscheidet, ob die
+ // Nachricht gesendet werden darf oder nicht.
ch.access_cl = symbol_function("check_ch_access", owner) || #'check_ch_access;
m_add(channels, ch_name, ch);
diff --git a/p/daemon/channeld.init b/p/daemon/channeld.init
index debe70b..e8695b3 100644
--- a/p/daemon/channeld.init
+++ b/p/daemon/channeld.init
@@ -1,65 +1,65 @@
# CHANNEL MASTER INIT FILE
# To create a new channel:
-# <name>:<recv>:<send>:<accessflags>:<desc>:<supervisor>
-Allgemein: 0: 0: 0:Allgemeine Unterhaltungsebene
-Abenteuer: 0: 0: 0:Fragen die Abenteuer betreffen: /secure/questmaster
-Grats: 0: 0: 0:Gratulationen zu geloesten Abenteuern etc
-Beileid: 0: 0: 0:Beileidsbekundungen jeglicher Art
-Fraternitas: 0: 0: 0:Fraternitas dono Archmagorum
-Tod: 0:-1: 0:Wer stirbt wann?:/room/death/death_room
-TdT: 15:15:1:Tod den Testies!:/room/death/death_room
-Moerder: 0:-1: 0:Guck mal wer da spricht...: /std/corpse
-Seher: 1: 1: 1:Diskussionsebene fuer Seher
-ZT: 0: 0: 0:Nuetzliche Tips fuer die Zaubertranksuche
+# <name>:<recv>:<send>:<accessflags>:<channelflags>:<desc>:<supervisor>
+Allgemein: 0: 0: 0: 0:Allgemeine Unterhaltungsebene
+Abenteuer: 0: 0: 0: 0:Fragen die Abenteuer betreffen:/secure/questmaster
+Grats: 0: 0: 0: 0:Gratulationen zu geloesten Abenteuern etc
+Beileid: 0: 0: 0: 0:Beileidsbekundungen jeglicher Art
+Fraternitas: 0: 0: 0: 0:Fraternitas dono Archmagorum
+Tod: 0:-1: 0: 1:Wer stirbt wann?:/room/death/death_room
+TdT: 15:15:1: 1:Tod den Testies!:/room/death/death_room
+Moerder: 0:-1: 0: 0:Guck mal wer da spricht...:/std/corpse
+Seher: 1: 1: 1: 1:Diskussionsebene fuer Seher
+ZT: 0: 0: 0: 0:Nuetzliche Tips fuer die Zaubertranksuche
#
# Guild channels
#
-Klerus: 0: 0: 0:Die Priester: /gilden/klerus
-Bierschuettler: 0: 0: 0:Die Bierschuettler: /gilden/bierschuettler
-Werwoelfe: 0: 0: 0:Die Werwoelfe: /gilden/werwoelfe
-AbGilde: 0: 0: 0:Abenteurer, und solche, die es werden wollen: /gilden/abenteurer
-Zauberer: 0: 0: 0:Die Zauberer: /gilden/zauberer
-Tanjian: 0: 0: 0:Die Tanjian: /gilden/tanjian
-Karate: 0: 0: 0:Die Karateka: /gilden/karate
-Chaos: 0: 0: 0:Chaoten...: /gilden/chaos
-Trves: 0: 0: 0:Neues vom Koru Tschakar Struv: /p/kaempfer/std/k_master
-Magus: 0: 0: 0:Der magische Convent zu Castalla Rosso: /gilden/magus
-Dunkelelfen: 0: 0: 0:Die Dunkelelfen: /gilden/dunkelelfen
-Uruk-Hai: 0: 0: 0:Fuer echte Orks: /gilden/urukhai
+Klerus: 0: 0: 0: 0:Die Priester:/gilden/klerus
+Bierschuettler: 0: 0: 0: 0:Die Bierschuettler:/gilden/bierschuettler
+Werwoelfe: 0: 0: 0: 0:Die Werwoelfe:/gilden/werwoelfe
+AbGilde: 0: 0: 0: 0:Abenteurer, und solche, die es werden wollen:/gilden/abenteurer
+Zauberer: 0: 0: 0: 0:Die Zauberer:/gilden/zauberer
+Tanjian: 0: 0: 0: 0:Die Tanjian:/gilden/tanjian
+Karate: 0: 0: 0: 0:Die Karateka:/gilden/karate
+Chaos: 0: 0: 0: 0:Chaoten...:/gilden/chaos
+Trves: 0: 0: 0: 0:Neues vom Koru Tschakar Struv:/p/kaempfer/std/k_master
+Magus: 0: 0: 0: 0:Der magische Convent zu Castalla Rosso:/gilden/magus
+Dunkelelfen: 0: 0: 0: 0:Die Dunkelelfen:/gilden/dunkelelfen
+Uruk-Hai: 0: 0: 0: 0:Fuer echte Orks:/gilden/urukhai
#
# Wizard channels
#
-Magier: 15:15: 1:Diskussionsebene fuer Magier
-Erzmagier: 60:60: 1:Erzmagier
-Goetter: 100:100: 1:Goetter
-LPC: 15:15: 1:Fragen zur Programmierung und LPC
+Magier: 15 :15: 1: 1:Diskussionsebene fuer Magier
+Erzmagier: 60 :60: 1: 1:Erzmagier
+Goetter: 100:100:1: 1:Goetter
+LPC: 15 :15: 1: 1:Fragen zur Programmierung und LPC
#
-Debug: 20:60: 1:Debug und Fehlermeldungen: /p/daemon/debug
-Entwicklung: 20:60:1:Fehler rund um Eigenentwicklungen: /p/daemon/debug
-Warnungen: 20:60:1:Laufzeit-Warnungen: /p/daemon/debug
-Snoop: 60:-1: 1:Wer snoopt denn hier?: /secure/simul_efun/simul_efun
-FTP: 60:-1: 1:Wer macht denn FTP?: /secure/bbmaster
+Debug: 20:60: 1: 1:Debug und Fehlermeldungen:/p/daemon/debug
+Entwicklung:20:60: 1: 1:Fehler rund um Eigenentwicklungen:/p/daemon/debug
+Warnungen: 20:60: 1: 1:Laufzeit-Warnungen:/p/daemon/debug
+Snoop: 60:-1: 1: 1:Wer snoopt denn hier?:/secure/simul_efun/simul_efun
+FTP: 60:-1: 1: 1:Wer macht denn FTP?:/secure/bbmaster
#
# Intermud channels
#
-Intermud: 0: 5: 2:Intermud chat (Englisch): /secure/udp/channel
-Intercode: 20:20: 3:Programmierfragen (Englisch): /secure/udp/channel
-Interadmin: 45:55: 3:Administration (Englisch): /secure/udp/channel
-D-chat: 0: 5: 2:Verbindet Deutsche MUDs: /secure/udp/channel
-D-linux: 0: 5: 2:Linux im D-Chat: /secure/udp/channel
-D-tv-alles: 0: 5: 2:Deutsches TV Programm: /secure/udp/channel
-D-news: 0: 5: 2:Deutsches Nachrichten: /secure/udp/channel
-D-code: 20:20: 3:MUD Programmier Forum: /secure/udp/channel
-D-adm: 60:60: 3:Deutschsprachige Administration: /secure/udp/channel
+Intermud: 0: 5: 2: 1:Intermud chat (Englisch):/secure/udp/channel
+Intercode: 20:20: 3: 1:Programmierfragen (Englisch):/secure/udp/channel
+Interadmin: 45:55: 3: 1:Administration (Englisch):/secure/udp/channel
+D-chat: 0: 5: 2: 1:Verbindet Deutsche MUDs:/secure/udp/channel
+D-linux: 0: 5: 2: 1:Linux im D-Chat:/secure/udp/channel
+D-tv-alles: 0: 5: 2: 1:Deutsches TV Programm:/secure/udp/channel
+D-news: 0: 5: 2: 1:Deutsches Nachrichten:/secure/udp/channel
+D-code: 20:20: 3: 1:MUD Programmier Forum:/secure/udp/channel
+D-adm: 60:60: 3: 1:Deutschsprachige Administration:/secure/udp/channel
#
# special
#
-Wissenschaft:0: 0: 0:Wissenschaftliche Dispute
-Kultur: 0: 0: 0:Kulturelle Ereignisse und Erguesse
-Sport: 0: 0: 0:Sport und Spiel
-Anfaenger: 0: 0: 0:Die Ebene fuer Anfaengerfragen
-twitter: 0: 0: 1:Ein Vogel im Mud?: /secure/misc/twitter
+Wissenschaft:0: 0: 0: 0:Wissenschaftliche Dispute
+Kultur: 0: 0: 0: 0:Kulturelle Ereignisse und Erguesse
+Sport: 0: 0: 0: 0:Sport und Spiel
+Anfaenger: 0: 0: 0: 0:Die Ebene fuer Anfaengerfragen
+twitter: 0: 0: 1: 1:Ein Vogel im Mud?: /secure/misc/twitter
#
# Gebietspezifisches
#
-Metzelorakel:0: 0: 0:Fuer die Metzelwuetigen: /d/ebene/arathorn/orakel/secure/schamane
+Metzelorakel:0: 0: 0: 0:Fuer die Metzelwuetigen:/d/ebene/arathorn/orakel/secure/schamane
diff --git a/p/daemon/channeld.init.testmud b/p/daemon/channeld.init.testmud
index 4dc4195..ea9696d 100644
--- a/p/daemon/channeld.init.testmud
+++ b/p/daemon/channeld.init.testmud
@@ -1,8 +1,8 @@
# CHANNEL MASTER INIT FILE
# To create a new channel:
-# <name>:<recv>:<send>:<accessflags>:<desc>:<supervisor>
+# <name>:<recv>:<send>:<accessflags>:<channelflags>:<desc>:<supervisor>
#
# Debug-Ebenen initialisieren.
-Debug: 20:60: 1:Debug und Fehlermeldungen: /p/daemon/debug
-Entwicklung: 20:60:1:Fehler rund um Eigenentwicklungen: /p/daemon/debug
-Warnungen: 20:60:1:Laufzeit-Warnungen: /p/daemon/debug
+Debug: 20:60:1:1:Debug und Fehlermeldungen:/p/daemon/debug
+Entwicklung: 20:60:1:1:Fehler rund um Eigenentwicklungen:/p/daemon/debug
+Warnungen: 20:60:1:1:Laufzeit-Warnungen:/p/daemon/debug