void shutdowndccchat(dccchat_t *chat, int flush) { if (chat->status != DCCCHAT_UNUSED) { if (flush) { flushdccchat(chat); } usleep(100*1000); shutdown_close(chat->con.clientsocket); mydelete(chat->groups); mydelete(chat->hostmask); mydelete(chat->nick); mydelete(chat->con.localaddr); mydelete(chat->con.remoteaddr); ir_boutput_delete(&chat->boutput); if (chat->status == DCCCHAT_LISTENING) ir_listen_port_connected(chat->con.localport); #ifdef USE_UPNP if (gdata.upnp_router && (chat->con.family == AF_INET)) upnp_rem_redir(chat->con.localport); #endif /* USE_UPNP */ memset(chat, 0, sizeof(dccchat_t)); chat->con.clientsocket = FD_UNUSED; chat->status = DCCCHAT_UNUSED; gdata.num_dccchats--; } return; }
void CloseNetwork (void) { #ifdef ODA_HAVE_MINIUPNP upnp_rem_redir (port); #endif closesocket (inet_socket); #ifdef _WIN32 WSACleanup (); #endif }
void t_closeconn(transfer * const t, const char *msg, int errno1) { gnetwork_t *backup; updatecontext(); if (errno1) { ioutput(OUT_S|OUT_L|OUT_D, COLOR_YELLOW, "XDCC [%02i:%s on %s]: Connection closed: %s (%s)", t->id, t->nick, gdata.networks[ t->net ].name, msg, strerror(errno1)); } else { ioutput(OUT_S|OUT_L|OUT_D, COLOR_YELLOW, "XDCC [%02i:%s on %s]: Connection closed: %s", t->id, t->nick, gdata.networks[ t->net ].name, msg); } if (t->tr_status == TRANSFER_STATUS_DONE) { return; } if (gdata.debug > 0) { ioutput(OUT_S, COLOR_YELLOW, "clientsock = %d", t->con.clientsocket); } #ifdef HAVE_MMAP if (t->mmap_info) { t->mmap_info->ref_count--; if (!t->mmap_info->ref_count) { int callval_i; callval_i = munmap(t->mmap_info->mmap_ptr, t->mmap_info->mmap_size); if (callval_i < 0) { outerror(OUTERROR_TYPE_WARN, "Couldn't munmap(): %s", strerror(errno)); } irlist_delete(&t->xpack->mmaps, t->mmap_info); } t->mmap_info = NULL; } #endif if (t->con.listensocket != FD_UNUSED && t->con.listensocket > 2) { event_close(t->con.listensocket); t->con.listensocket = FD_UNUSED; } if (t->con.clientsocket != FD_UNUSED && t->con.clientsocket > 2) { shutdown_close(t->con.clientsocket); t->con.clientsocket = FD_UNUSED; } t->xpack->file_fd_count--; if (!t->xpack->file_fd_count && (t->xpack->file_fd != FD_UNUSED)) { close(t->xpack->file_fd); t->xpack->file_fd = FD_UNUSED; t->xpack->file_fd_location = 0; } if (t->tr_status == TRANSFER_STATUS_LISTENING) ir_listen_port_connected(t->con.localport); #ifdef USE_UPNP if (gdata.upnp_router && (t->con.family == AF_INET)) upnp_rem_redir(t->con.localport); #endif /* USE_UPNP */ t->tr_status = TRANSFER_STATUS_DONE; backup = gnetwork; gnetwork = &(gdata.networks[t->net]); if (errno1) { notice(t->nick, "** Closing Connection: %s (%s)", msg, strerror(errno1)); } else { notice(t->nick, "** Closing Connection: %s", msg); } gnetwork = backup; }