/* For mem.c : calculate memory we SHOULD be using */ int expected_memory(void) { int tot; tot = expmem_chanprog() + expmem_users() + expmem_misc() + expmem_dccutil() + expmem_botnet() + expmem_tcl() + expmem_tclhash() + expmem_net() + expmem_modules(0) + expmem_language() + expmem_tcldcc() + expmem_tclmisc() + expmem_dns(); #ifdef TLS tot += expmem_tls(); #endif return tot; }
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); }