void debug_mem_to_dcc(int idx) { #ifdef DEBUG_MEM # define MAX_MEM 13 unsigned long exp[MAX_MEM], use[MAX_MEM], l; int i, j; char fn[20], sofar[81]; module_entry *me; char *p; exp[0] = expmem_language(); exp[1] = expmem_chanprog(); exp[2] = expmem_misc(); exp[3] = expmem_users(); exp[4] = expmem_net(); exp[5] = expmem_dccutil(); exp[6] = expmem_botnet(); exp[7] = expmem_tcl(); exp[8] = expmem_tclhash(); exp[9] = expmem_tclmisc(); exp[10] = expmem_modules(1); exp[11] = expmem_tcldcc(); exp[12] = expmem_dns(); for (me = module_list; me; me = me->next) me->mem_work = 0; for (i = 0; i < MAX_MEM; i++) use[i] = 0; for (i = 0; i < lastused; i++) { strcpy(fn, memtbl[i].file); p = strchr(fn, ':'); if (p) *p = 0; l = memtbl[i].size; if (!strcmp(fn, "language.c")) use[0] += l; else if (!strcmp(fn, "chanprog.c")) use[1] += l; else if (!strcmp(fn, "misc.c")) use[2] += l; else if (!strcmp(fn, "userrec.c")) use[3] += l; else if (!strcmp(fn, "net.c")) use[4] += l; else if (!strcmp(fn, "dccutil.c")) use[5] += l; else if (!strcmp(fn, "botnet.c")) use[6] += l; else if (!strcmp(fn, "tcl.c")) use[7] += l; else if (!strcmp(fn, "tclhash.c")) use[8] += l; else if (!strcmp(fn, "tclmisc.c")) use[9] += l; else if (!strcmp(fn, "modules.c")) use[10] += l; else if (!strcmp(fn, "tcldcc.c")) use[11] += l; else if (!strcmp(fn, "dns.c")) use[12] += l; else if (p) { for (me = module_list; me; me = me->next) if (!strcmp(fn, me->name)) me->mem_work += l; } else dprintf(idx, "Not logging file %s!\n", fn); } for (i = 0; i < MAX_MEM; i++) { switch (i) { case 0: strcpy(fn, "language.c"); break; case 1: strcpy(fn, "chanprog.c"); break; case 2: strcpy(fn, "misc.c"); break; case 3: strcpy(fn, "userrec.c"); break; case 4: strcpy(fn, "net.c"); break; case 5: strcpy(fn, "dccutil.c"); break; case 6: strcpy(fn, "botnet.c"); break; case 7: strcpy(fn, "tcl.c"); break; case 8: strcpy(fn, "tclhash.c"); break; case 9: strcpy(fn, "tclmisc.c"); break; case 10: strcpy(fn, "modules.c"); break; case 11: strcpy(fn, "tcldcc.c"); break; case 12: strcpy(fn, "dns.c"); break; } if (use[i] == exp[i]) dprintf(idx, "File '%-10s' accounted for %lu/%lu (ok)\n", fn, exp[i], use[i]); else { dprintf(idx, "File '%-10s' accounted for %lu/%lu (debug follows:)\n", fn, exp[i], use[i]); strcpy(sofar, " "); for (j = 0; j < lastused; j++) { if ((p = strchr(memtbl[j].file, ':'))) *p = 0; if (!egg_strcasecmp(memtbl[j].file, fn)) { if (p) sprintf(&sofar[strlen(sofar)], "%-10s/%-4d:(%04d) ", p + 1, memtbl[j].line, memtbl[j].size); else sprintf(&sofar[strlen(sofar)], "%-4d:(%04d) ", memtbl[j].line, memtbl[j].size); if (strlen(sofar) > 60) { sofar[strlen(sofar) - 1] = 0; dprintf(idx, "%s\n", sofar); strcpy(sofar, " "); } } if (p) *p = ':'; } if (sofar[0]) { sofar[strlen(sofar) - 1] = 0; dprintf(idx, "%s\n", sofar); } } } for (me = module_list; me; me = me->next) { Function *f = me->funcs; int expt = 0; if ((f != NULL) && (f[MODCALL_EXPMEM] != NULL)) expt = f[MODCALL_EXPMEM] (); if (me->mem_work == expt) dprintf(idx, "Module '%-10s' accounted for %lu/%lu (ok)\n", me->name, expt, me->mem_work); else { dprintf(idx, "Module '%-10s' accounted for %lu/%lu (debug follows:)\n", me->name, expt, me->mem_work); strcpy(sofar, " "); for (j = 0; j < lastused; j++) { strcpy(fn, memtbl[j].file); if ((p = strchr(fn, ':')) != NULL) { *p = 0; if (!egg_strcasecmp(fn, me->name)) { sprintf(&sofar[strlen(sofar)], "%-10s/%-4d:(%04X) ", p + 1, memtbl[j].line, memtbl[j].size); if (strlen(sofar) > 60) { sofar[strlen(sofar) - 1] = 0; dprintf(idx, "%s\n", sofar); strcpy(sofar, " "); } *p = ':'; } } } if (sofar[0]) { sofar[strlen(sofar) - 1] = 0; dprintf(idx, "%s\n", sofar); } } } dprintf(idx, "--- End of debug memory list.\n"); #else dprintf(idx, "Compiled without extensive memory debugging (sorry).\n"); #endif tell_netdebug(idx); }
void readsocks(const char *fname) { /* Don't bother setting this if a hub ... it is only intended to prevent parting channels (in bot_shouldjoin()) */ if (!conf.bot->hub) restarting = 1; char *nick = NULL, *jnick = NULL, *ip4 = NULL, *ip6 = NULL; time_t old_buildts = 0; bool cached_005 = 0; const char salt1[] = SALT1; EncryptedStream stream(salt1); stream.loadFile(fname); bd::String str, type; reset_chans = 0; while (stream.tell() < stream.length()) { str = stream.getline().chomp(); dprintf(DP_DEBUG, "read line: %s\n", str.c_str()); type = newsplit(str); if (type == STR("-dcc")) dprintf(DP_DEBUG, STR("Added dcc: %d\n"), dcc_read(stream)); else if (type == STR("-sock")) dprintf(DP_DEBUG, STR("Added fd: %d\n"), sock_read(stream)); else if (type == STR("+online_since")) online_since = strtol(str.c_str(), NULL, 10); else if (type == STR("+server_online")) server_online = strtol(str.c_str(), NULL, 10); else if (type == STR("+server_floodless")) floodless = 1; else if (type == STR("+in_deaf")) in_deaf = 1; else if (type == STR("+in_callerid")) in_callerid = 1; else if (type == STR("+chan")) { bd::String chname = str; channel_add(NULL, chname.c_str(), NULL); struct chanset_t* chan = findchan_by_dname(chname.c_str()); strlcpy(chan->name, chan->dname, sizeof(chan->name)); chan->status = chan->ircnet_status = 0; chan->ircnet_status |= CHAN_PEND; reset_chans = 2; } else if (type == STR("+buildts")) old_buildts = strtol(str.c_str(), NULL, 10); else if (type == STR("+botname")) nick = str.dup(); else if (type == STR("+rolls")) rolls = atoi(str.c_str()); else if (type == STR("+altnick_char")) altnick_char = str[0]; else if (type == STR("+burst")) burst = atoi(str.c_str()); else if (type == STR("+flood_count")) flood_count = atoi(str.c_str()); else if (type == STR("+my_cookie_counter")) { my_cookie_counter = strtol(str.c_str(), NULL, 10); my_cookie_counter += 100; // Increase to avoid race conditions } else if (type == STR("+ip4")) ip4 = str.dup(); else if (type == STR("+ip6")) ip6 = str.dup(); else if (type == STR("+serv_cache")) { if (!cached_005 && str.find(STR("005"))) cached_005 = 1; dprintf(DP_CACHE, "%s", str.c_str()); } } restart_time = now; if (old_buildts && buildts > old_buildts) restart_was_update = 1; tell_dcc(DP_DEBUG); tell_netdebug(DP_DEBUG); unlink(fname); if (servidx >= 0) { char nserv[50] = ""; if ((ip4 && ip6) && (strcmp(ip4, myipstr(AF_INET)) || strcmp(ip6, myipstr(AF_INET6)))) { if (tands > 0) { /* We're not linked yet.. but for future */ botnet_send_chat(-1, conf.bot->nick, STR("IP changed.")); botnet_send_bye(STR("IP changed.")); } fatal("brb", 1); } else if (conf.bot->hub) { // I became a hub during restart... disconnect from IRC. if (tands > 0) { /* We're not linked yet.. but for future */ botnet_send_chat(-1, conf.bot->nick, STR("Changing to HUB.")); botnet_send_bye(STR("Changing to HUB.")); } nuke_server("emoquit"); } else { simple_snprintf(nserv, sizeof(nserv), "%s:%d", dcc[servidx].host, dcc[servidx].port); add_server(nserv); curserv = 0; keepnick = 0; /* Wait to change nicks until relinking, fixes nick/jupenick switching issues during restart */ reset_flood(); if (!server_online) server_online = now; rehash_server(dcc[servidx].host, nick); if (cached_005) replay_cache(servidx, NULL); else dprintf(DP_DUMP, "VERSION\n"); if (!reset_chans) reset_chans = 1; } } delete[] nick; delete[] ip4; delete[] ip6; if (jnick) free(jnick); if (socksfile) free(socksfile); }