#include "housekeeping.h"
#include "tools.h"
#include "modules/crypto/serv_crypto.h" /* Needed for init_ssl, client_write_ssl, client_read_ssl, destruct_ssl */
+#include "ecrash.h"
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
void DestroyWorkerList(void);
+
+/*
+ * Create an interface to lprintf that follows the coding convention.
+ * This is here until such time as we have replaced all calls to lprintf with CtdlLogPrintf
+ */
+
+void CtdlLogPrintf(enum LogLevel loglevel, const char *format, ...)
+{
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ vlprintf(loglevel, format, arg_ptr);
+ va_end(arg_ptr);
+}
+
+
/*
* lprintf() ... Write logging information
*/
void lprintf(enum LogLevel loglevel, const char *format, ...) {
va_list arg_ptr;
+ va_start(arg_ptr, format);
+ vlprintf(loglevel, format, arg_ptr);
+ va_end(arg_ptr);
+}
+
+void vlprintf(enum LogLevel loglevel, const char *format, va_list arg_ptr)
+{
+ char buf[SIZ], buf2[SIZ];
if (enable_syslog) {
- va_start(arg_ptr, format);
- vsyslog((syslog_facility | loglevel), format, arg_ptr);
- va_end(arg_ptr);
+ vsyslog((syslog_facility | loglevel), format, arg_ptr);
}
/* stderr output code */
unixtime = tv.tv_sec;
localtime_r(&unixtime, &tim);
if (CC->cs_pid != 0) {
- fprintf(stderr,
+ sprintf(buf,
"%04d/%02d/%02d %2d:%02d:%02d.%06ld [%3d] ",
tim.tm_year + 1900, tim.tm_mon + 1,
tim.tm_mday, tim.tm_hour, tim.tm_min,
tim.tm_sec, (long)tv.tv_usec,
CC->cs_pid);
} else {
- fprintf(stderr,
+ sprintf(buf,
"%04d/%02d/%02d %2d:%02d:%02d.%06ld ",
tim.tm_year + 1900, tim.tm_mon + 1,
tim.tm_mday, tim.tm_hour, tim.tm_min,
tim.tm_sec, (long)tv.tv_usec);
}
- va_start(arg_ptr, format);
- vfprintf(stderr, format, arg_ptr);
- va_end(arg_ptr);
+ vsprintf(buf2, format, arg_ptr);
+
+ fprintf(stderr, "%s%s", buf, buf2);
fflush(stderr);
}
}
master_cleanup(signum);
}
+
+
+
+void InitialiseSemaphores(void)
+{
+ int i;
+
+ /* Set up a bunch of semaphores to be used for critical sections */
+ for (i=0; i<MAX_SEMAPHORES; ++i) {
+ pthread_mutex_init(&Critters[i], NULL);
+ }
+}
+
+
+
/*
* Some initialization stuff...
*/
void init_sysdep(void) {
- int i;
sigset_t set;
/* Avoid vulnerabilities related to FD_SETSIZE if we can. */
init_ssl();
#endif
- /* Set up a bunch of semaphores to be used for critical sections */
- for (i=0; i<MAX_SEMAPHORES; ++i) {
- pthread_mutex_init(&Critters[i], NULL);
- }
-
/*
* Set up a place to put thread-specific data.
* We only need a single pointer per thread - it points to the
return(-1);
}
- fchmod(s, 0777);
+ chmod(sockpath, S_ISGID|S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
return(s);
}
#ifndef HAVE_TCP_BUFFERING
int old_buffer_len = 0;
#endif
-
- if (CC->redirect_buffer != NULL) {
- if ((CC->redirect_len + nbytes + 2) >= CC->redirect_alloc) {
- CC->redirect_alloc = (CC->redirect_alloc * 2) + nbytes;
- CC->redirect_buffer = realloc(CC->redirect_buffer,
- CC->redirect_alloc);
+ t_context *Ctx;
+
+ Ctx = CC;
+ if (Ctx->redirect_buffer != NULL) {
+ if ((Ctx->redirect_len + nbytes + 2) >= Ctx->redirect_alloc) {
+ Ctx->redirect_alloc = (Ctx->redirect_alloc * 2) + nbytes;
+ Ctx->redirect_buffer = realloc(Ctx->redirect_buffer,
+ Ctx->redirect_alloc);
}
- memcpy(&CC->redirect_buffer[CC->redirect_len], buf, nbytes);
- CC->redirect_len += nbytes;
- CC->redirect_buffer[CC->redirect_len] = 0;
+ memcpy(&Ctx->redirect_buffer[Ctx->redirect_len], buf, nbytes);
+ Ctx->redirect_len += nbytes;
+ Ctx->redirect_buffer[Ctx->redirect_len] = 0;
return;
}
#ifndef HAVE_TCP_BUFFERING
/* If we're buffering for later, do that now. */
- if (CC->buffering) {
- old_buffer_len = CC->buffer_len;
- CC->buffer_len += nbytes;
- CC->output_buffer = realloc(CC->output_buffer, CC->buffer_len);
- memcpy(&CC->output_buffer[old_buffer_len], buf, nbytes);
+ if (Ctx->buffering) {
+ old_buffer_len = Ctx->buffer_len;
+ Ctx->buffer_len += nbytes;
+ Ctx->output_buffer = realloc(Ctx->output_buffer, Ctx->buffer_len);
+ memcpy(&Ctx->output_buffer[old_buffer_len], buf, nbytes);
return;
}
#endif
/* Ok, at this point we're not buffering. Go ahead and write. */
#ifdef HAVE_OPENSSL
- if (CC->redirect_ssl) {
+ if (Ctx->redirect_ssl) {
client_write_ssl(buf, nbytes);
return;
}
#endif
while (bytes_written < nbytes) {
- retval = write(CC->client_socket, &buf[bytes_written],
+ retval = write(Ctx->client_socket, &buf[bytes_written],
nbytes - bytes_written);
if (retval < 1) {
lprintf(CTDL_ERR,
nbytes - bytes_written,
strerror(errno), errno);
cit_backtrace();
- CC->kill_me = 1;
+ // lprintf(CTDL_DEBUG, "Tried to send: %s", &buf[bytes_written]);
+ Ctx->kill_me = 1;
return;
}
bytes_written = bytes_written + retval;
{
int len,rlen;
fd_set rfds;
+ int fd;
struct timeval tv;
int retval;
}
#endif
len = 0;
+ fd = CC->client_socket;
while(len<bytes) {
FD_ZERO(&rfds);
- FD_SET(CC->client_socket, &rfds);
+ FD_SET(fd, &rfds);
tv.tv_sec = timeout;
tv.tv_usec = 0;
- retval = select( (CC->client_socket)+1,
- &rfds, NULL, NULL, &tv);
+ retval = select( (fd)+1,
+ &rfds, NULL, NULL, &tv);
- if (FD_ISSET(CC->client_socket, &rfds) == 0) {
+ if (FD_ISSET(fd, &rfds) == 0) {
return(0);
}
- rlen = read(CC->client_socket, &buf[len], bytes-len);
+ rlen = read(fd, &buf[len], bytes-len);
if (rlen<1) {
/* The socket has been disconnected! */
CC->kill_me = 1;
/* Strip the trailing LF, and the trailing CR if present.
*/
buf[i] = 0;
- while ( (!IsEmptyStr(buf)) && ((buf[strlen(buf)-1]==10) || (buf[strlen(buf)-1] == 13)) ) {
- buf[strlen(buf)-1] = 0;
+ while ( (i > 0)
+ && ( (buf[i - 1]==13)
+ || ( buf[i - 1]==10)) ) {
+ i--;
+ buf[i] = 0;
}
- if (retval < 0) safestrncpy(buf, "000", bufsize);
+ if (retval < 0) safestrncpy(&buf[i], "000", bufsize - i);
return(retval);
}
CtdlDestroyFixedOutputHooks();
CtdlDestroySessionHooks();
CtdlDestroyServiceHook();
+ #ifdef HAVE_BACKTRACE
+ eCrash_Uninit();
+ #endif
}
else {
fp = fopen(file_pid_file, "w");
if (fp != NULL) {
- fprintf(fp, ""F_PID_T"\n", child);
+ /*
+ * NB.. The pid file contains the pid of the actual server.
+ * This is not the pid of the watcher process
+ */
+ fprintf(fp, ""F_PID_T"\n", current_child);
fclose(fp);
}
waitpid(current_child, &status, 0);
cdb_allocate_tsd();
+ // Register for tracing
+ #ifdef HAVE_BACKTRACE
+ eCrash_RegisterThread("WorkerThread", 0);
+ #endif
while (!time_to_die) {
/* make doubly sure we're not holding any stale db handles
serviceptr->h_command_function;
con->h_async_function =
serviceptr->h_async_function;
-
+ con->ServiceName =
+ serviceptr->ServiceName;
+
/* Determine whether it's a local socket */
if (serviceptr->sockpath != NULL)
con->is_local_socket = 1;
}
if (con != NULL) free (con);//// TODO: could this harm other threads?
/* If control reaches this point, the server is shutting down */
+ #ifdef HAVE_BACKTRACE
+ eCrash_UnregisterThread();
+ #endif
return(NULL);
}