From f95401b73d6f0c34dd00639be58fa8731e6959e9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Fri, 17 Apr 2009 00:44:52 +0000 Subject: [PATCH] * give all commands their own function * evade rumpelstilskin-lookup in favour of module registration commands * replace linked list of commands by 4-char-hash. --- citadel/citserver.c | 419 ++++------------------- citadel/citserver.h | 14 +- citadel/control.c | 15 + citadel/euidindex.c | 9 +- citadel/file_ops.c | 27 +- citadel/file_ops.h | 14 +- citadel/include/ctdl_module.h | 1 - citadel/mk_module_init.sh | 20 ++ citadel/modules/calendar/serv_calendar.c | 4 +- citadel/modules/crypto/serv_crypto.c | 2 - citadel/msgbase.c | 25 ++ citadel/msgbase.h | 2 +- citadel/policy.c | 11 + citadel/room_ops.c | 38 +- citadel/room_ops.h | 23 +- citadel/serv_extensions.c | 81 ++--- citadel/user_ops.c | 45 ++- citadel/user_ops.h | 22 +- 18 files changed, 280 insertions(+), 492 deletions(-) diff --git a/citadel/citserver.c b/citadel/citserver.c index d4bb9cc66..df75a28a0 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -343,7 +343,7 @@ char CtdlCheckExpress(void) { } } -void cmd_time(void) +void cmd_time(char *argbuf) { time_t tv; struct tm tmp; @@ -781,7 +781,7 @@ void cmd_term(char *cmdbuf) /* * get the paginator prompt */ -void cmd_more(void) { +void cmd_more(char *argbuf) { cprintf("%d %s\n", CIT_OK, config.c_moreprompt); } @@ -863,7 +863,7 @@ void cmd_down(char *argbuf) { /* * Halt the server without exiting the server process. */ -void cmd_halt(void) { +void cmd_halt(char *argbuf) { if (CtdlAccessCheck(ac_aide)) return; @@ -1016,6 +1016,28 @@ void citproto_begin_session() { +void cmd_noop(char *argbuf) +{ + cprintf("%d%cok\n", CIT_OK, CtdlCheckExpress() ); +} + +void cmd_qnop(char *argbuf) +{ + /* do nothing, this command returns no response */ +} + +void cmd_quit(char *argbuf) +{ + cprintf("%d Goodbye.\n", CIT_OK); + CC->kill_me = 1; +} + +void cmd_lout(char *argbuf) +{ + if (CC->logged_in) + logout(); + cprintf("%d logged out.\n", CIT_OK); +} /* * This loop recognizes all server commands. @@ -1070,363 +1092,9 @@ void do_command_loop(void) { CC->cs_flags &= ~CS_POSTING; } - if (!strncasecmp(cmdbuf, "NOOP", 4)) { - cprintf("%d%cok\n", CIT_OK, CtdlCheckExpress() ); - } - - else if (!strncasecmp(cmdbuf, "QNOP", 4)) { - /* do nothing, this command returns no response */ - } - - else if (!strncasecmp(cmdbuf,"QUIT",4)) { - cprintf("%d Goodbye.\n", CIT_OK); - CC->kill_me = 1; - } - - else if (!strncasecmp(cmdbuf,"ASYN",4)) { - cmd_asyn(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LOUT",4)) { - if (CC->logged_in) logout(); - cprintf("%d logged out.\n", CIT_OK); - } - - else if (!strncasecmp(cmdbuf,"USER",4)) { - cmd_user(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"PASS",4)) { - cmd_pass(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"NEWU",4)) { - cmd_newu(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"CREU",4)) { - cmd_creu(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"SETP",4)) { - cmd_setp(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LRMS",4)) { - cmd_lrms(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LKRA",4)) { - cmd_lkra(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LKRN",4)) { - cmd_lkrn(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LKRO",4)) { - cmd_lkro(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LZRM",4)) { - cmd_lzrm(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LPRM",4)) { - cmd_lprm(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"GETU",4)) { - cmd_getu(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"SETU",4)) { - cmd_setu(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"GOTO",4)) { - cmd_goto(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MSGS",4)) { - cmd_msgs(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"WHOK",4)) { - cmd_whok(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"RDIR",4)) { - cmd_rdir(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"EUID",4)) { - cmd_euid(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MSG0",4)) { - cmd_msg0(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MSG2",4)) { - cmd_msg2(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MSG3",4)) { - cmd_msg3(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MSG4",4)) { - cmd_msg4(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MSGP",4)) { - cmd_msgp(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"OPNA",4)) { - cmd_opna(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"DLAT",4)) { - cmd_dlat(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"INFO",4)) { - cmd_info(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"SLRP",4)) { - cmd_slrp(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"INVT",4)) { - cmd_invt_kick(&cmdbuf[5], 1); - } - - else if (!strncasecmp(cmdbuf,"KICK",4)) { - cmd_invt_kick(&cmdbuf[5], 0); - } - - else if (!strncasecmp(cmdbuf,"GETR",4)) { - cmd_getr(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"SETR",4)) { - cmd_setr(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"GETA",4)) { - cmd_geta(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"SETA",4)) { - cmd_seta(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"ENT0",4)) { - cmd_ent0(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"RINF",4)) { - cmd_rinf(); - } - - else if (!strncasecmp(cmdbuf,"DELE",4)) { - cmd_dele(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"KILL",4)) { - cmd_kill(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"CRE8",4)) { - cmd_cre8(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MOVE",4)) { - cmd_move(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"FORG",4)) { - cmd_forg(); - } - - else if (!strncasecmp(cmdbuf,"MESG",4)) { - cmd_mesg(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"EMSG",4)) { - cmd_emsg(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"GNUR",4)) { - cmd_gnur(); - } - - else if (!strncasecmp(cmdbuf,"VALI",4)) { - cmd_vali(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"EINF",4)) { - cmd_einf(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LIST",4)) { - cmd_list(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"CHEK",4)) { - cmd_chek(); - } - - else if (!strncasecmp(cmdbuf,"DELF",4)) { - cmd_delf(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MOVF",4)) { - cmd_movf(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"OPEN",4)) { - cmd_open(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"CLOS",4)) { - cmd_clos(); - } - - else if (!strncasecmp(cmdbuf,"UOPN",4)) { - cmd_uopn(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"UCLS",4)) { - cmd_ucls(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"READ",4)) { - cmd_read(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"WRIT",4)) { - cmd_writ(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"QUSR",4)) { - cmd_qusr(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"ECHO",4)) { - cmd_echo(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"OIMG",4)) { - cmd_oimg(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"MORE",4)) { - cmd_more(); - } - - else if (!strncasecmp(cmdbuf,"NDOP",4)) { - cmd_ndop(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"NUOP",4)) { - cmd_nuop(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"LFLR",4)) { - cmd_lflr(); - } - - else if (!strncasecmp(cmdbuf,"CFLR",4)) { - cmd_cflr(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"KFLR",4)) { - cmd_kflr(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"EFLR",4)) { - cmd_eflr(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"IDEN",4)) { - cmd_iden(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"IPGM",4)) { - cmd_ipgm(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"TERM",4)) { - cmd_term(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"DOWN",4)) { - cmd_down(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf,"HALT",4)) { - cmd_halt(); - } - - else if (!strncasecmp(cmdbuf,"SCDN",4)) { - cmd_scdn(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "UIMG", 4)) { - cmd_uimg(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "TIME", 4)) { - cmd_time(); - } - - else if (!strncasecmp(cmdbuf, "AGUP", 4)) { - cmd_agup(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "ASUP", 4)) { - cmd_asup(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "GPEX", 4)) { - cmd_gpex(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "SPEX", 4)) { - cmd_spex(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "CONF", 4)) { - cmd_conf(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "SEEN", 4)) { - cmd_seen(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "GTSN", 4)) { - cmd_gtsn(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "VIEW", 4)) { - cmd_view(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "ISME", 4)) { - cmd_isme(&cmdbuf[5]); - } - - else if (!strncasecmp(cmdbuf, "RENU", 4)) { - cmd_renu(&cmdbuf[5]); - } - - else if (!DLoader_Exec_Cmd(cmdbuf)) { + if (!DLoader_Exec_Cmd(cmdbuf)) { cprintf("%d Unrecognized or unsupported command.\n", ERROR + CMD_NOT_SUPPORTED); - } + } unbuffer_output(); @@ -1442,3 +1110,36 @@ void do_command_loop(void) { void do_async_loop(void) { PerformSessionHooks(EVT_ASYNC); } + + + + + + + +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ + +CTDL_MODULE_INIT(citserver) +{ + CtdlRegisterProtoHook(cmd_noop, "NOOP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_qnop, "QNOP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_quit, "QUIT", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_lout, "LOUT", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_asyn, "ASYN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_info, "INFO", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_mesg, "MESG", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_emsg, "EMSG", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_echo, "ECHO", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_more, "MORE", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_iden, "IDEN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_ipgm, "IPGM", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_term, "TERM", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_down, "DOWN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_halt, "HALT", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_scdn, "SCDN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_time, "TIME", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/citserver.h b/citadel/citserver.h index 5b08b7863..59586a44b 100644 --- a/citadel/citserver.h +++ b/citadel/citserver.h @@ -19,19 +19,6 @@ void master_cleanup (int exitcode); void RemoveContext (struct CitContext *); void set_wtmpsupp (char *newtext); void set_wtmpsupp_to_current_room(void); -void cmd_info (char *cmdbuf); -void cmd_time (void); -void cmd_iden (char *argbuf); -void cmd_mesg (char *mname); -void cmd_emsg (char *mname); -void cmd_term (char *cmdbuf); -void cmd_more (void); -void cmd_echo (char *etext); -void cmd_ipgm (char *argbuf); -void cmd_down (char *argbuf); -void cmd_halt (void); -void cmd_scdn (char *argbuf); -void cmd_extn (char *argbuf); void do_command_loop(void); void do_async_loop(void); void begin_session(struct CitContext *con); @@ -57,3 +44,4 @@ enum { extern time_t server_startup_time; + diff --git a/citadel/control.c b/citadel/control.c index 03ffa7c75..85bef8f3b 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -47,6 +47,8 @@ #include "snprintf.h" #endif +#include "ctdl_module.h" + struct CitControl CitControl; extern struct config config; FILE *control_fp = NULL; @@ -696,3 +698,16 @@ void cmd_conf(char *argbuf) ERROR + ILLEGAL_VALUE); } } + + +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ + + +CTDL_MODULE_INIT(control) +{ + CtdlRegisterProtoHook(cmd_conf, "CONF", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/euidindex.c b/citadel/euidindex.c index ce9ebd350..2dac3730f 100644 --- a/citadel/euidindex.c +++ b/citadel/euidindex.c @@ -44,6 +44,8 @@ #include "control.h" #include "euidindex.h" +#include "ctdl_module.h" + /* * The structure of an euidindex record *key* is: * @@ -250,4 +252,9 @@ void cmd_euid(char *cmdbuf) { cprintf("%d not found\n", ERROR + MESSAGE_NOT_FOUND); } - +CTDL_MODULE_INIT(euidindex) +{ + CtdlRegisterProtoHook(cmd_euid, "EUID", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/file_ops.c b/citadel/file_ops.c index 1424e33e1..8fcc068bf 100644 --- a/citadel/file_ops.c +++ b/citadel/file_ops.c @@ -45,6 +45,8 @@ #include "snprintf.h" #endif +#include "ctdl_module.h" + /* * network_talking_to() -- concurrency checker */ @@ -516,7 +518,7 @@ void cmd_uimg(char *cmdbuf) /* * close the download file */ -void cmd_clos(void) +void cmd_clos(char *cmdbuf) { char buf[256]; @@ -769,3 +771,26 @@ void cmd_nuop(char *cmdbuf) CC->upload_type = UPL_NET; cprintf("%d Ok\n", CIT_OK); } + + +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ + +CTDL_MODULE_INIT(file_ops) +{ + CtdlRegisterProtoHook(cmd_delf, "DELF", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_movf, "MOVF", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_open, "OPEN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_clos, "CLOS", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_uopn, "UOPN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_ucls, "UCLS", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_read, "READ", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_writ, "WRIT", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_oimg, "OIMG", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_ndop, "NDOP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_nuop, "NUOP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_uimg, "UIMG", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/file_ops.h b/citadel/file_ops.h index f2110caab..6f95c1374 100644 --- a/citadel/file_ops.h +++ b/citadel/file_ops.h @@ -1,19 +1,7 @@ /* $Id$ */ -void cmd_delf (char *filename); -void cmd_movf (char *cmdbuf); -void cmd_netf (char *cmdbuf); void OpenCmdResult (char *, const char *); -void cmd_open (char *cmdbuf); -void cmd_oimg (char *cmdbuf); -void cmd_uopn (char *cmdbuf); -void cmd_uimg (char *cmdbuf); -void cmd_clos (void); void abort_upl (struct CitContext *who); -void cmd_ucls (char *cmd); -void cmd_read (char *cmdbuf); -void cmd_writ (char *cmdbuf); -void cmd_ndop (char *cmdbuf); -void cmd_nuop (char *cmdbuf); + int network_talking_to(char *nodename, int operation); /* diff --git a/citadel/include/ctdl_module.h b/citadel/include/ctdl_module.h index 754b2e146..e7a9510e9 100644 --- a/citadel/include/ctdl_module.h +++ b/citadel/include/ctdl_module.h @@ -64,7 +64,6 @@ void CtdlRegisterCleanupHook(void (*fcn_ptr)(void)); void CtdlUnregisterCleanupHook(void (*fcn_ptr)(void)); void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc); -void CtdlUnregisterProtoHook(void (*handler)(char *), char *cmd); void CtdlRegisterServiceHook(int tcp_port, char *sockpath, diff --git a/citadel/mk_module_init.sh b/citadel/mk_module_init.sh index 4969208d5..4bc379aff 100755 --- a/citadel/mk_module_init.sh +++ b/citadel/mk_module_init.sh @@ -121,6 +121,17 @@ void initialise_modules (int threading) CtdlLogPrintf (CTDL_INFO, "Initialise modules, CtdlThreads enabled.\n"); else CtdlLogPrintf (CTDL_INFO, "Initialise modules, CtdlThreads not yet enabled.\n"); +/* static server initialization: */ + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(citserver)); + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(control)); + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(euidindex)); + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(file_ops)); + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(msgbase)); + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(policy)); + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(room_ops)); + CtdlLogPrintf (CTDL_INFO, "%s\n", CTDL_INIT_CALL(user_ops)); +/* dynamic modules: */ + EOF @@ -138,6 +149,15 @@ cat < $H_FILE extern size_t nSizErrmsg; void initialise_modules (int threading); void upgrade_modules(void); + + CTDL_MODULE_INIT(citserver); + CTDL_MODULE_INIT(control); + CTDL_MODULE_INIT(euidindex); + CTDL_MODULE_INIT(file_ops); + CTDL_MODULE_INIT(msgbase); + CTDL_MODULE_INIT(policy); + CTDL_MODULE_INIT(room_ops); + CTDL_MODULE_INIT(user_ops); EOF for i in serv_*.c diff --git a/citadel/modules/calendar/serv_calendar.c b/citadel/modules/calendar/serv_calendar.c index 7e5160631..094ab1308 100644 --- a/citadel/modules/calendar/serv_calendar.c +++ b/citadel/modules/calendar/serv_calendar.c @@ -1988,9 +1988,9 @@ void ical_send_out_invitations(icalcomponent *top_level_cal, icalcomponent *cal) size_t reqsize; icalproperty *p; struct icaltimetype t; - icaltimezone *attached_zones[5] = { NULL, NULL, NULL, NULL, NULL }; + const icaltimezone *attached_zones[5] = { NULL, NULL, NULL, NULL, NULL }; int i; - icaltimezone *z; + const icaltimezone *z; int num_zones_attached = 0; int zone_already_attached; diff --git a/citadel/modules/crypto/serv_crypto.c b/citadel/modules/crypto/serv_crypto.c index 0fbf27282..70d9aab94 100644 --- a/citadel/modules/crypto/serv_crypto.c +++ b/citadel/modules/crypto/serv_crypto.c @@ -56,8 +56,6 @@ static unsigned long id_callback(void) void destruct_ssl(void) { int a; - CtdlUnregisterProtoHook(cmd_stls, "STLS"); - CtdlUnregisterProtoHook(cmd_gtls, "GTLS"); for (a = 0; a < CRYPTO_num_locks(); a++) free(SSLCritters[a]); free (SSLCritters); diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 2a4a8b109..cde4e1eca 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -54,6 +54,8 @@ #include "serv_network.h" #include "threads.h" +#include "ctdl_module.h" + long config_msgnum; struct addresses_to_be_filed *atbf = NULL; @@ -4694,3 +4696,26 @@ void cmd_isme(char *argbuf) { } } + + +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ + +CTDL_MODULE_INIT(msgbase) +{ + CtdlRegisterProtoHook(cmd_msgs, "MSGS", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_msg0, "MSG0", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_msg2, "MSG2", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_msg3, "MSG3", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_msg4, "MSG4", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_msgp, "MSGP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_opna, "OPNA", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_dlat, "DLAT", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_ent0, "ENT0", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_dele, "DELE", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_move, "MOVE", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_isme, "ISME", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/msgbase.h b/citadel/msgbase.h index 60993254c..9786cfd3f 100644 --- a/citadel/msgbase.h +++ b/citadel/msgbase.h @@ -3,7 +3,7 @@ #ifndef MSGBASE_H #define MSGBASE_H -#define aide_message(text, subject) quickie_message("Citadel",NULL,NULL,AIDEROOM,text,0,subject) +#define aide_message(text, subject) quickie_message("Citadel",NULL,NULL,AIDEROOM,text,FMT_CITADEL,subject) enum { MSGS_ALL, diff --git a/citadel/policy.c b/citadel/policy.c index 226e985dc..dd1b7994b 100644 --- a/citadel/policy.c +++ b/citadel/policy.c @@ -35,6 +35,7 @@ #include "msgbase.h" #include "citserver.h" +#include "ctdl_module.h" /* * Retrieve the applicable expire policy for a specific room @@ -178,4 +179,14 @@ void cmd_spex(char *argbuf) { } +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ +CTDL_MODULE_INIT(policy) +{ + CtdlRegisterProtoHook(cmd_gpex, "GPEX", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_spex, "SPEX", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/room_ops.c b/citadel/room_ops.c index eeaf10d96..c97beb1c2 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.c @@ -42,6 +42,8 @@ #include "citadel_dirs.h" #include "threads.h" +#include "ctdl_module.h" + struct floor *floorcache[MAXFLOORS]; /* @@ -1559,7 +1561,7 @@ void cmd_seta(char *new_ra) /* * retrieve info file for this room */ -void cmd_rinf(void) +void cmd_rinf(char *gargs) { char filename[128]; char buf[SIZ]; @@ -2000,7 +2002,7 @@ void cmd_einf(char *ok) /* * cmd_lflr() - List all known floors */ -void cmd_lflr(void) +void cmd_lflr(char *gargs) { int a; struct floor flbuf; @@ -2157,3 +2159,35 @@ void cmd_eflr(char *argbuf) cprintf("%d Ok\n", CIT_OK); } + + +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ + +CTDL_MODULE_INIT(room_ops) +{ + CtdlRegisterProtoHook(cmd_lrms, "LRMS", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_lkra, "LKRA", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_lkrn, "LKRN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_lkro, "LKRO", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_lzrm, "LZRM", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_lprm, "LPRM", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_goto, "GOTO", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_whok, "WHOK", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_rdir, "RDIR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_getr, "GETR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_setr, "SETR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_geta, "GETA", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_seta, "SETA", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_rinf, "RINF", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_kill, "KILL", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_cre8, "CRE8", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_einf, "EINF", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_lflr, "LFLR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_cflr, "CFLR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_kflr, "KFLR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_eflr, "EFLR", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/room_ops.h b/citadel/room_ops.h index 71e8dac06..d099459c1 100644 --- a/citadel/room_ops.h +++ b/citadel/room_ops.h @@ -17,23 +17,8 @@ void lgetfloor (struct floor *flbuf, int floor_num); void putfloor (struct floor *flbuf, int floor_num); void lputfloor (struct floor *flbuf, int floor_num); int sort_msglist (long int *listptrs, int oldcount); -void cmd_lrms (char *argbuf); -void cmd_lkra (char *argbuf); -void cmd_lkrn (char *argbuf); -void cmd_lkro (char *argbuf); -void cmd_lzrm (char *argbuf); -void cmd_lprm (char *argbuf); void usergoto (char *where, int display_result, int transiently, int *msgs, int *new); -void cmd_goto (char *gargs); -void cmd_whok (char *cmdbuf); -void cmd_rdir (char *cmdbuf); -void cmd_getr (char *cmdbuf); -void cmd_setr (char *args); -void cmd_geta (char *cmdbuf); -void cmd_seta (char *new_ra); -void cmd_rinf (void); -void cmd_kill (char *argbuf); unsigned create_room(char *new_room_name, int new_room_type, char *new_room_pass, @@ -41,12 +26,6 @@ unsigned create_room(char *new_room_name, int really_create, int avoid_access, int new_room_view); -void cmd_cre8 (char *args); -void cmd_einf (char *ok); -void cmd_lflr (void); -void cmd_cflr (char *argbuf); -void cmd_kflr (char *argbuf); -void cmd_eflr (char *argbuf); void ForEachRoom(void (*CallBack)(struct ctdlroom *EachRoom, void *out_data), void *in_data); void schedule_room_for_deletion(struct ctdlroom *qrbuf); @@ -70,3 +49,5 @@ enum { crr_invalid_floor, /* target floor does not exist */ crr_access_denied /* not allowed to edit this room */ }; + + diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index 0c4c4dc0f..115b6769b 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -46,10 +46,11 @@ struct SearchFunctionHook *SearchFunctionHookTable = NULL; struct ProtoFunctionHook { void (*handler) (char *cmdbuf); - char *cmd; - char *desc; - struct ProtoFunctionHook *next; -} *ProtoHookList = NULL; + const char *cmd; + const char *desc; +}; + +HashList *ProtoHookList = NULL; struct DirectoryServiceHook { @@ -193,22 +194,37 @@ void AddPortError(char *Port, char *ErrorMessage) int DLoader_Exec_Cmd(char *cmdbuf) { + void *vP; struct ProtoFunctionHook *p; - for (p = ProtoHookList; p; p = p->next) { - if (!strncasecmp(cmdbuf, p->cmd, 4)) { - p->handler(&cmdbuf[5]); - return 1; - } + if (GetHash(ProtoHookList, cmdbuf, 4, &vP) && (vP != NULL)) { + p = (struct ProtoFunctionHook*) vP; + p->handler(&cmdbuf[5]); + return 1; } return 0; } +int FourHash(const char *key, long length) +{ + int i; + int ret = 0; + const unsigned char *ptr = (const unsigned char*)key; + + for (i = 0; i < 4; i++, ptr ++) + ret = (ret << 8) | *ptr; + + return ret; +} void CtdlRegisterProtoHook(void (*handler) (char *), char *cmd, char *desc) { struct ProtoFunctionHook *p; + if (ProtoHookList == NULL) + ProtoHookList = NewHash (1, FourHash); + + p = (struct ProtoFunctionHook *) malloc(sizeof(struct ProtoFunctionHook)); @@ -219,56 +235,15 @@ void CtdlRegisterProtoHook(void (*handler) (char *), char *cmd, char *desc) p->handler = handler; p->cmd = cmd; p->desc = desc; - p->next = ProtoHookList; - ProtoHookList = p; - CtdlLogPrintf(CTDL_INFO, "Registered server command %s (%s)\n", cmd, desc); -} - -void CtdlUnregisterProtoHook(void (*handler) (char *), char *cmd) -{ - struct ProtoFunctionHook *cur = NULL; - struct ProtoFunctionHook *p = NULL; - struct ProtoFunctionHook *lastcur = NULL; - - for (cur = ProtoHookList; - cur != NULL; - cur = (cur != NULL)? cur->next: NULL) { - /* This will also remove duplicates if any */ - while (cur != NULL && - handler == cur->handler && - !strcmp(cmd, cur->cmd)) { - CtdlLogPrintf(CTDL_INFO, "Unregistered server command %s (%s)\n", - cmd, cur->desc); - p = cur->next; - if (cur == ProtoHookList) { - ProtoHookList = p; - } - else if (lastcur != NULL) - { - lastcur->next = p; - } - free(cur); - cur = p; - } - lastcur = cur; - } + Put(ProtoHookList, cmd, 4, p, NULL); + CtdlLogPrintf(CTDL_INFO, "Registered server command %s (%s)\n", cmd, desc); } void CtdlDestroyProtoHooks(void) { - struct ProtoFunctionHook *cur, *p; - cur = ProtoHookList; - while (cur != NULL) - { - CtdlLogPrintf(CTDL_INFO, "Destroyed server command %s (%s)\n", - cur->cmd, cur->desc); - p = cur->next; - free(cur); - cur = p; - } - ProtoHookList = NULL; + DeleteHash(&ProtoHookList); } diff --git a/citadel/user_ops.c b/citadel/user_ops.c index 8faf50f7e..b61247d0c 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -52,6 +52,8 @@ #include "threads.h" #include "citadel_ldap.h" +#include "ctdl_module.h" + /* These pipes are used to talk to the chkpwd daemon, which is forked during startup */ int chkpwd_write_pipe[2]; int chkpwd_read_pipe[2]; @@ -1523,6 +1525,8 @@ void cmd_invt_kick(char *iuser, int op) { return; } +void cmd_invt(char *iuser) {cmd_invt_kick(iuser, 1);} +void cmd_kick(char *iuser) {cmd_invt_kick(iuser, 0);} /* * Forget (Zap) the current room (API call) @@ -1556,7 +1560,7 @@ int CtdlForgetThisRoom(void) { /* * forget (Zap) the current room */ -void cmd_forg(void) +void cmd_forg(char *argbuf) { if (CtdlAccessCheck(ac_logged_in)) { @@ -1574,7 +1578,7 @@ void cmd_forg(void) /* * Get Next Unregistered User */ -void cmd_gnur(void) +void cmd_gnur(char *argbuf) { struct cdbdata *cdbus; struct ctdluser usbuf; @@ -1727,7 +1731,7 @@ void cmd_list(char *cmdbuf) /* * assorted info we need to check at login */ -void cmd_chek(void) +void cmd_chek(char *argbuf) { int mail = 0; int regis = 0; @@ -1997,3 +2001,38 @@ void cmd_renu(char *cmdbuf) cprintf("%d An unknown error occurred.\n", ERROR); } + + + +/*****************************************************************************/ +/* MODULE INITIALIZATION STUFF */ +/*****************************************************************************/ + + +CTDL_MODULE_INIT(user_ops) +{ + CtdlRegisterProtoHook(cmd_user, "USER", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_pass, "PASS", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_creu, "CREU", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_setp, "SETP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_getu, "GETU", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_setu, "SETU", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_slrp, "SLRP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_invt, "INVT", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_kick, "KICK", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_forg, "FORG", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_gnur, "GNUR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_vali, "VALI", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_list, "LIST", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_chek, "CHEK", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_qusr, "QUSR", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_agup, "AGUP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_asup, "ASUP", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_seen, "SEEN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_gtsn, "GTSN", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_view, "VIEW", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_renu, "RENU", "Autoconverted. TODO: document me."); + CtdlRegisterProtoHook(cmd_newu, "NEWU", "Autoconverted. TODO: document me."); + /* return our Subversion id for the Log */ + return "$Id$"; +} diff --git a/citadel/user_ops.h b/citadel/user_ops.h index b516410f0..6bf604175 100644 --- a/citadel/user_ops.h +++ b/citadel/user_ops.h @@ -12,31 +12,13 @@ void cmd_user (char *cmdbuf); void session_startup (void); void logged_in_response(void); void logout (void); -void cmd_pass (char *buf); int purge_user (char *pname); int create_user (char *newusername, int become_user); void do_login(void); -void cmd_newu (char *cmdbuf); -void cmd_creu (char *cmdbuf); -void cmd_setp (char *new_pw); -void cmd_getu (char *cmdbuf); -void cmd_setu (char *new_parms); -void cmd_slrp (char *new_ptr); int CtdlInvtKick(char *iuser, int op); -void cmd_invt_kick (char *iuser, int op); -void cmd_forg (void); -void cmd_gnur (void); -void cmd_vali (char *v_args); void ForEachUser(void (*CallBack)(struct ctdluser *EachUser, void *out_data), void *in_data); void ListThisUser(struct ctdluser *usbuf, void *data); -void cmd_list (char *); -void cmd_chek (void); -void cmd_qusr (char *who); -void cmd_agup (char *cmdbuf); -void cmd_asup (char *cmdbuf); -void cmd_view (char *cmdbuf); -void cmd_renu (char *cmdbuf); int NewMailCount(void); int InitialMailCheck(void); void put_visit(struct visit *newvisit); @@ -84,8 +66,8 @@ enum { int CtdlForgetThisRoom(void); -void cmd_seen(char *argbuf); -void cmd_gtsn(char *argbuf); + +void cmd_newu (char *cmdbuf); void BumpNewMailCounter(long); void start_chkpwd_daemon(void); -- 2.30.2