*
*/
+#ifdef DLL_EXPORT
+#define IN_LIBCIT
+#endif
+
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
-#include <time.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
#include <ctype.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
-#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "citadel.h"
#include "server.h"
+#include "dynloader.h"
#include "sysdep_decls.h"
#include "citserver.h"
#include "config.h"
#include "locate_host.h"
#include "room_ops.h"
#include "file_ops.h"
-#include "dynloader.h"
#include "policy.h"
#include "control.h"
#include "tools.h"
lprintf(9, "master_startup() started\n");
lprintf(7, "Opening databases\n");
open_databases();
- cdb_begin_transaction();
if (do_defrag) {
defrag_databases();
check_ref_counts();
lprintf(7, "Creating base rooms (if necessary)\n");
- create_room(BASEROOM, 0, "", 0);
- create_room(AIDEROOM, 3, "", 0);
- create_room(SYSCONFIGROOM, 3, "", 0);
- create_room(config.c_twitroom, 0, "", 0);
+ create_room(BASEROOM, 0, "", 0, 1);
+ create_room(AIDEROOM, 3, "", 0, 1);
+ create_room(SYSCONFIGROOM, 3, "", 0, 1);
+ create_room(config.c_twitroom, 0, "", 0, 1);
lprintf(7, "Seeding the pseudo-random number generator...\n");
gettimeofday(&tv, NULL);
/*
* Cleanup routine to be called when the server is shutting down.
+ * WARNING: It's no longer safe to call this function to force a shutdown.
+ * Instead, set time_to_die = 1.
*/
void master_cleanup(void) {
struct CleanupFunctionHook *fcn;
- /* Cancel all running sessions */
- lprintf(7, "Cancelling running sessions...\n");
-
-/* FIXME do something here
- while (ContextList != NULL) {
- }
- */
-
/* Run any cleanup routines registered by loadable modules */
for (fcn = CleanupHookTable; fcn != NULL; fcn = fcn->next) {
(*fcn->h_function_pointer)();
/* Close databases */
lprintf(7, "Closing databases\n");
- cdb_end_transaction();
close_databases();
/* Do system-dependent stuff */
*/
int is_public_client(char *where)
{
- char buf[256];
+ char buf[SIZ];
FILE *fp;
lprintf(9, "Checking whether %s is a public client\n", where);
fp = fopen("public_clients","r");
if (fp == NULL) return(0);
- while (fgets(buf,256,fp)!=NULL) {
+ while (fgets(buf, sizeof buf, fp)!=NULL) {
while (isspace((buf[strlen(buf)-1])))
buf[strlen(buf)-1] = 0;
if (hostnames_match(where,buf)) {
int dev_code;
int cli_code;
int rev_level;
- char desc[256];
- char from_host[256];
+ char desc[SIZ];
+ char from_host[SIZ];
struct in_addr addr;
int do_lookup = 0;
void cmd_mesg(char *mname)
{
FILE *mfp;
- char targ[256];
- char buf[256];
+ char targ[SIZ];
+ char buf[SIZ];
char *dirs[2];
extract(buf,mname,0);
}
cprintf("%d %s\n",LISTING_FOLLOWS,buf);
- while (fgets(buf,255,mfp)!=NULL) {
+ while (fgets(buf, (SIZ-1), mfp)!=NULL) {
buf[strlen(buf)-1] = 0;
do_help_subst(buf);
cprintf("%s\n",buf);
void cmd_emsg(char *mname)
{
FILE *mfp;
- char targ[256];
- char buf[256];
+ char targ[SIZ];
+ char buf[SIZ];
char *dirs[2];
int a;
if (CtdlAccessCheck(ac_aide)) return;
cprintf("%d Shutting down server. Goodbye.\n", OK);
- master_cleanup();
+ time_to_die = 1;
}
/*
ScheduledShutdown = new_state;
}
cprintf("%d %d\n", OK, ScheduledShutdown);
+}
+
+
+/*
+ * Set or unset asynchronous protocol mode
+ */
+void cmd_asyn(char *argbuf)
+{
+ int new_state;
+
+ new_state = extract_int(argbuf, 0);
+ if ((new_state == 0) || (new_state == 1)) {
+ CC->is_async = new_state;
}
+ cprintf("%d %d\n", OK, CC->is_async);
+}
/*
* This loop recognizes all server commands.
*/
void do_command_loop(void) {
- char cmdbuf[256];
+ char cmdbuf[SIZ];
time(&CC->lastcmd);
memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
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(CC);
cprintf("%d logged out.\n",OK);
cmd_conf(&cmdbuf[5]);
}
+ else if (!strncasecmp(cmdbuf, "SEEN", 4)) {
+ cmd_seen(&cmdbuf[5]);
+ }
+
#ifdef DEBUG_MEMORY_LEAKS
else if (!strncasecmp(cmdbuf, "LEAK", 4)) {
dump_tracked();