X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=x5%2Fkhatus.c;h=733f6863f85ff25e48517a1adf5b8b7a27fb42e3;hb=3efcce25450defc72df93f907a918bf37891d568;hp=a41351a9b72842d7c9376216cf3c989441b962c3;hpb=77c76070aa1cdd9f38b6b1c338854c83abae21ff;p=khatus.git diff --git a/x5/khatus.c b/x5/khatus.c index a41351a..733f686 100644 --- a/x5/khatus.c +++ b/x5/khatus.c @@ -1,6 +1,8 @@ + #include #include #include +#include #include #include @@ -235,27 +237,20 @@ opts_parse(Config *cfg, int argc, char *argv[], int i) void read_one(File *f, char *buf) { - ssize_t n; + ssize_t current; + ssize_t total; char *b; + char c; + current = 0; + total = 0; + c = '\0'; b = buf + f->pos; memset(b, ' ', f->width); - while ((n = read(f->fd, b, f->width)) > 0) { - b += n; - debug("read %zd from %s\n", n, f->name); - } - - if (n > -1) { - if (*(b - 1) == '\n') - *(b - 1) = ' '; - } else { - error( - "Failed to read: \"%s\". Error: %s\n", - f->name, - strerror(errno) - ); - } - + while ((current = read(f->fd, &c, 1)) && c != '\n' && c != '\0' && total++ < f->width) + *b++ = c; + if (current == -1) + error("Failed to read: \"%s\". Error: %s\n", f->name, strerror(errno)); close(f->fd); f->fd = -1; } @@ -266,11 +261,17 @@ read_all(Config *cfg, char *buf) fd_set fds; int maxfd; int ready; + struct stat st; FD_ZERO(&fds); - /* TODO: stat then check TTL */ + /* TODO: Check TTL */ for (File *f = cfg->files; f; f = f->next) { + /* TODO: Create the FIFO if it doesn't already exist. */ + if (lstat(f->name, &st) < 0) + fatal("Cannot stat \"%s\". Error: %s\n", f->name, strerror(errno)); + if (!(st.st_mode & S_IFIFO)) + fatal("\"%s\" is not a FIFO\n", f->name); debug("opening: %s\n", f->name); if (f->fd < 0) f->fd = open(f->name, O_RDONLY | O_NONBLOCK);