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 setupdccchataccept(dccchat_t *chat) { SIGNEDSOCK int addrlen; char *msg; updatecontext(); addrlen = sizeof(struct sockaddr_in); if ((chat->con.clientsocket = accept(chat->con.listensocket, &(chat->con.remote.sa), &addrlen)) < 0) { outerror(OUTERROR_TYPE_WARN,"Accept Error, Aborting: %s",strerror(errno)); event_close(chat->con.listensocket); chat->con.clientsocket = FD_UNUSED; chat->con.listensocket = FD_UNUSED; return; } ir_listen_port_connected(chat->con.localport); event_close(chat->con.listensocket); chat->con.listensocket = FD_UNUSED; ioutput(OUT_S|OUT_L|OUT_D, COLOR_MAGENTA, "DCC CHAT connection received, authenticating"); if (set_socket_nonblocking(chat->con.clientsocket, 1) < 0 ) { outerror(OUTERROR_TYPE_WARN,"Couldn't Set Non-Blocking"); } if (is_in_badip(&(chat->con.remote))) { shutdowndccchat(chat, 0); return; } chat->status = DCCCHAT_AUTHENTICATING; chat->con.connecttime = gdata.curtime; chat->con.lastcontact = gdata.curtime; ir_boutput_init(&chat->boutput, chat->con.clientsocket, 0); msg = mymalloc(maxtextlength); my_getnameinfo(msg, maxtextlength -1, &(chat->con.remote.sa)); chat->con.remoteaddr = mystrdup(msg); mydelete(msg); setup_chat_banner(chat); }
void t_establishcon (transfer * const t) { SIGNEDSOCK int addrlen; updatecontext(); addrlen = (t->con.family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6); if ((t->con.clientsocket = accept(t->con.listensocket, &t->con.local.sa, &addrlen)) < 0) { int errno2 = errno; outerror(OUTERROR_TYPE_WARN, "Accept Error, Aborting: %s", strerror(errno)); t_closeconn(t, "Connection Error, Try Again", errno2); return; } ir_listen_port_connected(t->con.localport); event_close(t->con.listensocket); t->con.listensocket = FD_UNUSED; t_setup_send(t); }
/* accept incoming connection */ static void l_setup_accept(upload * const l) { SIGNEDSOCK int addrlen; char *msg; updatecontext(); addrlen = sizeof(l->con.remote); if ((l->con.clientsocket = accept(l->con.listensocket, &(l->con.remote.sa), &addrlen)) < 0) { outerror(OUTERROR_TYPE_WARN, "Accept Error, Aborting: %s", strerror(errno)); l->con.clientsocket = FD_UNUSED; l_closeconn(l, "Connection Lost", 0); return; } ir_listen_port_connected(l->con.localport); event_close(l->con.listensocket); l->con.listensocket = FD_UNUSED; ioutput(OUT_S|OUT_L|OUT_D, COLOR_MAGENTA, "DCC SEND connection received"); ir_setsockopt(l->con.clientsocket); notice(l->nick, "DCC Send Accepted, Connecting..."); msg = mymalloc(maxtextlength); my_getnameinfo(msg, maxtextlength -1, &(l->con.remote.sa)); mydelete(l->con.remoteaddr); l->con.remoteaddr = mystrdup(msg); mydelete(msg); l->con.remoteport = get_port(&(l->con.remote)); l->con.connecttime = gdata.curtime; l->con.lastcontact = gdata.curtime; l->ul_status = UPLOAD_STATUS_GETTING; }
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; }