#include #include #include #include #include #include #include #include "librez.h" t_librez_fd librez_fds_add(t_rez *d_rez, int fd) { int ifds; t_librez_fd rezid; int i; if (d_rez->dts == d_rez->nfds) errx(1, "librez: max `struct pollfd' table size reached."); ifds = d_rez->nfds++; memset(&d_rez->tsa[ifds], '\0', sizeof(struct sockaddr_in)); d_rez->fds[ifds].fd = fd; ioctl(fd, FIONBIO, !0); for (i = 0; i < d_rez->dts; ++i) if (d_rez->tl_rezid_2_ifds[i] == -1) { rezid = i; break; } d_rez->tl_ifds_2_rezid[ifds] = rezid; d_rez->tl_rezid_2_ifds[rezid] = ifds; librez_set_func(d_rez, rezid, LIBREZ_POLLRDNORM, LIBREZ_FUNC_IGN); librez_set_func(d_rez, rezid, LIBREZ_POLLWRNORM, LIBREZ_FUNC_IGN); librez_set_func(d_rez, rezid, LIBREZ_POLLACCEPT, LIBREZ_FUNC_IGN); librez_set_func(d_rez, rezid, LIBREZ_POLLHUP, LIBREZ_FUNC_IGN); librez_set_notify(d_rez, rezid, LIBREZ_POLLRDNORM, NULL); librez_set_notify(d_rez, rezid, LIBREZ_POLLWRNORM, NULL); librez_set_notify(d_rez, rezid, LIBREZ_POLLACCEPT, NULL); librez_set_notify(d_rez, rezid, LIBREZ_POLLHUP, NULL); librez_set_mask(d_rez, rezid, 0); d_rez->fds[ifds].revents = 0; return (rezid); }