ENTITY_SOCK_WRITE,
};
-enum writer_state {
- WRITER_SOCKET = 0,
- WRITER_PIPE,
- WRITER_KMSG
-};
-
struct fd_entity {
int type;
};
struct writer;
+struct logger;
+
+/**
+ * @brief Service a writer
+ * @details Specific handler that event is delegated to, according to writers type
+ * @param[in] server The logger server
+ * @param[in] wr The writer who sent the request
+ * @param[in] event The relevant event
+ * @return 0 on success, else -errno
+ */
+typedef int (*service_writer_t)(struct logger* server, struct writer* wr, struct epoll_event* event);
struct writer {
struct fd_entity _entity;
struct log_buffer* buf_ptr;
int readed;
- char state;
+ service_writer_t service_writer;
char buffer[LOG_MAX_SIZE];
};
-struct reader;
-struct log_buffer;
-
struct reader {
enum reader_type type;
struct log_file file;
char partial_log[LOG_MAX_SIZE];
};
+struct log_buffer;
+
struct sock_data {
struct fd_entity _entity;
int fd;
static struct file_buffer g_file_buffer;
// function prototypes
+static int service_writer_socket(struct logger* server, struct writer* wr, struct epoll_event* event);
+static int service_writer_pipe(struct logger* server, struct writer* wr, struct epoll_event* event);
+static int service_writer_kmsg(struct logger* server, struct writer* wr, struct epoll_event* event);
static void reader_free(struct reader* reader);
static void logger_free(struct logger* l);
static int parse_args(int argc, char ** argv, struct buffering * b);
if (w) {
w->working_fd = fd;
w->rights = rights;
+ w->service_writer = service_writer_socket;
}
return w;
return -errno;
}
- w->state = WRITER_KMSG;
+ w->service_writer = service_writer_kmsg;
w->buf_ptr = server->buffers[LOG_ID_KMSG];
LIST_ADD(server->writers, w);
goto err_remove;
writer_close_fd(server, wr);
- wr->state = WRITER_PIPE;
+ wr->service_writer = service_writer_pipe;
wr->working_fd = pipe_fd[0];
wr->readed = 0;
return 0;
}
/**
- * @brief Service a writer
- * @details Relegates the event to specific handlers
- * @param[in] server The logger server
- * @param[in] wr The writer who sent the request
- * @param[in] event The relevant event
- * @return 0 on success, else -errno
- */
-static int service_writer(struct logger* server, struct writer* wr, struct epoll_event* event)
-{
- switch (wr->state) {
- case WRITER_SOCKET:
- return service_writer_socket(server, wr, event);
- case WRITER_PIPE:
- return service_writer_pipe(server, wr, event);
- case WRITER_KMSG:
- return service_writer_kmsg(server, wr, event);
- default:
- return -EINVAL;
- }
-}
-
-/**
* @brief Service all readers
* @details Update all readers with latest data
* @param[in] server The logger server
{
switch (entity->type) {
case ENTITY_WRITER: {
- int r = service_writer(server, (struct writer*)entity, event);
+ struct writer *writer = (struct writer*)entity;
+ assert(writer->service_writer);
+ int r = writer->service_writer(server, writer, event);
if (r) {
- LIST_REMOVE(server->writers, ((struct writer*)entity), writer);
- writer_free((struct writer*)entity);
+ LIST_REMOVE(server->writers, writer, writer);
+ writer_free(writer);
}
break;
}