20#include <libcitadel.h>
126 void (*
fcn_ptr) (
int *,
long **,
const char *);
143#define ERR_PORT (1 << 1)
154 {HKEY(
"Citadel had trouble on starting up. ")},
155 {HKEY(
" This means, Citadel won't be the service provider for a specific service you configured it to.\n\n"
156 "If you don't want Citadel to provide these services, turn them off in WebCit via: ")},
157 {HKEY(
"To make both ways actualy take place restart the citserver with \"sendcommand down\"\n\n"
158 "The errors returned by the system were:\n")},
159 {HKEY(
"You can recheck the above if you follow this faq item:\n"
160 "http://www.citadel.org/doku.php?id=faq:mastering_your_os:net#netstat")}
163ConstStr
ErrPortShort = { HKEY(
"We couldn't bind all ports you configured to be provided by Citadel Server.\n")};
164ConstStr
ErrPortWhere = { HKEY(
"\"Admin->System Preferences->Network\".\n\nThe failed ports and sockets are: ")};
165ConstStr
ErrPortHint = { HKEY(
"If you want Citadel to provide you with that functionality, "
166 "check the output of \"netstat -lnp\" on Linux, or \"netstat -na\" on BSD"
167 " and disable the program that binds these ports.\n")};
173 StrBuf *List, *DetailList;
174 ConstStr *Short, *Where, *Hint;
198 StrBufAppendBufPlain(Message, CKEY(
ErrGeneral[0]), 0);
199 StrBufAppendBufPlain(Message, CKEY(*Short), 0);
200 StrBufAppendBufPlain(Message, CKEY(
ErrGeneral[1]), 0);
201 StrBufAppendBufPlain(Message, CKEY(*Where), 0);
202 StrBufAppendBuf(Message, List, 0);
203 StrBufAppendBufPlain(Message, HKEY(
"\n\n"), 0);
204 StrBufAppendBufPlain(Message, CKEY(*Hint), 0);
205 StrBufAppendBufPlain(Message, HKEY(
"\n\n"), 0);
206 StrBufAppendBufPlain(Message, CKEY(
ErrGeneral[2]), 0);
207 StrBufAppendBuf(Message, DetailList, 0);
208 StrBufAppendBufPlain(Message, HKEY(
"\n\n"), 0);
209 StrBufAppendBufPlain(Message, CKEY(
ErrGeneral[3]), 0);
211 syslog(LOG_ERR,
"extensions: %s", ChrPtr(Message));
212 syslog(LOG_ERR,
"extensions: %s",
ErrSubject);
215 FreeStrBuf(&Message);
217 FreeStrBuf(&DetailList);
228 if (len > 0) StrBufAppendBufPlain(
errormessages, HKEY(
"; "), 0);
234 if (len > 0) StrBufAppendBufPlain(
portlist, HKEY(
";"), 0);
236 StrBufAppendBufPlain(
portlist, Port, -1, 0);
245 if (GetHash(
ProtoHookList, cmdbuf, 4, &vP) && (vP != NULL)) {
266 fprintf(stderr,
"can't malloc new ProtoFunctionHook\n");
274 syslog(LOG_DEBUG,
"extensions: registered server command %s (%s)", cmd, desc);
290 while ((*pfcn != NULL) &&
291 ((*pfcn)->Priority < newfcn->
Priority) &&
292 ((*pfcn)->next != NULL))
293 pfcn = &(*pfcn)->
next;
295 newfcn->
next = *pfcn;
298 syslog(LOG_DEBUG,
"extensions: registered a new session function (type %d Priority %d)", EventType, Priority);
307 while (cur != NULL) {
311 syslog(LOG_DEBUG,
"extensions: unregistered session function (type %d)", EventType);
343 syslog(LOG_DEBUG,
"extensions: registered a new user function (type %d)",
353 while (cur != NULL) {
357 syslog(LOG_DEBUG,
"extensions: unregistered user function (type %d)", EventType);
389 syslog(LOG_DEBUG,
"extensions: registered a new message function (type %d)", EventType);
398 while (cur != NULL) {
402 syslog(LOG_DEBUG,
"extensions: unregistered message function (type %d)", EventType);
431 syslog(LOG_DEBUG,
"extensions: registered a new room function");
443 syslog(LOG_DEBUG,
"extensions: unregistered room function");
473 syslog(LOG_DEBUG,
"extensions: registered a new delete function");
483 while (cur != NULL) {
486 syslog(LOG_DEBUG,
"extensions: unregistered delete function");
516 syslog(LOG_DEBUG,
"extensions: registered a new fixed output function for %s", newfcn->
content_type);
526 while (cur != NULL) {
529 syslog(LOG_DEBUG,
"extensions: unregistered fixed output function for %s", content_type);
571 newfcn->
order = order;
574 syslog(LOG_DEBUG,
"extensions: registered a new x-msg function (priority %d)", order);
584 while (cur != NULL) {
587 order == cur->
order) {
588 syslog(LOG_DEBUG,
"extensions: unregistered x-msg function (priority %d)", order);
610 void (*h_greeting_function) (
void),
611 void (*h_command_function) (
void),
612 void (*h_async_function) (
void),
613 const char *ServiceName)
629 if (sockpath != NULL) {
631 snprintf(message,
SIZ,
"extensions: unix domain socket '%s': ", sockpath);
633 else if (tcp_port <= 0) {
634 syslog(LOG_INFO,
"extensions: service %s has been manually disabled, skipping", ServiceName);
641 snprintf(message,
SIZ,
"extensions: TCP port %s:%d: (%s) ",
645 if (newfcn->
msock > 0) {
647 strcat(message,
"registered.");
648 syslog(LOG_INFO,
"%s", message);
652 strcat(message,
"FAILED.");
653 syslog(LOG_ERR,
"%s", message);
661 void (*h_greeting_function) (
void),
662 void (*h_command_function) (
void),
663 void (*h_async_function) (
void)
670 while (cur != NULL) {
681 syslog(LOG_INFO,
"extensions: closed UNIX domain socket %s", sockpath);
683 }
else if (tcp_port) {
684 syslog(LOG_INFO,
"extensions: closed TCP port %d", tcp_port);
686 syslog(LOG_INFO,
"extensions: unregistered service \"%s\"", cur->
ServiceName);
712 if (cur->
msock != -1)
717 syslog(LOG_INFO,
"extensions: [%s] Closed UNIX domain socket %s", cur->
ServiceName, cur->
sockpath);
720 syslog(LOG_INFO,
"extensions: [%s] closing service", cur->
ServiceName);
732 if (!name || !fcn_ptr) {
743 syslog(LOG_DEBUG,
"extensions: registered a new search function (%s)", name);
752 while (cur != NULL) {
755 name && !strcmp(name, cur->
name))
757 syslog(LOG_DEBUG,
"extensions: unregistered search function(%s)", name);
774void CtdlModuleDoSearch(
int *num_msgs,
long **search_msgs,
const char *search_string,
const char *func_name)
779 if (!func_name || !strcmp(func_name, fcn->
name)) {
780 (*fcn->
fcn_ptr) (num_msgs, search_msgs, search_string);
795 pthread_setspecific(
MyConKey, NULL);
816 int total_retval = 0;
844 int total_retval = 0;
846 syslog(LOG_DEBUG,
"extensions: performing room hooks for <%s>", target_room->
QRname);
849 total_retval = total_retval + (*fcn->
fcn_ptr) (target_room);
876 if (fcn->
order == p) {
879 (sender, sender_email, recp, msg);
887 if (total_sent)
break;
899 CtdlStartTLS (ok_response, nosup_response, error_response);
char * CtdlGetConfigStr(char *key)
int CtdlGetConfigInt(char *key)
#define CTDL_MODULE_INIT(module_name)
long quickie_message(char *from, char *fromaddr, char *to, char *room, char *text, int format_type, char *subject)
void CtdlModuleStartCryptoMsgs(char *ok_response, char *nosup_response, char *error_response)
void AddPortError(char *Port, char *ErrorMessage)
void CtdlShutdownServiceHooks(void)
void CtdlUnregisterUserHook(void(*fcn_ptr)(struct ctdluser *), int EventType)
SessionFunctionHook * SessionHookTable
DeleteFunctionHook * DeleteHookTable
int PerformRoomHooks(struct ctdlroom *target_room)
MessageFunctionHook * MessageHookTable
void CtdlUnregisterDeleteHook(void(*handler)(char *, long))
void CtdlUnregisterServiceHook(int tcp_port, char *sockpath, void(*h_greeting_function)(void), void(*h_command_function)(void), void(*h_async_function)(void))
void PerformSessionHooks(int EventType)
void CtdlRegisterServiceHook(int tcp_port, char *sockpath, void(*h_greeting_function)(void), void(*h_command_function)(void), void(*h_async_function)(void), const char *ServiceName)
void CtdlRegisterSessionHook(void(*fcn_ptr)(void), int EventType, int Priority)
int PerformFixedOutputHooks(char *content_type, char *content, int content_length)
void CtdlRegisterRoomHook(int(*fcn_ptr)(struct ctdlroom *))
RoomFunctionHook * RoomHookTable
void CtdlModuleDoSearch(int *num_msgs, long **search_msgs, const char *search_string, const char *func_name)
void CtdlRegisterUserHook(void(*fcn_ptr)(ctdluser *), int EventType)
XmsgFunctionHook * XmsgHookTable
void CtdlRegisterMessageHook(int(*handler)(struct CtdlMessage *, struct recptypes *), int EventType)
SearchFunctionHook * SearchFunctionHookTable
void LogPrintMessages(long err)
void CtdlRegisterFixedOutputHook(char *content_type, void(*handler)(char *, int))
void CtdlUnregisterFixedOutputHook(char *content_type)
void CtdlUnregisterXmsgHook(int(*fcn_ptr)(char *, char *, char *, char *), int order)
UserFunctionHook * UserHookTable
void CtdlUnregisterSessionHook(void(*fcn_ptr)(void), int EventType)
FixedOutputHook * FixedOutputTable
void PerformUserHooks(ctdluser *usbuf, int EventType)
ServiceFunctionHook * ServiceHookTable
int PerformXmsgHooks(char *sender, char *sender_email, char *recp, char *msg)
int DLoader_Exec_Cmd(char *cmdbuf)
void CtdlRegisterSearchFuncHook(void(*fcn_ptr)(int *, long **, const char *), char *name)
void CtdlUnregisterRoomHook(int(*fcn_ptr)(struct ctdlroom *))
static StrBuf * errormessages
void CtdlRegisterXmsgHook(int(*fcn_ptr)(char *, char *, char *, char *), int order)
void CtdlRegisterDeleteHook(void(*handler)(char *, long))
void CtdlUnregisterSearchFuncHook(void(*fcn_ptr)(int *, long **, const char *), char *name)
int PerformMessageHooks(struct CtdlMessage *msg, struct recptypes *recps, int EventType)
void PerformDeleteHooks(char *room, long msgnum)
void CtdlUnregisterMessageHook(int(*handler)(struct CtdlMessage *, struct recptypes *), int EventType)
void CtdlRegisterProtoHook(void(*handler)(char *), char *cmd, char *desc)
void(* h_function_pointer)(char *target_room, long msgnum)
DeleteFunctionHook * next
void(* h_function_pointer)(char *, int)
MessageFunctionHook * next
int(* h_function_pointer)(struct CtdlMessage *msg, struct recptypes *recps)
void(* handler)(char *cmdbuf)
int(* fcn_ptr)(struct ctdlroom *)
void(* fcn_ptr)(int *, long **, const char *)
SearchFunctionHook * next
void(* h_greeting_function)(void)
void(* h_async_function)(void)
void(* h_command_function)(void)
ServiceFunctionHook * next
void(* h_function_pointer)(void)
SessionFunctionHook * next
void(* h_function_pointer)(struct ctdluser *usbuf)
int(* h_function_pointer)(char *, char *, char *, char *)
int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len)
int ctdl_uds_server(char *sockpath, int queue_len)