#include #include #include #include #include #include #include #include "librez.h" t_librez_fd librez_doaccept(t_rez *d_rez, t_librez_fd rezid) { int s; struct sockaddr_in addr; int ifds; int new_ifds; t_librez_fd new_rezid; ifds = d_rez->tl_rezid_2_ifds[rezid]; s = accept(d_rez->fds[ifds].fd, (struct sockaddr *)&addr, (socklen_t *)&d_rez->tsa[ifds].sin_len); if (s == -1) { if (errno == EMFILE) return (-1); err(1, "doaccept"); } new_rezid = librez_fds_add(d_rez, s); new_ifds = d_rez->tl_rezid_2_ifds[new_rezid]; memcpy(&d_rez->tsa[new_ifds], &addr, sizeof(struct sockaddr_in)); librez_set_func(d_rez, new_rezid, LIBREZ_POLLRDNORM, LIBREZ_FUNC_DFL); librez_set_func(d_rez, new_rezid, LIBREZ_POLLWRNORM, LIBREZ_FUNC_DFL); librez_set_func(d_rez, new_rezid, LIBREZ_POLLHUP, LIBREZ_FUNC_DFL); librez_set_mask(d_rez, new_rezid, POLLRDNORM); librez_set_notify(d_rez, new_rezid, LIBREZ_POLLRDNORM, d_rez->notify[ifds][LIBREZ_POLLRDNORM]); librez_set_notify(d_rez, new_rezid, LIBREZ_POLLWRNORM, d_rez->notify[ifds][LIBREZ_POLLWRNORM]); librez_set_notify(d_rez, new_rezid, LIBREZ_POLLACCEPT, d_rez->notify[ifds][LIBREZ_POLLACCEPT]); librez_set_notify(d_rez, new_rezid, LIBREZ_POLLHUP, d_rez->notify[ifds][LIBREZ_POLLHUP]); return (new_rezid); }