- current = 0;
- total = 0;
- c = '\0';
- b = buf + f->pos;
- 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));
- fifo_read_error(f, buf);
- } else {
- while (total++ < f->width)
- *b++ = ' ';
+ for (;;) {
+ switch (read(f->fd, &c, 1)) {
+ case -1:
+ khlib_error(
+ "Failed to read: \"%s\". errno: %d, msg: %s\n",
+ f->name, errno, strerror(errno)
+ );
+ switch (errno) {
+ case EINTR:
+ case EAGAIN:
+ return RETRY;
+ default:
+ return FAILURE;
+ }
+ case 0:
+ khlib_debug("%s: End of FILE\n", f->name);
+ f->pos_curr = f->pos_init;
+ return END_OF_FILE;
+ case 1:
+ /* TODO: Consider making msg term char a CLI option */
+ if (c == '\n' || c == '\0') {
+ r = f->pos_final - f->pos_curr;
+ if (r > 0)
+ memset(buf + f->pos_curr, ' ', r);
+ f->pos_curr = f->pos_init;
+ f->last_read = t;
+ return END_OF_MESSAGE;
+ } else {
+ if (f->pos_curr <= f->pos_final)
+ buf[f->pos_curr++] = c;
+ /* Drop beyond available range. */
+ /*
+ * TODO Define max after which we stop reading.
+ * To ensure that a rogue large message
+ * doesn't trap us here.
+ */
+ }
+ break;
+ default:
+ assert(0);
+ }