1c2aa98e2SPeter Wemm /* 25dd76dd0SGregory Neil Shapiro * Copyright (c) 1998-2001, 2003 Proofpoint, 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 164313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: stab.c,v 8.92 2013-11-22 20:51:56 ca Exp $") 1740266059SGregory Neil Shapiro 18*5b0945b5SGregory Neil Shapiro #if DANE 19*5b0945b5SGregory Neil Shapiro # include <tls.h> 20*5b0945b5SGregory Neil Shapiro #endif 21*5b0945b5SGregory Neil Shapiro 22c2aa98e2SPeter Wemm /* 23c2aa98e2SPeter Wemm ** STAB -- manage the symbol table 24c2aa98e2SPeter Wemm ** 25c2aa98e2SPeter Wemm ** Parameters: 26c2aa98e2SPeter Wemm ** name -- the name to be looked up or inserted. 27c2aa98e2SPeter Wemm ** type -- the type of symbol. 28c2aa98e2SPeter Wemm ** op -- what to do: 2940266059SGregory Neil Shapiro ** ST_ENTER -- enter the name if not already present. 30c2aa98e2SPeter Wemm ** ST_FIND -- find it only. 31c2aa98e2SPeter Wemm ** 32c2aa98e2SPeter Wemm ** Returns: 33c2aa98e2SPeter Wemm ** pointer to a STAB entry for this name. 34c2aa98e2SPeter Wemm ** NULL if not found and not entered. 35c2aa98e2SPeter Wemm ** 36c2aa98e2SPeter Wemm ** Side Effects: 37c2aa98e2SPeter Wemm ** can update the symbol table. 38c2aa98e2SPeter Wemm */ 39c2aa98e2SPeter Wemm 40c2aa98e2SPeter Wemm #define STABSIZE 2003 4140266059SGregory Neil Shapiro #define SM_LOWER(c) ((isascii(c) && isupper(c)) ? tolower(c) : (c)) 42c2aa98e2SPeter Wemm 43c2aa98e2SPeter Wemm static STAB *SymTab[STABSIZE]; 44c2aa98e2SPeter Wemm 45c2aa98e2SPeter Wemm STAB * 46c2aa98e2SPeter Wemm stab(name, type, op) 47c2aa98e2SPeter Wemm char *name; 48c2aa98e2SPeter Wemm int type; 49c2aa98e2SPeter Wemm int op; 50c2aa98e2SPeter Wemm { 51c2aa98e2SPeter Wemm register STAB *s; 52c2aa98e2SPeter Wemm register STAB **ps; 53c2aa98e2SPeter Wemm register int hfunc; 54c2aa98e2SPeter Wemm register char *p; 55c2aa98e2SPeter Wemm int len; 56c2aa98e2SPeter Wemm 57c2aa98e2SPeter Wemm if (tTd(36, 5)) 5840266059SGregory Neil Shapiro sm_dprintf("STAB: %s %d ", name, type); 59c2aa98e2SPeter Wemm 60c2aa98e2SPeter Wemm /* 61c2aa98e2SPeter Wemm ** Compute the hashing function 62c2aa98e2SPeter Wemm */ 63c2aa98e2SPeter Wemm 64c2aa98e2SPeter Wemm hfunc = type; 65c2aa98e2SPeter Wemm for (p = name; *p != '\0'; p++) 6640266059SGregory Neil Shapiro hfunc = ((hfunc << 1) ^ (SM_LOWER(*p) & 0377)) % STABSIZE; 67c2aa98e2SPeter Wemm 68c2aa98e2SPeter Wemm if (tTd(36, 9)) 6940266059SGregory Neil Shapiro sm_dprintf("(hfunc=%d) ", hfunc); 70c2aa98e2SPeter Wemm 71c2aa98e2SPeter Wemm ps = &SymTab[hfunc]; 72ba00ec3dSGregory Neil Shapiro if (type == ST_MACRO || type == ST_RULESET || type == ST_NAMECANON) 73c2aa98e2SPeter Wemm { 74c2aa98e2SPeter Wemm while ((s = *ps) != NULL && 7540266059SGregory Neil Shapiro (s->s_symtype != type || strcmp(name, s->s_name))) 76c2aa98e2SPeter Wemm ps = &s->s_next; 77c2aa98e2SPeter Wemm } 78c2aa98e2SPeter Wemm else 79c2aa98e2SPeter Wemm { 80c2aa98e2SPeter Wemm while ((s = *ps) != NULL && 8140266059SGregory Neil Shapiro (s->s_symtype != type || sm_strcasecmp(name, s->s_name))) 82c2aa98e2SPeter Wemm ps = &s->s_next; 83c2aa98e2SPeter Wemm } 84c2aa98e2SPeter Wemm 85c2aa98e2SPeter Wemm /* 86c2aa98e2SPeter Wemm ** Dispose of the entry. 87c2aa98e2SPeter Wemm */ 88c2aa98e2SPeter Wemm 89c2aa98e2SPeter Wemm if (s != NULL || op == ST_FIND) 90c2aa98e2SPeter Wemm { 91c2aa98e2SPeter Wemm if (tTd(36, 5)) 92c2aa98e2SPeter Wemm { 93c2aa98e2SPeter Wemm if (s == NULL) 9440266059SGregory Neil Shapiro sm_dprintf("not found\n"); 95c2aa98e2SPeter Wemm else 96c2aa98e2SPeter Wemm { 97c2aa98e2SPeter Wemm long *lp = (long *) s->s_class; 98c2aa98e2SPeter Wemm 9940266059SGregory Neil Shapiro sm_dprintf("type %d val %lx %lx %lx %lx\n", 10040266059SGregory Neil Shapiro s->s_symtype, lp[0], lp[1], lp[2], lp[3]); 101c2aa98e2SPeter Wemm } 102c2aa98e2SPeter Wemm } 10306f25ae9SGregory Neil Shapiro return s; 104c2aa98e2SPeter Wemm } 105c2aa98e2SPeter Wemm 106c2aa98e2SPeter Wemm /* 107c2aa98e2SPeter Wemm ** Make a new entry and link it in. 108c2aa98e2SPeter Wemm */ 109c2aa98e2SPeter Wemm 110c2aa98e2SPeter Wemm if (tTd(36, 5)) 11140266059SGregory Neil Shapiro sm_dprintf("entered\n"); 112c2aa98e2SPeter Wemm 113c2aa98e2SPeter Wemm /* determine size of new entry */ 114c2aa98e2SPeter Wemm switch (type) 115c2aa98e2SPeter Wemm { 116c2aa98e2SPeter Wemm case ST_CLASS: 117d0cef73dSGregory Neil Shapiro len = sizeof(s->s_class); 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; 164*5b0945b5SGregory Neil Shapiro #endif 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; 170*5b0945b5SGregory Neil Shapiro #endif 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; 180*5b0945b5SGregory Neil Shapiro #endif 181*5b0945b5SGregory Neil Shapiro 182*5b0945b5SGregory Neil Shapiro #if DANE 183*5b0945b5SGregory Neil Shapiro case ST_TLSA_RR: 184*5b0945b5SGregory Neil Shapiro len = sizeof(s->s_tlsa); 185*5b0945b5SGregory Neil Shapiro break; 186*5b0945b5SGregory Neil Shapiro #endif 187e92d3f3fSGregory Neil Shapiro 188c2aa98e2SPeter Wemm default: 18906f25ae9SGregory Neil Shapiro /* 19040266059SGregory Neil Shapiro ** Each mailer has its own MCI stab entry: 19106f25ae9SGregory Neil Shapiro ** 19206f25ae9SGregory Neil Shapiro ** s = stab(host, ST_MCI + m->m_mno, ST_ENTER); 19306f25ae9SGregory Neil Shapiro ** 19406f25ae9SGregory Neil Shapiro ** Therefore, anything ST_MCI or larger is an s_mci. 19506f25ae9SGregory Neil Shapiro */ 19606f25ae9SGregory Neil Shapiro 197c2aa98e2SPeter Wemm if (type >= ST_MCI) 198d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mci); 199c2aa98e2SPeter Wemm else 200c2aa98e2SPeter Wemm { 201c2aa98e2SPeter Wemm syserr("stab: unknown symbol type %d", type); 202d0cef73dSGregory Neil Shapiro len = sizeof(s->s_value); 203c2aa98e2SPeter Wemm } 204c2aa98e2SPeter Wemm break; 205c2aa98e2SPeter Wemm } 206d0cef73dSGregory Neil Shapiro len += sizeof(*s) - sizeof(s->s_value); 20706f25ae9SGregory Neil Shapiro 20806f25ae9SGregory Neil Shapiro if (tTd(36, 15)) 20940266059SGregory Neil Shapiro sm_dprintf("size of stab entry: %d\n", len); 210c2aa98e2SPeter Wemm 211c2aa98e2SPeter Wemm /* make new entry */ 21240266059SGregory Neil Shapiro s = (STAB *) sm_pmalloc_x(len); 21306f25ae9SGregory Neil Shapiro memset((char *) s, '\0', len); 21440266059SGregory Neil Shapiro s->s_name = sm_pstrdup_x(name); 21540266059SGregory Neil Shapiro s->s_symtype = type; 216c2aa98e2SPeter Wemm 217c2aa98e2SPeter Wemm /* link it in */ 218c2aa98e2SPeter Wemm *ps = s; 219c2aa98e2SPeter Wemm 22006f25ae9SGregory Neil Shapiro /* set a default value for rulesets */ 22106f25ae9SGregory Neil Shapiro if (type == ST_RULESET) 22206f25ae9SGregory Neil Shapiro s->s_ruleset = -1; 22306f25ae9SGregory Neil Shapiro 22406f25ae9SGregory Neil Shapiro return s; 225c2aa98e2SPeter Wemm } 22640266059SGregory Neil Shapiro /* 227c2aa98e2SPeter Wemm ** STABAPPLY -- apply function to all stab entries 228c2aa98e2SPeter Wemm ** 229c2aa98e2SPeter Wemm ** Parameters: 23040266059SGregory Neil Shapiro ** func -- the function to apply. It will be given two 23140266059SGregory Neil Shapiro ** parameters (the stab entry and the arg). 232c2aa98e2SPeter Wemm ** arg -- an arbitrary argument, passed to func. 233c2aa98e2SPeter Wemm ** 234c2aa98e2SPeter Wemm ** Returns: 235c2aa98e2SPeter Wemm ** none. 236c2aa98e2SPeter Wemm */ 237c2aa98e2SPeter Wemm 238c2aa98e2SPeter Wemm void 239c2aa98e2SPeter Wemm stabapply(func, arg) 240c2aa98e2SPeter Wemm void (*func)__P((STAB *, int)); 241c2aa98e2SPeter Wemm int arg; 242c2aa98e2SPeter Wemm { 243c2aa98e2SPeter Wemm register STAB **shead; 244c2aa98e2SPeter Wemm register STAB *s; 245c2aa98e2SPeter Wemm 246c2aa98e2SPeter Wemm for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 247c2aa98e2SPeter Wemm { 248c2aa98e2SPeter Wemm for (s = *shead; s != NULL; s = s->s_next) 249c2aa98e2SPeter Wemm { 250c2aa98e2SPeter Wemm if (tTd(36, 90)) 25140266059SGregory Neil Shapiro sm_dprintf("stabapply: trying %d/%s\n", 25240266059SGregory Neil Shapiro s->s_symtype, s->s_name); 253c2aa98e2SPeter Wemm func(s, arg); 254c2aa98e2SPeter Wemm } 255c2aa98e2SPeter Wemm } 256c2aa98e2SPeter Wemm } 25740266059SGregory Neil Shapiro /* 25806f25ae9SGregory Neil Shapiro ** QUEUEUP_MACROS -- queueup the macros in a class 25906f25ae9SGregory Neil Shapiro ** 26006f25ae9SGregory Neil Shapiro ** Write the macros listed in the specified class into the 26106f25ae9SGregory Neil Shapiro ** file referenced by qfp. 26206f25ae9SGregory Neil Shapiro ** 26306f25ae9SGregory Neil Shapiro ** Parameters: 26406f25ae9SGregory Neil Shapiro ** class -- class ID. 26540266059SGregory Neil Shapiro ** qfp -- file pointer to the queue file. 26606f25ae9SGregory Neil Shapiro ** e -- the envelope. 26706f25ae9SGregory Neil Shapiro ** 26806f25ae9SGregory Neil Shapiro ** Returns: 26906f25ae9SGregory Neil Shapiro ** none. 27006f25ae9SGregory Neil Shapiro */ 27106f25ae9SGregory Neil Shapiro 27206f25ae9SGregory Neil Shapiro void 27306f25ae9SGregory Neil Shapiro queueup_macros(class, qfp, e) 27406f25ae9SGregory Neil Shapiro int class; 27540266059SGregory Neil Shapiro SM_FILE_T *qfp; 27606f25ae9SGregory Neil Shapiro ENVELOPE *e; 27706f25ae9SGregory Neil Shapiro { 27806f25ae9SGregory Neil Shapiro register STAB **shead; 27906f25ae9SGregory Neil Shapiro register STAB *s; 28006f25ae9SGregory Neil Shapiro 28106f25ae9SGregory Neil Shapiro if (e == NULL) 28206f25ae9SGregory Neil Shapiro return; 28306f25ae9SGregory Neil Shapiro 284193538b7SGregory Neil Shapiro class = bitidx(class); 28506f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 28606f25ae9SGregory Neil Shapiro { 28706f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 28806f25ae9SGregory Neil Shapiro { 28906f25ae9SGregory Neil Shapiro int m; 29006f25ae9SGregory Neil Shapiro char *p; 29106f25ae9SGregory Neil Shapiro 29240266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 29340266059SGregory Neil Shapiro bitnset(bitidx(class), s->s_class) && 294a7ec597cSGregory Neil Shapiro (m = macid(s->s_name)) != 0 && 29506f25ae9SGregory Neil Shapiro (p = macvalue(m, e)) != NULL) 29606f25ae9SGregory Neil Shapiro { 29740266059SGregory Neil Shapiro (void) sm_io_fprintf(qfp, SM_TIME_DEFAULT, 29840266059SGregory Neil Shapiro "$%s%s\n", 29906f25ae9SGregory Neil Shapiro s->s_name, 30040266059SGregory Neil Shapiro denlstring(p, true, 30140266059SGregory Neil Shapiro false)); 30206f25ae9SGregory Neil Shapiro } 30306f25ae9SGregory Neil Shapiro } 30406f25ae9SGregory Neil Shapiro } 30506f25ae9SGregory Neil Shapiro } 30640266059SGregory Neil Shapiro /* 30706f25ae9SGregory Neil Shapiro ** COPY_CLASS -- copy class members from one class to another 30806f25ae9SGregory Neil Shapiro ** 30906f25ae9SGregory Neil Shapiro ** Parameters: 31006f25ae9SGregory Neil Shapiro ** src -- source class. 31106f25ae9SGregory Neil Shapiro ** dst -- destination class. 31206f25ae9SGregory Neil Shapiro ** 31306f25ae9SGregory Neil Shapiro ** Returns: 31406f25ae9SGregory Neil Shapiro ** none. 31506f25ae9SGregory Neil Shapiro */ 31606f25ae9SGregory Neil Shapiro 31706f25ae9SGregory Neil Shapiro void 31806f25ae9SGregory Neil Shapiro copy_class(src, dst) 31906f25ae9SGregory Neil Shapiro int src; 32006f25ae9SGregory Neil Shapiro int dst; 32106f25ae9SGregory Neil Shapiro { 32206f25ae9SGregory Neil Shapiro register STAB **shead; 32306f25ae9SGregory Neil Shapiro register STAB *s; 32406f25ae9SGregory Neil Shapiro 325193538b7SGregory Neil Shapiro src = bitidx(src); 326193538b7SGregory Neil Shapiro dst = bitidx(dst); 32706f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 32806f25ae9SGregory Neil Shapiro { 32906f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 33006f25ae9SGregory Neil Shapiro { 33140266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 332193538b7SGregory Neil Shapiro bitnset(src, s->s_class)) 33306f25ae9SGregory Neil Shapiro setbitn(dst, s->s_class); 33406f25ae9SGregory Neil Shapiro } 33506f25ae9SGregory Neil Shapiro } 33606f25ae9SGregory Neil Shapiro } 33740266059SGregory Neil Shapiro 33840266059SGregory Neil Shapiro /* 33940266059SGregory Neil Shapiro ** RMEXPSTAB -- remove expired entries from SymTab. 34040266059SGregory Neil Shapiro ** 34140266059SGregory Neil Shapiro ** These entries need to be removed in long-running processes, 34240266059SGregory Neil Shapiro ** e.g., persistent queue runners, to avoid consuming memory. 34340266059SGregory Neil Shapiro ** 34440266059SGregory Neil Shapiro ** XXX It might be useful to restrict the maximum TTL to avoid 34540266059SGregory Neil Shapiro ** caching data very long. 34640266059SGregory Neil Shapiro ** 34740266059SGregory Neil Shapiro ** Parameters: 34840266059SGregory Neil Shapiro ** none. 34940266059SGregory Neil Shapiro ** 35040266059SGregory Neil Shapiro ** Returns: 35140266059SGregory Neil Shapiro ** none. 35240266059SGregory Neil Shapiro ** 35340266059SGregory Neil Shapiro ** Side Effects: 35440266059SGregory Neil Shapiro ** can remove entries from the symbol table. 35540266059SGregory Neil Shapiro */ 35640266059SGregory Neil Shapiro 35740266059SGregory Neil Shapiro #define SM_STAB_FREE(x) \ 35840266059SGregory Neil Shapiro do \ 35940266059SGregory Neil Shapiro { \ 36040266059SGregory Neil Shapiro char *o = (x); \ 36140266059SGregory Neil Shapiro (x) = NULL; \ 36240266059SGregory Neil Shapiro if (o != NULL) \ 36340266059SGregory Neil Shapiro sm_free(o); \ 36440266059SGregory Neil Shapiro } while (0) 36540266059SGregory Neil Shapiro 36640266059SGregory Neil Shapiro void 36740266059SGregory Neil Shapiro rmexpstab() 36840266059SGregory Neil Shapiro { 36940266059SGregory Neil Shapiro int i; 37040266059SGregory Neil Shapiro STAB *s, *p, *f; 37140266059SGregory Neil Shapiro time_t now; 37240266059SGregory Neil Shapiro 37340266059SGregory Neil Shapiro now = curtime(); 37440266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 37540266059SGregory Neil Shapiro { 37640266059SGregory Neil Shapiro p = NULL; 37740266059SGregory Neil Shapiro s = SymTab[i]; 37840266059SGregory Neil Shapiro while (s != NULL) 37940266059SGregory Neil Shapiro { 38040266059SGregory Neil Shapiro switch (s->s_symtype) 38140266059SGregory Neil Shapiro { 38240266059SGregory Neil Shapiro case ST_HOSTSIG: 38340266059SGregory Neil Shapiro if (s->s_hostsig.hs_exp >= now) 38440266059SGregory Neil Shapiro goto next; /* not expired */ 38540266059SGregory Neil Shapiro SM_STAB_FREE(s->s_hostsig.hs_sig); /* XXX */ 38640266059SGregory Neil Shapiro break; 38740266059SGregory Neil Shapiro 38840266059SGregory Neil Shapiro case ST_NAMECANON: 38940266059SGregory Neil Shapiro if (s->s_namecanon.nc_exp >= now) 39040266059SGregory Neil Shapiro goto next; /* not expired */ 39140266059SGregory Neil Shapiro SM_STAB_FREE(s->s_namecanon.nc_cname); /* XXX */ 39240266059SGregory Neil Shapiro break; 39340266059SGregory Neil Shapiro 394*5b0945b5SGregory Neil Shapiro #if DANE 395*5b0945b5SGregory Neil Shapiro case ST_TLSA_RR: 396*5b0945b5SGregory Neil Shapiro if (s->s_tlsa->dane_tlsa_exp >= now) 397*5b0945b5SGregory Neil Shapiro goto next; /* not expired */ 398*5b0945b5SGregory Neil Shapiro (void) dane_tlsa_free(s->s_tlsa); 399*5b0945b5SGregory Neil Shapiro s->s_tlsa = NULL; 400*5b0945b5SGregory Neil Shapiro break; 401*5b0945b5SGregory Neil Shapiro #endif /* DANE */ 402*5b0945b5SGregory Neil Shapiro 40340266059SGregory Neil Shapiro default: 40440266059SGregory Neil Shapiro if (s->s_symtype >= ST_MCI) 40540266059SGregory Neil Shapiro { 40640266059SGregory Neil Shapiro /* call mci_uncache? */ 40740266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_status); 40840266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_rstatus); 40940266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_heloname); 41040266059SGregory Neil Shapiro #if 0 41140266059SGregory Neil Shapiro /* not dynamically allocated */ 41240266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_host); 41340266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_tolist); 41440266059SGregory Neil Shapiro #endif /* 0 */ 41540266059SGregory Neil Shapiro #if SASL 41640266059SGregory Neil Shapiro /* should always by NULL */ 41740266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_sasl_string); 418*5b0945b5SGregory Neil Shapiro #endif 41940266059SGregory Neil Shapiro if (s->s_mci.mci_rpool != NULL) 42040266059SGregory Neil Shapiro { 42140266059SGregory Neil Shapiro sm_rpool_free(s->s_mci.mci_rpool); 42240266059SGregory Neil Shapiro s->s_mci.mci_macro.mac_rpool = NULL; 42340266059SGregory Neil Shapiro s->s_mci.mci_rpool = NULL; 42440266059SGregory Neil Shapiro } 42540266059SGregory Neil Shapiro break; 42640266059SGregory Neil Shapiro } 42740266059SGregory Neil Shapiro next: 42840266059SGregory Neil Shapiro p = s; 42940266059SGregory Neil Shapiro s = s->s_next; 43040266059SGregory Neil Shapiro continue; 43140266059SGregory Neil Shapiro } 43240266059SGregory Neil Shapiro 43340266059SGregory Neil Shapiro /* remove entry */ 43440266059SGregory Neil Shapiro SM_STAB_FREE(s->s_name); /* XXX */ 43540266059SGregory Neil Shapiro f = s; 43640266059SGregory Neil Shapiro s = s->s_next; 43740266059SGregory Neil Shapiro sm_free(f); /* XXX */ 43840266059SGregory Neil Shapiro if (p == NULL) 43940266059SGregory Neil Shapiro SymTab[i] = s; 44040266059SGregory Neil Shapiro else 44140266059SGregory Neil Shapiro p->s_next = s; 44240266059SGregory Neil Shapiro } 44340266059SGregory Neil Shapiro } 44440266059SGregory Neil Shapiro } 44540266059SGregory Neil Shapiro 44640266059SGregory Neil Shapiro #if SM_HEAP_CHECK 44740266059SGregory Neil Shapiro /* 44840266059SGregory Neil Shapiro ** DUMPSTAB -- dump symbol table. 44940266059SGregory Neil Shapiro ** 45040266059SGregory Neil Shapiro ** For debugging. 45140266059SGregory Neil Shapiro */ 45240266059SGregory Neil Shapiro 45340266059SGregory Neil Shapiro #define MAXSTTYPES (ST_MCI + 1) 45440266059SGregory Neil Shapiro 45540266059SGregory Neil Shapiro void 45640266059SGregory Neil Shapiro dumpstab() 45740266059SGregory Neil Shapiro { 45840266059SGregory Neil Shapiro int i, t, total, types[MAXSTTYPES]; 45940266059SGregory Neil Shapiro STAB *s; 46040266059SGregory Neil Shapiro static int prevt[MAXSTTYPES], prev = 0; 46140266059SGregory Neil Shapiro 46240266059SGregory Neil Shapiro total = 0; 46340266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 46440266059SGregory Neil Shapiro types[i] = 0; 46540266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 46640266059SGregory Neil Shapiro { 46740266059SGregory Neil Shapiro s = SymTab[i]; 46840266059SGregory Neil Shapiro while (s != NULL) 46940266059SGregory Neil Shapiro { 47040266059SGregory Neil Shapiro ++total; 47140266059SGregory Neil Shapiro t = s->s_symtype; 47240266059SGregory Neil Shapiro if (t > MAXSTTYPES - 1) 47340266059SGregory Neil Shapiro t = MAXSTTYPES - 1; 47440266059SGregory Neil Shapiro types[t]++; 47540266059SGregory Neil Shapiro s = s->s_next; 47640266059SGregory Neil Shapiro } 47740266059SGregory Neil Shapiro } 47840266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: total=%d (%d)", total, total - prev); 47940266059SGregory Neil Shapiro prev = total; 48040266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 48140266059SGregory Neil Shapiro { 48240266059SGregory Neil Shapiro if (types[i] != 0) 48340266059SGregory Neil Shapiro { 48440266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: type[%2d]=%2d (%d)", 48540266059SGregory Neil Shapiro i, types[i], types[i] - prevt[i]); 48640266059SGregory Neil Shapiro } 48740266059SGregory Neil Shapiro prevt[i] = types[i]; 48840266059SGregory Neil Shapiro } 48940266059SGregory Neil Shapiro } 49040266059SGregory Neil Shapiro #endif /* SM_HEAP_CHECK */ 491