|
|
|
@ -34,28 +34,43 @@ gboolean log_write_(server *srv, connection *con, const char *fmt, ...) {
|
|
|
|
|
va_list ap; |
|
|
|
|
GString *log_line; |
|
|
|
|
static GStaticMutex log_mutex = G_STATIC_MUTEX_INIT; |
|
|
|
|
gint log_fd; |
|
|
|
|
log_t *log; |
|
|
|
|
guint log_ndx; |
|
|
|
|
gssize bytes_written; |
|
|
|
|
gssize write_res; |
|
|
|
|
|
|
|
|
|
if (con != NULL) { |
|
|
|
|
/* get fd from connection */ |
|
|
|
|
/* get log index from connection */ |
|
|
|
|
g_mutex_lock(con->mutex); |
|
|
|
|
log_fd = con->error_log_fd; |
|
|
|
|
log_ndx = con->log_ndx; |
|
|
|
|
g_mutex_unlock(con->mutex); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
/* get fd from server */ |
|
|
|
|
g_mutex_lock(srv->mutex); |
|
|
|
|
log_fd = srv->error_log_fd; |
|
|
|
|
g_mutex_unlock(srv->mutex); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
log_ndx = 0; |
|
|
|
|
|
|
|
|
|
/* get fd from server */ |
|
|
|
|
g_mutex_lock(srv->mutex); |
|
|
|
|
log = &g_array_index(srv->logs, log_t, log_ndx); |
|
|
|
|
g_mutex_unlock(srv->mutex); |
|
|
|
|
|
|
|
|
|
log_line = g_string_sized_new(0); |
|
|
|
|
va_start(ap, fmt); |
|
|
|
|
g_string_vprintf(log_line, fmt, ap); |
|
|
|
|
va_end(ap); |
|
|
|
|
|
|
|
|
|
/* check if last message for this log was the same */ |
|
|
|
|
if (g_string_equal(log->lastmsg, log_line)) { |
|
|
|
|
log->lastmsg_count++; |
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
if (log->lastmsg_count > 0) { |
|
|
|
|
log_write_(srv, con, "last message repeated %d times", log->lastmsg_count); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
log->lastmsg_count = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
g_string_append_len(log_line, CONST_STR_LEN("\r\n")); |
|
|
|
|
|
|
|
|
|
bytes_written = 0; |
|
|
|
@ -63,7 +78,7 @@ gboolean log_write_(server *srv, connection *con, const char *fmt, ...) {
|
|
|
|
|
/* lock to ensure that multiple threads don't mess up the logs */ |
|
|
|
|
g_static_mutex_lock(&log_mutex); |
|
|
|
|
while (bytes_written < (gssize)log_line->len) { |
|
|
|
|
write_res = write(log_fd, log_line->str + bytes_written, log_line->len - bytes_written); |
|
|
|
|
write_res = write(log->fd, log_line->str + bytes_written, log_line->len - bytes_written); |
|
|
|
|
|
|
|
|
|
assert(write_res <= (gssize) log_line->len); |
|
|
|
|
|
|
|
|
@ -91,3 +106,29 @@ gboolean log_write_(server *srv, connection *con, const char *fmt, ...) {
|
|
|
|
|
|
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
log_t *log_new(const gchar* filename) { |
|
|
|
|
gint fd; |
|
|
|
|
log_t *log; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fd = open(filename, O_RDWR | O_CREAT | O_APPEND, 0660); |
|
|
|
|
|
|
|
|
|
if (fd == -1) |
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
log = g_slice_new0(log_t); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log->fd = fd; |
|
|
|
|
log->mutex = g_mutex_new(); |
|
|
|
|
log->lastmsg = g_string_new("hubba bubba"); |
|
|
|
|
|
|
|
|
|
return log; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void log_free(log_t *log) { |
|
|
|
|
close(log->fd); |
|
|
|
|
g_mutex_free(log->mutex); |
|
|
|
|
g_string_free(log->lastmsg, TRUE); |
|
|
|
|
} |
|
|
|
|