#include #include #include #include #include #include "librez.h" #include "myserv.h" #include "simple_list.h" static void librez_fds_copy(t_rez *d_rez, int dst_ifds, int src_ifds) { t_librez_fd src_rezid; t_librez_fd dst_rezid; /* printf("&d_rez->tsa[dst_ifds].sin_addr: %s.\n", librez_ntoa(d_rez, d_rez->tl_ifds_2_rezid[dst_ifds])); */ /* printf("&d_rez->tsa[src_ifds].sin_addr: %s.\n", librez_ntoa(d_rez, d_rez->tl_ifds_2_rezid[src_ifds])); */ /* printf("%u %u.\n", d_rez->tsa[src_ifds].sin_addr.s_addr, d_rez->tsa[dst_ifds].sin_addr.s_addr); */ memcpy(&d_rez->tsa[dst_ifds], &d_rez->tsa[src_ifds], sizeof(struct sockaddr_in)); /* memcpy(d_rez->tsa + dst_ifds, d_rez->fds + src_ifds, 16); */ /* d_rez->tsa[dst_ifds].sin_addr.s_addr = d_rez->tsa[src_ifds].sin_addr.s_addr; */ /* printf("%u %u.\n", d_rez->tsa[src_ifds].sin_addr.s_addr, d_rez->tsa[dst_ifds].sin_addr.s_addr); */ /* printf("&d_rez->tsa[dst_ifds].sin_addr: %s.\n", librez_ntoa(d_rez, d_rez->tl_ifds_2_rezid[dst_ifds])); */ /* printf("&d_rez->tsa[src_ifds].sin_addr: %s.\n", librez_ntoa(d_rez, d_rez->tl_ifds_2_rezid[src_ifds])); */ memcpy(&d_rez->fds[dst_ifds], &d_rez->fds[src_ifds], sizeof(struct pollfd)); memcpy(&d_rez->f_poll[dst_ifds], &d_rez->f_poll[src_ifds], sizeof (f_poll_func *[4])); memcpy(&d_rez->notify[dst_ifds], &d_rez->notify[src_ifds], sizeof (f_poll_func *[5])); memcpy(&d_rez->buffer[dst_ifds], &d_rez->buffer[src_ifds], sizeof (void *[4])); memcpy(&d_rez->buffer_size[dst_ifds], &d_rez->buffer_size[src_ifds], sizeof(int [2])); memset(&d_rez->buffer[src_ifds], '\0', sizeof(void *[4])); memset(&d_rez->buffer_size[src_ifds], '\0', sizeof(int [2])); src_rezid = d_rez->tl_ifds_2_rezid[src_ifds]; dst_rezid = d_rez->tl_ifds_2_rezid[dst_ifds]; d_rez->tl_ifds_2_rezid[dst_ifds] = src_rezid; d_rez->tl_rezid_2_ifds[src_rezid] = dst_ifds; } void librez_fds_remove(t_rez *d_rez, t_librez_fd rezid) { int ifds; ifds = d_rez->tl_rezid_2_ifds[rezid]; simple_list_free((t_slist **)&d_rez->buffer[ifds][LIBREZ_BUFFER_QUEUE_RDNORM]); simple_list_free((t_slist **)&d_rez->buffer[ifds][LIBREZ_BUFFER_QUEUE_WRNORM]); simple_list_free((t_slist **)&d_rez->buffer[ifds][LIBREZ_BUFFER_LINE_RDNORM]); simple_list_free((t_slist **)&d_rez->buffer[ifds][LIBREZ_BUFFER_LINE_WRNORM]); librez_fds_copy(d_rez, ifds, d_rez->nfds - 1); d_rez->ssl[rezid] = NULL; d_rez->ssl_negociation[rezid] = NULL; if (d_rez->ssl[rezid]) SSL_free(d_rez->ssl[rezid]); --d_rez->nfds; --d_rez->cfds; d_rez->tl_rezid_2_ifds[rezid] = -1; }