diff --git a/src/IO/http.cc b/src/IO/http.cc index ab60334..9187750 100644 --- a/src/IO/http.cc +++ b/src/IO/http.cc @@ -44,6 +44,10 @@ #include #include +#include +#include +#include +#include /* Used to send a message to the bw's status bar */ #define MSG_BW(web, root, ...) \ @@ -87,10 +91,10 @@ typedef struct { Dlist *queue; } Server_t; -typedef struct { +struct FdMapEntry_t { int fd; int skey; -} FdMapEntry_t; +}; static void Http_socket_enqueue(Server_t *srv, SocketData_t* sock); static Server_t *Http_server_get(const char *host, uint_t port, bool_t https); @@ -113,7 +117,7 @@ static Dlist *servers; /* TODO: If fd_map will stick around in its present form (FDs and SocketData_t) * then consider whether having both this and ValidSocks is necessary. */ -static Dlist *fd_map; +static std::map< int, std::unique_ptr< FdMapEntry_t > > fd_map; /** * Initialize proxy vars and Accept-Language header @@ -139,7 +143,6 @@ int a_Http_init(void) */ servers = dList_new(5); - fd_map = dList_new(20); return 0; } @@ -187,16 +190,16 @@ static int Http_fd_map_cmp(const void *v1, const void *v2) static void Http_fd_map_add_entry(SocketData_t *sd) { - FdMapEntry_t *e = dNew0(FdMapEntry_t, 1); + auto e = std::make_unique< FdMapEntry_t >(); e->fd = sd->SockFD; e->skey = VOIDP2INT(sd->Info->LocalKey); - if (dList_find_custom(fd_map, INT2VOIDP(e->fd), Http_fd_map_cmp)) { + if (fd_map.contains( e->fd )) { MSG_ERR("FD ENTRY ALREADY FOUND FOR %d\n", e->fd); assert(0); } - dList_append(fd_map, e); + fd_map.emplace( e->fd, std::move( e ) ); } /** @@ -204,11 +207,8 @@ static void Http_fd_map_add_entry(SocketData_t *sd) */ static void Http_fd_map_remove_entry(int fd) { - void *data = dList_find_custom(fd_map, INT2VOIDP(fd), Http_fd_map_cmp); - - if (data) { - dList_remove_fast(fd_map, data); - dFree(data); + if (fd_map.contains( fd )) { + fd_map.erase( fd ); } else { MSG("FD ENTRY NOT FOUND FOR %d\n", fd); } @@ -217,8 +217,8 @@ static void Http_fd_map_remove_entry(int fd) void a_Http_connect_done(int fd, bool_t success) { SocketData_t *sd; - FdMapEntry_t *fme = reinterpret_cast< FdMapEntry_t * >( dList_find_custom(fd_map, INT2VOIDP(fd), - Http_fd_map_cmp) ); + std::optional< FdMapEntry_t > fme; + if( fd_map.contains( fd ) ) fme= *fd_map.at( fd ); if (fme && (sd = reinterpret_cast< SocketData_t * >( a_Klist_get_data(ValidSocks, fme->skey) ))) { ChainLink *info = sd->Info; @@ -237,7 +237,7 @@ void a_Http_connect_done(int fd, bool_t success) dFree(info); } } else { - MSG("**** but no luck with fme %p or sd\n", (void *) fme); + MSG("**** but no luck with fme %p or sd\n", (void *) &*fme); } } @@ -1025,9 +1025,8 @@ void a_Http_ccc(int Op, int Branch, int Dir, ChainLink *Info, if (Data2) { if (!strcmp(reinterpret_cast< const char * >( Data2 ), "FD")) { int fd = *(int*)Data1; - FdMapEntry_t *fme = reinterpret_cast< FdMapEntry_t * >( dList_find_custom(fd_map, INT2VOIDP(fd), - Http_fd_map_cmp) ); - Info->LocalKey = INT2VOIDP(fme->skey); + const FdMapEntry_t &fme = *fd_map.at( fd ); + Info->LocalKey = INT2VOIDP(fme.skey); a_Chain_bcb(OpSend, Info, Data1, Data2); } else if (!strcmp(reinterpret_cast< const char * >( Data2 ), "reply_complete")) { a_Chain_bfcb(OpEnd, Info, NULL, NULL); @@ -1128,14 +1127,7 @@ static void Http_servers_remove_all(void) static void Http_fd_map_remove_all(void) { - FdMapEntry_t *fme; - int i, n = dList_length(fd_map); - - for (i = 0; i < n; i++) { - fme = (FdMapEntry_t *) dList_nth_data(fd_map, i); - dFree(fme); - } - dList_free(fd_map); + fd_map.clear(); } /**