Also added a version number check to libcitadel.h and to the
library itself. citserver and webcit will refuse to run if
the linked version of libcitadel is older than the one used
at compile time.
#define LONG_MAX 2147483647L
#endif
#define LONG_MAX 2147483647L
#endif
-
-/*
- * Views
- */
-#define VIEW_BBS 0 /* Bulletin board view */
-#define VIEW_MAILBOX 1 /* Mailbox summary */
-#define VIEW_ADDRESSBOOK 2 /* Address book view */
-#define VIEW_CALENDAR 3 /* Calendar view */
-#define VIEW_TASKS 4 /* Tasks view */
-#define VIEW_NOTES 5 /* Notes view */
-#define VIEW_WIKI 6 /* Wiki view */
-#define VIEW_CALBRIEF 7 /* Brief Calendar view */
-#define VIEW_JOURNAL 8 /* Journal view (not yet implemented in native clients) */
-
/*
* Authentication modes
*/
/*
* Authentication modes
*/
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include "citadel.h"
#include "server.h"
#include "config.h"
#include "citadel.h"
#include "server.h"
#include "config.h"
perror(file_citadel_config);
exit(CTDLEXIT_CONFIG);
}
perror(file_citadel_config);
exit(CTDLEXIT_CONFIG);
}
#ifndef __CYGWIN__
if (st.st_uid != CTDLUID) {
fprintf(stderr, "%s must be owned by uid="F_UID_T" but "F_UID_T" owns it!\n",
#ifndef __CYGWIN__
if (st.st_uid != CTDLUID) {
fprintf(stderr, "%s must be owned by uid="F_UID_T" but "F_UID_T" owns it!\n",
exit(CTDLEXIT_CONFIG);
}
#endif
exit(CTDLEXIT_CONFIG);
}
#endif
+ /* Ensure that we are linked to the correct version of libcitadel */
+ if (libcitadel_version_number() < LIBCITADEL_VERSION_NUMBER) {
+ fprintf(stderr, " You are running libcitadel version %d.%02d\n",
+ (libcitadel_version_number() / 100), (libcitadel_version_number() % 100));
+ fprintf(stderr, "citserver was compiled against version %d.%02d\n",
+ (LIBCITADEL_VERSION_NUMBER / 100), (LIBCITADEL_VERSION_NUMBER % 100));
+ exit(CTDLEXIT_LIBCITADEL);
+ }
+
+
+ /* Check to see whether 'setup' must first be run to update data file formats */
if (config.c_setup_level < REV_MIN) {
if (config.c_setup_level < REV_MIN) {
- fprintf(stderr, "config: Your data files are out of date. ");
- fprintf(stderr, "Run setup to update them.\n");
- fprintf(stderr,
- " This program requires level %d.%02d\n",
+ fprintf(stderr, "Your data files are out of date. Run setup to update them.\n");
+ fprintf(stderr, " This program requires level %d.%02d\n",
(REV_LEVEL / 100), (REV_LEVEL % 100));
(REV_LEVEL / 100), (REV_LEVEL % 100));
- fprintf(stderr,
- " Data files are currently at %d.%02d\n",
+ fprintf(stderr, " Data files are currently at %d.%02d\n",
(config.c_setup_level / 100),
(config.c_setup_level % 100));
exit(CTDLEXIT_OOD);
(config.c_setup_level / 100),
(config.c_setup_level % 100));
exit(CTDLEXIT_OOD);
#define CTDLEXIT_HOME 103 /* Citadel home directory not found */
#define CTDLEXIT_OOD 104 /* Out Of Date config - rerun setup */
#define CTDLEXIT_DB 105 /* Unable to initialize database */
#define CTDLEXIT_HOME 103 /* Citadel home directory not found */
#define CTDLEXIT_OOD 104 /* Out Of Date config - rerun setup */
#define CTDLEXIT_DB 105 /* Unable to initialize database */
+#define CTDLEXIT_LIBCITADEL 106 /* Incorrect version of libcitadel */
+int libcitadel_version_number(void) {
+ return LIBCITADEL_VERSION_NUMBER;
+}
+
+#define LIBCITADEL_VERSION_NUMBER 101
+
/*
* Here's a bunch of stupid magic to make the MIME parser portable.
*/
/*
* Here's a bunch of stupid magic to make the MIME parser portable.
*/
+
+/*
+ * Views
+ */
+#define VIEW_BBS 0 /* Bulletin board view */
+#define VIEW_MAILBOX 1 /* Mailbox summary */
+#define VIEW_ADDRESSBOOK 2 /* Address book view */
+#define VIEW_CALENDAR 3 /* Calendar view */
+#define VIEW_TASKS 4 /* Tasks view */
+#define VIEW_NOTES 5 /* Notes view */
+#define VIEW_WIKI 6 /* Wiki view */
+#define VIEW_CALBRIEF 7 /* Brief Calendar view */
+#define VIEW_JOURNAL 8 /* Journal view (not yet implemented in native clients) */
+
+
#ifndef IsEmptyStr
#define IsEmptyStr(a) ((a)[0] == '\0')
#endif
#ifndef IsEmptyStr
#define IsEmptyStr(a) ((a)[0] == '\0')
#endif
*/
char *libcitadel_version_string(void);
*/
char *libcitadel_version_string(void);
+int libcitadel_version_number(void);
+ * Lots of different room-related operations.
-/**
- * \defgroup RoomOps Lots of different room-related operations.
- * \ingroup CitadelCommunitacion
- */
-/*@{*/
#include "webcit.h"
char floorlist[128][SIZ]; /**< list of our floor names */
char *viewdefs[9]; /**< the different kinds of available views */
#include "webcit.h"
char floorlist[128][SIZ]; /**< list of our floor names */
char *viewdefs[9]; /**< the different kinds of available views */
-/**
- * \brief initialize the viewdefs with localized strings
+/*
+ * Initialize the viewdefs with localized strings
*/
void initialize_viewdefs(void) {
viewdefs[0] = _("Bulletin Board");
*/
void initialize_viewdefs(void) {
viewdefs[0] = _("Bulletin Board");
viewdefs[8] = _("Journal");
}
viewdefs[8] = _("Journal");
}
-/**
- * \brief Determine which views are allowed as the default for creating a new room.
- *
- * \param which_view The view ID being queried.
+/*
+ * Determine which views are allowed as the default for creating a new room.
*/
int is_view_allowed_as_default(int which_view)
{
*/
int is_view_allowed_as_default(int which_view)
{
-/**
- * \brief load the list of floors
+/*
+ * load the list of floors
*/
void load_floorlist(void)
{
*/
void load_floorlist(void)
{
-/**
- * \brief Free a session's march list
- *
- * \param wcf Pointer to session being cleared
+/*
+ * Free a session's march list
*/
void free_march_list(struct wcsession *wcf)
{
*/
void free_march_list(struct wcsession *wcf)
{
-/**
- * \brief remove a room from the march list
+/*
+ * remove a room from the march list
*/
void remove_march(char *aaa)
{
*/
void remove_march(char *aaa)
{
-/**
- * \brief display rooms in tree structure???
- * \param rp the roomlist to build a tree from
+/*
+ * display rooms in tree structure
*/
void room_tree_list(struct roomlisting *rp)
{
*/
void room_tree_list(struct roomlisting *rp)
{
void http_datestring(char *buf, size_t n, time_t xtime);
void http_datestring(char *buf, size_t n, time_t xtime);
-/** Views (from citadel.h) */
-#define VIEW_BBS 0 /**< Traditional Citadel BBS view */
-#define VIEW_MAILBOX 1 /**< Mailbox summary */
-#define VIEW_ADDRESSBOOK 2 /**< Address book view */
-#define VIEW_CALENDAR 3 /**< Calendar view */
-#define VIEW_TASKS 4 /**< Tasks view */
-#define VIEW_NOTES 5 /**< Notes view */
-#define VIEW_WIKI 6 /**< Wiki view */
-#define VIEW_CALBRIEF 7 /**< Brief Calendar view */
-#define VIEW_JOURNAL 8 /**< Journal view (not yet implemented in webcit) */
-
/* These should be empty, but we have them for testing */
#define DEFAULT_HTTPAUTH_USER ""
#define DEFAULT_HTTPAUTH_PASS ""
/* These should be empty, but we have them for testing */
#define DEFAULT_HTTPAUTH_USER ""
#define DEFAULT_HTTPAUTH_PASS ""
- */
-/**
- * \defgroup Webserver This contains a simple multithreaded TCP server manager. It sits around
+ *
+ * This contains a simple multithreaded TCP server manager. It sits around
* waiting on the specified port for incoming HTTP connections. When a
* connection is established, it calls context_loop() from context_loop.c.
* waiting on the specified port for incoming HTTP connections. When a
* connection is established, it calls context_loop() from context_loop.c.
- * \ingroup WebcitHttpServer
#include "webcit.h"
#include "webserver.h"
#include "webcit.h"
#include "webserver.h"
int vsnprintf(char *buf, size_t max, const char *fmt, va_list argp);
#endif
int vsnprintf(char *buf, size_t max, const char *fmt, va_list argp);
#endif
-int verbosity = 9; /**< Logging level */
-int msock; /**< master listening socket */
-int is_https = 0; /**< Nonzero if I am an HTTPS service */
-int follow_xff = 0; /**< Follow X-Forwarded-For: header */
-int home_specified = 0; /**< did the user specify a homedir? */
-int time_to_die = 0; /**< Nonzero if server is shutting down */
+int verbosity = 9; /* Logging level */
+int msock; /* master listening socket */
+int is_https = 0; /* Nonzero if I am an HTTPS service */
+int follow_xff = 0; /* Follow X-Forwarded-For: header */
+int home_specified = 0; /* did the user specify a homedir? */
+int time_to_die = 0; /* Nonzero if server is shutting down */
extern void *context_loop(int);
extern void *housekeeping_loop(void);
extern pthread_mutex_t SessionListMutex;
extern void *context_loop(int);
extern void *housekeeping_loop(void);
extern pthread_mutex_t SessionListMutex;
char file_crpt_file_csr[PATH_MAX]="";
char file_crpt_file_cer[PATH_MAX]="";
char file_crpt_file_csr[PATH_MAX]="";
char file_crpt_file_cer[PATH_MAX]="";
-char socket_dir[PATH_MAX]; /**< where to talk to our citadel server */
-static const char editor_absolut_dir[PATH_MAX]=EDITORDIR; /**< nailed to what configure gives us. */
-static char static_dir[PATH_MAX]; /**< calculated on startup */
-static char static_local_dir[PATH_MAX]; /**< calculated on startup */
-char *static_dirs[]={ /**< needs same sort order as the web mapping */
- (char*)static_dir, /** our templates on disk */
- (char*)static_local_dir, /** user provided templates disk */
- (char*)editor_absolut_dir /** the editor on disk */
+char socket_dir[PATH_MAX]; /* where to talk to our citadel server */
+static const char editor_absolut_dir[PATH_MAX]=EDITORDIR; /* nailed to what configure gives us. */
+static char static_dir[PATH_MAX]; /* calculated on startup */
+static char static_local_dir[PATH_MAX]; /* calculated on startup */
+char *static_dirs[]={ /* needs same sort order as the web mapping */
+ (char*)static_dir, /* our templates on disk */
+ (char*)static_local_dir, /* user provided templates disk */
+ (char*)editor_absolut_dir /* the editor on disk */
* Subdirectories from which the client may request static content
*
* (If you add more, remember to increment 'ndirs' below)
* Subdirectories from which the client may request static content
*
* (If you add more, remember to increment 'ndirs' below)
-char *server_cookie = NULL; /**< our Cookie connection to the client */
-int http_port = PORT_NUM; /**< Port to listen on */
-char *ctdlhost = DEFAULT_HOST; /**< our name */
-char *ctdlport = DEFAULT_PORT; /**< our Port */
-int setup_wizard = 0; /**< should we run the setup wizard? \todo */
-char wizard_filename[PATH_MAX]; /**< where's the setup wizard? */
-int running_as_daemon = 0; /**< should we deamonize on startup? */
+char *server_cookie = NULL; /* our Cookie connection to the client */
+int http_port = PORT_NUM; /* Port to listen on */
+char *ctdlhost = DEFAULT_HOST; /* our name */
+char *ctdlport = DEFAULT_PORT; /* our Port */
+int setup_wizard = 0; /* should we run the setup wizard? \todo */
+char wizard_filename[PATH_MAX]; /* where's the setup wizard? */
+int running_as_daemon = 0; /* should we deamonize on startup? */
-/**
- * \brief This is a generic function to set up a master socket for listening on
+/*
+ * This is a generic function to set up a master socket for listening on
* a TCP port. The server shuts down if the bind fails.
* a TCP port. The server shuts down if the bind fails.
- * \param ip_addr ip to bind to
- * \param port_number the port to bind to
- * \param queue_len Number of incoming connections to allow in the queue
+ *
+ * ip_addr IP address to bind
+ * port_number port number to bind
+ * queue_len number of incoming connections to allow in the queue
*/
int ig_tcp_server(char *ip_addr, int port_number, int queue_len)
{
*/
int ig_tcp_server(char *ip_addr, int port_number, int queue_len)
{
lprintf(1, "Can't create a socket: %s\n", strerror(errno));
exit(WC_EXIT_BIND);
}
lprintf(1, "Can't create a socket: %s\n", strerror(errno));
exit(WC_EXIT_BIND);
}
- /** Set some socket options that make sense. */
+ /* Set some socket options that make sense. */
i = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
i = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
* \brief Create a Unix domain socket and listen on it
* \param sockpath file name of the unix domain socket
* \param queue_len Number of incoming connections to allow in the queue
* \brief Create a Unix domain socket and listen on it
* \param sockpath file name of the unix domain socket
* \param queue_len Number of incoming connections to allow in the queue
i = unlink(sockpath);
if (i != 0) if (errno != ENOENT) {
i = unlink(sockpath);
if (i != 0) if (errno != ENOENT) {
- lprintf(1, "citserver: can't unlink %s: %s\n",
+ lprintf(1, "webserver: can't unlink %s: %s\n",
sockpath, strerror(errno));
exit(WC_EXIT_BIND);
}
sockpath, strerror(errno));
exit(WC_EXIT_BIND);
}
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
- lprintf(1, "citserver: Can't create a socket: %s\n",
+ lprintf(1, "webserver: Can't create a socket: %s\n",
strerror(errno));
exit(WC_EXIT_BIND);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
strerror(errno));
exit(WC_EXIT_BIND);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- lprintf(1, "citserver: Can't bind: %s\n",
+ lprintf(1, "webserver: Can't bind: %s\n",
strerror(errno));
exit(WC_EXIT_BIND);
}
if (listen(s, actual_queue_len) < 0) {
strerror(errno));
exit(WC_EXIT_BIND);
}
if (listen(s, actual_queue_len) < 0) {
- lprintf(1, "citserver: Can't listen: %s\n",
+ lprintf(1, "webserver: Can't listen: %s\n",
strerror(errno));
exit(WC_EXIT_BIND);
}
strerror(errno));
exit(WC_EXIT_BIND);
}
* \brief Read data from the client socket.
* \param sock socket fd to read from
* \param buf buffer to read into
* \brief Read data from the client socket.
* \param sock socket fd to read from
* \param buf buffer to read into
* \brief write data to the client
* \param buf data to write to the client
* \param count size of buffer
* \brief write data to the client
* \param buf data to write to the client
* \param count size of buffer
return (write(WC->http_sock, buf, count));
}
return (write(WC->http_sock, buf, count));
}
* \brief Begin buffering HTTP output so we can transmit it all in one write operation later.
*/
void begin_burst(void)
* \brief Begin buffering HTTP output so we can transmit it all in one write operation later.
*/
void begin_burst(void)
* \brief uses the same calling syntax as compress2(), but it
* creates a stream compatible with HTTP "Content-encoding: gzip"
*/
#ifdef HAVE_ZLIB
* \brief uses the same calling syntax as compress2(), but it
* creates a stream compatible with HTTP "Content-encoding: gzip"
*/
#ifdef HAVE_ZLIB
-#define DEF_MEM_LEVEL 8 /**< memlevel??? */
-#define OS_CODE 0x03 /**< unix */
-int ZEXPORT compress_gzip(Bytef * dest, /**< compressed buffer*/
- size_t * destLen, /**< length of the compresed data */
- const Bytef * source, /**< source to encode */
- uLong sourceLen, /**< length of source to encode */
- int level) /**< compression level */
+#define DEF_MEM_LEVEL 8 /*< memlevel??? */
+#define OS_CODE 0x03 /*< unix */
+int ZEXPORT compress_gzip(Bytef * dest, /*< compressed buffer*/
+ size_t * destLen, /*< length of the compresed data */
+ const Bytef * source, /*< source to encode */
+ uLong sourceLen, /*< length of source to encode */
+ int level) /*< compression level */
- const int gz_magic[2] = { 0x1f, 0x8b }; /** gzip magic header */
+ const int gz_magic[2] = { 0x1f, 0x8b }; /* gzip magic header */
- /** write gzip header */
+ /* write gzip header */
snprintf((char *) dest, *destLen,
"%c%c%c%c%c%c%c%c%c%c",
gz_magic[0], gz_magic[1], Z_DEFLATED,
snprintf((char *) dest, *destLen,
"%c%c%c%c%c%c%c%c%c%c",
gz_magic[0], gz_magic[1], Z_DEFLATED,
- 0 /*flags */ , 0, 0, 0, 0 /*time */ , 0 /** xflags */ ,
+ 0 /*flags */ , 0, 0, 0, 0 /*time */ , 0 /* xflags */ ,
OS_CODE);
/* normal deflate */
OS_CODE);
/* normal deflate */
* \brief Finish buffering HTTP output. [Compress using zlib and] output with a Content-Length: header.
*/
void end_burst(void)
* \brief Finish buffering HTTP output. [Compress using zlib and] output with a Content-Length: header.
*/
void end_burst(void)
* \brief Read data from the client socket with default timeout.
* (This is implemented in terms of client_read_to() and could be
* justifiably moved out of sysdep.c)
* \brief Read data from the client socket with default timeout.
* (This is implemented in terms of client_read_to() and could be
* justifiably moved out of sysdep.c)
* \brief Get a LF-terminated line of text from the client.
* (This is implemented in terms of client_read() and could be
* justifiably moved out of sysdep.c)
* \brief Get a LF-terminated line of text from the client.
* (This is implemented in terms of client_read() and could be
* justifiably moved out of sysdep.c)
- /** Read one character at a time.*/
+ /* Read one character at a time.*/
for (i = 0;; i++) {
retval = client_read(sock, &buf[i], 1);
if (retval != 1 || buf[i] == '\n' || i == (bufsiz-1))
break;
if ( (!isspace(buf[i])) && (!isprint(buf[i])) ) {
for (i = 0;; i++) {
retval = client_read(sock, &buf[i], 1);
if (retval != 1 || buf[i] == '\n' || i == (bufsiz-1))
break;
if ( (!isspace(buf[i])) && (!isprint(buf[i])) ) {
- /** Non printable character recieved from client */
+ /* Non printable character recieved from client */
- /** If we got a long line, discard characters until the newline. */
+ /* If we got a long line, discard characters until the newline. */
if (i == (bufsiz-1))
while (buf[i] != '\n' && retval == 1)
retval = client_read(sock, &buf[i], 1);
if (i == (bufsiz-1))
while (buf[i] != '\n' && retval == 1)
retval = client_read(sock, &buf[i], 1);
* Strip any trailing non-printable characters.
*/
buf[i] = 0;
* Strip any trailing non-printable characters.
*/
buf[i] = 0;
* \brief shut us down the regular way.
* param signum the signal we want to forward
*/
* \brief shut us down the regular way.
* param signum the signal we want to forward
*/
* \brief shut us down the regular way.
* param signum the signal we want to forward
*/
* \brief shut us down the regular way.
* param signum the signal we want to forward
*/
* \brief Start running as a daemon.
*
* param do_close_stdio Only close stdio if set.
* \brief Start running as a daemon.
*
* param do_close_stdio Only close stdio if set.
exit(WEXITSTATUS(status));
}
exit(WEXITSTATUS(status));
}
* \brief Spawn an additional worker thread into the pool.
*/
void spawn_another_worker_thread()
{
* \brief Spawn an additional worker thread into the pool.
*/
void spawn_another_worker_thread()
{
- pthread_t SessThread; /**< Thread descriptor */
- pthread_attr_t attr; /**< Thread attributes */
+ pthread_t SessThread; /*< Thread descriptor */
+ pthread_attr_t attr; /*< Thread attributes */
int ret;
lprintf(3, "Creating a new thread\n");
int ret;
lprintf(3, "Creating a new thread\n");
- /** set attributes for the new thread */
+ /* set attributes for the new thread */
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
* Our per-thread stacks need to be bigger than the default size, otherwise
* the MIME parser crashes on FreeBSD, and the IMAP service crashes on
* 64-bit Linux.
* Our per-thread stacks need to be bigger than the default size, otherwise
* the MIME parser crashes on FreeBSD, and the IMAP service crashes on
* 64-bit Linux.
pthread_attr_destroy(&attr);
}
pthread_attr_destroy(&attr);
}
- /** now create the thread */
+ /* now create the thread */
if (pthread_create(&SessThread, &attr,
(void *(*)(void *)) worker_entry, NULL)
!= 0) {
lprintf(1, "Can't create thread: %s\n", strerror(errno));
}
if (pthread_create(&SessThread, &attr,
(void *(*)(void *)) worker_entry, NULL)
!= 0) {
lprintf(1, "Can't create thread: %s\n", strerror(errno));
}
- /** free up the attributes */
+ /* free up the attributes */
pthread_attr_destroy(&attr);
}
pthread_attr_destroy(&attr);
}
* \brief Here's where it all begins.
* \param argc number of commandline args
* \param argv the commandline arguments
*/
int main(int argc, char **argv)
{
* \brief Here's where it all begins.
* \param argc number of commandline args
* \param argv the commandline arguments
*/
int main(int argc, char **argv)
{
- pthread_t SessThread; /**< Thread descriptor */
- pthread_attr_t attr; /**< Thread attributes */
- int a, i; /**< General-purpose variables */
+ pthread_t SessThread; /*< Thread descriptor */
+ pthread_attr_t attr; /*< Thread attributes */
+ int a, i; /*< General-purpose variables */
char tracefile[PATH_MAX];
char ip_addr[256]="0.0.0.0";
char dirbuffer[PATH_MAX]="";
char tracefile[PATH_MAX];
char ip_addr[256]="0.0.0.0";
char dirbuffer[PATH_MAX]="";
char *locale = NULL;
char *mo = NULL;
#endif /* ENABLE_NLS */
char *locale = NULL;
char *mo = NULL;
#endif /* ENABLE_NLS */
- char uds_listen_path[PATH_MAX]; /**< listen on a unix domain socket? */
+ char uds_listen_path[PATH_MAX]; /*< listen on a unix domain socket? */
+
+ /* Ensure that we are linked to the correct version of libcitadel */
+ if (libcitadel_version_number() < LIBCITADEL_VERSION_NUMBER) {
+ fprintf(stderr, " You are running libcitadel version %d.%02d\n",
+ (libcitadel_version_number() / 100), (libcitadel_version_number() % 100));
+ fprintf(stderr, "WebCit was compiled against version %d.%02d\n",
+ (LIBCITADEL_VERSION_NUMBER / 100), (LIBCITADEL_VERSION_NUMBER % 100));
+ return(1);
+ }
strcpy(uds_listen_path, "");
if (getenv("TZ") == NULL)
putenv("TZ=UTC");
strcpy(uds_listen_path, "");
if (getenv("TZ") == NULL)
putenv("TZ=UTC");
- /** Parse command line */
+ /* Parse command line */
#ifdef HAVE_OPENSSL
while ((a = getopt(argc, argv, "h:i:p:t:x:dD:cfs")) != EOF)
#else
#ifdef HAVE_OPENSSL
while ((a = getopt(argc, argv, "h:i:p:t:x:dD:cfs")) != EOF)
#else
signal(SIGHUP, graceful_shutdown);
}
signal(SIGHUP, graceful_shutdown);
}
- /** Tell 'em who's in da house */
+ /* Tell 'em who's in da house */
lprintf(1, PACKAGE_STRING "\n");
lprintf(1, "Copyright (C) 1996-2008 by the Citadel development team.\n"
"This software is distributed under the terms of the "
lprintf(1, PACKAGE_STRING "\n");
lprintf(1, "Copyright (C) 1996-2008 by the Citadel development team.\n"
"This software is distributed under the terms of the "
- /** initialize the International Bright Young Thing */
+ /* initialize the International Bright Young Thing */
#ifdef ENABLE_NLS
initialize_locales();
locale = setlocale(LC_ALL, "");
#ifdef ENABLE_NLS
initialize_locales();
locale = setlocale(LC_ALL, "");
"%s/citadel.cer",
ctdl_key_dir);
"%s/citadel.cer",
ctdl_key_dir);
- /** we should go somewhere we can leave our coredump, if enabled... */
+ /* we should go somewhere we can leave our coredump, if enabled... */
lprintf(9, "Changing directory to %s\n", socket_dir);
if (chdir(webcitdir) != 0) {
perror("chdir");
lprintf(9, "Changing directory to %s\n", socket_dir);
if (chdir(webcitdir) != 0) {
perror("chdir");
initialize_viewdefs();
initialize_axdefs();
initialize_viewdefs();
initialize_axdefs();
* Set up a place to put thread-specific data.
* We only need a single pointer per thread - it points to the
* wcsession struct to which the thread is currently bound.
* Set up a place to put thread-specific data.
* We only need a single pointer per thread - it points to the
* wcsession struct to which the thread is currently bound.
}
InitialiseSemaphores ();
}
InitialiseSemaphores ();
* Set up a place to put thread-specific SSL data.
* We don't stick this in the wcsession struct because SSL starts
* up before the session is bound, and it gets torn down between
* Set up a place to put thread-specific SSL data.
* We don't stick this in the wcsession struct because SSL starts
* up before the session is bound, and it gets torn down between
* Bind the server to our favorite port.
* There is no need to check for errors, because ig_tcp_server()
* exits if it doesn't succeed.
* Bind the server to our favorite port.
* There is no need to check for errors, because ig_tcp_server()
* exits if it doesn't succeed.
pthread_mutex_init(&SessionListMutex, NULL);
pthread_mutex_init(&SessionListMutex, NULL);
* Start up the housekeeping thread
*/
pthread_attr_init(&attr);
* Start up the housekeeping thread
*/
pthread_attr_init(&attr);
(void *(*)(void *)) housekeeping_loop, NULL);
(void *(*)(void *)) housekeeping_loop, NULL);
* If this is an HTTPS server, fire up SSL
*/
#ifdef HAVE_OPENSSL
* If this is an HTTPS server, fire up SSL
*/
#ifdef HAVE_OPENSSL
- /** Start a few initial worker threads */
+ /* Start a few initial worker threads */
for (i = 0; i < (MIN_WORKER_THREADS); ++i) {
spawn_another_worker_thread();
}
for (i = 0; i < (MIN_WORKER_THREADS); ++i) {
spawn_another_worker_thread();
}
* Entry point for worker threads
*/
void worker_entry(void)
* Entry point for worker threads
*/
void worker_entry(void)
FD_SET(msock, &readset);
do {
FD_SET(msock, &readset);
do {
- /** Only one thread can accept at a time */
+ /* Only one thread can accept at a time */
fail_this_transaction = 0;
ssock = -1;
errno = EAGAIN;
fail_this_transaction = 0;
ssock = -1;
errno = EAGAIN;
lprintf(2, "inbetween.");
pthread_exit(NULL);
} else { // Got it? do some real work!
lprintf(2, "inbetween.");
pthread_exit(NULL);
} else { // Got it? do some real work!
- /** Set the SO_REUSEADDR socket option */
+ /* Set the SO_REUSEADDR socket option */
i = 1;
setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR,
&i, sizeof(i));
i = 1;
setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR,
&i, sizeof(i));
- /** If we are an HTTPS server, go crypto now. */
+ /* If we are an HTTPS server, go crypto now. */
#ifdef HAVE_OPENSSL
if (is_https) {
if (starttls(ssock) != 0) {
#ifdef HAVE_OPENSSL
if (is_https) {
if (starttls(ssock) != 0) {
if (fail_this_transaction == 0) {
if (fail_this_transaction == 0) {
- /** Perform an HTTP transaction... */
+ /* Perform an HTTP transaction... */
- /** Shut down SSL/TLS if required... */
+ /* Shut down SSL/TLS if required... */
#ifdef HAVE_OPENSSL
if (is_https) {
endtls();
}
#endif
#ifdef HAVE_OPENSSL
if (is_https) {
endtls();
}
#endif
- /** ...and close the socket. */
+ /* ...and close the socket. */
lingering_close(ssock);
}
lingering_close(ssock);
}
* \brief logprintf. log messages
* logs to stderr if loglevel is lower than the verbosity set at startup
* \param loglevel level of the message
* \brief logprintf. log messages
* logs to stderr if loglevel is lower than the verbosity set at startup
* \param loglevel level of the message
* \brief print the actual stack frame.
*/
void wc_backtrace(void)
* \brief print the actual stack frame.
*/
void wc_backtrace(void)