Back to index

citadel  8.12
Classes | Defines | Typedefs | Functions | Variables
serv_extensions.c File Reference
#include "sysdep.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <syslog.h>
#include <libcitadel.h>
#include "citadel.h"
#include "server.h"
#include "serv_extensions.h"
#include "sysdep_decls.h"
#include "msgbase.h"
#include "config.h"
#include "modules/crypto/serv_crypto.h"
#include "ctdl_module.h"
#include <stdarg.h>
#include "snprintf.h"

Go to the source code of this file.

Classes

struct  __LogDebugEntry
struct  LogFunctionHook
struct  FixedOutputHook
struct  SessionFunctionHook
struct  UserFunctionHook
struct  MessageFunctionHook
struct  NetprocFunctionHook
struct  DeleteFunctionHook
struct  XmsgFunctionHook
struct  RoomFunctionHook
struct  SearchFunctionHook
struct  ProtoFunctionHook

Defines

#define ERR_PORT   (1 << 1)

Typedefs

typedef struct __LogDebugEntry LogDebugEntry
typedef struct LogFunctionHook
typedef struct FixedOutputHook
typedef struct SessionFunctionHook
typedef struct UserFunctionHook
typedef struct MessageFunctionHook
typedef struct NetprocFunctionHook
typedef struct DeleteFunctionHook
typedef struct XmsgFunctionHook
typedef struct RoomFunctionHook
typedef struct SearchFunctionHook
typedef struct ProtoFunctionHook

Functions

void LogPrintMessages (long err)
void AddPortError (char *Port, char *ErrorMessage)
int DLoader_Exec_Cmd (char *cmdbuf)
long FourHash (const char *key, long length)
void CtdlRegisterDebugFlagHook (const char *Name, long Len, CtdlDbgFunction F, const int *LogP)
void CtdlSetDebugLogFacilities (const char **Str, long n)
void cmd_log_get (char *argbuf)
void cmd_log_set (char *argbuf)
void CtdlDestroyDebugTable (void)
void CtdlRegisterProtoHook (void(*handler)(char *), char *cmd, char *desc)
void CtdlDestroyProtoHooks (void)
void CtdlRegisterCleanupHook (void(*fcn_ptr)(void))
void CtdlUnregisterCleanupHook (void(*fcn_ptr)(void))
void CtdlDestroyCleanupHooks (void)
void CtdlRegisterEVCleanupHook (void(*fcn_ptr)(void))
void CtdlUnregisterEVCleanupHook (void(*fcn_ptr)(void))
void CtdlDestroyEVCleanupHooks (void)
void CtdlRegisterSessionHook (void(*fcn_ptr)(void), int EventType, int Priority)
void CtdlUnregisterSessionHook (void(*fcn_ptr)(void), int EventType)
void CtdlDestroySessionHooks (void)
void CtdlRegisterUserHook (void(*fcn_ptr)(ctdluser *), int EventType)
void CtdlUnregisterUserHook (void(*fcn_ptr)(struct ctdluser *), int EventType)
void CtdlDestroyUserHooks (void)
void CtdlRegisterMessageHook (int(*handler)(struct CtdlMessage *), int EventType)
void CtdlUnregisterMessageHook (int(*handler)(struct CtdlMessage *), int EventType)
void CtdlDestroyMessageHook (void)
void CtdlRegisterRoomHook (int(*fcn_ptr)(struct ctdlroom *))
void CtdlUnregisterRoomHook (int(*fcn_ptr)(struct ctdlroom *))
void CtdlDestroyRoomHooks (void)
void CtdlRegisterNetprocHook (int(*handler)(struct CtdlMessage *, char *))
void CtdlUnregisterNetprocHook (int(*handler)(struct CtdlMessage *, char *))
void CtdlDestroyNetprocHooks (void)
void CtdlRegisterDeleteHook (void(*handler)(char *, long))
void CtdlUnregisterDeleteHook (void(*handler)(char *, long))
void CtdlDestroyDeleteHooks (void)
void CtdlRegisterFixedOutputHook (char *content_type, void(*handler)(char *, int))
void CtdlUnregisterFixedOutputHook (char *content_type)
void CtdlDestroyFixedOutputHooks (void)
int PerformFixedOutputHooks (char *content_type, char *content, int content_length)
void CtdlRegisterXmsgHook (int(*fcn_ptr)(char *, char *, char *, char *), int order)
void CtdlUnregisterXmsgHook (int(*fcn_ptr)(char *, char *, char *, char *), int order)
void CtdlDestroyXmsgHooks (void)
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 CtdlUnregisterServiceHook (int tcp_port, char *sockpath, void(*h_greeting_function)(void), void(*h_command_function)(void), void(*h_async_function)(void))
void CtdlShutdownServiceHooks (void)
void CtdlDestroyServiceHook (void)
void CtdlRegisterSearchFuncHook (void(*fcn_ptr)(int *, long **, const char *), char *name)
void CtdlUnregisterSearchFuncHook (void(*fcn_ptr)(int *, long **, const char *), char *name)
void CtdlDestroySearchHooks (void)
void CtdlModuleDoSearch (int *num_msgs, long **search_msgs, const char *search_string, const char *func_name)
void PerformSessionHooks (int EventType)
void PerformUserHooks (ctdluser *usbuf, int EventType)
int PerformMessageHooks (struct CtdlMessage *msg, int EventType)
int PerformRoomHooks (struct ctdlroom *target_room)
int PerformNetprocHooks (struct CtdlMessage *msg, char *target_room)
void PerformDeleteHooks (char *room, long msgnum)
int PerformXmsgHooks (char *sender, char *sender_email, char *recp, char *msg)
void CtdlModuleStartCryptoMsgs (char *ok_response, char *nosup_response, char *error_response)
void DebugModulesEnable (const int n)
 CTDL_MODULE_INIT (modules)

Variables

int DebugModules = 0
HashList * LogDebugEntryTable = NULL
LogFunctionHookLogHookTable
FixedOutputHookFixedOutputTable = NULL
SessionFunctionHookSessionHookTable = NULL
UserFunctionHookUserHookTable = NULL
MessageFunctionHookMessageHookTable = NULL
NetprocFunctionHookNetprocHookTable = NULL
DeleteFunctionHookDeleteHookTable = NULL
XmsgFunctionHookXmsgHookTable = NULL
RoomFunctionHookRoomHookTable = NULL
SearchFunctionHookSearchFunctionHookTable = NULL
CleanupFunctionHookCleanupHookTable = NULL
CleanupFunctionHookEVCleanupHookTable = NULL
ServiceFunctionHookServiceHookTable = NULL
HashList * ProtoHookList = NULL
static StrBuf * portlist = NULL
static StrBuf * errormessages = NULL
long DetailErrorFlags
ConstStr Empty = {HKEY("")}
char * ErrSubject = "Startup Problems"
ConstStr ErrGeneral []
ConstStr ErrPortShort = { HKEY("We couldn't bind all ports you configured to be provided by citadel server.\n")}
ConstStr ErrPortWhere = { HKEY("\"Admin->System Preferences->Network\".\n\nThe failed ports and sockets are: ")}
ConstStr ErrPortHint

Class Documentation

struct __LogDebugEntry

Definition at line 55 of file serv_extensions.c.

Class Members
CtdlDbgFunction F
long Len
const int * LogP
const char * Name

Define Documentation

#define ERR_PORT   (1 << 1)

Definition at line 209 of file serv_extensions.c.


Typedef Documentation

typedef struct DeleteFunctionHook

Definition at line 139 of file serv_extensions.c.

typedef struct FixedOutputHook

Definition at line 71 of file serv_extensions.c.

typedef struct LogFunctionHook

Definition at line 63 of file serv_extensions.c.

typedef struct MessageFunctionHook

Definition at line 114 of file serv_extensions.c.

typedef struct NetprocFunctionHook

Definition at line 127 of file serv_extensions.c.

typedef struct ProtoFunctionHook

Definition at line 199 of file serv_extensions.c.

typedef struct RoomFunctionHook

Definition at line 168 of file serv_extensions.c.

typedef struct SearchFunctionHook

Definition at line 177 of file serv_extensions.c.

typedef struct SessionFunctionHook

Definition at line 87 of file serv_extensions.c.

typedef struct UserFunctionHook

Definition at line 102 of file serv_extensions.c.

typedef struct XmsgFunctionHook

Definition at line 153 of file serv_extensions.c.


Function Documentation

void AddPortError ( char *  Port,
char *  ErrorMessage 
)

Definition at line 291 of file serv_extensions.c.

{
       long len;

       DetailErrorFlags |= ERR_PORT;

       len = StrLength(errormessages);
       if (len > 0) StrBufAppendBufPlain(errormessages, HKEY("; "), 0);
       else errormessages = NewStrBuf();
       StrBufAppendBufPlain(errormessages, ErrorMessage, -1, 0);


       len = StrLength(portlist);
       if (len > 0) StrBufAppendBufPlain(portlist, HKEY(";"), 0);
       else portlist = NewStrBuf();
       StrBufAppendBufPlain(portlist, Port, -1, 0);
}

Here is the caller graph for this function:

void cmd_log_get ( char *  argbuf)

Definition at line 398 of file serv_extensions.c.

{
       long HKLen;
       const char *ch;
       HashPos *Pos;
       void *vptr;

       if (CtdlAccessCheck(ac_aide)) return;

       cprintf("%d Log modules enabled:\n", LISTING_FOLLOWS);

       Pos = GetNewHashPos(LogDebugEntryTable, 0);

       while (GetNextHashPos(LogDebugEntryTable, Pos, &HKLen, &ch, &vptr)) {
              LogDebugEntry *E = (LogDebugEntry*)vptr;
              cprintf("%s|%d\n", ch, *E->LogP);
       }
       
       DeleteHashPos(&Pos);
       cprintf("000\n");
}

Here is the call graph for this function:

Here is the caller graph for this function:

void cmd_log_set ( char *  argbuf)

Definition at line 419 of file serv_extensions.c.

{
       void *vptr;
       int lset;
       int wlen;
       char which[SIZ] = "";

       if (CtdlAccessCheck(ac_aide)) return;

       wlen = extract_token(which, argbuf, 0, '|', sizeof(which));
       if (wlen < 0) wlen = 0;
       lset = extract_int(argbuf, 1);
       if (lset != 0) lset = 1;
       if (GetHash(LogDebugEntryTable, which, wlen, &vptr) && 
           (vptr != NULL))
       {
              LogDebugEntry *E = (LogDebugEntry*)vptr;
              E->F(lset);
              cprintf("%d %s|%d\n", CIT_OK, which, lset);
       }
       else {
              cprintf("%d Log setting %s not known\n", 
                     ERROR, which);
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

CTDL_MODULE_INIT ( modules  )

Definition at line 1473 of file serv_extensions.c.

{
       if (!threading) {
              CtdlRegisterDebugFlagHook(HKEY("modules"), DebugModulesEnable, &DebugModules);

              CtdlRegisterProtoHook(cmd_log_get, "LOGP", "Print Log-parameters");
              CtdlRegisterProtoHook(cmd_log_set, "LOGS", "Set Log-parameters");
       }
       return "modules";
}

Here is the call graph for this function:

void CtdlDestroyCleanupHooks ( void  )

Definition at line 524 of file serv_extensions.c.

{
       CleanupFunctionHook *cur, *p;

       cur = CleanupHookTable;
       while (cur != NULL)
       {
              MODM_syslog(LOG_DEBUG, "Destroyed cleanup function\n");
              p = cur->next;
              free(cur);
              cur = p;
       }
       CleanupHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyDebugTable ( void  )

Definition at line 444 of file serv_extensions.c.

{

       DeleteHash(&LogDebugEntryTable);
}

Here is the caller graph for this function:

void CtdlDestroyDeleteHooks ( void  )

Definition at line 949 of file serv_extensions.c.

{
       DeleteFunctionHook *cur, *p;

       cur = DeleteHookTable;
       while (cur != NULL)
       {
              MODM_syslog(LOG_DEBUG, "Destroyed delete function\n");
              p = cur->next;
              free(cur);
              cur = p;             
       }
       DeleteHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyEVCleanupHooks ( void  )

Definition at line 583 of file serv_extensions.c.

{
       CleanupFunctionHook *cur, *p;

       cur = EVCleanupHookTable;
       while (cur != NULL)
       {
              MODM_syslog(LOG_DEBUG, "Destroyed cleanup function\n");
              p = cur->next;
              free(cur);
              cur = p;
       }
       EVCleanupHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyFixedOutputHooks ( void  )

Definition at line 1013 of file serv_extensions.c.

{
       FixedOutputHook *cur, *p;

       cur = FixedOutputTable; 
       while (cur != NULL)
       {
              MOD_syslog(LOG_DEBUG, "Destroyed fixed output function for %s\n", cur->content_type);
              p = cur->next;
              free(cur);
              cur = p;
              
       }
       FixedOutputTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyMessageHook ( void  )

Definition at line 778 of file serv_extensions.c.

{
       MessageFunctionHook *cur, *p;

       cur = MessageHookTable; 
       while (cur != NULL)
       {
              MOD_syslog(LOG_DEBUG, "Destroyed message function (type %d)\n", cur->eventtype);
              p = cur->next;
              free(cur);
              cur = p;
       }
       MessageHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyNetprocHooks ( void  )

Definition at line 893 of file serv_extensions.c.

{
       NetprocFunctionHook *cur, *p;

       cur = NetprocHookTable;
       while (cur != NULL)
       {
              MODM_syslog(LOG_DEBUG, "Destroyed netproc function\n");
              p = cur->next;
              free(cur);
              cur = p;
       }
       NetprocHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyProtoHooks ( void  )

Definition at line 473 of file serv_extensions.c.

{

       DeleteHash(&ProtoHookList);
}

Here is the caller graph for this function:

void CtdlDestroyRoomHooks ( void  )

Definition at line 836 of file serv_extensions.c.

{
       RoomFunctionHook *cur, *p;

       cur = RoomHookTable;
       while (cur != NULL)
       {
              MODM_syslog(LOG_DEBUG, "Destroyed room function\n");
              p = cur->next;
              free(cur);
              cur = p;
       }
       RoomHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroySearchHooks ( void  )

Definition at line 1305 of file serv_extensions.c.

{
        SearchFunctionHook *cur, *p;

       cur = SearchFunctionHookTable;
       SearchFunctionHookTable = NULL;
        while (cur != NULL) {
              p = cur->next;
              free(cur);
              cur = p;
       }
}

Here is the caller graph for this function:

void CtdlDestroyServiceHook ( void  )

Definition at line 1236 of file serv_extensions.c.

{
       ServiceFunctionHook *cur, *p;

       cur = ServiceHookTable;
       while (cur != NULL)
       {
              close(cur->msock);
              if (cur->sockpath) {
                     MOD_syslog(LOG_INFO, "Closed UNIX domain socket %s\n",
                               cur->sockpath);
                     unlink(cur->sockpath);
              } else if (cur->tcp_port) {
                     MOD_syslog(LOG_INFO, "Closed TCP port %d\n", cur->tcp_port);
              } else {
                     MOD_syslog(LOG_INFO, "Destroyed service \"%s\"\n", cur->ServiceName);
              }
              p = cur->next;
              free(cur);
              cur = p;
       }
       ServiceHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroySessionHooks ( void  )

Definition at line 653 of file serv_extensions.c.

{
       SessionFunctionHook *cur, *p;

       cur = SessionHookTable;
       while (cur != NULL)
       {
              MODM_syslog(LOG_DEBUG, "Destroyed session function\n");
              p = cur->next;
              free(cur);
              cur = p;
       }
       SessionHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyUserHooks ( void  )

Definition at line 715 of file serv_extensions.c.

{
       UserFunctionHook *cur, *p;

       cur = UserHookTable;
       while (cur != NULL)
       {
              MODM_syslog(LOG_DEBUG, "Destroyed user function \n");
              p = cur->next;
              free(cur);
              cur = p;
       }
       UserHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlDestroyXmsgHooks ( void  )

Definition at line 1090 of file serv_extensions.c.

{
       XmsgFunctionHook *cur, *p;

       cur = XmsgHookTable;
       while (cur != NULL)
       {
              MOD_syslog(LOG_DEBUG, "Destroyed x-msg function "
                     "(priority %d)\n", cur->order);
              p = cur->next;
                     
              free(cur);
              cur = p;
       }
       XmsgHookTable = NULL;
}

Here is the caller graph for this function:

void CtdlModuleDoSearch ( int *  num_msgs,
long **  search_msgs,
const char *  search_string,
const char *  func_name 
)

Definition at line 1318 of file serv_extensions.c.

{
       SearchFunctionHook *fcn = NULL;

       for (fcn = SearchFunctionHookTable; fcn != NULL; fcn = fcn->next) {
              if (!func_name || !strcmp(func_name, fcn->name)) {
                     (*fcn->fcn_ptr) (num_msgs, search_msgs, search_string);
                     return;
              }
       }
       *num_msgs = 0;
}

Here is the caller graph for this function:

void CtdlModuleStartCryptoMsgs ( char *  ok_response,
char *  nosup_response,
char *  error_response 
)

Definition at line 1462 of file serv_extensions.c.

{
#ifdef HAVE_OPENSSL
       CtdlStartTLS (ok_response, nosup_response, error_response);
#endif
}

Here is the caller graph for this function:

void CtdlRegisterCleanupHook ( void(*)(void)  fcn_ptr)

Definition at line 480 of file serv_extensions.c.

{

       CleanupFunctionHook *newfcn;

       newfcn = (CleanupFunctionHook *)
           malloc(sizeof(CleanupFunctionHook));
       newfcn->next = CleanupHookTable;
       newfcn->h_function_pointer = fcn_ptr;
       CleanupHookTable = newfcn;

       MODM_syslog(LOG_DEBUG, "Registered a new cleanup function\n");
}

Here is the caller graph for this function:

void CtdlRegisterDebugFlagHook ( const char *  Name,
long  Len,
CtdlDbgFunction  F,
const int *  LogP 
)

Definition at line 339 of file serv_extensions.c.

{
       LogDebugEntry *E;
       if (LogDebugEntryTable == NULL)
              LogDebugEntryTable = NewHash(1, NULL);
       E = (LogDebugEntry*) malloc(sizeof(LogDebugEntry));
       E->F = F;
       E->Name = Name;
       E->Len = Len;
       E->LogP = LogP;
       Put(LogDebugEntryTable, Name, Len, E, NULL);
       
}

Here is the caller graph for this function:

void CtdlRegisterDeleteHook ( void(*)(char *, long)  handler)

Definition at line 909 of file serv_extensions.c.

{
       DeleteFunctionHook *newfcn;

       newfcn = (DeleteFunctionHook *)
           malloc(sizeof(DeleteFunctionHook));
       newfcn->next = DeleteHookTable;
       newfcn->h_function_pointer = handler;
       DeleteHookTable = newfcn;

       MODM_syslog(LOG_DEBUG, "Registered a new delete function\n");
}

Here is the caller graph for this function:

void CtdlRegisterEVCleanupHook ( void(*)(void)  fcn_ptr)

Definition at line 539 of file serv_extensions.c.

{

       CleanupFunctionHook *newfcn;

       newfcn = (CleanupFunctionHook *)
           malloc(sizeof(CleanupFunctionHook));
       newfcn->next = EVCleanupHookTable;
       newfcn->h_function_pointer = fcn_ptr;
       EVCleanupHookTable = newfcn;

       MODM_syslog(LOG_DEBUG, "Registered a new cleanup function\n");
}

Here is the caller graph for this function:

void CtdlRegisterFixedOutputHook ( char *  content_type,
void(*)(char *, int)  handler 
)

Definition at line 967 of file serv_extensions.c.

{
       FixedOutputHook *newfcn;

       newfcn = (FixedOutputHook *)
           malloc(sizeof(FixedOutputHook));
       newfcn->next = FixedOutputTable;
       newfcn->h_function_pointer = handler;
       safestrncpy(newfcn->content_type, content_type, sizeof newfcn->content_type);
       FixedOutputTable = newfcn;

       MOD_syslog(LOG_DEBUG, "Registered a new fixed output function for %s\n", newfcn->content_type);
}
void CtdlRegisterMessageHook ( int(*)(struct CtdlMessage *)  handler,
int  EventType 
)

Definition at line 731 of file serv_extensions.c.

{

       MessageFunctionHook *newfcn;

       newfcn = (MessageFunctionHook *)
           malloc(sizeof(MessageFunctionHook));
       newfcn->next = MessageHookTable;
       newfcn->h_function_pointer = handler;
       newfcn->eventtype = EventType;
       MessageHookTable = newfcn;

       MOD_syslog(LOG_DEBUG, "Registered a new message function (type %d)\n",
                 EventType);
}

Here is the caller graph for this function:

void CtdlRegisterNetprocHook ( int(*)(struct CtdlMessage *, char *)  handler)

Definition at line 851 of file serv_extensions.c.

{
       NetprocFunctionHook *newfcn;

       newfcn = (NetprocFunctionHook *)
           malloc(sizeof(NetprocFunctionHook));
       newfcn->next = NetprocHookTable;
       newfcn->h_function_pointer = handler;
       NetprocHookTable = newfcn;

       MODM_syslog(LOG_DEBUG, "Registered a new netproc function\n");
}

Here is the caller graph for this function:

void CtdlRegisterProtoHook ( void(*)(char *)  handler,
char *  cmd,
char *  desc 
)

Definition at line 450 of file serv_extensions.c.

{
       ProtoFunctionHook *p;

       if (ProtoHookList == NULL)
              ProtoHookList = NewHash (1, FourHash);


       p = (ProtoFunctionHook *)
              malloc(sizeof(ProtoFunctionHook));

       if (p == NULL) {
              fprintf(stderr, "can't malloc new ProtoFunctionHook\n");
              exit(EXIT_FAILURE);
       }
       p->handler = handler;
       p->cmd = cmd;
       p->desc = desc;

       Put(ProtoHookList, cmd, 4, p, NULL);
       MOD_syslog(LOG_DEBUG, "Registered server command %s (%s)\n", cmd, desc);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void CtdlRegisterRoomHook ( int(*)(struct ctdlroom *)  fcn_ptr)

Definition at line 794 of file serv_extensions.c.

{
       RoomFunctionHook *newfcn;

       newfcn = (RoomFunctionHook *)
           malloc(sizeof(RoomFunctionHook));
       newfcn->next = RoomHookTable;
       newfcn->fcn_ptr = fcn_ptr;
       RoomHookTable = newfcn;

       MODM_syslog(LOG_DEBUG, "Registered a new room function\n");
}

Here is the caller graph for this function:

void CtdlRegisterSearchFuncHook ( void(*)(int *, long **, const char *)  fcn_ptr,
char *  name 
)

Definition at line 1260 of file serv_extensions.c.

{
       SearchFunctionHook *newfcn;

       if (!name || !fcn_ptr) {
              return;
       }
       
       newfcn = (SearchFunctionHook *)
           malloc(sizeof(SearchFunctionHook));
       newfcn->next = SearchFunctionHookTable;
       newfcn->name = name;
       newfcn->fcn_ptr = fcn_ptr;
       SearchFunctionHookTable = newfcn;

       MOD_syslog(LOG_DEBUG, "Registered a new search function (%s)\n", name);
}

Here is the caller graph for this function:

void CtdlRegisterServiceHook ( int  tcp_port,
char *  sockpath,
void(*)(void)  h_greeting_function,
void(*)(void)  h_command_function,
void(*)(void)  h_async_function,
const char *  ServiceName 
)

Definition at line 1108 of file serv_extensions.c.

{
       ServiceFunctionHook *newfcn;
       char *message;
       char error[SIZ];

       strcpy(error, "");
       newfcn = (ServiceFunctionHook *) malloc(sizeof(ServiceFunctionHook));
       message = (char*) malloc (SIZ + SIZ);
       
       newfcn->next = ServiceHookTable;
       newfcn->tcp_port = tcp_port;
       newfcn->sockpath = sockpath;
       newfcn->h_greeting_function = h_greeting_function;
       newfcn->h_command_function = h_command_function;
       newfcn->h_async_function = h_async_function;
       newfcn->ServiceName = ServiceName;

       if (sockpath != NULL) {
              newfcn->msock = ctdl_uds_server(sockpath, config.c_maxsessions, error);
              snprintf(message, SIZ, "Unix domain socket '%s': ", sockpath);
       }
       else if (tcp_port <= 0) {   /* port -1 to disable */
              MOD_syslog(LOG_INFO, "Service %s has been manually disabled, skipping\n", ServiceName);
              free (message);
              free(newfcn);
              return;
       }
       else {
              newfcn->msock = ctdl_tcp_server(config.c_ip_addr,
                                         tcp_port,
                                         config.c_maxsessions, 
                                         error);
              snprintf(message, SIZ, "TCP port %s:%d: (%s) ", 
                      config.c_ip_addr, tcp_port, ServiceName);
       }

       if (newfcn->msock > 0) {
              ServiceHookTable = newfcn;
              strcat(message, "registered.");
              MOD_syslog(LOG_INFO, "%s\n", message);
       }
       else {
              AddPortError(message, error);
              strcat(message, "FAILED.");
              MOD_syslog(LOG_CRIT, "%s\n", message);
              free(newfcn);
       }
       free(message);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void CtdlRegisterSessionHook ( void(*)(void)  fcn_ptr,
int  EventType,
int  Priority 
)

Definition at line 599 of file serv_extensions.c.

{
       SessionFunctionHook *newfcn;

       newfcn = (SessionFunctionHook *)
           malloc(sizeof(SessionFunctionHook));
       newfcn->Priority = Priority;
       newfcn->h_function_pointer = fcn_ptr;
       newfcn->eventtype = EventType;

       SessionFunctionHook **pfcn;
       pfcn = &SessionHookTable;
       while ((*pfcn != NULL) && 
              ((*pfcn)->Priority < newfcn->Priority) &&
              ((*pfcn)->next != NULL))
              pfcn = &(*pfcn)->next;
              
       newfcn->next = *pfcn;
       *pfcn = newfcn;
       
       MOD_syslog(LOG_DEBUG, "Registered a new session function (type %d Priority %d)\n",
                 EventType, Priority);
}

Here is the caller graph for this function:

void CtdlRegisterUserHook ( void(*)(ctdluser *)  fcn_ptr,
int  EventType 
)

Definition at line 669 of file serv_extensions.c.

{

       UserFunctionHook *newfcn;

       newfcn = (UserFunctionHook *)
           malloc(sizeof(UserFunctionHook));
       newfcn->next = UserHookTable;
       newfcn->h_function_pointer = fcn_ptr;
       newfcn->eventtype = EventType;
       UserHookTable = newfcn;

       MOD_syslog(LOG_DEBUG, "Registered a new user function (type %d)\n",
                 EventType);
}
void CtdlRegisterXmsgHook ( int(*)(char *, char *, char *, char *)  fcn_ptr,
int  order 
)

Definition at line 1047 of file serv_extensions.c.

{

       XmsgFunctionHook *newfcn;

       newfcn = (XmsgFunctionHook *) malloc(sizeof(XmsgFunctionHook));
       newfcn->next = XmsgHookTable;
       newfcn->order = order;
       newfcn->h_function_pointer = fcn_ptr;
       XmsgHookTable = newfcn;
       MOD_syslog(LOG_DEBUG, "Registered a new x-msg function (priority %d)\n", order);
}

Here is the caller graph for this function:

void CtdlSetDebugLogFacilities ( const char **  Str,
long  n 
)

Definition at line 352 of file serv_extensions.c.

{
       StrBuf *Token = NULL;
       StrBuf *Buf = NULL;
       const char *ch;
       int i;
       int DoAll = 0;
       void *vptr;

       for (i=0; i < n; i++){
              if ((Str[i] != NULL) && !IsEmptyStr(Str[i])) {
                     if (strcmp(Str[i], "all") == 0) {
                            DoAll = 1;
                            continue;
                     }
                     Buf = NewStrBufPlain(Str[i], -1);
                     ch = NULL;
                     if (Token == NULL)
                            Token = NewStrBufPlain(NULL, StrLength(Buf));
                     while ((ch != StrBufNOTNULL) &&
                            StrBufExtract_NextToken(Token, Buf, &ch, ',')) {
                            if (GetHash(LogDebugEntryTable, SKEY(Token), &vptr) && 
                                (vptr != NULL))
                            {
                                   LogDebugEntry *E = (LogDebugEntry*)vptr;
                                   E->F(1);
                            }
                     }
              }
              FreeStrBuf(&Buf);
       }
       FreeStrBuf(&Token);
       if (DoAll) {
              long HKLen;
              const char *ch;
              HashPos *Pos;

              Pos = GetNewHashPos(LogDebugEntryTable, 0);
              while (GetNextHashPos(LogDebugEntryTable, Pos, &HKLen, &ch, &vptr)) {
                     LogDebugEntry *E = (LogDebugEntry*)vptr;
                     E->F(1);
              }

              DeleteHashPos(&Pos);
       }
}

Here is the caller graph for this function:

void CtdlShutdownServiceHooks ( void  )

Definition at line 1210 of file serv_extensions.c.

{
       /* sort of a duplicate of close_masters() but called earlier */
       ServiceFunctionHook *cur;

       cur = ServiceHookTable;
       while (cur != NULL) 
       {
              if (cur->msock != -1)
              {
                     close(cur->msock);
                     cur->msock = -1;
                     if (cur->sockpath != NULL){
                            MOD_syslog(LOG_INFO, "[%s] Closed UNIX domain socket %s\n",
                                      cur->ServiceName,
                                      cur->sockpath);
                            unlink(cur->sockpath);
                     } else {
                            MOD_syslog(LOG_INFO, "[%s] closing service\n", 
                                      cur->ServiceName);
                     }
              }
              cur = cur->next;
       }
}

Here is the caller graph for this function:

void CtdlUnregisterCleanupHook ( void(*)(void)  fcn_ptr)

Definition at line 495 of file serv_extensions.c.

{
       CleanupFunctionHook *cur, *p, *last;
       last = NULL;
       cur = CleanupHookTable;
       while (cur != NULL)
       {
              if (fcn_ptr == cur->h_function_pointer)
              {
                     MODM_syslog(LOG_DEBUG, "Unregistered cleanup function\n");
                     p = cur->next;

                     free(cur);
                     cur = NULL;

                     if (last != NULL)
                            last->next = p;
                     else 
                            CleanupHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterDeleteHook ( void(*)(char *, long)  handler)

Definition at line 923 of file serv_extensions.c.

{
       DeleteFunctionHook *cur, *p, *last;

       last = NULL;
       cur = DeleteHookTable;
       while (cur != NULL) {
              if (handler == cur->h_function_pointer )
              {
                     MODM_syslog(LOG_DEBUG, "Unregistered delete function\n");
                     p = cur->next;
                     free(cur);

                     if (last != NULL)
                            last->next = p;
                     else
                            DeleteHookTable = p;

                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterEVCleanupHook ( void(*)(void)  fcn_ptr)

Definition at line 554 of file serv_extensions.c.

{
       CleanupFunctionHook *cur, *p, *last;
       last = NULL;
       cur = EVCleanupHookTable;
       while (cur != NULL)
       {
              if (fcn_ptr == cur->h_function_pointer)
              {
                     MODM_syslog(LOG_DEBUG, "Unregistered cleanup function\n");
                     p = cur->next;

                     free(cur);
                     cur = NULL;

                     if (last != NULL)
                            last->next = p;
                     else 
                            EVCleanupHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterFixedOutputHook ( char *  content_type)

Definition at line 982 of file serv_extensions.c.

{
       FixedOutputHook *cur, *p, *last;

       last = NULL;
       cur = FixedOutputTable;
       while (cur != NULL) {
              /* This will also remove duplicates if any */
              if (!strcasecmp(content_type, cur->content_type)) {
                     MOD_syslog(LOG_DEBUG,
                               "Unregistered fixed output function for %s\n",
                               content_type);

                     p = cur->next;
                     free(cur);

                     if (last != NULL)
                            last->next = p;
                     else
                            FixedOutputTable = p;
                     
                     cur = p;
              }
              else
              {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterMessageHook ( int(*)(struct CtdlMessage *)  handler,
int  EventType 
)

Definition at line 749 of file serv_extensions.c.

{
       MessageFunctionHook *cur, *p, *last;
       last = NULL;
       cur = MessageHookTable;
       while (cur != NULL) {
              if ((handler == cur->h_function_pointer) &&
                  (EventType == cur->eventtype))
              {
                     MOD_syslog(LOG_DEBUG, "Unregistered message function (type %d)\n",
                               EventType);
                     p = cur->next;
                     free(cur);
                     cur = NULL;

                     if (last != NULL)
                            last->next = p;
                     else 
                            MessageHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterNetprocHook ( int(*)(struct CtdlMessage *, char *)  handler)

Definition at line 865 of file serv_extensions.c.

{
       NetprocFunctionHook *cur, *p, *last;

       cur = NetprocHookTable;
       last = NULL;

       while (cur != NULL) {
              if (handler == cur->h_function_pointer)
              {
                     MODM_syslog(LOG_DEBUG, "Unregistered netproc function\n");
                     p = cur->next;
                     free(cur);
                     if (last != NULL) {
                            last->next = p;
                     }
                     else {
                            NetprocHookTable = p;
                     }
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterRoomHook ( int(*)(struct ctdlroom *)  fcn_ptr)

Definition at line 808 of file serv_extensions.c.

{
       RoomFunctionHook *cur, *p, *last;
       last = NULL;
       cur = RoomHookTable;
       while (cur != NULL)
       {
              if (fcn_ptr == cur->fcn_ptr) {
                     MODM_syslog(LOG_DEBUG, "Unregistered room function\n");
                     p = cur->next;

                     free(cur);
                     cur = NULL;

                     if (last != NULL)
                            last->next = p;
                     else 
                            RoomHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterSearchFuncHook ( void(*)(int *, long **, const char *)  fcn_ptr,
char *  name 
)

Definition at line 1278 of file serv_extensions.c.

{
       SearchFunctionHook *cur, *p, *last;
       
       last = NULL;
       cur = SearchFunctionHookTable;
       while (cur != NULL) {
              if (fcn_ptr &&
                  (cur->fcn_ptr == fcn_ptr) &&
                  name && !strcmp(name, cur->name))
              {
                     MOD_syslog(LOG_DEBUG, "Unregistered search function(%s)\n", name);
                     p = cur->next;
                     free (cur);
                     if (last != NULL)
                            last->next = p;
                     else
                            SearchFunctionHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterServiceHook ( int  tcp_port,
char *  sockpath,
void(*)(void)  h_greeting_function,
void(*)(void)  h_command_function,
void(*)(void)  h_async_function 
)

Definition at line 1165 of file serv_extensions.c.

{
       ServiceFunctionHook *cur, *p, *last;

       last = NULL;
       cur = ServiceHookTable;
       while (cur != NULL) {
              /* This will also remove duplicates if any */
              if (h_greeting_function == cur->h_greeting_function &&
                  h_command_function == cur->h_command_function &&
                  h_async_function == cur->h_async_function &&
                  tcp_port == cur->tcp_port && 
                  !(sockpath && cur->sockpath && strcmp(sockpath, cur->sockpath)) )
              {
                     if (cur->msock > 0)
                            close(cur->msock);
                     if (sockpath) {
                            MOD_syslog(LOG_INFO, "Closed UNIX domain socket %s\n",
                                      sockpath);
                            unlink(sockpath);
                     } else if (tcp_port) {
                            MOD_syslog(LOG_INFO, "Closed TCP port %d\n", tcp_port);
                     } else {
                            MOD_syslog(LOG_INFO, "Unregistered service \"%s\"\n", cur->ServiceName);
                     }
                     p = cur->next;
                     free(cur);
                     if (last != NULL)
                            last->next = p;
                     else
                            ServiceHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterSessionHook ( void(*)(void)  fcn_ptr,
int  EventType 
)

Definition at line 624 of file serv_extensions.c.

{
       SessionFunctionHook *cur, *p, *last;
       last = NULL;
       cur = SessionHookTable;
       while  (cur != NULL) {
              if ((fcn_ptr == cur->h_function_pointer) &&
                  (EventType == cur->eventtype))
              {
                     MOD_syslog(LOG_DEBUG, "Unregistered session function (type %d)\n",
                               EventType);
                     p = cur->next;

                     free(cur);
                     cur = NULL;

                     if (last != NULL)
                            last->next = p;
                     else 
                            SessionHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterUserHook ( void(*)(struct ctdluser *)  fcn_ptr,
int  EventType 
)

Definition at line 686 of file serv_extensions.c.

{
       UserFunctionHook *cur, *p, *last;
       last = NULL;
       cur = UserHookTable;
       while (cur != NULL) {
              if ((fcn_ptr == cur->h_function_pointer) &&
                  (EventType == cur->eventtype))
              {
                     MOD_syslog(LOG_DEBUG, "Unregistered user function (type %d)\n",
                               EventType);
                     p = cur->next;

                     free(cur);
                     cur = NULL;

                     if (last != NULL)
                            last->next = p;
                     else 
                            UserHookTable = p;
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void CtdlUnregisterXmsgHook ( int(*)(char *, char *, char *, char *)  fcn_ptr,
int  order 
)

Definition at line 1061 of file serv_extensions.c.

{
       XmsgFunctionHook *cur, *p, *last;

       last = NULL;
       cur = XmsgHookTable;
       while (cur != NULL) {
              /* This will also remove duplicates if any */
              if (fcn_ptr == cur->h_function_pointer &&
                  order == cur->order) {
                     MOD_syslog(LOG_DEBUG, "Unregistered x-msg function "
                               "(priority %d)\n", order);
                     p = cur->next;
                     free(cur);

                     if (last != NULL)
                            last->next = p;
                     else
                            XmsgHookTable = p;
                     
                     cur = p;
              }
              else {
                     last = cur;
                     cur = cur->next;
              }
       }
}
void DebugModulesEnable ( const int  n)

Definition at line 1469 of file serv_extensions.c.

{
       DebugModules = n;
}

Here is the caller graph for this function:

int DLoader_Exec_Cmd ( char *  cmdbuf)

Definition at line 310 of file serv_extensions.c.

{
       void *vP;
       ProtoFunctionHook *p;

       if (GetHash(ProtoHookList, cmdbuf, 4, &vP) && (vP != NULL)) {
              p = (ProtoFunctionHook*) vP;
              p->handler(&cmdbuf[5]);
              return 1;
       }
       return 0;
}

Here is the caller graph for this function:

long FourHash ( const char *  key,
long  length 
)

Definition at line 323 of file serv_extensions.c.

{
       int i;
       int ret = 0;
       const unsigned char *ptr = (const unsigned char*)key;

       for (i = 0; i < 4; i++, ptr ++) 
              ret = (ret << 8) | 
                     ( ((*ptr >= 'a') &&
                        (*ptr <= 'z'))? 
                       *ptr - 'a' + 'A': 
                       *ptr);

       return ret;
}

Here is the caller graph for this function:

void LogPrintMessages ( long  err)

Definition at line 239 of file serv_extensions.c.

{
       StrBuf *Message;
       StrBuf *List, *DetailList;
       ConstStr *Short, *Where, *Hint; 

       
       Message = NewStrBufPlain(NULL, 
                             StrLength(portlist) + StrLength(errormessages));
       
       DetailErrorFlags = DetailErrorFlags & ~err;

       switch (err)
       {
       case ERR_PORT:
              Short = &ErrPortShort;
              Where = &ErrPortWhere;
              Hint  = &ErrPortHint;
              List  = portlist;
              DetailList = errormessages;
              break;
       default:
              Short = &Empty;
              Where = &Empty;
              Hint  = &Empty;
              List  = NULL;
              DetailList = NULL;
       }

       StrBufAppendBufPlain(Message, CKEY(ErrGeneral[0]), 0);
       StrBufAppendBufPlain(Message, CKEY(*Short), 0);  
       StrBufAppendBufPlain(Message, CKEY(ErrGeneral[1]), 0);
       StrBufAppendBufPlain(Message, CKEY(*Where), 0);
       StrBufAppendBuf(Message, List, 0);
       StrBufAppendBufPlain(Message, HKEY("\n\n"), 0);
       StrBufAppendBufPlain(Message, CKEY(*Hint), 0);
       StrBufAppendBufPlain(Message, HKEY("\n\n"), 0);
       StrBufAppendBufPlain(Message, CKEY(ErrGeneral[2]), 0);
       StrBufAppendBuf(Message, DetailList, 0);
       StrBufAppendBufPlain(Message, HKEY("\n\n"), 0);
       StrBufAppendBufPlain(Message, CKEY(ErrGeneral[3]), 0);

       MOD_syslog(LOG_EMERG, "%s", ChrPtr(Message));
       MOD_syslog(LOG_EMERG, "%s", ErrSubject);
       quickie_message("Citadel", NULL, NULL, AIDEROOM, ChrPtr(Message), FMT_FIXED, ErrSubject);

       FreeStrBuf(&Message);
       FreeStrBuf(&List);
       FreeStrBuf(&DetailList);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void PerformDeleteHooks ( char *  room,
long  msgnum 
)

Definition at line 1421 of file serv_extensions.c.

{
       DeleteFunctionHook *fcn;

       for (fcn = DeleteHookTable; fcn != NULL; fcn = fcn->next) {
              (*fcn->h_function_pointer) (room, msgnum);
       }
}

Here is the caller graph for this function:

int PerformFixedOutputHooks ( char *  content_type,
char *  content,
int  content_length 
)

Definition at line 1030 of file serv_extensions.c.

{
       FixedOutputHook *fcn;

       for (fcn = FixedOutputTable; fcn != NULL; fcn = fcn->next) {
              if (!strcasecmp(content_type, fcn->content_type)) {
                     (*fcn->h_function_pointer) (content, content_length);
                     return(1);
              }
       }
       return(0);
}

Here is the caller graph for this function:

int PerformMessageHooks ( struct CtdlMessage msg,
int  EventType 
)

Definition at line 1357 of file serv_extensions.c.

{
       MessageFunctionHook *fcn = NULL;
       int total_retval = 0;

       /* Other code may elect to protect this message from server-side
        * handlers; if this is the case, don't do anything.
       MOD_syslog(LOG_DEBUG, "** Event type is %d, flags are %d\n", EventType, msg->cm_flags);
        */
       if (msg->cm_flags & CM_SKIP_HOOKS) {
              MODM_syslog(LOG_DEBUG, "Skipping hooks\n");
              return(0);
       }

       /* Otherwise, run all the hooks appropriate to this event type.
        */
       for (fcn = MessageHookTable; fcn != NULL; fcn = fcn->next) {
              if (fcn->eventtype == EventType) {
                     total_retval = total_retval + (*fcn->h_function_pointer) (msg);
              }
       }

       /* Return the sum of the return codes from the hook functions.  If
        * this is an EVT_BEFORESAVE event, a nonzero return code will cause
        * the save operation to abort.
        */
       return total_retval;
}

Here is the caller graph for this function:

int PerformNetprocHooks ( struct CtdlMessage msg,
char *  target_room 
)

Definition at line 1404 of file serv_extensions.c.

{
       NetprocFunctionHook *fcn;
       int total_retval = 0;

       for (fcn = NetprocHookTable; fcn != NULL; fcn = fcn->next) {
              total_retval = total_retval +
                     (*fcn->h_function_pointer) (msg, target_room);
       }

       /* Return the sum of the return codes from the hook functions.
        * A nonzero return code will cause the message to *not* be imported.
        */
       return total_retval;
}

Here is the caller graph for this function:

int PerformRoomHooks ( struct ctdlroom target_room)

Definition at line 1387 of file serv_extensions.c.

{
       RoomFunctionHook *fcn;
       int total_retval = 0;

       MOD_syslog(LOG_DEBUG, "Performing room hooks for <%s>\n", target_room->QRname);

       for (fcn = RoomHookTable; fcn != NULL; fcn = fcn->next) {
              total_retval = total_retval + (*fcn->fcn_ptr) (target_room);
       }

       /* Return the sum of the return codes from the hook functions.
        */
       return total_retval;
}

Here is the caller graph for this function:

void PerformSessionHooks ( int  EventType)

Definition at line 1332 of file serv_extensions.c.

{
       SessionFunctionHook *fcn = NULL;

       for (fcn = SessionHookTable; fcn != NULL; fcn = fcn->next) {
              if (fcn->eventtype == EventType) {
                     if (EventType == EVT_TIMER) {
                            pthread_setspecific(MyConKey, NULL);      /* for every hook */
                     }
                     (*fcn->h_function_pointer) ();
              }
       }
}

Here is the caller graph for this function:

void PerformUserHooks ( ctdluser usbuf,
int  EventType 
)

Definition at line 1346 of file serv_extensions.c.

{
       UserFunctionHook *fcn = NULL;

       for (fcn = UserHookTable; fcn != NULL; fcn = fcn->next) {
              if (fcn->eventtype == EventType) {
                     (*fcn->h_function_pointer) (usbuf);
              }
       }
}

Here is the caller graph for this function:

int PerformXmsgHooks ( char *  sender,
char *  sender_email,
char *  recp,
char *  msg 
)

Definition at line 1434 of file serv_extensions.c.

{
       XmsgFunctionHook *fcn;
       int total_sent = 0;
       int p;

       for (p=0; p<MAX_XMSG_PRI; ++p) {
              for (fcn = XmsgHookTable; fcn != NULL; fcn = fcn->next) {
                     if (fcn->order == p) {
                            total_sent +=
                                   (*fcn->h_function_pointer)
                                          (sender, sender_email, recp, msg);
                     }
              }
              /* Break out of the loop if a higher-priority function
               * successfully delivered the message.  This prevents duplicate
               * deliveries to local users simultaneously signed onto
               * remote services.
               */
              if (total_sent) break;
       }
       return total_sent;
}

Here is the caller graph for this function:


Variable Documentation

Definition at line 186 of file serv_extensions.c.

int DebugModules = 0

Definition at line 49 of file serv_extensions.c.

Definition at line 193 of file serv_extensions.c.

Definition at line 217 of file serv_extensions.c.

ConstStr Empty = {HKEY("")}

Definition at line 218 of file serv_extensions.c.

ConstStr ErrGeneral[]
Initial value:
 {
       {HKEY("Citadel had trouble on starting up. ")},
       {HKEY(" This means, citadel won't be the service provider for a specific service you configured it to.\n\n"
             "If you don't want citadel to provide these services, turn them off in WebCit via: ")},
       {HKEY("To make both ways actualy take place restart the citserver with \"sendcommand down\"\n\n"
             "The errors returned by the system were:\n")},
       {HKEY("You can recheck the above if you follow this faq item:\n"
             "http://www.citadel.org/doku.php?id=faq:mastering_your_os:net#netstat")}
}

Definition at line 220 of file serv_extensions.c.

StrBuf* errormessages = NULL [static]

Definition at line 214 of file serv_extensions.c.

ConstStr ErrPortHint
Initial value:
 { HKEY("If you want citadel to provide you with that functionality, "
                            "check the output of \"netstat -lnp\" on linux Servers or \"netstat -na\" on *BSD"
                            " and stop the program that binds these ports.\n You should eventually remove "
                            " their initscripts in /etc/init.d so that you won't get this trouble once more.\n"
                            " After that goto \"Administration -> Shutdown Citadel\" to make Citadel restart & retry to bind this port.\n")}

Definition at line 232 of file serv_extensions.c.

ConstStr ErrPortShort = { HKEY("We couldn't bind all ports you configured to be provided by citadel server.\n")}

Definition at line 230 of file serv_extensions.c.

ConstStr ErrPortWhere = { HKEY("\"Admin->System Preferences->Network\".\n\nThe failed ports and sockets are: ")}

Definition at line 231 of file serv_extensions.c.

char* ErrSubject = "Startup Problems"

Definition at line 219 of file serv_extensions.c.

Definition at line 187 of file serv_extensions.c.

Definition at line 195 of file serv_extensions.c.

HashList* LogDebugEntryTable = NULL

Definition at line 61 of file serv_extensions.c.

Definition at line 191 of file serv_extensions.c.

Definition at line 192 of file serv_extensions.c.

StrBuf* portlist = NULL [static]

Definition at line 212 of file serv_extensions.c.

HashList* ProtoHookList = NULL

Definition at line 206 of file serv_extensions.c.

Definition at line 196 of file serv_extensions.c.

Definition at line 197 of file serv_extensions.c.

Definition at line 194 of file serv_extensions.c.

Definition at line 188 of file serv_extensions.c.

Definition at line 189 of file serv_extensions.c.

Definition at line 190 of file serv_extensions.c.