/* user disconnected before her relay had finished connecting */ static void failed_pre_relay(int idx) { register int tidx = (-1), i; Context; for (i = 0; i < dcc_total; i++) if ((dcc[i].type == &DCC_FORK_RELAY) && (dcc[i].u.relay->sock == dcc[idx].sock)) tidx = i; if (tidx < 0) { putlog(LOG_MISC, "*", "%s %d -> %d", BOT_CANTFINDRELAYUSER, dcc[i].sock, dcc[i].u.relay->sock); killsock(dcc[i].sock); lostdcc(i); return; } putlog(LOG_MISC, "*", "%s [%s]%s/%d", BOT_LOSTDCCUSER, dcc[idx].nick, dcc[idx].host, dcc[idx].port); putlog(LOG_MISC, "*", "(%s %s)", BOT_DROPPINGRELAY, dcc[tidx].nick); if ((dcc[tidx].sock != STDOUT) || backgrd) { if (idx > tidx) { int t = tidx; tidx = idx; idx = t; } killsock(dcc[tidx].sock); lostdcc(tidx); } else { fatal("Lost my terminal??!?!?!", 0); } killsock(dcc[idx].sock); lostdcc(idx); }
static char *filesys_close() { int i; p_tcl_bind_list H_ctcp; Context; putlog(LOG_MISC, "*", "Unloading filesystem, killing all filesystem connections.."); for (i = 0; i < dcc_total; i++) if (dcc[i].type == &DCC_FILES) { dprintf(i, DCC_BOOTED1); dprintf(i, "You have been booted from the filesystem, module unloaded.\n"); killsock(dcc[i].sock); lostdcc(i); } else if (dcc[i].type == &DCC_FILES_PASS) { killsock(dcc[i].sock); lostdcc(i); } rem_tcl_commands(mytcls); rem_tcl_strings(mystrings); rem_tcl_ints(myints); rem_builtins(H_dcc, mydcc); rem_builtins(H_load, myload); rem_builtins(H_fil, myfiles); rem_help_reference("filesys.help"); if ((H_ctcp = find_bind_table("ctcp"))) rem_builtins(H_ctcp, myctcp); del_bind_table(H_fil); del_entry_type(&USERENTRY_DCCDIR); del_lang_section("filesys"); module_undepend(MODULE_NAME); return NULL; }
/* input from user before connect is ready */ static void pre_relay(int idx, char *buf, register int i) { register int tidx = (-1); Context; for (i = 0; i < dcc_total; i++) if ((dcc[i].type == &DCC_FORK_RELAY) && (dcc[i].u.relay->sock == dcc[idx].sock)) tidx = i; if (tidx < 0) { putlog(LOG_MISC, "*", "%s %d -> %d", BOT_CANTFINDRELAYUSER, dcc[i].sock, dcc[i].u.relay->sock); killsock(dcc[i].sock); lostdcc(i); return; } Context; if (!strcasecmp(buf, "*bye*")) { /* disconnect */ struct chat_info *ci = dcc[idx].u.relay->chat; dprintf(idx, "%s %s.\n", BOT_ABORTRELAY1, dcc[tidx].nick); dprintf(idx, "%s %s.\n\n", BOT_ABORTRELAY2, botnetnick); putlog(LOG_MISC, "*", "%s %s -> %s", BOT_ABORTRELAY3, dcc[idx].nick, dcc[tidx].nick); dcc[idx].status = dcc[idx].u.relay->old_status; nfree(dcc[idx].u.relay); dcc[idx].u.chat = ci; dcc[idx].type = &DCC_CHAT; killsock(dcc[tidx].sock); lostdcc(tidx); return; } Context; }
/* once a minute, send 'ping' to each bot -- no exceptions */ void check_botnet_pings() { int i; Context; for (i = 0; i < dcc_total; i++) if (dcc[i].type == &DCC_BOT) if (dcc[i].status & STAT_PINGED) { char s[1024]; putlog(LOG_BOTS, "*", "%s: %s", BOT_PINGTIMEOUT, dcc[i].nick); simple_sprintf(s, "%s: %s", BOT_PINGTIMEOUT, dcc[i].nick); chatout("*** %s\n", s); botnet_send_unlinked(i, dcc[i].nick, s); killsock(dcc[i].sock); lostdcc(i); } Context; for (i = 0; i < dcc_total; i++) if (dcc[i].type == &DCC_BOT) { botnet_send_ping(i); dcc[i].status |= STAT_PINGED; } Context; for (i = 0; i < dcc_total; i++) if ((dcc[i].type == &DCC_BOT) && (dcc[i].status & STAT_LEAF)) { tand_t *bot, *via = findbot(dcc[i].nick); for (bot = tandbot; bot; bot = bot->next) { if ((via == bot->via) && (bot != via)) { /* not leaflike behavior */ if (dcc[i].status & STAT_WARNED) { char s[1024]; putlog(LOG_BOTS, "*", "%s %s (%s).", BOT_DISCONNECTED, dcc[i].nick, BOT_BOTNOTLEAFLIKE); dprintf(i, "bye\n"); simple_sprintf(s, "%s %s (%s)", BOT_DISCONNECTED, dcc[i].nick, BOT_BOTNOTLEAFLIKE); chatout("*** %s\n", s); botnet_send_unlinked(i, dcc[i].nick, s); killsock(dcc[i].sock); lostdcc(i); } else { botnet_send_reject(i, botnetnick, NULL, bot->bot, NULL, NULL); dcc[i].status |= STAT_WARNED; } } else dcc[i].status &= ~STAT_WARNED; } } Context; }
static void eof_dcc_relaying(int idx) { register int j, x = dcc[idx].u.relay->sock; putlog(LOG_MISC, "*", "%s [%s]%s/%d", BOT_LOSTDCCUSER, dcc[idx].nick, dcc[idx].host, dcc[idx].port); killsock(dcc[idx].sock); lostdcc(idx); for (j = 0; (dcc[j].sock != x) || (dcc[j].type == &DCC_FORK_RELAY); j++); putlog(LOG_MISC, "*", "(%s %s)", BOT_DROPPEDRELAY, dcc[j].nick); killsock(dcc[j].sock); lostdcc(j); /* drop connection to the bot */ }
static int tcl_killdcc(ClientData cd, Tcl_Interp *irp, int argc, char *argv[]) { int idx; BADARGS(2, 3, " idx ?reason?"); idx = findidx(atoi(argv[1])); if (idx < 0) { Tcl_AppendResult(irp, "invalid idx", NULL); return TCL_ERROR; } if ((dcc[idx].sock == STDOUT) && !backgrd) /* Don't kill terminal socket */ return TCL_OK; if (dcc[idx].type->flags & DCT_CHAT) { /* Make sure 'whom' info is updated */ chanout_but(idx, dcc[idx].u.chat->channel, "*** %s has left the %s%s%s\n", dcc[idx].nick, dcc[idx].u.chat ? "channel" : "partyline", argc == 3 ? ": " : "", argc == 3 ? argv[2] : ""); botnet_send_part_idx(idx, argc == 3 ? argv[2] : ""); if ((dcc[idx].u.chat->channel >= 0) && (dcc[idx].u.chat->channel < GLOBAL_CHANS)) check_tcl_chpt(botnetnick, dcc[idx].nick, dcc[idx].sock, dcc[idx].u.chat->channel); check_tcl_chof(dcc[idx].nick, dcc[idx].sock); } killsock(dcc[idx].sock); killtransfer(idx); lostdcc(idx); return TCL_OK; }
/* Send connection request to proxy */ static int proxy_connect(int sock, char *host, int port, int proxy) { unsigned char x[10]; struct hostent *hp; char s[256]; int i; /* socks proxy */ if (proxy == PROXY_SOCKS) { /* numeric IP? */ if (host[strlen(host) - 1] >= '0' && host[strlen(host) - 1] <= '9') { IP ip = ((IP) inet_addr(host)); egg_memcpy(x, &ip, 4); } else { /* no, must be host.domain */ if (!sigsetjmp(alarmret, 1)) { alarm(resolve_timeout); hp = gethostbyname(host); alarm(0); } else hp = NULL; if (hp == NULL) { killsock(sock); return -2; } egg_memcpy(x, hp->h_addr, hp->h_length); } for (i = 0; i < threaddata()->MAXSOCKS; i++) if (!(socklist[i].flags & SOCK_UNUSED) && socklist[i].sock == sock) socklist[i].flags |= SOCK_PROXYWAIT; /* drummer */ egg_snprintf(s, sizeof s, "\004\001%c%c%c%c%c%c%s", (port >> 8) % 256, (port % 256), x[0], x[1], x[2], x[3], botuser); tputs(sock, s, strlen(botuser) + 9); /* drummer */ } else if (proxy == PROXY_SUN) {
void eof_dcc_dnswait(int idx) { putlog(LOG_MISC, "*", "Lost connection while resolving hostname [%s/%d]", iptostr(&dcc[idx].sockname.addr.sa), dcc[idx].port); killsock(dcc[idx].sock); lostdcc(idx); }
/* Handle someone being booted from dcc chat. */ void do_boot(int idx, char *by, char *reason) { int files = (dcc[idx].type != &DCC_CHAT); dprintf(idx, DCC_BOOTED1); dprintf(idx, DCC_BOOTED2, files ? "file section" : "bot", by, reason[0] ? ": " : ".", reason); /* If it's a partyliner (chatterer :) */ /* Horrible assumption that DCT_CHAT using structure uses same format * as DCC_CHAT */ if ((dcc[idx].type->flags & DCT_CHAT) && (dcc[idx].u.chat->channel >= 0)) { char x[1024]; egg_snprintf(x, sizeof x, DCC_BOOTED3, by, dcc[idx].nick, reason[0] ? ": " : "", reason); chanout_but(idx, dcc[idx].u.chat->channel, "*** %s.\n", x); if (dcc[idx].u.chat->channel < GLOBAL_CHANS) botnet_send_part_idx(idx, x); } check_tcl_chof(dcc[idx].nick, dcc[idx].sock); if ((dcc[idx].sock != STDOUT) || backgrd) { killsock(dcc[idx].sock); lostdcc(idx); /* Entry must remain in the table so it can be logged by the caller */ } else { dprintf(DP_STDOUT, "\n### SIMULATION RESET\n\n"); dcc_chatter(idx); } return; }
static void eof_dcc_relay(int idx) { register int j; struct chat_info *ci; for (j = 0; dcc[j].sock != dcc[idx].u.relay->sock; j++); dcc[j].status = dcc[j].u.relay->old_status; /* in case echo was off, turn it back on: */ if (dcc[j].status & STAT_TELNET) dprintf(j, "\377\374\001\n"); putlog(LOG_MISC, "*", "%s: %s -> %s", BOT_ENDRELAY1, dcc[j].nick, dcc[idx].nick); dprintf(j, "\n\n*** %s %s\n", BOT_ENDRELAY2, botnetnick); ci = dcc[j].u.relay->chat; nfree(dcc[j].u.relay); dcc[j].u.chat = ci; dcc[j].type = &DCC_CHAT; if (dcc[j].u.chat->channel >= 0) { chanout_but(-1, dcc[j].u.chat->channel, "*** %s %s.\n", dcc[j].nick, BOT_PARTYREJOINED); Context; if (dcc[j].u.chat->channel < 100000) botnet_send_join_idx(j, -1); } check_tcl_chon(dcc[j].nick, dcc[j].sock); check_tcl_chjn(botnetnick, dcc[j].nick, dcc[j].u.chat->channel, geticon(j), dcc[j].sock, dcc[j].host); killsock(dcc[idx].sock); lostdcc(idx); }
static void eof_dcc_files(int idx) { dcc[idx].u.file->chat->con_flags = 0; putlog(LOG_MISC, "*", "Lost dcc connection to %s (%s/%d)", dcc[idx].nick, dcc[idx].host, dcc[idx].port); killsock(dcc[idx].sock); lostdcc(idx); }
static void tout_dcc_files_pass(int i) { dprintf(i, "Timeout.\n"); putlog(LOG_MISC, "*", "Password timeout on dcc chat: [%s]%s", dcc[i].nick, dcc[i].host); killsock(dcc[i].sock); lostdcc(i); }
void check_maxfiles() { int sock = -1, sock1 = -1 , bogus = 0, failed_close = 0; #ifdef USE_IPV6 sock1 = getsock(0, AF_INET); /* fill up any lower avail */ sock = getsock(0, AF_INET); #else sock1 = getsock(0); sock = getsock(0); #endif if (sock1 != -1) killsock(sock1); if (sock == -1) { return; } else killsock(sock); bogus = sock - socks_total - 4; //4 for stdin/stdout/stderr/dns if (bogus >= 50) { /* Attempt to close them */ sdprintf("SOCK: %d BOGUS: %d SOCKS_TOTAL: %d", sock, bogus, socks_total); for (int i = 10; i < sock; i++) /* dont close lower sockets, they're probably legit */ if (!findanysnum(i)) { if ((close(i)) == -1) /* try to close the BOGUS fd (likely a KQUEUE) */ failed_close++; else bogus--; } if (bogus >= 150 || failed_close >= 50) { if (tands > 0) { botnet_send_chat(-1, conf.bot->nick, "Max FD reached, restarting..."); botnet_send_bye("Max FD reached, restarting..."); } nuke_server("brb"); cycle_time = 0; restart(-1); } else if (bogus >= 100 && (bogus % 10) == 0) { putlog(LOG_WARN, "*", "* WARNING: $b%d$b bogus file descriptors detected, auto restart at 150", bogus); } } }
void zapfbot(int idx) { char s[1024]; simple_sprintf(s, "%s: %s", BOT_BOTDROPPED, dcc[idx].nick); chatout("*** %s\n", s); botnet_send_unlinked(idx, dcc[idx].nick, s); killsock(dcc[idx].sock); lostdcc(idx); }
static void killreq( tr_natpmp_req_t ** req ) { if( NULL != *req ) { killsock( &(*req)->fd ); free( *req ); *req = NULL; } }
void tr_natpmpStop( tr_natpmp_t * pmp ) { if( pmp->active ) { tr_inf( "stopping nat-pmp" ); pmp->active = 0; killsock( &pmp->mcastfd ); unmap( pmp ); } }
static void eof_dns_socket(int idx) { putlog(LOG_MISC, "*", "DNS Error: socket closed."); killsock(dcc[idx].sock); /* Try to reopen socket */ if (init_dns_network()) { putlog(LOG_MISC, "*", "DNS socket successfully reopened!"); dcc[idx].sock = resfd; dcc[idx].timeval = now; } else lostdcc(idx); }
static void dcc_files(int idx, char *buf, int i) { Context; if (buf[0] && detect_dcc_flood(&dcc[idx].timeval, dcc[idx].u.file->chat, idx)) return; dcc[idx].timeval = now; strcpy(buf, check_tcl_filt(idx, buf)); if (!buf[0]) return; touch_laston(dcc[idx].user, "filearea", now); if (buf[0] == ',') { for (i = 0; i < dcc_total; i++) { if ((dcc[i].type->flags & DCT_MASTER) && dcc[idx].user && (dcc[idx].user->flags & USER_MASTER) && ((dcc[i].type == &DCC_FILES) || (dcc[i].u.chat->channel >= 0)) && ((i != idx) || (dcc[idx].status & STAT_ECHO))) dprintf(i, "-%s- %s\n", dcc[idx].nick, &buf[1]); } } else if (got_files_cmd(idx, buf)) { dprintf(idx, "*** Ja mata!\n"); flush_lines(idx, dcc[idx].u.file->chat); putlog(LOG_FILES, "*", "DCC user [%s]%s left file system", dcc[idx].nick, dcc[idx].host); set_user(&USERENTRY_DCCDIR, dcc[idx].user, dcc[idx].u.file->dir); if (dcc[idx].status & STAT_CHAT) { struct chat_info *ci; dprintf(idx, "Returning you to command mode...\n"); ci = dcc[idx].u.file->chat; nfree(dcc[idx].u.file); dcc[idx].u.chat = ci; dcc[idx].status &= (~STAT_CHAT); dcc[idx].type = &DCC_CHAT; if (dcc[idx].u.chat->channel >= 0) { chanout_but(-1, dcc[idx].u.chat->channel, "*** %s has returned.\n", dcc[idx].nick); if (dcc[idx].u.chat->channel < 100000) botnet_send_join_idx(idx, -1); } } else { dprintf(idx, "Dropping connection now.\n"); putlog(LOG_FILES, "*", "Left files: [%s]%s/%d", dcc[idx].nick, dcc[idx].host, dcc[idx].port); killsock(dcc[idx].sock); lostdcc(idx); } } if (dcc[idx].status & STAT_PAGE) flush_lines(idx, dcc[idx].u.file->chat); }
static void dcc_files_pass(int idx, char *buf, int x) { struct userrec *u = get_user_by_handle(userlist, dcc[idx].nick); if (!x) return; if (u_pass_match(u, buf)) { if (too_many_filers()) { dprintf(idx, "Too many people are in the file system right now.\n"); dprintf(idx, "Please try again later.\n"); putlog(LOG_MISC, "*", "File area full: DCC chat [%s]%s", dcc[idx].nick, dcc[idx].host); killsock(dcc[idx].sock); lostdcc(idx); return; } dcc[idx].type = &DCC_FILES; if (dcc[idx].status & STAT_TELNET) dprintf(idx, "\377\374\001\n"); /* turn echo back on */ putlog(LOG_FILES, "*", "File system: [%s]%s/%d", dcc[idx].nick, dcc[idx].host, dcc[idx].port); if (!welcome_to_files(idx)) { putlog(LOG_FILES, "*", "File system broken."); killsock(dcc[idx].sock); lostdcc(idx); } else { struct userrec *u = get_user_by_handle(userlist, dcc[idx].nick); touch_laston(u, "filearea", now); } return; } dprintf(idx, "Negative on that, Houston.\n"); putlog(LOG_MISC, "*", "Bad password: DCC chat [%s]%s", dcc[idx].nick, dcc[idx].host); killsock(dcc[idx].sock); lostdcc(idx); }
static void disconnect_server(int idx) { if (server_online > 0) check_tcl_event("disconnect-server"); server_online = 0; if (realservername) nfree(realservername); realservername = 0; if (dcc[idx].sock >= 0) killsock(dcc[idx].sock); dcc[idx].sock = -1; serv = -1; botuserhost[0] = 0; }
static void mcastpulse( tr_natpmp_t * pmp ) { struct sockaddr_in sin; uint8_t buf[16]; int res; char dbgstr[INET_ADDRSTRLEN]; tr_natpmp_parse_t parse; res = tr_netRecvFrom( pmp->mcastfd, buf, sizeof( buf ), &sin ); if( TR_NET_BLOCK & res ) { return; } else if( TR_NET_CLOSE & res ) { tr_err( "error reading nat-pmp multicast message" ); killsock( &pmp->mcastfd ); return; } tr_netNtop( &sin.sin_addr, dbgstr, sizeof( dbgstr ) ); tr_dbg( "nat-pmp read %i byte multicast packet from %s", res, dbgstr ); if( pmp->dest.s_addr != sin.sin_addr.s_addr ) { tr_dbg( "nat-pmp ignoring multicast packet from unknown host %s", dbgstr ); return; } if( TR_NET_OK == parseresponse( buf, res, -1, &parse ) ) { if( checktime( &pmp->uptime, parse.seconds ) ) { pmp->renew = 0; tr_inf( "detected nat-pmp device reset" ); if( NULL != pmp->req ) { resetreq( pmp->req ); } } if( PMP_STATE_NOBODYHOME == pmp->state ) { tr_dbg( "nat-pmp state notfound -> idle" ); pmp->state = PMP_STATE_IDLE; } } }
static void failed_tandem_relay(int idx) { int uidx = (-1), i; Context; for (i = 0; i < dcc_total; i++) if ((dcc[i].type == &DCC_PRE_RELAY) && (dcc[i].u.relay->sock == dcc[idx].sock)) uidx = i; if (uidx < 0) { putlog(LOG_MISC, "*", "%s %d -> %d", BOT_CANTFINDRELAYUSER, dcc[idx].sock, dcc[idx].u.relay->sock); killsock(dcc[idx].sock); lostdcc(idx); return; } if (dcc[idx].port >= dcc[idx].u.relay->port + 3) { struct chat_info *ci = dcc[uidx].u.relay->chat; dprintf(uidx, "%s %s.\n", BOT_CANTLINKTO, dcc[idx].nick); dcc[uidx].status = dcc[uidx].u.relay->old_status; nfree(dcc[uidx].u.relay); dcc[uidx].u.chat = ci; dcc[uidx].type = &DCC_CHAT; killsock(dcc[idx].sock); lostdcc(idx); return; } killsock(dcc[idx].sock); dcc[idx].sock = getsock(SOCK_STRONGCONN); dcc[uidx].u.relay->sock = dcc[idx].sock; dcc[idx].port++; dcc[idx].timeval = now; if (open_telnet_raw(dcc[idx].sock, dcc[idx].host, dcc[idx].port) < 0) failed_tandem_relay(idx); }
static void dns_reinit(int idx) { sdprintf("Re-opening dns socket..."); killsock(dcc[idx].sock); lostdcc(idx); dns_idx = -1; dns_sock = -1; dns_ip = NULL; if (!get_dns_idx()) sdprintf("Successfully reopened dns socket"); else sdprintf("Failed to reopen dns socket"); }
void fatal(const char *s, int recoverable) { int i; putlog(LOG_MISC, "*", "* %s", s); flushlogs(); for (i = 0; i < dcc_total; i++) if (dcc[i].sock >= 0) killsock(dcc[i].sock); unlink(pid_file); if (!recoverable) { bg_send_quit(BG_ABORT); exit(1); } }
static void bot_linked(int idx, char *par) { char s[1024]; int bots, users; bots = bots_in_subtree(findbot(dcc[idx].nick)); users = users_in_subtree(findbot(dcc[idx].nick)); putlog(LOG_BOTS, "*", "%s", BOT_OLDBOT); simple_sprintf(s, "%s %s (%s) (lost %d bot%s and %d user%s", MISC_DISCONNECTED, dcc[idx].nick, MISC_OUTDATED, bots, (bots != 1) ? "s" : "", users, (users != 1) ? "s" : ""); chatout("*** %s\n", s); botnet_send_unlinked(idx, dcc[idx].nick, s); killsock(dcc[idx].sock); lostdcc(idx); }
static void bot_bye(int idx, char *par) { char s[1024]; int users, bots; bots = bots_in_subtree(findbot(dcc[idx].nick)); users = users_in_subtree(findbot(dcc[idx].nick)); simple_sprintf(s, "%s %s. %s (lost %d bot%s and %d user%s)", BOT_DISCONNECTED, dcc[idx].nick, par[0] ? par : "No reason", bots, (bots != 1) ? "s" : "", users, (users != 1) ? "s" : ""); putlog(LOG_BOTS, "*", "%s", s); chatout("*** %s\n", s); botnet_send_unlinked(idx, dcc[idx].nick, s); dprintf(idx, "*bye\n"); killsock(dcc[idx].sock); lostdcc(idx); }
static void bot_bye(int idx, char *par) { char s[1024] = ""; int users, bots; bots = bots_in_subtree(findbot(dcc[idx].nick)); users = users_in_subtree(findbot(dcc[idx].nick)); simple_snprintf(s, sizeof(s), "%s %s. %s (lost %d bot%s and %d user%s)", "Disconnected from:", (conf.bot->hub || (conf.bot->localhub && bot_aggressive_to(dcc[idx].user))) ? dcc[idx].nick : "botnet", par[0] ? par : "No reason", bots, (bots != 1) ? "s" : "", users, (users != 1) ? "s" : ""); putlog(LOG_BOTS, "*", "%s", s); chatout("*** %s\n", s); botnet_send_unlinked(idx, dcc[idx].nick, s); dprintf(idx, "*bye\n"); killsock(dcc[idx].sock); lostdcc(idx); }
static char *dns_close() { int i; del_hook(HOOK_DNS_HOSTBYIP, (Function) dns_lookup); del_hook(HOOK_DNS_IPBYHOST, (Function) dns_forward); del_hook(HOOK_SECONDLY, (Function) dns_check_expires); for (i = 0; i < dcc_total; i++) { if (dcc[i].type == &DCC_DNS && dcc[i].sock == resfd) { killsock(dcc[i].sock); lostdcc(i); break; } } dns_free_cache(); module_undepend(MODULE_NAME); return NULL; }
static int get_dns_idx() { int i, sock; sock = -1; for (i = 0; i < nservers; i++) { if (!dns_ip) dns_ip = dns_next_server(); sock = socket_create(dns_ip, DNS_PORT, NULL, 0, SOCKET_CLIENT | SOCKET_NONBLOCK | SOCKET_UDP); if (sock < 0) { /* Try the next server. */ dns_ip = NULL; } else break; } if (i == nservers) return 1; // dns_idx = sockbuf_new(); // sockbuf_set_handler(dns_idx, &dns_handler, NULL); // sockbuf_set_sock(dns_idx, sock, 0); // allocsock(sock, SOCK_CONNECT); if (sock >= 0 && dns_ip) { dns_idx = new_dcc(&dns_handler, 0); if (dns_idx < 0) { putlog(LOG_SERV, "*", "NO MORE DCC CONNECTIONS -- Can't create dns connection."); killsock(sock); return 1; } sdprintf("dns_idx: %d", dns_idx); dcc[dns_idx].sock = sock; dns_sock = sock; sdprintf("dns_sock: %d", dcc[dns_idx].sock); strlcpy(dcc[dns_idx].host, dns_ip, UHOSTLEN); strlcpy(dcc[dns_idx].nick, "(adns)", NICKLEN); sdprintf("dns_ip: %s", dns_ip); dcc[dns_idx].timeval = now; dns_handler.timeout_val = 0; return 0; } return 1; }
static void bot_thisbot(int idx, char *par) { if (strcasecmp(par, dcc[idx].nick)) { char s[1024] = ""; putlog(LOG_BOTS, "*", "Wrong bot--wanted %s, got %s", dcc[idx].nick, par); dprintf(idx, "bye imposter\n"); simple_snprintf(s, sizeof(s), "Disconnected %s (imposter)", dcc[idx].nick); chatout("*** %s\n", s); botnet_send_unlinked(idx, dcc[idx].nick, s); unvia(idx, findbot(dcc[idx].nick)); killsock(dcc[idx].sock); lostdcc(idx); return; } /* Set capitalization the way they want it */ noshare = 1; change_handle(dcc[idx].user, par); noshare = 0; strlcpy(dcc[idx].nick, par, sizeof(dcc[idx].nick)); }