Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.52 KB | None | 0 0
  1. static void ioset_read_to_recvq(struct io_fd *fd)
  2. {
  3.     ssize_t res;
  4.     size_t put_avail;
  5.     struct ioq *recv = &fd->recv;
  6.  
  7.     put_avail = ioq_put_avail(recv);
  8.     if (!put_avail)
  9.         put_avail = ioq_expand(recv);
  10.  
  11.     res = read(fd->fd, recv->buf + recv->put, put_avail);
  12.     if (res < 0) {
  13.         if (errno != EAGAIN) {
  14.             printf("read() error on socket fd %d: %s\n", fd->fd,
  15.                 strerror(errno));
  16.             fd->state = IO_CLOSED;
  17.             fd->read_cb(&fd);
  18.             if (fd) ioset_shutdown(&fd, IOFD_CLOSE);
  19.         }
  20.     } else if (!res) {
  21.         fd->state = IO_CLOSED;
  22.         fd->read_cb(&fd);
  23.         if (fd) ioset_shutdown(&fd, IOFD_CLOSE);
  24.     } else {
  25.         if (!fd->line_len) {
  26.             size_t pos;
  27.  
  28.             for (pos=recv->put; pos < recv->put+res; ++pos) {
  29.                 if (recv->buf[pos] == '\n') {
  30.                     if (recv->put < recv->get) {
  31.                         fd->line_len = recv->size + pos + 1 - recv->get;
  32.                     } else {
  33.                         fd->line_len = pos + 1 - recv->get;
  34.                     }
  35.                     break;
  36.                 }
  37.             }
  38.  
  39.             recv->put += res;
  40.             if (recv->put == recv->size)
  41.                 recv->put = 0;
  42.             while (fd->line_len > 0) {
  43.                 fd->read_cb(&fd);
  44.                 if (fd) {
  45.                     ioset_find_line_length(fd);
  46.                 } else {
  47.                     break;
  48.                 }
  49.             }
  50.         }
  51.     }
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement