#include #include #include #include #include #include #include "librez.h" t_librez_fd librez_dolisten(t_rez *d_rez, in_addr_t listenaddress, u_int16_t port) { int ret; int yes; int s; struct sockaddr_in sa; int ifds; t_librez_fd rezid; yes = !0; sa.sin_len = sizeof(struct sockaddr_in); sa.sin_family = AF_INET; sa.sin_addr.s_addr = listenaddress; sa.sin_port = port; memset(&sa.sin_zero, '\0', sizeof(sa.sin_zero)); s = socket(AF_INET, SOCK_STREAM, 0); ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); if (ret == -1) err(1, "librez_dolisten"); ret = bind(s, (const struct sockaddr *)&sa, sizeof(struct sockaddr)); if (ret == -1) err(1, "librez_dolisten"); ret = listen(s, 5); if (ret == -1) err(1, "librez_dolisten"); rezid = librez_fds_add(d_rez, s); ifds = d_rez->tl_rezid_2_ifds[rezid]; memcpy(&d_rez->tsa[ifds], &sa, sizeof(struct sockaddr_in)); librez_set_func(d_rez, rezid, LIBREZ_POLLACCEPT, LIBREZ_FUNC_DFL); librez_set_mask(d_rez, rezid, POLLRDNORM); librez_set_mask_listen(d_rez, rezid); return (rezid); }