enum { INTERVAL_MIN = 0, INTERVAL_MAX = 3600 };
enum { BUFFER_MIN = 0, BUFFER_MAX = 65535 };
-enum reader_type {
- READER_BUFFER = 0,
- READER_LOGGER
-};
-
struct logger;
+struct writer;
+struct reader;
+
+/**
+ * @brief Event handler
+ * @details Receives and handles an event
+ * @param[in] server The logger server
+ * @param[in] event The received event
+ */
+typedef void (*dispatch_event_t)(struct logger *server, struct epoll_event *event);
struct fd_entity {
- /**
- * @brief Event handler
- * @details Receives and handles an event
- * @param[in] server The logger server
- * @param[in] event The received event
- */
- void (*dispatch_event)(struct logger *server, struct epoll_event *event);
+ dispatch_event_t dispatch_event;
+ struct epoll_event event;
};
-struct writer;
-
/**
* @brief Service a writer
* @details Specific handler that event is delegated to, according to writers type
char buffer[LOG_MAX_SIZE];
};
+/**
+ * @brief Service reader
+ * @details Passes the reader to a more specific servicing handler
+ * @param[in] server The logger server
+ * @param[in] reader The reader being serviced
+ * @return Positive integer if the reader is to be removed, else a nonpositive one
+ */
+typedef int (*service_reader_t)(struct logger *server, struct reader *reader);
+
struct reader {
- enum reader_type type;
struct log_file file;
int current;
int bytes_to_read;
int dumpcount;
int partial_log_size;
char partial_log[LOG_MAX_SIZE];
+ service_reader_t service_reader;
};
struct log_buffer;
}
/**
- * @brief Service reader
- * @details Passes the reader to a more specific servicing handler
- * @param[in] server The logger server
- * @param[in] reader The reader being serviced
- * @return Positive integer if the reader is to be removed, else a nonpositive one
- */
-static int service_reader(struct logger* server, struct reader* reader)
-{
- assert(reader);
-
- switch (reader->type) {
- case READER_BUFFER:
- return print_out_logs(server, reader);
- case READER_LOGGER:
- return service_reader_file(server, reader);
- default:
- return -1;
- }
-}
-
-/**
* @brief Add reader to log buffer
* @details Adds a reader to the log buffers reader list
* @param[in] log_buffer The buffer whither to add the reader
{
assert(reader);
assert(buffer);
- assert(reader->type == READER_BUFFER);
reader->current = buffer->head;
reader->bytes_to_read = buffer_used_space(buffer);
assert(server);
int ret;
- switch (reader->type) {
- case READER_BUFFER:
+
+ if (reader->buf_id != LOG_ID_INVALID) {
assert(reader->buf_id >= 0 && reader->buf_id < NELEMS(server->buffers));
if (server->buffers[reader->buf_id])
ret = add_buffer_reader(server->buffers[reader->buf_id], reader);
else
ret = -EINVAL;
- break;
- case READER_LOGGER:
+ } else {
+ assert(reader->read_fd >= 0);
ret = list_add(&server->extra_readers, reader) ? 0 : -ENOMEM;
- break;
- default:
- ret = -EINVAL;
- break;
}
return ret;
}
reader->read_fd = -1;
reader->dumpcount = 0;
reader->partial_log_size = 0;
+ reader->service_reader = NULL;
retval = log_config_read(&conf);
if (retval < 0)
goto cleanup;
}
if (!strcmp(conf_val, "pipe") || (optarg && (!strcmp(optarg, "kmsg") || !strcmp(optarg, "syslog")))) {
- reader->type = READER_BUFFER;
+ reader->service_reader = print_out_logs;
reader->buf_id = log_id_by_name(optarg);
} else if (!strcmp(conf_val, "logger")) {
- reader->type = READER_LOGGER;
-
+ reader->service_reader = service_reader_file;
conf_val = log_config_get(&conf, optarg);
if (!conf_val) {
retval = -ENOENT;
}
}
- if (reader->type != READER_BUFFER &&
- reader->type != READER_LOGGER) {
+ if (wr && wr->buf_ptr) {
+ reader->service_reader = print_out_logs;
+ reader->buf_id = wr->buf_ptr->id;
+ }
+ if (reader->service_reader == NULL) {
retval = -EINVAL;
goto cleanup;
}
else if (!silence)
log_add_filter_string(reader->file.format, "*:D");
- if (wr && wr->buf_ptr)
- reader->buf_id = wr->buf_ptr->id;
-
if ((reader->read_fd < 0) && ((reader->buf_id >= LOG_ID_MAX) || (reader->buf_id < 0))) {
retval = -EINVAL;
goto cleanup;
static int cond_service_reader(void *ptr, void *user_data)
{
+ assert(ptr);
struct reader* reader = (struct reader*)ptr;
- int r = service_reader((struct logger*)user_data, reader);
+
+ assert(reader->service_reader);
+ int r = reader->service_reader((struct logger*)user_data, reader);
if (r > 0) {
reader_free(reader);
return TRUE;