*/
static int service_writer_pipe(struct logger *server, struct writer *wr, struct epoll_event *event)
{
- if (event->events & EPOLLIN) {
- int r = read(wr->fd_entity.fd, wr->buffer + wr->readed, sizeof wr->buffer - wr->readed);
+ if (~event->events & EPOLLIN) {
+ return event->events & EPOLLHUP
+ ? -EBADF
+ : 0
+ ;
+ }
- if (r == -1 && errno == EAGAIN)
- return 0;
- else if ((r == 0 || r == -1) && event->events & EPOLLHUP)
- return -EINVAL;
- else if (r == 0)
- return -EBADF;
-
- wr->readed += r;
-
- struct pipe_logger_entry *const ple = (struct pipe_logger_entry *const)wr->buffer;
- while ((wr->readed >= sizeof(ple->len)) && (ple->len <= wr->readed)) {
- const int payload_size = ple->len - sizeof *ple;
- if (payload_size <= 0 || payload_size > LOG_MAX_PAYLOAD_SIZE)
- return -EINVAL;
-
- struct dlogutil_entry_with_msg lem;
- parse_pipe_message(ple, &lem.header, ple->len);
-
- struct now_t now;
- r = get_now(&now);
- if (r < 0)
- return r;
- add_recv_timestamp(&lem.header, now);
-
- fixup_pipe_msg(&lem, payload_size);
- if (server->qos)
- qos_add_log(server->qos, &lem.header);
- r = buffer_append(&lem.header, wr->buf_ptr);
- wr->readed -= ple->len;
- memmove(wr->buffer, wr->buffer + ple->len, sizeof wr->buffer - ple->len);
-
- if (r)
- return r;
- }
- } else if (event->events & EPOLLHUP)
+ int r = read(wr->fd_entity.fd, wr->buffer + wr->readed, sizeof wr->buffer - wr->readed);
+ if (r == -1 && errno == EAGAIN)
+ return 0;
+ else if ((r == 0 || r == -1) && event->events & EPOLLHUP)
+ return -EINVAL;
+ else if (r == 0)
return -EBADF;
+ wr->readed += r;
+
+ struct pipe_logger_entry *const ple = (struct pipe_logger_entry *const)wr->buffer;
+ while ((wr->readed >= sizeof(ple->len)) && (ple->len <= wr->readed)) {
+ const int payload_size = ple->len - sizeof *ple;
+ if (payload_size <= 0 || payload_size > LOG_MAX_PAYLOAD_SIZE)
+ return -EINVAL;
+
+ struct dlogutil_entry_with_msg lem;
+ parse_pipe_message(ple, &lem.header, ple->len);
+
+ struct now_t now;
+ r = get_now(&now);
+ if (r < 0)
+ return r;
+ add_recv_timestamp(&lem.header, now);
+
+ fixup_pipe_msg(&lem, payload_size);
+ if (server->qos)
+ qos_add_log(server->qos, &lem.header);
+ r = buffer_append(&lem.header, wr->buf_ptr);
+ wr->readed -= ple->len;
+ memmove(wr->buffer, wr->buffer + ple->len, sizeof wr->buffer - ple->len);
+
+ if (r)
+ return r;
+ }
+
return 0;
}
assert(!dumping || !monitor);
log_compressed_storage_reader *reader = malloc(sizeof(*reader));
- if (NULL != reader) {
- reader->storage = storage;
- reader->callback = callback;
- reader->user_data = user_data;
- reader->current = NULL;
- reader->counter = storage->counter_begin;
- reader->final = NULL;
-
- if (dumping) {
- // dumping - get all the logs up to this moment
- if (NULL != storage->entries)
- reader->final = storage->entries->prev;
- else
- // but in case there are no logs - we have nothing to do
- reader->storage = NULL;
- }
+ if (NULL == reader)
+ return NULL;
- if (monitor)
- reader_move_to_entry(reader, storage->entries ? storage->entries->prev : NULL);
- else if (NULL != reader->storage)
- list_add(&storage->waiting_readers, reader);
+ reader->storage = storage;
+ reader->callback = callback;
+ reader->user_data = user_data;
+ reader->current = NULL;
+ reader->counter = storage->counter_begin;
+ reader->final = NULL;
+
+ if (dumping) {
+ // dumping - get all the logs up to this moment
+ if (NULL != storage->entries)
+ reader->final = storage->entries->prev;
+ else
+ // but in case there are no logs - we have nothing to do
+ reader->storage = NULL;
}
+
+ if (monitor)
+ reader_move_to_entry(reader, storage->entries ? storage->entries->prev : NULL);
+ else if (NULL != reader->storage)
+ list_add(&storage->waiting_readers, reader);
+
return reader;
}
log_storage *log_storage_create(unsigned capacity, dlogutil_sorting_order_e sort_by)
{
log_storage *storage = malloc(sizeof(*storage));
- if (NULL != storage) {
- storage->capacity = capacity;
- storage->sort_by = sort_by;
- storage->counter_begin = 0;
- storage->counter_end = 0;
- storage->entries = NULL;
- storage->waiting_readers = NULL;
- }
+ if (NULL == storage)
+ return NULL;
+
+ storage->capacity = capacity;
+ storage->sort_by = sort_by;
+ storage->counter_begin = 0;
+ storage->counter_end = 0;
+ storage->entries = NULL;
+ storage->waiting_readers = NULL;
return storage;
}
assert(!dumping || !monitor);
log_storage_reader *reader = malloc(sizeof(*reader));
- if (NULL != reader) {
- reader->storage = storage;
- reader->callback = callback;
- reader->user_data = user_data;
- reader->current = NULL;
- reader->counter = storage->counter_begin;
- reader->final = NULL;
-
- if (dumping) {
- // dumping - get all the logs up to this moment
- if (NULL != storage->entries)
- reader->final = storage->entries->prev;
- else
- // but in case there are no logs - we have nothing to do
- reader->storage = NULL;
- }
+ if (NULL == reader)
+ return NULL;
- if (monitor)
- reader_move_to_entry(reader, storage->entries ? storage->entries->prev : NULL);
- else if (NULL != reader->storage)
- list_add(&storage->waiting_readers, reader);
+ reader->storage = storage;
+ reader->callback = callback;
+ reader->user_data = user_data;
+ reader->current = NULL;
+ reader->counter = storage->counter_begin;
+ reader->final = NULL;
+
+ if (dumping) {
+ // dumping - get all the logs up to this moment
+ if (NULL != storage->entries)
+ reader->final = storage->entries->prev;
+ else
+ // but in case there are no logs - we have nothing to do
+ reader->storage = NULL;
}
+
+ if (monitor)
+ reader_move_to_entry(reader, storage->entries ? storage->entries->prev : NULL);
+ else if (NULL != reader->storage)
+ list_add(&storage->waiting_readers, reader);
+
return reader;
}
{
return NULL == reader->storage
? NULL
- : NULL == reader->current
- ? reader->storage->entries
- ? &reader->storage->entries->entry
- : NULL
- : log_storage_reader_entry_is_not_last(reader, reader->current)
- ? &reader->current->next->entry
- : NULL
+ : NULL == reader->current
+ ? reader->storage->entries
+ ? &reader->storage->entries->entry
+ : NULL
+ : log_storage_reader_entry_is_not_last(reader, reader->current)
+ ? &reader->current->next->entry
+ : NULL
;
}
void flush_logfile_timely(struct log_file *file, struct timespec ts, int flush_time)
{
- if (file->buffer.position > 0) {
- if (ts.tv_sec - file->buffer.oldest_log.tv_sec +
- (ts.tv_nsec > file->buffer.oldest_log.tv_nsec ? 1 : 0) >
- flush_time)
- logfile_flush(file);
- }
+ if (file->buffer.position <= 0)
+ return;
+
+ const int sec_diff = ts.tv_sec - file->buffer.oldest_log.tv_sec
+ + (ts.tv_nsec > file->buffer.oldest_log.tv_nsec ? 1 : 0);
+
+ if (sec_diff <= flush_time)
+ return;
+
+ logfile_flush(file);
}
int add_reader_to_server(struct reader_common *reader, struct logger *server)
bool first_time;
if (data->first_time_file_path) {
int fd = open(data->first_time_file_path, O_CREAT | O_EXCL | O_RDONLY, 0644);
- if (fd == -1) {
- if (errno == EEXIST)
- first_time = false;
- else
- return -errno;
- } else {
+ if (fd != -1) {
first_time = true;
close(fd);
- }
+ } else if (errno == EEXIST)
+ first_time = false;
+ else
+ return -errno;
} else
// If no path, assume first time
first_time = true;
* or alternatively get culled if it gets no sub-readers. */
}
- for (log_id_t id = 0; id < LOG_ID_MAX; id++)
- if (data->is_buffer_enabled[id]) {
- int r = buffer_create(&l->buffers[id], id, data->buffers + id, l);
- if (r < 0)
- return r;
- }
+ for (log_id_t id = 0; id < LOG_ID_MAX; id++) {
+ if (!data->is_buffer_enabled[id])
+ continue;
- for (log_id_t id = 0; id < LOG_ID_MAX; id++)
- if (l->buffers[id]) {
- add_fd_entity(&l->epoll_common, &l->buffers[id]->sock_ctl.fd_entity);
- add_fd_entity(&l->epoll_common, &l->buffers[id]->sock_conn.fd_entity);
+ int r = buffer_create(&l->buffers[id], id, data->buffers + id, l);
+ if (r < 0)
+ return r;
+ }
- add_fd_entity(&l->epoll_socket, &l->buffers[id]->sock_ctl.fd_entity);
- add_fd_entity(&l->epoll_socket, &l->buffers[id]->sock_conn.fd_entity);
- }
+ for (log_id_t id = 0; id < LOG_ID_MAX; id++) {
+ if (!l->buffers[id])
+ continue;
+
+ add_fd_entity(&l->epoll_common, &l->buffers[id]->sock_ctl.fd_entity);
+ add_fd_entity(&l->epoll_common, &l->buffers[id]->sock_conn.fd_entity);
+
+ add_fd_entity(&l->epoll_socket, &l->buffers[id]->sock_ctl.fd_entity);
+ add_fd_entity(&l->epoll_socket, &l->buffers[id]->sock_conn.fd_entity);
+ }
/* TODO: make writers creation optional/configurable */
int (*writers_factories[LOG_ID_MAX])(struct writer **writer, struct log_buffer *log_buf) = {
g_backend.use_logger_by_default = true;
for (log_id_t buf_id = 0; buf_id < LOG_ID_MAX; ++buf_id) {
const char *const logger_device = log_config_get(&conf, log_name_by_id(buf_id));
- if (logger_device)
- strncpy(g_backend.logger_devices[buf_id], logger_device,
- NELEMS(g_backend.logger_devices[buf_id]) - 1);
+ if (!logger_device)
+ continue;
+
+ strncpy(g_backend.logger_devices[buf_id], logger_device,
+ NELEMS(g_backend.logger_devices[buf_id]) - 1);
}
g_backend.lazy_polling_total = log_config_get_int(&conf, "lazy_polling_total_ms", DEFAULT_LAZY_POLLING_TOTAL_MS);
g_backend.lazy_polling_sleep = log_config_get_int(&conf, "lazy_polling_sleep_ms", DEFAULT_LAZY_POLLING_SLEEP_MS);
dev_log_sock_get() >= 0 || log_config_get_boolean(&conf, "syslog_force", false);
for (log_id_t buf_id = 0; buf_id < LOG_ID_MAX; ++buf_id) {
- if (data->is_buffer_enabled[buf_id]) {
- ret = prepare_buffer_data(&conf, data->buffers + buf_id, buf_id);
- if (ret < 0)
- goto end;
- }
+ if (!data->is_buffer_enabled[buf_id])
+ continue;
+
+ ret = prepare_buffer_data(&conf, data->buffers + buf_id, buf_id);
+ if (ret < 0)
+ goto end;
}
log_config_foreach(&conf, save_logfile_config, data);
int systemd_sock_get(const char *path, int type)
{
- int sock_fd = -1;
int n = sd_listen_fds(0);
- if (n > 0) {
- int i;
- for (i = SD_LISTEN_FDS_START; sock_fd < 0 && i < SD_LISTEN_FDS_START + n; i++)
- if (sd_is_socket_unix(i, type, -1, path, 0) > 0)
- sock_fd = i;
- }
+ if (n <= 0)
+ return -1;
+
+ int sock_fd = -1;
+ for (int i = SD_LISTEN_FDS_START; sock_fd < 0 && i < SD_LISTEN_FDS_START + n; i++)
+ if (sd_is_socket_unix(i, type, -1, path, 0) > 0)
+ sock_fd = i;
+
return sock_fd;
}
* @return 0 on success, -ENOMEM when out of memory
*/
int writer_create(struct writer **writer, int fd, struct log_buffer *log_buffer,
- service_writer_t service_writer, service_socket_t service_socket)
+ service_writer_t service_writer, service_socket_t service_socket)
{
struct writer *w = (struct writer *)calloc(1, sizeof(*w));
if (!w)
#undef LARGEST_STRUCT
int writer_create(struct writer **writer, int fd, struct log_buffer *log_buffer,
- service_writer_t service_writer, service_socket_t service_socket);
+ service_writer_t service_writer, service_socket_t service_socket);
int create_kmsg_writer(struct writer **writer, struct log_buffer *log_buffer);
int create_syslog_writer(struct writer **writer, struct log_buffer *log_buffer);
void writer_close_fd(struct logger *server, struct writer *wr);