1c2aa98e2SPeter Wemm /* 28774250cSGregory Neil Shapiro * Copyright (c) 1998-2001 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 1640266059SGregory Neil Shapiro SM_RCSID("@(#)$Id: stab.c,v 8.86 2001/12/29 04:27:56 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: 113c2aa98e2SPeter Wemm len = sizeof s->s_class; 114c2aa98e2SPeter Wemm break; 115c2aa98e2SPeter Wemm 116c2aa98e2SPeter Wemm case ST_ADDRESS: 117c2aa98e2SPeter Wemm len = sizeof s->s_address; 118c2aa98e2SPeter Wemm break; 119c2aa98e2SPeter Wemm 120c2aa98e2SPeter Wemm case ST_MAILER: 121c2aa98e2SPeter Wemm len = sizeof s->s_mailer; 12206f25ae9SGregory Neil Shapiro break; 123c2aa98e2SPeter Wemm 124c2aa98e2SPeter Wemm case ST_ALIAS: 125c2aa98e2SPeter Wemm len = sizeof s->s_alias; 126c2aa98e2SPeter Wemm break; 127c2aa98e2SPeter Wemm 128c2aa98e2SPeter Wemm case ST_MAPCLASS: 129c2aa98e2SPeter Wemm len = sizeof s->s_mapclass; 130c2aa98e2SPeter Wemm break; 131c2aa98e2SPeter Wemm 132c2aa98e2SPeter Wemm case ST_MAP: 133c2aa98e2SPeter Wemm len = sizeof s->s_map; 134c2aa98e2SPeter Wemm break; 135c2aa98e2SPeter Wemm 136c2aa98e2SPeter Wemm case ST_HOSTSIG: 137c2aa98e2SPeter Wemm len = sizeof s->s_hostsig; 138c2aa98e2SPeter Wemm break; 139c2aa98e2SPeter Wemm 140c2aa98e2SPeter Wemm case ST_NAMECANON: 141c2aa98e2SPeter Wemm len = sizeof s->s_namecanon; 142c2aa98e2SPeter Wemm break; 143c2aa98e2SPeter Wemm 144c2aa98e2SPeter Wemm case ST_MACRO: 145c2aa98e2SPeter Wemm len = sizeof s->s_macro; 146c2aa98e2SPeter Wemm break; 147c2aa98e2SPeter Wemm 148c2aa98e2SPeter Wemm case ST_RULESET: 149c2aa98e2SPeter Wemm len = sizeof s->s_ruleset; 150c2aa98e2SPeter Wemm break; 151c2aa98e2SPeter Wemm 152c2aa98e2SPeter Wemm case ST_HEADER: 153c2aa98e2SPeter Wemm len = sizeof s->s_header; 154c2aa98e2SPeter Wemm break; 155c2aa98e2SPeter Wemm 15606f25ae9SGregory Neil Shapiro case ST_SERVICE: 15706f25ae9SGregory 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: 1628774250cSGregory 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: 16806f25ae9SGregory 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: 17340266059SGregory Neil Shapiro len = sizeof s->s_quegrp; 17440266059SGregory Neil Shapiro break; 17506f25ae9SGregory Neil Shapiro 176c2aa98e2SPeter Wemm default: 17706f25ae9SGregory Neil Shapiro /* 17840266059SGregory Neil Shapiro ** Each mailer has its own MCI stab entry: 17906f25ae9SGregory Neil Shapiro ** 18006f25ae9SGregory Neil Shapiro ** s = stab(host, ST_MCI + m->m_mno, ST_ENTER); 18106f25ae9SGregory Neil Shapiro ** 18206f25ae9SGregory Neil Shapiro ** Therefore, anything ST_MCI or larger is an s_mci. 18306f25ae9SGregory Neil Shapiro */ 18406f25ae9SGregory Neil Shapiro 185c2aa98e2SPeter Wemm if (type >= ST_MCI) 186c2aa98e2SPeter Wemm len = sizeof s->s_mci; 187c2aa98e2SPeter Wemm else 188c2aa98e2SPeter Wemm { 189c2aa98e2SPeter Wemm syserr("stab: unknown symbol type %d", type); 190c2aa98e2SPeter Wemm len = sizeof s->s_value; 191c2aa98e2SPeter Wemm } 192c2aa98e2SPeter Wemm break; 193c2aa98e2SPeter Wemm } 194c2aa98e2SPeter Wemm len += sizeof *s - sizeof s->s_value; 19506f25ae9SGregory Neil Shapiro 19606f25ae9SGregory Neil Shapiro if (tTd(36, 15)) 19740266059SGregory Neil Shapiro sm_dprintf("size of stab entry: %d\n", len); 198c2aa98e2SPeter Wemm 199c2aa98e2SPeter Wemm /* make new entry */ 20040266059SGregory Neil Shapiro s = (STAB *) sm_pmalloc_x(len); 20106f25ae9SGregory Neil Shapiro memset((char *) s, '\0', len); 20240266059SGregory Neil Shapiro s->s_name = sm_pstrdup_x(name); 20340266059SGregory Neil Shapiro s->s_symtype = type; 204c2aa98e2SPeter Wemm 205c2aa98e2SPeter Wemm /* link it in */ 206c2aa98e2SPeter Wemm *ps = s; 207c2aa98e2SPeter Wemm 20806f25ae9SGregory Neil Shapiro /* set a default value for rulesets */ 20906f25ae9SGregory Neil Shapiro if (type == ST_RULESET) 21006f25ae9SGregory Neil Shapiro s->s_ruleset = -1; 21106f25ae9SGregory Neil Shapiro 21206f25ae9SGregory Neil Shapiro return s; 213c2aa98e2SPeter Wemm } 21440266059SGregory Neil Shapiro /* 215c2aa98e2SPeter Wemm ** STABAPPLY -- apply function to all stab entries 216c2aa98e2SPeter Wemm ** 217c2aa98e2SPeter Wemm ** Parameters: 21840266059SGregory Neil Shapiro ** func -- the function to apply. It will be given two 21940266059SGregory Neil Shapiro ** parameters (the stab entry and the arg). 220c2aa98e2SPeter Wemm ** arg -- an arbitrary argument, passed to func. 221c2aa98e2SPeter Wemm ** 222c2aa98e2SPeter Wemm ** Returns: 223c2aa98e2SPeter Wemm ** none. 224c2aa98e2SPeter Wemm */ 225c2aa98e2SPeter Wemm 226c2aa98e2SPeter Wemm void 227c2aa98e2SPeter Wemm stabapply(func, arg) 228c2aa98e2SPeter Wemm void (*func)__P((STAB *, int)); 229c2aa98e2SPeter Wemm int arg; 230c2aa98e2SPeter Wemm { 231c2aa98e2SPeter Wemm register STAB **shead; 232c2aa98e2SPeter Wemm register STAB *s; 233c2aa98e2SPeter Wemm 234c2aa98e2SPeter Wemm for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 235c2aa98e2SPeter Wemm { 236c2aa98e2SPeter Wemm for (s = *shead; s != NULL; s = s->s_next) 237c2aa98e2SPeter Wemm { 238c2aa98e2SPeter Wemm if (tTd(36, 90)) 23940266059SGregory Neil Shapiro sm_dprintf("stabapply: trying %d/%s\n", 24040266059SGregory Neil Shapiro s->s_symtype, s->s_name); 241c2aa98e2SPeter Wemm func(s, arg); 242c2aa98e2SPeter Wemm } 243c2aa98e2SPeter Wemm } 244c2aa98e2SPeter Wemm } 24540266059SGregory Neil Shapiro /* 24606f25ae9SGregory Neil Shapiro ** QUEUEUP_MACROS -- queueup the macros in a class 24706f25ae9SGregory Neil Shapiro ** 24806f25ae9SGregory Neil Shapiro ** Write the macros listed in the specified class into the 24906f25ae9SGregory Neil Shapiro ** file referenced by qfp. 25006f25ae9SGregory Neil Shapiro ** 25106f25ae9SGregory Neil Shapiro ** Parameters: 25206f25ae9SGregory Neil Shapiro ** class -- class ID. 25340266059SGregory Neil Shapiro ** qfp -- file pointer to the queue file. 25406f25ae9SGregory Neil Shapiro ** e -- the envelope. 25506f25ae9SGregory Neil Shapiro ** 25606f25ae9SGregory Neil Shapiro ** Returns: 25706f25ae9SGregory Neil Shapiro ** none. 25806f25ae9SGregory Neil Shapiro */ 25906f25ae9SGregory Neil Shapiro 26006f25ae9SGregory Neil Shapiro void 26106f25ae9SGregory Neil Shapiro queueup_macros(class, qfp, e) 26206f25ae9SGregory Neil Shapiro int class; 26340266059SGregory Neil Shapiro SM_FILE_T *qfp; 26406f25ae9SGregory Neil Shapiro ENVELOPE *e; 26506f25ae9SGregory Neil Shapiro { 26606f25ae9SGregory Neil Shapiro register STAB **shead; 26706f25ae9SGregory Neil Shapiro register STAB *s; 26806f25ae9SGregory Neil Shapiro 26906f25ae9SGregory Neil Shapiro if (e == NULL) 27006f25ae9SGregory Neil Shapiro return; 27106f25ae9SGregory Neil Shapiro 272193538b7SGregory Neil Shapiro class = bitidx(class); 27306f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 27406f25ae9SGregory Neil Shapiro { 27506f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 27606f25ae9SGregory Neil Shapiro { 27706f25ae9SGregory Neil Shapiro int m; 27806f25ae9SGregory Neil Shapiro char *p; 27906f25ae9SGregory Neil Shapiro 28040266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 28140266059SGregory Neil Shapiro bitnset(bitidx(class), s->s_class) && 28240266059SGregory Neil Shapiro (m = macid(s->s_name)) != '\0' && 28306f25ae9SGregory Neil Shapiro (p = macvalue(m, e)) != NULL) 28406f25ae9SGregory Neil Shapiro { 28540266059SGregory Neil Shapiro (void) sm_io_fprintf(qfp, SM_TIME_DEFAULT, 28640266059SGregory Neil Shapiro "$%s%s\n", 28706f25ae9SGregory Neil Shapiro s->s_name, 28840266059SGregory Neil Shapiro denlstring(p, true, 28940266059SGregory Neil Shapiro false)); 29006f25ae9SGregory Neil Shapiro } 29106f25ae9SGregory Neil Shapiro } 29206f25ae9SGregory Neil Shapiro } 29306f25ae9SGregory Neil Shapiro } 29440266059SGregory Neil Shapiro /* 29506f25ae9SGregory Neil Shapiro ** COPY_CLASS -- copy class members from one class to another 29606f25ae9SGregory Neil Shapiro ** 29706f25ae9SGregory Neil Shapiro ** Parameters: 29806f25ae9SGregory Neil Shapiro ** src -- source class. 29906f25ae9SGregory Neil Shapiro ** dst -- destination class. 30006f25ae9SGregory Neil Shapiro ** 30106f25ae9SGregory Neil Shapiro ** Returns: 30206f25ae9SGregory Neil Shapiro ** none. 30306f25ae9SGregory Neil Shapiro */ 30406f25ae9SGregory Neil Shapiro 30506f25ae9SGregory Neil Shapiro void 30606f25ae9SGregory Neil Shapiro copy_class(src, dst) 30706f25ae9SGregory Neil Shapiro int src; 30806f25ae9SGregory Neil Shapiro int dst; 30906f25ae9SGregory Neil Shapiro { 31006f25ae9SGregory Neil Shapiro register STAB **shead; 31106f25ae9SGregory Neil Shapiro register STAB *s; 31206f25ae9SGregory Neil Shapiro 313193538b7SGregory Neil Shapiro src = bitidx(src); 314193538b7SGregory Neil Shapiro dst = bitidx(dst); 31506f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 31606f25ae9SGregory Neil Shapiro { 31706f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 31806f25ae9SGregory Neil Shapiro { 31940266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 320193538b7SGregory Neil Shapiro bitnset(src, s->s_class)) 32106f25ae9SGregory Neil Shapiro setbitn(dst, s->s_class); 32206f25ae9SGregory Neil Shapiro } 32306f25ae9SGregory Neil Shapiro } 32406f25ae9SGregory Neil Shapiro } 32540266059SGregory Neil Shapiro 32640266059SGregory Neil Shapiro /* 32740266059SGregory Neil Shapiro ** RMEXPSTAB -- remove expired entries from SymTab. 32840266059SGregory Neil Shapiro ** 32940266059SGregory Neil Shapiro ** These entries need to be removed in long-running processes, 33040266059SGregory Neil Shapiro ** e.g., persistent queue runners, to avoid consuming memory. 33140266059SGregory Neil Shapiro ** 33240266059SGregory Neil Shapiro ** XXX It might be useful to restrict the maximum TTL to avoid 33340266059SGregory Neil Shapiro ** caching data very long. 33440266059SGregory Neil Shapiro ** 33540266059SGregory Neil Shapiro ** Parameters: 33640266059SGregory Neil Shapiro ** none. 33740266059SGregory Neil Shapiro ** 33840266059SGregory Neil Shapiro ** Returns: 33940266059SGregory Neil Shapiro ** none. 34040266059SGregory Neil Shapiro ** 34140266059SGregory Neil Shapiro ** Side Effects: 34240266059SGregory Neil Shapiro ** can remove entries from the symbol table. 34340266059SGregory Neil Shapiro */ 34440266059SGregory Neil Shapiro 34540266059SGregory Neil Shapiro #define SM_STAB_FREE(x) \ 34640266059SGregory Neil Shapiro do \ 34740266059SGregory Neil Shapiro { \ 34840266059SGregory Neil Shapiro char *o = (x); \ 34940266059SGregory Neil Shapiro (x) = NULL; \ 35040266059SGregory Neil Shapiro if (o != NULL) \ 35140266059SGregory Neil Shapiro sm_free(o); \ 35240266059SGregory Neil Shapiro } while (0) 35340266059SGregory Neil Shapiro 35440266059SGregory Neil Shapiro void 35540266059SGregory Neil Shapiro rmexpstab() 35640266059SGregory Neil Shapiro { 35740266059SGregory Neil Shapiro int i; 35840266059SGregory Neil Shapiro STAB *s, *p, *f; 35940266059SGregory Neil Shapiro time_t now; 36040266059SGregory Neil Shapiro 36140266059SGregory Neil Shapiro now = curtime(); 36240266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 36340266059SGregory Neil Shapiro { 36440266059SGregory Neil Shapiro p = NULL; 36540266059SGregory Neil Shapiro s = SymTab[i]; 36640266059SGregory Neil Shapiro while (s != NULL) 36740266059SGregory Neil Shapiro { 36840266059SGregory Neil Shapiro switch (s->s_symtype) 36940266059SGregory Neil Shapiro { 37040266059SGregory Neil Shapiro case ST_HOSTSIG: 37140266059SGregory Neil Shapiro if (s->s_hostsig.hs_exp >= now) 37240266059SGregory Neil Shapiro goto next; /* not expired */ 37340266059SGregory Neil Shapiro SM_STAB_FREE(s->s_hostsig.hs_sig); /* XXX */ 37440266059SGregory Neil Shapiro break; 37540266059SGregory Neil Shapiro 37640266059SGregory Neil Shapiro case ST_NAMECANON: 37740266059SGregory Neil Shapiro if (s->s_namecanon.nc_exp >= now) 37840266059SGregory Neil Shapiro goto next; /* not expired */ 37940266059SGregory Neil Shapiro SM_STAB_FREE(s->s_namecanon.nc_cname); /* XXX */ 38040266059SGregory Neil Shapiro break; 38140266059SGregory Neil Shapiro 38240266059SGregory Neil Shapiro default: 38340266059SGregory Neil Shapiro if (s->s_symtype >= ST_MCI) 38440266059SGregory Neil Shapiro { 38540266059SGregory Neil Shapiro /* call mci_uncache? */ 38640266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_status); 38740266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_rstatus); 38840266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_heloname); 38940266059SGregory Neil Shapiro #if 0 39040266059SGregory Neil Shapiro /* not dynamically allocated */ 39140266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_host); 39240266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_tolist); 39340266059SGregory Neil Shapiro #endif /* 0 */ 39440266059SGregory Neil Shapiro #if SASL 39540266059SGregory Neil Shapiro /* should always by NULL */ 39640266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_sasl_string); 39740266059SGregory Neil Shapiro #endif /* SASL */ 39840266059SGregory Neil Shapiro if (s->s_mci.mci_rpool != NULL) 39940266059SGregory Neil Shapiro { 40040266059SGregory Neil Shapiro sm_rpool_free(s->s_mci.mci_rpool); 40140266059SGregory Neil Shapiro s->s_mci.mci_macro.mac_rpool = NULL; 40240266059SGregory Neil Shapiro s->s_mci.mci_rpool = NULL; 40340266059SGregory Neil Shapiro } 40440266059SGregory Neil Shapiro break; 40540266059SGregory Neil Shapiro } 40640266059SGregory Neil Shapiro next: 40740266059SGregory Neil Shapiro p = s; 40840266059SGregory Neil Shapiro s = s->s_next; 40940266059SGregory Neil Shapiro continue; 41040266059SGregory Neil Shapiro } 41140266059SGregory Neil Shapiro 41240266059SGregory Neil Shapiro /* remove entry */ 41340266059SGregory Neil Shapiro SM_STAB_FREE(s->s_name); /* XXX */ 41440266059SGregory Neil Shapiro f = s; 41540266059SGregory Neil Shapiro s = s->s_next; 41640266059SGregory Neil Shapiro sm_free(f); /* XXX */ 41740266059SGregory Neil Shapiro if (p == NULL) 41840266059SGregory Neil Shapiro SymTab[i] = s; 41940266059SGregory Neil Shapiro else 42040266059SGregory Neil Shapiro p->s_next = s; 42140266059SGregory Neil Shapiro } 42240266059SGregory Neil Shapiro } 42340266059SGregory Neil Shapiro } 42440266059SGregory Neil Shapiro 42540266059SGregory Neil Shapiro #if SM_HEAP_CHECK 42640266059SGregory Neil Shapiro /* 42740266059SGregory Neil Shapiro ** DUMPSTAB -- dump symbol table. 42840266059SGregory Neil Shapiro ** 42940266059SGregory Neil Shapiro ** For debugging. 43040266059SGregory Neil Shapiro */ 43140266059SGregory Neil Shapiro 43240266059SGregory Neil Shapiro #define MAXSTTYPES (ST_MCI + 1) 43340266059SGregory Neil Shapiro 43440266059SGregory Neil Shapiro void 43540266059SGregory Neil Shapiro dumpstab() 43640266059SGregory Neil Shapiro { 43740266059SGregory Neil Shapiro int i, t, total, types[MAXSTTYPES]; 43840266059SGregory Neil Shapiro STAB *s; 43940266059SGregory Neil Shapiro static int prevt[MAXSTTYPES], prev = 0; 44040266059SGregory Neil Shapiro 44140266059SGregory Neil Shapiro total = 0; 44240266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 44340266059SGregory Neil Shapiro types[i] = 0; 44440266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 44540266059SGregory Neil Shapiro { 44640266059SGregory Neil Shapiro s = SymTab[i]; 44740266059SGregory Neil Shapiro while (s != NULL) 44840266059SGregory Neil Shapiro { 44940266059SGregory Neil Shapiro ++total; 45040266059SGregory Neil Shapiro t = s->s_symtype; 45140266059SGregory Neil Shapiro if (t > MAXSTTYPES - 1) 45240266059SGregory Neil Shapiro t = MAXSTTYPES - 1; 45340266059SGregory Neil Shapiro types[t]++; 45440266059SGregory Neil Shapiro s = s->s_next; 45540266059SGregory Neil Shapiro } 45640266059SGregory Neil Shapiro } 45740266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: total=%d (%d)", total, total - prev); 45840266059SGregory Neil Shapiro prev = total; 45940266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 46040266059SGregory Neil Shapiro { 46140266059SGregory Neil Shapiro if (types[i] != 0) 46240266059SGregory Neil Shapiro { 46340266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: type[%2d]=%2d (%d)", 46440266059SGregory Neil Shapiro i, types[i], types[i] - prevt[i]); 46540266059SGregory Neil Shapiro } 46640266059SGregory Neil Shapiro prevt[i] = types[i]; 46740266059SGregory Neil Shapiro } 46840266059SGregory Neil Shapiro } 46940266059SGregory Neil Shapiro #endif /* SM_HEAP_CHECK */ 470