1c2aa98e2SPeter Wemm /* 2a7ec597cSGregory Neil Shapiro * Copyright (c) 1998-2001, 2003 Sendmail, Inc. and its suppliers. 306f25ae9SGregory Neil Shapiro * All rights reserved. 4c2aa98e2SPeter Wemm * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 5c2aa98e2SPeter Wemm * Copyright (c) 1988, 1993 6c2aa98e2SPeter Wemm * The Regents of the University of California. All rights reserved. 7c2aa98e2SPeter Wemm * 8c2aa98e2SPeter Wemm * By using this file, you agree to the terms and conditions set 9c2aa98e2SPeter Wemm * forth in the LICENSE file which can be found at the top level of 10c2aa98e2SPeter Wemm * the sendmail distribution. 11c2aa98e2SPeter Wemm * 12c2aa98e2SPeter Wemm */ 13c2aa98e2SPeter Wemm 1406f25ae9SGregory Neil Shapiro #include <sendmail.h> 15c2aa98e2SPeter Wemm 16ba00ec3dSGregory Neil Shapiro SM_RCSID("@(#)$Id: stab.c,v 8.91 2011/08/08 17:33:34 ca Exp $") 1740266059SGregory Neil Shapiro 18c2aa98e2SPeter Wemm /* 19c2aa98e2SPeter Wemm ** STAB -- manage the symbol table 20c2aa98e2SPeter Wemm ** 21c2aa98e2SPeter Wemm ** Parameters: 22c2aa98e2SPeter Wemm ** name -- the name to be looked up or inserted. 23c2aa98e2SPeter Wemm ** type -- the type of symbol. 24c2aa98e2SPeter Wemm ** op -- what to do: 2540266059SGregory Neil Shapiro ** ST_ENTER -- enter the name if not already present. 26c2aa98e2SPeter Wemm ** ST_FIND -- find it only. 27c2aa98e2SPeter Wemm ** 28c2aa98e2SPeter Wemm ** Returns: 29c2aa98e2SPeter Wemm ** pointer to a STAB entry for this name. 30c2aa98e2SPeter Wemm ** NULL if not found and not entered. 31c2aa98e2SPeter Wemm ** 32c2aa98e2SPeter Wemm ** Side Effects: 33c2aa98e2SPeter Wemm ** can update the symbol table. 34c2aa98e2SPeter Wemm */ 35c2aa98e2SPeter Wemm 36c2aa98e2SPeter Wemm #define STABSIZE 2003 3740266059SGregory Neil Shapiro #define SM_LOWER(c) ((isascii(c) && isupper(c)) ? tolower(c) : (c)) 38c2aa98e2SPeter Wemm 39c2aa98e2SPeter Wemm static STAB *SymTab[STABSIZE]; 40c2aa98e2SPeter Wemm 41c2aa98e2SPeter Wemm STAB * 42c2aa98e2SPeter Wemm stab(name, type, op) 43c2aa98e2SPeter Wemm char *name; 44c2aa98e2SPeter Wemm int type; 45c2aa98e2SPeter Wemm int op; 46c2aa98e2SPeter Wemm { 47c2aa98e2SPeter Wemm register STAB *s; 48c2aa98e2SPeter Wemm register STAB **ps; 49c2aa98e2SPeter Wemm register int hfunc; 50c2aa98e2SPeter Wemm register char *p; 51c2aa98e2SPeter Wemm int len; 52c2aa98e2SPeter Wemm 53c2aa98e2SPeter Wemm if (tTd(36, 5)) 5440266059SGregory Neil Shapiro sm_dprintf("STAB: %s %d ", name, type); 55c2aa98e2SPeter Wemm 56c2aa98e2SPeter Wemm /* 57c2aa98e2SPeter Wemm ** Compute the hashing function 58c2aa98e2SPeter Wemm */ 59c2aa98e2SPeter Wemm 60c2aa98e2SPeter Wemm hfunc = type; 61c2aa98e2SPeter Wemm for (p = name; *p != '\0'; p++) 6240266059SGregory Neil Shapiro hfunc = ((hfunc << 1) ^ (SM_LOWER(*p) & 0377)) % STABSIZE; 63c2aa98e2SPeter Wemm 64c2aa98e2SPeter Wemm if (tTd(36, 9)) 6540266059SGregory Neil Shapiro sm_dprintf("(hfunc=%d) ", hfunc); 66c2aa98e2SPeter Wemm 67c2aa98e2SPeter Wemm ps = &SymTab[hfunc]; 68ba00ec3dSGregory Neil Shapiro if (type == ST_MACRO || type == ST_RULESET || type == ST_NAMECANON) 69c2aa98e2SPeter Wemm { 70c2aa98e2SPeter Wemm while ((s = *ps) != NULL && 7140266059SGregory Neil Shapiro (s->s_symtype != type || strcmp(name, s->s_name))) 72c2aa98e2SPeter Wemm ps = &s->s_next; 73c2aa98e2SPeter Wemm } 74c2aa98e2SPeter Wemm else 75c2aa98e2SPeter Wemm { 76c2aa98e2SPeter Wemm while ((s = *ps) != NULL && 7740266059SGregory Neil Shapiro (s->s_symtype != type || sm_strcasecmp(name, s->s_name))) 78c2aa98e2SPeter Wemm ps = &s->s_next; 79c2aa98e2SPeter Wemm } 80c2aa98e2SPeter Wemm 81c2aa98e2SPeter Wemm /* 82c2aa98e2SPeter Wemm ** Dispose of the entry. 83c2aa98e2SPeter Wemm */ 84c2aa98e2SPeter Wemm 85c2aa98e2SPeter Wemm if (s != NULL || op == ST_FIND) 86c2aa98e2SPeter Wemm { 87c2aa98e2SPeter Wemm if (tTd(36, 5)) 88c2aa98e2SPeter Wemm { 89c2aa98e2SPeter Wemm if (s == NULL) 9040266059SGregory Neil Shapiro sm_dprintf("not found\n"); 91c2aa98e2SPeter Wemm else 92c2aa98e2SPeter Wemm { 93c2aa98e2SPeter Wemm long *lp = (long *) s->s_class; 94c2aa98e2SPeter Wemm 9540266059SGregory Neil Shapiro sm_dprintf("type %d val %lx %lx %lx %lx\n", 9640266059SGregory Neil Shapiro s->s_symtype, lp[0], lp[1], lp[2], lp[3]); 97c2aa98e2SPeter Wemm } 98c2aa98e2SPeter Wemm } 9906f25ae9SGregory Neil Shapiro return s; 100c2aa98e2SPeter Wemm } 101c2aa98e2SPeter Wemm 102c2aa98e2SPeter Wemm /* 103c2aa98e2SPeter Wemm ** Make a new entry and link it in. 104c2aa98e2SPeter Wemm */ 105c2aa98e2SPeter Wemm 106c2aa98e2SPeter Wemm if (tTd(36, 5)) 10740266059SGregory Neil Shapiro sm_dprintf("entered\n"); 108c2aa98e2SPeter Wemm 109c2aa98e2SPeter Wemm /* determine size of new entry */ 110c2aa98e2SPeter Wemm switch (type) 111c2aa98e2SPeter Wemm { 112c2aa98e2SPeter Wemm case ST_CLASS: 113d0cef73dSGregory Neil Shapiro len = sizeof(s->s_class); 114c2aa98e2SPeter Wemm break; 115c2aa98e2SPeter Wemm 116c2aa98e2SPeter Wemm case ST_MAILER: 117d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mailer); 11806f25ae9SGregory Neil Shapiro break; 119c2aa98e2SPeter Wemm 120c2aa98e2SPeter Wemm case ST_ALIAS: 121d0cef73dSGregory Neil Shapiro len = sizeof(s->s_alias); 122c2aa98e2SPeter Wemm break; 123c2aa98e2SPeter Wemm 124c2aa98e2SPeter Wemm case ST_MAPCLASS: 125d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mapclass); 126c2aa98e2SPeter Wemm break; 127c2aa98e2SPeter Wemm 128c2aa98e2SPeter Wemm case ST_MAP: 129d0cef73dSGregory Neil Shapiro len = sizeof(s->s_map); 130c2aa98e2SPeter Wemm break; 131c2aa98e2SPeter Wemm 132c2aa98e2SPeter Wemm case ST_HOSTSIG: 133d0cef73dSGregory Neil Shapiro len = sizeof(s->s_hostsig); 134c2aa98e2SPeter Wemm break; 135c2aa98e2SPeter Wemm 136c2aa98e2SPeter Wemm case ST_NAMECANON: 137d0cef73dSGregory Neil Shapiro len = sizeof(s->s_namecanon); 138c2aa98e2SPeter Wemm break; 139c2aa98e2SPeter Wemm 140c2aa98e2SPeter Wemm case ST_MACRO: 141d0cef73dSGregory Neil Shapiro len = sizeof(s->s_macro); 142c2aa98e2SPeter Wemm break; 143c2aa98e2SPeter Wemm 144c2aa98e2SPeter Wemm case ST_RULESET: 145d0cef73dSGregory Neil Shapiro len = sizeof(s->s_ruleset); 146c2aa98e2SPeter Wemm break; 147c2aa98e2SPeter Wemm 148c2aa98e2SPeter Wemm case ST_HEADER: 149d0cef73dSGregory Neil Shapiro len = sizeof(s->s_header); 150c2aa98e2SPeter Wemm break; 151c2aa98e2SPeter Wemm 15206f25ae9SGregory Neil Shapiro case ST_SERVICE: 153d0cef73dSGregory Neil Shapiro len = sizeof(s->s_service); 15406f25ae9SGregory Neil Shapiro break; 15506f25ae9SGregory Neil Shapiro 15640266059SGregory Neil Shapiro #if LDAPMAP 1578774250cSGregory Neil Shapiro case ST_LMAP: 158d0cef73dSGregory Neil Shapiro len = sizeof(s->s_lmap); 15906f25ae9SGregory Neil Shapiro break; 16006f25ae9SGregory Neil Shapiro #endif /* LDAPMAP */ 16106f25ae9SGregory Neil Shapiro 16240266059SGregory Neil Shapiro #if MILTER 16306f25ae9SGregory Neil Shapiro case ST_MILTER: 164d0cef73dSGregory Neil Shapiro len = sizeof(s->s_milter); 16506f25ae9SGregory Neil Shapiro break; 16640266059SGregory Neil Shapiro #endif /* MILTER */ 16740266059SGregory Neil Shapiro 16840266059SGregory Neil Shapiro case ST_QUEUE: 169d0cef73dSGregory Neil Shapiro len = sizeof(s->s_quegrp); 17040266059SGregory Neil Shapiro break; 17106f25ae9SGregory Neil Shapiro 172e92d3f3fSGregory Neil Shapiro #if SOCKETMAP 173e92d3f3fSGregory Neil Shapiro case ST_SOCKETMAP: 174d0cef73dSGregory Neil Shapiro len = sizeof(s->s_socketmap); 175e92d3f3fSGregory Neil Shapiro break; 176e92d3f3fSGregory Neil Shapiro #endif /* SOCKETMAP */ 177e92d3f3fSGregory Neil Shapiro 178c2aa98e2SPeter Wemm default: 17906f25ae9SGregory Neil Shapiro /* 18040266059SGregory Neil Shapiro ** Each mailer has its own MCI stab entry: 18106f25ae9SGregory Neil Shapiro ** 18206f25ae9SGregory Neil Shapiro ** s = stab(host, ST_MCI + m->m_mno, ST_ENTER); 18306f25ae9SGregory Neil Shapiro ** 18406f25ae9SGregory Neil Shapiro ** Therefore, anything ST_MCI or larger is an s_mci. 18506f25ae9SGregory Neil Shapiro */ 18606f25ae9SGregory Neil Shapiro 187c2aa98e2SPeter Wemm if (type >= ST_MCI) 188d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mci); 189c2aa98e2SPeter Wemm else 190c2aa98e2SPeter Wemm { 191c2aa98e2SPeter Wemm syserr("stab: unknown symbol type %d", type); 192d0cef73dSGregory Neil Shapiro len = sizeof(s->s_value); 193c2aa98e2SPeter Wemm } 194c2aa98e2SPeter Wemm break; 195c2aa98e2SPeter Wemm } 196d0cef73dSGregory Neil Shapiro len += sizeof(*s) - sizeof(s->s_value); 19706f25ae9SGregory Neil Shapiro 19806f25ae9SGregory Neil Shapiro if (tTd(36, 15)) 19940266059SGregory Neil Shapiro sm_dprintf("size of stab entry: %d\n", len); 200c2aa98e2SPeter Wemm 201c2aa98e2SPeter Wemm /* make new entry */ 20240266059SGregory Neil Shapiro s = (STAB *) sm_pmalloc_x(len); 20306f25ae9SGregory Neil Shapiro memset((char *) s, '\0', len); 20440266059SGregory Neil Shapiro s->s_name = sm_pstrdup_x(name); 20540266059SGregory Neil Shapiro s->s_symtype = type; 206c2aa98e2SPeter Wemm 207c2aa98e2SPeter Wemm /* link it in */ 208c2aa98e2SPeter Wemm *ps = s; 209c2aa98e2SPeter Wemm 21006f25ae9SGregory Neil Shapiro /* set a default value for rulesets */ 21106f25ae9SGregory Neil Shapiro if (type == ST_RULESET) 21206f25ae9SGregory Neil Shapiro s->s_ruleset = -1; 21306f25ae9SGregory Neil Shapiro 21406f25ae9SGregory Neil Shapiro return s; 215c2aa98e2SPeter Wemm } 21640266059SGregory Neil Shapiro /* 217c2aa98e2SPeter Wemm ** STABAPPLY -- apply function to all stab entries 218c2aa98e2SPeter Wemm ** 219c2aa98e2SPeter Wemm ** Parameters: 22040266059SGregory Neil Shapiro ** func -- the function to apply. It will be given two 22140266059SGregory Neil Shapiro ** parameters (the stab entry and the arg). 222c2aa98e2SPeter Wemm ** arg -- an arbitrary argument, passed to func. 223c2aa98e2SPeter Wemm ** 224c2aa98e2SPeter Wemm ** Returns: 225c2aa98e2SPeter Wemm ** none. 226c2aa98e2SPeter Wemm */ 227c2aa98e2SPeter Wemm 228c2aa98e2SPeter Wemm void 229c2aa98e2SPeter Wemm stabapply(func, arg) 230c2aa98e2SPeter Wemm void (*func)__P((STAB *, int)); 231c2aa98e2SPeter Wemm int arg; 232c2aa98e2SPeter Wemm { 233c2aa98e2SPeter Wemm register STAB **shead; 234c2aa98e2SPeter Wemm register STAB *s; 235c2aa98e2SPeter Wemm 236c2aa98e2SPeter Wemm for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 237c2aa98e2SPeter Wemm { 238c2aa98e2SPeter Wemm for (s = *shead; s != NULL; s = s->s_next) 239c2aa98e2SPeter Wemm { 240c2aa98e2SPeter Wemm if (tTd(36, 90)) 24140266059SGregory Neil Shapiro sm_dprintf("stabapply: trying %d/%s\n", 24240266059SGregory Neil Shapiro s->s_symtype, s->s_name); 243c2aa98e2SPeter Wemm func(s, arg); 244c2aa98e2SPeter Wemm } 245c2aa98e2SPeter Wemm } 246c2aa98e2SPeter Wemm } 24740266059SGregory Neil Shapiro /* 24806f25ae9SGregory Neil Shapiro ** QUEUEUP_MACROS -- queueup the macros in a class 24906f25ae9SGregory Neil Shapiro ** 25006f25ae9SGregory Neil Shapiro ** Write the macros listed in the specified class into the 25106f25ae9SGregory Neil Shapiro ** file referenced by qfp. 25206f25ae9SGregory Neil Shapiro ** 25306f25ae9SGregory Neil Shapiro ** Parameters: 25406f25ae9SGregory Neil Shapiro ** class -- class ID. 25540266059SGregory Neil Shapiro ** qfp -- file pointer to the queue file. 25606f25ae9SGregory Neil Shapiro ** e -- the envelope. 25706f25ae9SGregory Neil Shapiro ** 25806f25ae9SGregory Neil Shapiro ** Returns: 25906f25ae9SGregory Neil Shapiro ** none. 26006f25ae9SGregory Neil Shapiro */ 26106f25ae9SGregory Neil Shapiro 26206f25ae9SGregory Neil Shapiro void 26306f25ae9SGregory Neil Shapiro queueup_macros(class, qfp, e) 26406f25ae9SGregory Neil Shapiro int class; 26540266059SGregory Neil Shapiro SM_FILE_T *qfp; 26606f25ae9SGregory Neil Shapiro ENVELOPE *e; 26706f25ae9SGregory Neil Shapiro { 26806f25ae9SGregory Neil Shapiro register STAB **shead; 26906f25ae9SGregory Neil Shapiro register STAB *s; 27006f25ae9SGregory Neil Shapiro 27106f25ae9SGregory Neil Shapiro if (e == NULL) 27206f25ae9SGregory Neil Shapiro return; 27306f25ae9SGregory Neil Shapiro 274193538b7SGregory Neil Shapiro class = bitidx(class); 27506f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 27606f25ae9SGregory Neil Shapiro { 27706f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 27806f25ae9SGregory Neil Shapiro { 27906f25ae9SGregory Neil Shapiro int m; 28006f25ae9SGregory Neil Shapiro char *p; 28106f25ae9SGregory Neil Shapiro 28240266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 28340266059SGregory Neil Shapiro bitnset(bitidx(class), s->s_class) && 284a7ec597cSGregory Neil Shapiro (m = macid(s->s_name)) != 0 && 28506f25ae9SGregory Neil Shapiro (p = macvalue(m, e)) != NULL) 28606f25ae9SGregory Neil Shapiro { 28740266059SGregory Neil Shapiro (void) sm_io_fprintf(qfp, SM_TIME_DEFAULT, 28840266059SGregory Neil Shapiro "$%s%s\n", 28906f25ae9SGregory Neil Shapiro s->s_name, 29040266059SGregory Neil Shapiro denlstring(p, true, 29140266059SGregory Neil Shapiro false)); 29206f25ae9SGregory Neil Shapiro } 29306f25ae9SGregory Neil Shapiro } 29406f25ae9SGregory Neil Shapiro } 29506f25ae9SGregory Neil Shapiro } 29640266059SGregory Neil Shapiro /* 29706f25ae9SGregory Neil Shapiro ** COPY_CLASS -- copy class members from one class to another 29806f25ae9SGregory Neil Shapiro ** 29906f25ae9SGregory Neil Shapiro ** Parameters: 30006f25ae9SGregory Neil Shapiro ** src -- source class. 30106f25ae9SGregory Neil Shapiro ** dst -- destination class. 30206f25ae9SGregory Neil Shapiro ** 30306f25ae9SGregory Neil Shapiro ** Returns: 30406f25ae9SGregory Neil Shapiro ** none. 30506f25ae9SGregory Neil Shapiro */ 30606f25ae9SGregory Neil Shapiro 30706f25ae9SGregory Neil Shapiro void 30806f25ae9SGregory Neil Shapiro copy_class(src, dst) 30906f25ae9SGregory Neil Shapiro int src; 31006f25ae9SGregory Neil Shapiro int dst; 31106f25ae9SGregory Neil Shapiro { 31206f25ae9SGregory Neil Shapiro register STAB **shead; 31306f25ae9SGregory Neil Shapiro register STAB *s; 31406f25ae9SGregory Neil Shapiro 315193538b7SGregory Neil Shapiro src = bitidx(src); 316193538b7SGregory Neil Shapiro dst = bitidx(dst); 31706f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 31806f25ae9SGregory Neil Shapiro { 31906f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 32006f25ae9SGregory Neil Shapiro { 32140266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 322193538b7SGregory Neil Shapiro bitnset(src, s->s_class)) 32306f25ae9SGregory Neil Shapiro setbitn(dst, s->s_class); 32406f25ae9SGregory Neil Shapiro } 32506f25ae9SGregory Neil Shapiro } 32606f25ae9SGregory Neil Shapiro } 32740266059SGregory Neil Shapiro 32840266059SGregory Neil Shapiro /* 32940266059SGregory Neil Shapiro ** RMEXPSTAB -- remove expired entries from SymTab. 33040266059SGregory Neil Shapiro ** 33140266059SGregory Neil Shapiro ** These entries need to be removed in long-running processes, 33240266059SGregory Neil Shapiro ** e.g., persistent queue runners, to avoid consuming memory. 33340266059SGregory Neil Shapiro ** 33440266059SGregory Neil Shapiro ** XXX It might be useful to restrict the maximum TTL to avoid 33540266059SGregory Neil Shapiro ** caching data very long. 33640266059SGregory Neil Shapiro ** 33740266059SGregory Neil Shapiro ** Parameters: 33840266059SGregory Neil Shapiro ** none. 33940266059SGregory Neil Shapiro ** 34040266059SGregory Neil Shapiro ** Returns: 34140266059SGregory Neil Shapiro ** none. 34240266059SGregory Neil Shapiro ** 34340266059SGregory Neil Shapiro ** Side Effects: 34440266059SGregory Neil Shapiro ** can remove entries from the symbol table. 34540266059SGregory Neil Shapiro */ 34640266059SGregory Neil Shapiro 34740266059SGregory Neil Shapiro #define SM_STAB_FREE(x) \ 34840266059SGregory Neil Shapiro do \ 34940266059SGregory Neil Shapiro { \ 35040266059SGregory Neil Shapiro char *o = (x); \ 35140266059SGregory Neil Shapiro (x) = NULL; \ 35240266059SGregory Neil Shapiro if (o != NULL) \ 35340266059SGregory Neil Shapiro sm_free(o); \ 35440266059SGregory Neil Shapiro } while (0) 35540266059SGregory Neil Shapiro 35640266059SGregory Neil Shapiro void 35740266059SGregory Neil Shapiro rmexpstab() 35840266059SGregory Neil Shapiro { 35940266059SGregory Neil Shapiro int i; 36040266059SGregory Neil Shapiro STAB *s, *p, *f; 36140266059SGregory Neil Shapiro time_t now; 36240266059SGregory Neil Shapiro 36340266059SGregory Neil Shapiro now = curtime(); 36440266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 36540266059SGregory Neil Shapiro { 36640266059SGregory Neil Shapiro p = NULL; 36740266059SGregory Neil Shapiro s = SymTab[i]; 36840266059SGregory Neil Shapiro while (s != NULL) 36940266059SGregory Neil Shapiro { 37040266059SGregory Neil Shapiro switch (s->s_symtype) 37140266059SGregory Neil Shapiro { 37240266059SGregory Neil Shapiro case ST_HOSTSIG: 37340266059SGregory Neil Shapiro if (s->s_hostsig.hs_exp >= now) 37440266059SGregory Neil Shapiro goto next; /* not expired */ 37540266059SGregory Neil Shapiro SM_STAB_FREE(s->s_hostsig.hs_sig); /* XXX */ 37640266059SGregory Neil Shapiro break; 37740266059SGregory Neil Shapiro 37840266059SGregory Neil Shapiro case ST_NAMECANON: 37940266059SGregory Neil Shapiro if (s->s_namecanon.nc_exp >= now) 38040266059SGregory Neil Shapiro goto next; /* not expired */ 38140266059SGregory Neil Shapiro SM_STAB_FREE(s->s_namecanon.nc_cname); /* XXX */ 38240266059SGregory Neil Shapiro break; 38340266059SGregory Neil Shapiro 38440266059SGregory Neil Shapiro default: 38540266059SGregory Neil Shapiro if (s->s_symtype >= ST_MCI) 38640266059SGregory Neil Shapiro { 38740266059SGregory Neil Shapiro /* call mci_uncache? */ 38840266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_status); 38940266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_rstatus); 39040266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_heloname); 39140266059SGregory Neil Shapiro #if 0 39240266059SGregory Neil Shapiro /* not dynamically allocated */ 39340266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_host); 39440266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_tolist); 39540266059SGregory Neil Shapiro #endif /* 0 */ 39640266059SGregory Neil Shapiro #if SASL 39740266059SGregory Neil Shapiro /* should always by NULL */ 39840266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_sasl_string); 39940266059SGregory Neil Shapiro #endif /* SASL */ 40040266059SGregory Neil Shapiro if (s->s_mci.mci_rpool != NULL) 40140266059SGregory Neil Shapiro { 40240266059SGregory Neil Shapiro sm_rpool_free(s->s_mci.mci_rpool); 40340266059SGregory Neil Shapiro s->s_mci.mci_macro.mac_rpool = NULL; 40440266059SGregory Neil Shapiro s->s_mci.mci_rpool = NULL; 40540266059SGregory Neil Shapiro } 40640266059SGregory Neil Shapiro break; 40740266059SGregory Neil Shapiro } 40840266059SGregory Neil Shapiro next: 40940266059SGregory Neil Shapiro p = s; 41040266059SGregory Neil Shapiro s = s->s_next; 41140266059SGregory Neil Shapiro continue; 41240266059SGregory Neil Shapiro } 41340266059SGregory Neil Shapiro 41440266059SGregory Neil Shapiro /* remove entry */ 41540266059SGregory Neil Shapiro SM_STAB_FREE(s->s_name); /* XXX */ 41640266059SGregory Neil Shapiro f = s; 41740266059SGregory Neil Shapiro s = s->s_next; 41840266059SGregory Neil Shapiro sm_free(f); /* XXX */ 41940266059SGregory Neil Shapiro if (p == NULL) 42040266059SGregory Neil Shapiro SymTab[i] = s; 42140266059SGregory Neil Shapiro else 42240266059SGregory Neil Shapiro p->s_next = s; 42340266059SGregory Neil Shapiro } 42440266059SGregory Neil Shapiro } 42540266059SGregory Neil Shapiro } 42640266059SGregory Neil Shapiro 42740266059SGregory Neil Shapiro #if SM_HEAP_CHECK 42840266059SGregory Neil Shapiro /* 42940266059SGregory Neil Shapiro ** DUMPSTAB -- dump symbol table. 43040266059SGregory Neil Shapiro ** 43140266059SGregory Neil Shapiro ** For debugging. 43240266059SGregory Neil Shapiro */ 43340266059SGregory Neil Shapiro 43440266059SGregory Neil Shapiro #define MAXSTTYPES (ST_MCI + 1) 43540266059SGregory Neil Shapiro 43640266059SGregory Neil Shapiro void 43740266059SGregory Neil Shapiro dumpstab() 43840266059SGregory Neil Shapiro { 43940266059SGregory Neil Shapiro int i, t, total, types[MAXSTTYPES]; 44040266059SGregory Neil Shapiro STAB *s; 44140266059SGregory Neil Shapiro static int prevt[MAXSTTYPES], prev = 0; 44240266059SGregory Neil Shapiro 44340266059SGregory Neil Shapiro total = 0; 44440266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 44540266059SGregory Neil Shapiro types[i] = 0; 44640266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 44740266059SGregory Neil Shapiro { 44840266059SGregory Neil Shapiro s = SymTab[i]; 44940266059SGregory Neil Shapiro while (s != NULL) 45040266059SGregory Neil Shapiro { 45140266059SGregory Neil Shapiro ++total; 45240266059SGregory Neil Shapiro t = s->s_symtype; 45340266059SGregory Neil Shapiro if (t > MAXSTTYPES - 1) 45440266059SGregory Neil Shapiro t = MAXSTTYPES - 1; 45540266059SGregory Neil Shapiro types[t]++; 45640266059SGregory Neil Shapiro s = s->s_next; 45740266059SGregory Neil Shapiro } 45840266059SGregory Neil Shapiro } 45940266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: total=%d (%d)", total, total - prev); 46040266059SGregory Neil Shapiro prev = total; 46140266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 46240266059SGregory Neil Shapiro { 46340266059SGregory Neil Shapiro if (types[i] != 0) 46440266059SGregory Neil Shapiro { 46540266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: type[%2d]=%2d (%d)", 46640266059SGregory Neil Shapiro i, types[i], types[i] - prevt[i]); 46740266059SGregory Neil Shapiro } 46840266059SGregory Neil Shapiro prevt[i] = types[i]; 46940266059SGregory Neil Shapiro } 47040266059SGregory Neil Shapiro } 47140266059SGregory Neil Shapiro #endif /* SM_HEAP_CHECK */ 472