X-Git-Url: http://git.itanic.dy.fi/?p=log-plotter;a=blobdiff_plain;f=main.c;h=51e52605dafc2590a9cd160da1f2d014e0516d98;hp=4832e6a12063e85555091d4e37ee4a0d1b369246;hb=44f9c67945693b34dc03b602d33670b87863ddef;hpb=fb62d1b68429ab28cbc2c187ca7a426bb24b2063 diff --git a/main.c b/main.c index 4832e6a..51e5260 100644 --- a/main.c +++ b/main.c @@ -1,140 +1,11 @@ #include #include #include -#include -#include -#include -#include -#include #include "options.h" #include "baud.h" #include "debug.h" - -/** - * Read data from a slow device - * - * return 1 when a complete NULL terminated line has been read - * - * return 0 when a partial line has been read and appended to the - * buffer at @offset - * - * return negative on error - */ -static int read_log_line(int infd, char *buf, size_t bufsize, int *offset) -{ - int ret; - int i; - - ret = read(infd, buf + *offset, bufsize - *offset - 1); - if (ret < 0) { - pr_err("read: %m\n"); - return -1; - } - - if (ret == 0) { - pr_err("Read EOF, stopping\n"); - return -1; - } - buf[*offset + ret] = 0; - - for (i = 0; i < ret; i++) { - if (buf[i + *offset] == '\n' || - buf[i + *offset] == '\r') { - /* - * Got a complete line when there is a newline - * at the end. Remove the newline and possible - * other junk, such as '\r' - */ - buf[i + *offset] = 0; - *offset = 0; - - return 1; - } - - /* - * Fixme! Nothing guarantees that there isn't actually - * more data (a part of a new log entry perhaps) after - * the newline. So in rare cases (we are prevented - * from reading the serial line in very long time) we - * might lose data from the stream.. - */ - } - - *offset += ret; - return 0; -} - -static int read_data(int infd, int outfd) -{ - struct epoll_event ev; - time_t start_time = 0, cur_time; - int epoll_fd; - int ret; - char buf[256]; - int offset = 0; - - epoll_fd = epoll_create(1); - if (epoll_fd < 0) { - pr_err("Failed to create epoll socket: %m\n"); - return -1; - } - - ev.events = EPOLLIN; - ev.data.fd = infd; - if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, infd, &ev) == -1) { - pr_err("epoll_ctl: %m\n"); - return 1; - } - - while (1) { - char str[320]; - int len; - - ret = epoll_wait(epoll_fd, &ev, 1, -1); - if (ret == 0) - continue; - - if (ret < 0) { - pr_err("epoll: %m\n"); - return -1; - } - - ret = read_log_line(infd, buf, sizeof(buf), &offset); - if (ret < 0) - return ret; - - if (ret == 0) - continue; - - if (strlen(buf) < 5) { - pr_debug("discarding truncated log entry\n"); - offset = 0; - continue; - } - - if (!start_time) - start_time = time(NULL); - - cur_time = time(NULL); - - pr_info("%s\n", buf); - - if (!outfd) - continue; - - len = snprintf(str, sizeof(str), - "%ld;%s\n", cur_time - start_time, buf); - - ret = write(outfd, str, len); - if (ret < 0) { - pr_err("write: %m\n"); - break; - } - } - - return 0; -} +#include "data.h" int main(int argc, char *argv[]) {