*
*/
+#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"
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)();
}
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);
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);
+}
/*
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();