#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/socket.h>
-#include <sys/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 <limits.h>
#include <netinet/in.h>
#include <netdb.h>
fd_set masterfds; /* Master sockets etc. */
int masterhighest;
-time_t last_timer = 0L; /* Last timer hook processing */
-
static pthread_t initial_thread; /* tid for main() thread */
/*
* lprintf() ... Write logging information
+ *
+ * Note: the variable "buf" below needs to be large enough to handle any
+ * log data sent through this function. BE CAREFUL!
*/
void lprintf(int loglevel, const char *format, ...) {
va_list arg_ptr;
- char buf[512];
+ char buf[4096];
va_start(arg_ptr, format);
vsprintf(buf, format, arg_ptr);
va_end(arg_ptr);
if (loglevel <= verbosity) {
- fprintf(stderr, "%s", buf);
+ struct timeval tv;
+ struct tm *tim;
+
+ gettimeofday(&tv, NULL);
+ tim = localtime(&(tv.tv_sec));
+ /*
+ * Log provides millisecond accuracy. If you need
+ * microsecond accuracy and your OS supports it, change
+ * %03ld to %06ld and remove " / 1000" after tv.tv_usec.
+ */
+ fprintf(stderr, "%04d/%02d/%02d %2d:%02d:%02d.%03ld %s",
+ tim->tm_year + 1900, tim->tm_mon + 1, tim->tm_mday,
+ tim->tm_hour, tim->tm_min, tim->tm_sec,
+ tv.tv_usec / 1000, buf);
fflush(stderr);
}
void begin_critical_section(int which_one)
{
/* lprintf(9, "begin_critical_section(%d)\n", which_one); */
+ /* ensure nobody ever tries to do a critical section within a
+ transaction; this could lead to deadlock. */
+ cdb_check_handles();
pthread_mutex_lock(&Critters[which_one]);
}
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons((u_short)port_number);
- s = socket(PF_INET, SOCK_STREAM,
- (getprotobyname("tcp")->p_proto));
+ s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s < 0) {
lprintf(1, "citserver: Can't create a socket: %s\n",
int retval;
int sock;
+
if (CC->redirect_fp != NULL) {
fwrite(buf, nbytes, 1, CC->redirect_fp);
return;
/* Tell 'em who's in da house */
lprintf(1,
"\nMultithreaded message server for Citadel/UX\n"
-"Copyright (C) 1987-2000 by the Citadel/UX development team.\n"
+"Copyright (C) 1987-2001 by the Citadel/UX development team.\n"
"Citadel/UX is free software, covered by the GNU General Public License, and\n"
"you are welcome to change it and/or distribute copies of it under certain\n"
"conditions. There is absolutely no warranty for this software. Please\n"
/* make doubly sure we're not holding any stale db handles
* which might cause a deadlock.
*/
- cdb_release_handles();
+ cdb_check_handles();
begin_critical_section(S_I_WANNA_SELECT);
SETUP_FD: memcpy(&readfds, &masterfds, sizeof masterfds);
}
dead_session_purge();
- if ((time(NULL) - last_timer) > 60L) {
- last_timer = time(NULL);
- cdb_release_handles(); /* suggested by Justin Case */
- PerformSessionHooks(EVT_TIMER);
- }
-
+ do_housekeeping();
check_sched_shutdown();
}