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 16d0cef73dSGregory Neil Shapiro SM_RCSID("@(#)$Id: stab.c,v 8.89 2006/08/15 23:24:58 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]; 68c2aa98e2SPeter Wemm if (type == ST_MACRO || type == ST_RULESET) 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_ADDRESS: 117d0cef73dSGregory Neil Shapiro len = sizeof(s->s_address); 118c2aa98e2SPeter Wemm break; 119c2aa98e2SPeter Wemm 120c2aa98e2SPeter Wemm case ST_MAILER: 121d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mailer); 12206f25ae9SGregory Neil Shapiro break; 123c2aa98e2SPeter Wemm 124c2aa98e2SPeter Wemm case ST_ALIAS: 125d0cef73dSGregory Neil Shapiro len = sizeof(s->s_alias); 126c2aa98e2SPeter Wemm break; 127c2aa98e2SPeter Wemm 128c2aa98e2SPeter Wemm case ST_MAPCLASS: 129d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mapclass); 130c2aa98e2SPeter Wemm break; 131c2aa98e2SPeter Wemm 132c2aa98e2SPeter Wemm case ST_MAP: 133d0cef73dSGregory Neil Shapiro len = sizeof(s->s_map); 134c2aa98e2SPeter Wemm break; 135c2aa98e2SPeter Wemm 136c2aa98e2SPeter Wemm case ST_HOSTSIG: 137d0cef73dSGregory Neil Shapiro len = sizeof(s->s_hostsig); 138c2aa98e2SPeter Wemm break; 139c2aa98e2SPeter Wemm 140c2aa98e2SPeter Wemm case ST_NAMECANON: 141d0cef73dSGregory Neil Shapiro len = sizeof(s->s_namecanon); 142c2aa98e2SPeter Wemm break; 143c2aa98e2SPeter Wemm 144c2aa98e2SPeter Wemm case ST_MACRO: 145d0cef73dSGregory Neil Shapiro len = sizeof(s->s_macro); 146c2aa98e2SPeter Wemm break; 147c2aa98e2SPeter Wemm 148c2aa98e2SPeter Wemm case ST_RULESET: 149d0cef73dSGregory Neil Shapiro len = sizeof(s->s_ruleset); 150c2aa98e2SPeter Wemm break; 151c2aa98e2SPeter Wemm 152c2aa98e2SPeter Wemm case ST_HEADER: 153d0cef73dSGregory Neil Shapiro len = sizeof(s->s_header); 154c2aa98e2SPeter Wemm break; 155c2aa98e2SPeter Wemm 15606f25ae9SGregory Neil Shapiro case ST_SERVICE: 157d0cef73dSGregory Neil Shapiro len = sizeof(s->s_service); 15806f25ae9SGregory Neil Shapiro break; 15906f25ae9SGregory Neil Shapiro 16040266059SGregory Neil Shapiro #if LDAPMAP 1618774250cSGregory Neil Shapiro case ST_LMAP: 162d0cef73dSGregory Neil Shapiro len = sizeof(s->s_lmap); 16306f25ae9SGregory Neil Shapiro break; 16406f25ae9SGregory Neil Shapiro #endif /* LDAPMAP */ 16506f25ae9SGregory Neil Shapiro 16640266059SGregory Neil Shapiro #if MILTER 16706f25ae9SGregory Neil Shapiro case ST_MILTER: 168d0cef73dSGregory Neil Shapiro len = sizeof(s->s_milter); 16906f25ae9SGregory Neil Shapiro break; 17040266059SGregory Neil Shapiro #endif /* MILTER */ 17140266059SGregory Neil Shapiro 17240266059SGregory Neil Shapiro case ST_QUEUE: 173d0cef73dSGregory Neil Shapiro len = sizeof(s->s_quegrp); 17440266059SGregory Neil Shapiro break; 17506f25ae9SGregory Neil Shapiro 176e92d3f3fSGregory Neil Shapiro #if SOCKETMAP 177e92d3f3fSGregory Neil Shapiro case ST_SOCKETMAP: 178d0cef73dSGregory Neil Shapiro len = sizeof(s->s_socketmap); 179e92d3f3fSGregory Neil Shapiro break; 180e92d3f3fSGregory Neil Shapiro #endif /* SOCKETMAP */ 181e92d3f3fSGregory Neil Shapiro 182c2aa98e2SPeter Wemm default: 18306f25ae9SGregory Neil Shapiro /* 18440266059SGregory Neil Shapiro ** Each mailer has its own MCI stab entry: 18506f25ae9SGregory Neil Shapiro ** 18606f25ae9SGregory Neil Shapiro ** s = stab(host, ST_MCI + m->m_mno, ST_ENTER); 18706f25ae9SGregory Neil Shapiro ** 18806f25ae9SGregory Neil Shapiro ** Therefore, anything ST_MCI or larger is an s_mci. 18906f25ae9SGregory Neil Shapiro */ 19006f25ae9SGregory Neil Shapiro 191c2aa98e2SPeter Wemm if (type >= ST_MCI) 192d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mci); 193c2aa98e2SPeter Wemm else 194c2aa98e2SPeter Wemm { 195c2aa98e2SPeter Wemm syserr("stab: unknown symbol type %d", type); 196d0cef73dSGregory Neil Shapiro len = sizeof(s->s_value); 197c2aa98e2SPeter Wemm } 198c2aa98e2SPeter Wemm break; 199c2aa98e2SPeter Wemm } 200d0cef73dSGregory Neil Shapiro len += sizeof(*s) - sizeof(s->s_value); 20106f25ae9SGregory Neil Shapiro 20206f25ae9SGregory Neil Shapiro if (tTd(36, 15)) 20340266059SGregory Neil Shapiro sm_dprintf("size of stab entry: %d\n", len); 204c2aa98e2SPeter Wemm 205c2aa98e2SPeter Wemm /* make new entry */ 20640266059SGregory Neil Shapiro s = (STAB *) sm_pmalloc_x(len); 20706f25ae9SGregory Neil Shapiro memset((char *) s, '\0', len); 20840266059SGregory Neil Shapiro s->s_name = sm_pstrdup_x(name); 20940266059SGregory Neil Shapiro s->s_symtype = type; 210c2aa98e2SPeter Wemm 211c2aa98e2SPeter Wemm /* link it in */ 212c2aa98e2SPeter Wemm *ps = s; 213c2aa98e2SPeter Wemm 21406f25ae9SGregory Neil Shapiro /* set a default value for rulesets */ 21506f25ae9SGregory Neil Shapiro if (type == ST_RULESET) 21606f25ae9SGregory Neil Shapiro s->s_ruleset = -1; 21706f25ae9SGregory Neil Shapiro 21806f25ae9SGregory Neil Shapiro return s; 219c2aa98e2SPeter Wemm } 22040266059SGregory Neil Shapiro /* 221c2aa98e2SPeter Wemm ** STABAPPLY -- apply function to all stab entries 222c2aa98e2SPeter Wemm ** 223c2aa98e2SPeter Wemm ** Parameters: 22440266059SGregory Neil Shapiro ** func -- the function to apply. It will be given two 22540266059SGregory Neil Shapiro ** parameters (the stab entry and the arg). 226c2aa98e2SPeter Wemm ** arg -- an arbitrary argument, passed to func. 227c2aa98e2SPeter Wemm ** 228c2aa98e2SPeter Wemm ** Returns: 229c2aa98e2SPeter Wemm ** none. 230c2aa98e2SPeter Wemm */ 231c2aa98e2SPeter Wemm 232c2aa98e2SPeter Wemm void 233c2aa98e2SPeter Wemm stabapply(func, arg) 234c2aa98e2SPeter Wemm void (*func)__P((STAB *, int)); 235c2aa98e2SPeter Wemm int arg; 236c2aa98e2SPeter Wemm { 237c2aa98e2SPeter Wemm register STAB **shead; 238c2aa98e2SPeter Wemm register STAB *s; 239c2aa98e2SPeter Wemm 240c2aa98e2SPeter Wemm for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 241c2aa98e2SPeter Wemm { 242c2aa98e2SPeter Wemm for (s = *shead; s != NULL; s = s->s_next) 243c2aa98e2SPeter Wemm { 244c2aa98e2SPeter Wemm if (tTd(36, 90)) 24540266059SGregory Neil Shapiro sm_dprintf("stabapply: trying %d/%s\n", 24640266059SGregory Neil Shapiro s->s_symtype, s->s_name); 247c2aa98e2SPeter Wemm func(s, arg); 248c2aa98e2SPeter Wemm } 249c2aa98e2SPeter Wemm } 250c2aa98e2SPeter Wemm } 25140266059SGregory Neil Shapiro /* 25206f25ae9SGregory Neil Shapiro ** QUEUEUP_MACROS -- queueup the macros in a class 25306f25ae9SGregory Neil Shapiro ** 25406f25ae9SGregory Neil Shapiro ** Write the macros listed in the specified class into the 25506f25ae9SGregory Neil Shapiro ** file referenced by qfp. 25606f25ae9SGregory Neil Shapiro ** 25706f25ae9SGregory Neil Shapiro ** Parameters: 25806f25ae9SGregory Neil Shapiro ** class -- class ID. 25940266059SGregory Neil Shapiro ** qfp -- file pointer to the queue file. 26006f25ae9SGregory Neil Shapiro ** e -- the envelope. 26106f25ae9SGregory Neil Shapiro ** 26206f25ae9SGregory Neil Shapiro ** Returns: 26306f25ae9SGregory Neil Shapiro ** none. 26406f25ae9SGregory Neil Shapiro */ 26506f25ae9SGregory Neil Shapiro 26606f25ae9SGregory Neil Shapiro void 26706f25ae9SGregory Neil Shapiro queueup_macros(class, qfp, e) 26806f25ae9SGregory Neil Shapiro int class; 26940266059SGregory Neil Shapiro SM_FILE_T *qfp; 27006f25ae9SGregory Neil Shapiro ENVELOPE *e; 27106f25ae9SGregory Neil Shapiro { 27206f25ae9SGregory Neil Shapiro register STAB **shead; 27306f25ae9SGregory Neil Shapiro register STAB *s; 27406f25ae9SGregory Neil Shapiro 27506f25ae9SGregory Neil Shapiro if (e == NULL) 27606f25ae9SGregory Neil Shapiro return; 27706f25ae9SGregory Neil Shapiro 278193538b7SGregory Neil Shapiro class = bitidx(class); 27906f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 28006f25ae9SGregory Neil Shapiro { 28106f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 28206f25ae9SGregory Neil Shapiro { 28306f25ae9SGregory Neil Shapiro int m; 28406f25ae9SGregory Neil Shapiro char *p; 28506f25ae9SGregory Neil Shapiro 28640266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 28740266059SGregory Neil Shapiro bitnset(bitidx(class), s->s_class) && 288a7ec597cSGregory Neil Shapiro (m = macid(s->s_name)) != 0 && 28906f25ae9SGregory Neil Shapiro (p = macvalue(m, e)) != NULL) 29006f25ae9SGregory Neil Shapiro { 29140266059SGregory Neil Shapiro (void) sm_io_fprintf(qfp, SM_TIME_DEFAULT, 29240266059SGregory Neil Shapiro "$%s%s\n", 29306f25ae9SGregory Neil Shapiro s->s_name, 29440266059SGregory Neil Shapiro denlstring(p, true, 29540266059SGregory Neil Shapiro false)); 29606f25ae9SGregory Neil Shapiro } 29706f25ae9SGregory Neil Shapiro } 29806f25ae9SGregory Neil Shapiro } 29906f25ae9SGregory Neil Shapiro } 30040266059SGregory Neil Shapiro /* 30106f25ae9SGregory Neil Shapiro ** COPY_CLASS -- copy class members from one class to another 30206f25ae9SGregory Neil Shapiro ** 30306f25ae9SGregory Neil Shapiro ** Parameters: 30406f25ae9SGregory Neil Shapiro ** src -- source class. 30506f25ae9SGregory Neil Shapiro ** dst -- destination class. 30606f25ae9SGregory Neil Shapiro ** 30706f25ae9SGregory Neil Shapiro ** Returns: 30806f25ae9SGregory Neil Shapiro ** none. 30906f25ae9SGregory Neil Shapiro */ 31006f25ae9SGregory Neil Shapiro 31106f25ae9SGregory Neil Shapiro void 31206f25ae9SGregory Neil Shapiro copy_class(src, dst) 31306f25ae9SGregory Neil Shapiro int src; 31406f25ae9SGregory Neil Shapiro int dst; 31506f25ae9SGregory Neil Shapiro { 31606f25ae9SGregory Neil Shapiro register STAB **shead; 31706f25ae9SGregory Neil Shapiro register STAB *s; 31806f25ae9SGregory Neil Shapiro 319193538b7SGregory Neil Shapiro src = bitidx(src); 320193538b7SGregory Neil Shapiro dst = bitidx(dst); 32106f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 32206f25ae9SGregory Neil Shapiro { 32306f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 32406f25ae9SGregory Neil Shapiro { 32540266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 326193538b7SGregory Neil Shapiro bitnset(src, s->s_class)) 32706f25ae9SGregory Neil Shapiro setbitn(dst, s->s_class); 32806f25ae9SGregory Neil Shapiro } 32906f25ae9SGregory Neil Shapiro } 33006f25ae9SGregory Neil Shapiro } 33140266059SGregory Neil Shapiro 33240266059SGregory Neil Shapiro /* 33340266059SGregory Neil Shapiro ** RMEXPSTAB -- remove expired entries from SymTab. 33440266059SGregory Neil Shapiro ** 33540266059SGregory Neil Shapiro ** These entries need to be removed in long-running processes, 33640266059SGregory Neil Shapiro ** e.g., persistent queue runners, to avoid consuming memory. 33740266059SGregory Neil Shapiro ** 33840266059SGregory Neil Shapiro ** XXX It might be useful to restrict the maximum TTL to avoid 33940266059SGregory Neil Shapiro ** caching data very long. 34040266059SGregory Neil Shapiro ** 34140266059SGregory Neil Shapiro ** Parameters: 34240266059SGregory Neil Shapiro ** none. 34340266059SGregory Neil Shapiro ** 34440266059SGregory Neil Shapiro ** Returns: 34540266059SGregory Neil Shapiro ** none. 34640266059SGregory Neil Shapiro ** 34740266059SGregory Neil Shapiro ** Side Effects: 34840266059SGregory Neil Shapiro ** can remove entries from the symbol table. 34940266059SGregory Neil Shapiro */ 35040266059SGregory Neil Shapiro 35140266059SGregory Neil Shapiro #define SM_STAB_FREE(x) \ 35240266059SGregory Neil Shapiro do \ 35340266059SGregory Neil Shapiro { \ 35440266059SGregory Neil Shapiro char *o = (x); \ 35540266059SGregory Neil Shapiro (x) = NULL; \ 35640266059SGregory Neil Shapiro if (o != NULL) \ 35740266059SGregory Neil Shapiro sm_free(o); \ 35840266059SGregory Neil Shapiro } while (0) 35940266059SGregory Neil Shapiro 36040266059SGregory Neil Shapiro void 36140266059SGregory Neil Shapiro rmexpstab() 36240266059SGregory Neil Shapiro { 36340266059SGregory Neil Shapiro int i; 36440266059SGregory Neil Shapiro STAB *s, *p, *f; 36540266059SGregory Neil Shapiro time_t now; 36640266059SGregory Neil Shapiro 36740266059SGregory Neil Shapiro now = curtime(); 36840266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 36940266059SGregory Neil Shapiro { 37040266059SGregory Neil Shapiro p = NULL; 37140266059SGregory Neil Shapiro s = SymTab[i]; 37240266059SGregory Neil Shapiro while (s != NULL) 37340266059SGregory Neil Shapiro { 37440266059SGregory Neil Shapiro switch (s->s_symtype) 37540266059SGregory Neil Shapiro { 37640266059SGregory Neil Shapiro case ST_HOSTSIG: 37740266059SGregory Neil Shapiro if (s->s_hostsig.hs_exp >= now) 37840266059SGregory Neil Shapiro goto next; /* not expired */ 37940266059SGregory Neil Shapiro SM_STAB_FREE(s->s_hostsig.hs_sig); /* XXX */ 38040266059SGregory Neil Shapiro break; 38140266059SGregory Neil Shapiro 38240266059SGregory Neil Shapiro case ST_NAMECANON: 38340266059SGregory Neil Shapiro if (s->s_namecanon.nc_exp >= now) 38440266059SGregory Neil Shapiro goto next; /* not expired */ 38540266059SGregory Neil Shapiro SM_STAB_FREE(s->s_namecanon.nc_cname); /* XXX */ 38640266059SGregory Neil Shapiro break; 38740266059SGregory Neil Shapiro 38840266059SGregory Neil Shapiro default: 38940266059SGregory Neil Shapiro if (s->s_symtype >= ST_MCI) 39040266059SGregory Neil Shapiro { 39140266059SGregory Neil Shapiro /* call mci_uncache? */ 39240266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_status); 39340266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_rstatus); 39440266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_heloname); 39540266059SGregory Neil Shapiro #if 0 39640266059SGregory Neil Shapiro /* not dynamically allocated */ 39740266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_host); 39840266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_tolist); 39940266059SGregory Neil Shapiro #endif /* 0 */ 40040266059SGregory Neil Shapiro #if SASL 40140266059SGregory Neil Shapiro /* should always by NULL */ 40240266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_sasl_string); 40340266059SGregory Neil Shapiro #endif /* SASL */ 40440266059SGregory Neil Shapiro if (s->s_mci.mci_rpool != NULL) 40540266059SGregory Neil Shapiro { 40640266059SGregory Neil Shapiro sm_rpool_free(s->s_mci.mci_rpool); 40740266059SGregory Neil Shapiro s->s_mci.mci_macro.mac_rpool = NULL; 40840266059SGregory Neil Shapiro s->s_mci.mci_rpool = NULL; 40940266059SGregory Neil Shapiro } 41040266059SGregory Neil Shapiro break; 41140266059SGregory Neil Shapiro } 41240266059SGregory Neil Shapiro next: 41340266059SGregory Neil Shapiro p = s; 41440266059SGregory Neil Shapiro s = s->s_next; 41540266059SGregory Neil Shapiro continue; 41640266059SGregory Neil Shapiro } 41740266059SGregory Neil Shapiro 41840266059SGregory Neil Shapiro /* remove entry */ 41940266059SGregory Neil Shapiro SM_STAB_FREE(s->s_name); /* XXX */ 42040266059SGregory Neil Shapiro f = s; 42140266059SGregory Neil Shapiro s = s->s_next; 42240266059SGregory Neil Shapiro sm_free(f); /* XXX */ 42340266059SGregory Neil Shapiro if (p == NULL) 42440266059SGregory Neil Shapiro SymTab[i] = s; 42540266059SGregory Neil Shapiro else 42640266059SGregory Neil Shapiro p->s_next = s; 42740266059SGregory Neil Shapiro } 42840266059SGregory Neil Shapiro } 42940266059SGregory Neil Shapiro } 43040266059SGregory Neil Shapiro 43140266059SGregory Neil Shapiro #if SM_HEAP_CHECK 43240266059SGregory Neil Shapiro /* 43340266059SGregory Neil Shapiro ** DUMPSTAB -- dump symbol table. 43440266059SGregory Neil Shapiro ** 43540266059SGregory Neil Shapiro ** For debugging. 43640266059SGregory Neil Shapiro */ 43740266059SGregory Neil Shapiro 43840266059SGregory Neil Shapiro #define MAXSTTYPES (ST_MCI + 1) 43940266059SGregory Neil Shapiro 44040266059SGregory Neil Shapiro void 44140266059SGregory Neil Shapiro dumpstab() 44240266059SGregory Neil Shapiro { 44340266059SGregory Neil Shapiro int i, t, total, types[MAXSTTYPES]; 44440266059SGregory Neil Shapiro STAB *s; 44540266059SGregory Neil Shapiro static int prevt[MAXSTTYPES], prev = 0; 44640266059SGregory Neil Shapiro 44740266059SGregory Neil Shapiro total = 0; 44840266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 44940266059SGregory Neil Shapiro types[i] = 0; 45040266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 45140266059SGregory Neil Shapiro { 45240266059SGregory Neil Shapiro s = SymTab[i]; 45340266059SGregory Neil Shapiro while (s != NULL) 45440266059SGregory Neil Shapiro { 45540266059SGregory Neil Shapiro ++total; 45640266059SGregory Neil Shapiro t = s->s_symtype; 45740266059SGregory Neil Shapiro if (t > MAXSTTYPES - 1) 45840266059SGregory Neil Shapiro t = MAXSTTYPES - 1; 45940266059SGregory Neil Shapiro types[t]++; 46040266059SGregory Neil Shapiro s = s->s_next; 46140266059SGregory Neil Shapiro } 46240266059SGregory Neil Shapiro } 46340266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: total=%d (%d)", total, total - prev); 46440266059SGregory Neil Shapiro prev = total; 46540266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 46640266059SGregory Neil Shapiro { 46740266059SGregory Neil Shapiro if (types[i] != 0) 46840266059SGregory Neil Shapiro { 46940266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: type[%2d]=%2d (%d)", 47040266059SGregory Neil Shapiro i, types[i], types[i] - prevt[i]); 47140266059SGregory Neil Shapiro } 47240266059SGregory Neil Shapiro prevt[i] = types[i]; 47340266059SGregory Neil Shapiro } 47440266059SGregory Neil Shapiro } 47540266059SGregory Neil Shapiro #endif /* SM_HEAP_CHECK */ 476