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*2fb4f839SGregory Neil Shapiro #include <sm/sendmail.h> 19*2fb4f839SGregory Neil Shapiro #if USE_EAI 20*2fb4f839SGregory Neil Shapiro # include <sm/ixlen.h> 21*2fb4f839SGregory Neil Shapiro #endif 225b0945b5SGregory Neil Shapiro #if DANE 235b0945b5SGregory Neil Shapiro # include <tls.h> 245b0945b5SGregory Neil Shapiro #endif 255b0945b5SGregory Neil Shapiro 26c2aa98e2SPeter Wemm /* 27c2aa98e2SPeter Wemm ** STAB -- manage the symbol table 28c2aa98e2SPeter Wemm ** 29c2aa98e2SPeter Wemm ** Parameters: 30c2aa98e2SPeter Wemm ** name -- the name to be looked up or inserted. 31c2aa98e2SPeter Wemm ** type -- the type of symbol. 32c2aa98e2SPeter Wemm ** op -- what to do: 3340266059SGregory Neil Shapiro ** ST_ENTER -- enter the name if not already present. 34c2aa98e2SPeter Wemm ** ST_FIND -- find it only. 35c2aa98e2SPeter Wemm ** 36c2aa98e2SPeter Wemm ** Returns: 37c2aa98e2SPeter Wemm ** pointer to a STAB entry for this name. 38c2aa98e2SPeter Wemm ** NULL if not found and not entered. 39c2aa98e2SPeter Wemm ** 40c2aa98e2SPeter Wemm ** Side Effects: 41c2aa98e2SPeter Wemm ** can update the symbol table. 42c2aa98e2SPeter Wemm */ 43c2aa98e2SPeter Wemm 44c2aa98e2SPeter Wemm #define STABSIZE 2003 4540266059SGregory Neil Shapiro #define SM_LOWER(c) ((isascii(c) && isupper(c)) ? tolower(c) : (c)) 46c2aa98e2SPeter Wemm 47c2aa98e2SPeter Wemm static STAB *SymTab[STABSIZE]; 48c2aa98e2SPeter Wemm 49c2aa98e2SPeter Wemm STAB * 50c2aa98e2SPeter Wemm stab(name, type, op) 51c2aa98e2SPeter Wemm char *name; 52c2aa98e2SPeter Wemm int type; 53c2aa98e2SPeter Wemm int op; 54c2aa98e2SPeter Wemm { 55c2aa98e2SPeter Wemm register STAB *s; 56c2aa98e2SPeter Wemm register STAB **ps; 57c2aa98e2SPeter Wemm register int hfunc; 58c2aa98e2SPeter Wemm register char *p; 59c2aa98e2SPeter Wemm int len; 60c2aa98e2SPeter Wemm 61c2aa98e2SPeter Wemm if (tTd(36, 5)) 6240266059SGregory Neil Shapiro sm_dprintf("STAB: %s %d ", name, type); 63c2aa98e2SPeter Wemm 64c2aa98e2SPeter Wemm /* 65c2aa98e2SPeter Wemm ** Compute the hashing function 66c2aa98e2SPeter Wemm */ 67c2aa98e2SPeter Wemm 68c2aa98e2SPeter Wemm hfunc = type; 69*2fb4f839SGregory Neil Shapiro #if USE_EAI 70*2fb4f839SGregory Neil Shapiro if (!addr_is_ascii(name)) 71*2fb4f839SGregory Neil Shapiro { 72*2fb4f839SGregory Neil Shapiro char *lower, *cstr; 73*2fb4f839SGregory Neil Shapiro 74*2fb4f839SGregory Neil Shapiro lower = sm_lowercase(name); 75*2fb4f839SGregory Neil Shapiro for (cstr = lower; *cstr != '\0'; cstr++) 76*2fb4f839SGregory Neil Shapiro hfunc = ((hfunc << 1) ^ ((*cstr) & 0377)) % STABSIZE; 77*2fb4f839SGregory Neil Shapiro } 78*2fb4f839SGregory Neil Shapiro else 79*2fb4f839SGregory Neil Shapiro #endif 80*2fb4f839SGregory Neil Shapiro /* "else" in #if code above */ 81*2fb4f839SGregory Neil Shapiro { 82c2aa98e2SPeter Wemm for (p = name; *p != '\0'; p++) 83*2fb4f839SGregory Neil Shapiro hfunc = ((hfunc << 1) ^ (SM_LOWER(*p) & 0377)) % 84*2fb4f839SGregory Neil Shapiro STABSIZE; 85*2fb4f839SGregory Neil Shapiro } 86c2aa98e2SPeter Wemm 87c2aa98e2SPeter Wemm if (tTd(36, 9)) 8840266059SGregory Neil Shapiro sm_dprintf("(hfunc=%d) ", hfunc); 89c2aa98e2SPeter Wemm 90c2aa98e2SPeter Wemm ps = &SymTab[hfunc]; 91ba00ec3dSGregory Neil Shapiro if (type == ST_MACRO || type == ST_RULESET || type == ST_NAMECANON) 92c2aa98e2SPeter Wemm { 93c2aa98e2SPeter Wemm while ((s = *ps) != NULL && 9440266059SGregory Neil Shapiro (s->s_symtype != type || strcmp(name, s->s_name))) 95c2aa98e2SPeter Wemm ps = &s->s_next; 96c2aa98e2SPeter Wemm } 97c2aa98e2SPeter Wemm else 98c2aa98e2SPeter Wemm { 99c2aa98e2SPeter Wemm while ((s = *ps) != NULL && 100*2fb4f839SGregory Neil Shapiro (s->s_symtype != type || !SM_STRCASEEQ(name, s->s_name))) 101c2aa98e2SPeter Wemm ps = &s->s_next; 102c2aa98e2SPeter Wemm } 103c2aa98e2SPeter Wemm 104c2aa98e2SPeter Wemm /* 105c2aa98e2SPeter Wemm ** Dispose of the entry. 106c2aa98e2SPeter Wemm */ 107c2aa98e2SPeter Wemm 108c2aa98e2SPeter Wemm if (s != NULL || op == ST_FIND) 109c2aa98e2SPeter Wemm { 110c2aa98e2SPeter Wemm if (tTd(36, 5)) 111c2aa98e2SPeter Wemm { 112c2aa98e2SPeter Wemm if (s == NULL) 11340266059SGregory Neil Shapiro sm_dprintf("not found\n"); 114c2aa98e2SPeter Wemm else 115c2aa98e2SPeter Wemm { 116c2aa98e2SPeter Wemm long *lp = (long *) s->s_class; 117c2aa98e2SPeter Wemm 11840266059SGregory Neil Shapiro sm_dprintf("type %d val %lx %lx %lx %lx\n", 11940266059SGregory Neil Shapiro s->s_symtype, lp[0], lp[1], lp[2], lp[3]); 120c2aa98e2SPeter Wemm } 121c2aa98e2SPeter Wemm } 12206f25ae9SGregory Neil Shapiro return s; 123c2aa98e2SPeter Wemm } 124c2aa98e2SPeter Wemm 125c2aa98e2SPeter Wemm /* 126c2aa98e2SPeter Wemm ** Make a new entry and link it in. 127c2aa98e2SPeter Wemm */ 128c2aa98e2SPeter Wemm 129c2aa98e2SPeter Wemm if (tTd(36, 5)) 13040266059SGregory Neil Shapiro sm_dprintf("entered\n"); 131c2aa98e2SPeter Wemm 132c2aa98e2SPeter Wemm /* determine size of new entry */ 133c2aa98e2SPeter Wemm switch (type) 134c2aa98e2SPeter Wemm { 135c2aa98e2SPeter Wemm case ST_CLASS: 136d0cef73dSGregory Neil Shapiro len = sizeof(s->s_class); 137c2aa98e2SPeter Wemm break; 138c2aa98e2SPeter Wemm 139c2aa98e2SPeter Wemm case ST_MAILER: 140d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mailer); 14106f25ae9SGregory Neil Shapiro break; 142c2aa98e2SPeter Wemm 143c2aa98e2SPeter Wemm case ST_ALIAS: 144d0cef73dSGregory Neil Shapiro len = sizeof(s->s_alias); 145c2aa98e2SPeter Wemm break; 146c2aa98e2SPeter Wemm 147c2aa98e2SPeter Wemm case ST_MAPCLASS: 148d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mapclass); 149c2aa98e2SPeter Wemm break; 150c2aa98e2SPeter Wemm 151c2aa98e2SPeter Wemm case ST_MAP: 152d0cef73dSGregory Neil Shapiro len = sizeof(s->s_map); 153c2aa98e2SPeter Wemm break; 154c2aa98e2SPeter Wemm 155c2aa98e2SPeter Wemm case ST_HOSTSIG: 156d0cef73dSGregory Neil Shapiro len = sizeof(s->s_hostsig); 157c2aa98e2SPeter Wemm break; 158c2aa98e2SPeter Wemm 159c2aa98e2SPeter Wemm case ST_NAMECANON: 160d0cef73dSGregory Neil Shapiro len = sizeof(s->s_namecanon); 161c2aa98e2SPeter Wemm break; 162c2aa98e2SPeter Wemm 163c2aa98e2SPeter Wemm case ST_MACRO: 164d0cef73dSGregory Neil Shapiro len = sizeof(s->s_macro); 165c2aa98e2SPeter Wemm break; 166c2aa98e2SPeter Wemm 167c2aa98e2SPeter Wemm case ST_RULESET: 168d0cef73dSGregory Neil Shapiro len = sizeof(s->s_ruleset); 169c2aa98e2SPeter Wemm break; 170c2aa98e2SPeter Wemm 171c2aa98e2SPeter Wemm case ST_HEADER: 172d0cef73dSGregory Neil Shapiro len = sizeof(s->s_header); 173c2aa98e2SPeter Wemm break; 174c2aa98e2SPeter Wemm 17506f25ae9SGregory Neil Shapiro case ST_SERVICE: 176d0cef73dSGregory Neil Shapiro len = sizeof(s->s_service); 17706f25ae9SGregory Neil Shapiro break; 17806f25ae9SGregory Neil Shapiro 17940266059SGregory Neil Shapiro #if LDAPMAP 1808774250cSGregory Neil Shapiro case ST_LMAP: 181d0cef73dSGregory Neil Shapiro len = sizeof(s->s_lmap); 18206f25ae9SGregory Neil Shapiro break; 1835b0945b5SGregory Neil Shapiro #endif 18406f25ae9SGregory Neil Shapiro 18540266059SGregory Neil Shapiro #if MILTER 18606f25ae9SGregory Neil Shapiro case ST_MILTER: 187d0cef73dSGregory Neil Shapiro len = sizeof(s->s_milter); 18806f25ae9SGregory Neil Shapiro break; 1895b0945b5SGregory Neil Shapiro #endif 19040266059SGregory Neil Shapiro 19140266059SGregory Neil Shapiro case ST_QUEUE: 192d0cef73dSGregory Neil Shapiro len = sizeof(s->s_quegrp); 19340266059SGregory Neil Shapiro break; 19406f25ae9SGregory Neil Shapiro 195e92d3f3fSGregory Neil Shapiro #if SOCKETMAP 196e92d3f3fSGregory Neil Shapiro case ST_SOCKETMAP: 197d0cef73dSGregory Neil Shapiro len = sizeof(s->s_socketmap); 198e92d3f3fSGregory Neil Shapiro break; 1995b0945b5SGregory Neil Shapiro #endif 2005b0945b5SGregory Neil Shapiro 2015b0945b5SGregory Neil Shapiro #if DANE 2025b0945b5SGregory Neil Shapiro case ST_TLSA_RR: 2035b0945b5SGregory Neil Shapiro len = sizeof(s->s_tlsa); 2045b0945b5SGregory Neil Shapiro break; 2055b0945b5SGregory Neil Shapiro #endif 206e92d3f3fSGregory Neil Shapiro 207c2aa98e2SPeter Wemm default: 20806f25ae9SGregory Neil Shapiro /* 20940266059SGregory Neil Shapiro ** Each mailer has its own MCI stab entry: 21006f25ae9SGregory Neil Shapiro ** 21106f25ae9SGregory Neil Shapiro ** s = stab(host, ST_MCI + m->m_mno, ST_ENTER); 21206f25ae9SGregory Neil Shapiro ** 21306f25ae9SGregory Neil Shapiro ** Therefore, anything ST_MCI or larger is an s_mci. 21406f25ae9SGregory Neil Shapiro */ 21506f25ae9SGregory Neil Shapiro 216c2aa98e2SPeter Wemm if (type >= ST_MCI) 217d0cef73dSGregory Neil Shapiro len = sizeof(s->s_mci); 218c2aa98e2SPeter Wemm else 219c2aa98e2SPeter Wemm { 220c2aa98e2SPeter Wemm syserr("stab: unknown symbol type %d", type); 221d0cef73dSGregory Neil Shapiro len = sizeof(s->s_value); 222c2aa98e2SPeter Wemm } 223c2aa98e2SPeter Wemm break; 224c2aa98e2SPeter Wemm } 225d0cef73dSGregory Neil Shapiro len += sizeof(*s) - sizeof(s->s_value); 22606f25ae9SGregory Neil Shapiro 22706f25ae9SGregory Neil Shapiro if (tTd(36, 15)) 22840266059SGregory Neil Shapiro sm_dprintf("size of stab entry: %d\n", len); 229c2aa98e2SPeter Wemm 230c2aa98e2SPeter Wemm /* make new entry */ 23140266059SGregory Neil Shapiro s = (STAB *) sm_pmalloc_x(len); 23206f25ae9SGregory Neil Shapiro memset((char *) s, '\0', len); 23340266059SGregory Neil Shapiro s->s_name = sm_pstrdup_x(name); 23440266059SGregory Neil Shapiro s->s_symtype = type; 235c2aa98e2SPeter Wemm 236c2aa98e2SPeter Wemm /* link it in */ 237c2aa98e2SPeter Wemm *ps = s; 238c2aa98e2SPeter Wemm 23906f25ae9SGregory Neil Shapiro /* set a default value for rulesets */ 24006f25ae9SGregory Neil Shapiro if (type == ST_RULESET) 24106f25ae9SGregory Neil Shapiro s->s_ruleset = -1; 24206f25ae9SGregory Neil Shapiro 24306f25ae9SGregory Neil Shapiro return s; 244c2aa98e2SPeter Wemm } 24540266059SGregory Neil Shapiro /* 246c2aa98e2SPeter Wemm ** STABAPPLY -- apply function to all stab entries 247c2aa98e2SPeter Wemm ** 248c2aa98e2SPeter Wemm ** Parameters: 24940266059SGregory Neil Shapiro ** func -- the function to apply. It will be given two 25040266059SGregory Neil Shapiro ** parameters (the stab entry and the arg). 251c2aa98e2SPeter Wemm ** arg -- an arbitrary argument, passed to func. 252c2aa98e2SPeter Wemm ** 253c2aa98e2SPeter Wemm ** Returns: 254c2aa98e2SPeter Wemm ** none. 255c2aa98e2SPeter Wemm */ 256c2aa98e2SPeter Wemm 257c2aa98e2SPeter Wemm void 258c2aa98e2SPeter Wemm stabapply(func, arg) 259c2aa98e2SPeter Wemm void (*func)__P((STAB *, int)); 260c2aa98e2SPeter Wemm int arg; 261c2aa98e2SPeter Wemm { 262c2aa98e2SPeter Wemm register STAB **shead; 263c2aa98e2SPeter Wemm register STAB *s; 264c2aa98e2SPeter Wemm 265c2aa98e2SPeter Wemm for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 266c2aa98e2SPeter Wemm { 267c2aa98e2SPeter Wemm for (s = *shead; s != NULL; s = s->s_next) 268c2aa98e2SPeter Wemm { 269c2aa98e2SPeter Wemm if (tTd(36, 90)) 27040266059SGregory Neil Shapiro sm_dprintf("stabapply: trying %d/%s\n", 27140266059SGregory Neil Shapiro s->s_symtype, s->s_name); 272c2aa98e2SPeter Wemm func(s, arg); 273c2aa98e2SPeter Wemm } 274c2aa98e2SPeter Wemm } 275c2aa98e2SPeter Wemm } 27640266059SGregory Neil Shapiro /* 27706f25ae9SGregory Neil Shapiro ** QUEUEUP_MACROS -- queueup the macros in a class 27806f25ae9SGregory Neil Shapiro ** 27906f25ae9SGregory Neil Shapiro ** Write the macros listed in the specified class into the 28006f25ae9SGregory Neil Shapiro ** file referenced by qfp. 28106f25ae9SGregory Neil Shapiro ** 28206f25ae9SGregory Neil Shapiro ** Parameters: 28306f25ae9SGregory Neil Shapiro ** class -- class ID. 28440266059SGregory Neil Shapiro ** qfp -- file pointer to the queue file. 28506f25ae9SGregory Neil Shapiro ** e -- the envelope. 28606f25ae9SGregory Neil Shapiro ** 28706f25ae9SGregory Neil Shapiro ** Returns: 28806f25ae9SGregory Neil Shapiro ** none. 28906f25ae9SGregory Neil Shapiro */ 29006f25ae9SGregory Neil Shapiro 29106f25ae9SGregory Neil Shapiro void 29206f25ae9SGregory Neil Shapiro queueup_macros(class, qfp, e) 29306f25ae9SGregory Neil Shapiro int class; 29440266059SGregory Neil Shapiro SM_FILE_T *qfp; 29506f25ae9SGregory Neil Shapiro ENVELOPE *e; 29606f25ae9SGregory Neil Shapiro { 29706f25ae9SGregory Neil Shapiro register STAB **shead; 29806f25ae9SGregory Neil Shapiro register STAB *s; 29906f25ae9SGregory Neil Shapiro 30006f25ae9SGregory Neil Shapiro if (e == NULL) 30106f25ae9SGregory Neil Shapiro return; 30206f25ae9SGregory Neil Shapiro 303193538b7SGregory Neil Shapiro class = bitidx(class); 30406f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 30506f25ae9SGregory Neil Shapiro { 30606f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 30706f25ae9SGregory Neil Shapiro { 30806f25ae9SGregory Neil Shapiro int m; 30906f25ae9SGregory Neil Shapiro char *p; 31006f25ae9SGregory Neil Shapiro 31140266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 31240266059SGregory Neil Shapiro bitnset(bitidx(class), s->s_class) && 313a7ec597cSGregory Neil Shapiro (m = macid(s->s_name)) != 0 && 31406f25ae9SGregory Neil Shapiro (p = macvalue(m, e)) != NULL) 31506f25ae9SGregory Neil Shapiro { 31640266059SGregory Neil Shapiro (void) sm_io_fprintf(qfp, SM_TIME_DEFAULT, 31740266059SGregory Neil Shapiro "$%s%s\n", 31806f25ae9SGregory Neil Shapiro s->s_name, 31940266059SGregory Neil Shapiro denlstring(p, true, 32040266059SGregory Neil Shapiro false)); 32106f25ae9SGregory Neil Shapiro } 32206f25ae9SGregory Neil Shapiro } 32306f25ae9SGregory Neil Shapiro } 32406f25ae9SGregory Neil Shapiro } 32540266059SGregory Neil Shapiro /* 32606f25ae9SGregory Neil Shapiro ** COPY_CLASS -- copy class members from one class to another 32706f25ae9SGregory Neil Shapiro ** 32806f25ae9SGregory Neil Shapiro ** Parameters: 32906f25ae9SGregory Neil Shapiro ** src -- source class. 33006f25ae9SGregory Neil Shapiro ** dst -- destination class. 33106f25ae9SGregory Neil Shapiro ** 33206f25ae9SGregory Neil Shapiro ** Returns: 33306f25ae9SGregory Neil Shapiro ** none. 33406f25ae9SGregory Neil Shapiro */ 33506f25ae9SGregory Neil Shapiro 33606f25ae9SGregory Neil Shapiro void 33706f25ae9SGregory Neil Shapiro copy_class(src, dst) 33806f25ae9SGregory Neil Shapiro int src; 33906f25ae9SGregory Neil Shapiro int dst; 34006f25ae9SGregory Neil Shapiro { 34106f25ae9SGregory Neil Shapiro register STAB **shead; 34206f25ae9SGregory Neil Shapiro register STAB *s; 34306f25ae9SGregory Neil Shapiro 344193538b7SGregory Neil Shapiro src = bitidx(src); 345193538b7SGregory Neil Shapiro dst = bitidx(dst); 34606f25ae9SGregory Neil Shapiro for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 34706f25ae9SGregory Neil Shapiro { 34806f25ae9SGregory Neil Shapiro for (s = *shead; s != NULL; s = s->s_next) 34906f25ae9SGregory Neil Shapiro { 35040266059SGregory Neil Shapiro if (s->s_symtype == ST_CLASS && 351193538b7SGregory Neil Shapiro bitnset(src, s->s_class)) 35206f25ae9SGregory Neil Shapiro setbitn(dst, s->s_class); 35306f25ae9SGregory Neil Shapiro } 35406f25ae9SGregory Neil Shapiro } 35506f25ae9SGregory Neil Shapiro } 35640266059SGregory Neil Shapiro 35740266059SGregory Neil Shapiro /* 35840266059SGregory Neil Shapiro ** RMEXPSTAB -- remove expired entries from SymTab. 35940266059SGregory Neil Shapiro ** 36040266059SGregory Neil Shapiro ** These entries need to be removed in long-running processes, 36140266059SGregory Neil Shapiro ** e.g., persistent queue runners, to avoid consuming memory. 36240266059SGregory Neil Shapiro ** 36340266059SGregory Neil Shapiro ** XXX It might be useful to restrict the maximum TTL to avoid 36440266059SGregory Neil Shapiro ** caching data very long. 36540266059SGregory Neil Shapiro ** 36640266059SGregory Neil Shapiro ** Parameters: 36740266059SGregory Neil Shapiro ** none. 36840266059SGregory Neil Shapiro ** 36940266059SGregory Neil Shapiro ** Returns: 37040266059SGregory Neil Shapiro ** none. 37140266059SGregory Neil Shapiro ** 37240266059SGregory Neil Shapiro ** Side Effects: 37340266059SGregory Neil Shapiro ** can remove entries from the symbol table. 37440266059SGregory Neil Shapiro */ 37540266059SGregory Neil Shapiro 37640266059SGregory Neil Shapiro #define SM_STAB_FREE(x) \ 37740266059SGregory Neil Shapiro do \ 37840266059SGregory Neil Shapiro { \ 37940266059SGregory Neil Shapiro char *o = (x); \ 38040266059SGregory Neil Shapiro (x) = NULL; \ 38140266059SGregory Neil Shapiro if (o != NULL) \ 38240266059SGregory Neil Shapiro sm_free(o); \ 38340266059SGregory Neil Shapiro } while (0) 38440266059SGregory Neil Shapiro 38540266059SGregory Neil Shapiro void 38640266059SGregory Neil Shapiro rmexpstab() 38740266059SGregory Neil Shapiro { 38840266059SGregory Neil Shapiro int i; 38940266059SGregory Neil Shapiro STAB *s, *p, *f; 39040266059SGregory Neil Shapiro time_t now; 39140266059SGregory Neil Shapiro 39240266059SGregory Neil Shapiro now = curtime(); 39340266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 39440266059SGregory Neil Shapiro { 39540266059SGregory Neil Shapiro p = NULL; 39640266059SGregory Neil Shapiro s = SymTab[i]; 39740266059SGregory Neil Shapiro while (s != NULL) 39840266059SGregory Neil Shapiro { 39940266059SGregory Neil Shapiro switch (s->s_symtype) 40040266059SGregory Neil Shapiro { 40140266059SGregory Neil Shapiro case ST_HOSTSIG: 40240266059SGregory Neil Shapiro if (s->s_hostsig.hs_exp >= now) 40340266059SGregory Neil Shapiro goto next; /* not expired */ 40440266059SGregory Neil Shapiro SM_STAB_FREE(s->s_hostsig.hs_sig); /* XXX */ 40540266059SGregory Neil Shapiro break; 40640266059SGregory Neil Shapiro 40740266059SGregory Neil Shapiro case ST_NAMECANON: 40840266059SGregory Neil Shapiro if (s->s_namecanon.nc_exp >= now) 40940266059SGregory Neil Shapiro goto next; /* not expired */ 41040266059SGregory Neil Shapiro SM_STAB_FREE(s->s_namecanon.nc_cname); /* XXX */ 41140266059SGregory Neil Shapiro break; 41240266059SGregory Neil Shapiro 4135b0945b5SGregory Neil Shapiro #if DANE 4145b0945b5SGregory Neil Shapiro case ST_TLSA_RR: 4155b0945b5SGregory Neil Shapiro if (s->s_tlsa->dane_tlsa_exp >= now) 4165b0945b5SGregory Neil Shapiro goto next; /* not expired */ 4175b0945b5SGregory Neil Shapiro (void) dane_tlsa_free(s->s_tlsa); 4185b0945b5SGregory Neil Shapiro s->s_tlsa = NULL; 4195b0945b5SGregory Neil Shapiro break; 4205b0945b5SGregory Neil Shapiro #endif /* DANE */ 4215b0945b5SGregory Neil Shapiro 42240266059SGregory Neil Shapiro default: 42340266059SGregory Neil Shapiro if (s->s_symtype >= ST_MCI) 42440266059SGregory Neil Shapiro { 42540266059SGregory Neil Shapiro /* call mci_uncache? */ 42640266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_status); 42740266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_rstatus); 42840266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_heloname); 42940266059SGregory Neil Shapiro #if 0 43040266059SGregory Neil Shapiro /* not dynamically allocated */ 43140266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_host); 43240266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_tolist); 43340266059SGregory Neil Shapiro #endif /* 0 */ 43440266059SGregory Neil Shapiro #if SASL 43540266059SGregory Neil Shapiro /* should always by NULL */ 43640266059SGregory Neil Shapiro SM_STAB_FREE(s->s_mci.mci_sasl_string); 4375b0945b5SGregory Neil Shapiro #endif 43840266059SGregory Neil Shapiro if (s->s_mci.mci_rpool != NULL) 43940266059SGregory Neil Shapiro { 44040266059SGregory Neil Shapiro sm_rpool_free(s->s_mci.mci_rpool); 44140266059SGregory Neil Shapiro s->s_mci.mci_macro.mac_rpool = NULL; 44240266059SGregory Neil Shapiro s->s_mci.mci_rpool = NULL; 44340266059SGregory Neil Shapiro } 44440266059SGregory Neil Shapiro break; 44540266059SGregory Neil Shapiro } 44640266059SGregory Neil Shapiro next: 44740266059SGregory Neil Shapiro p = s; 44840266059SGregory Neil Shapiro s = s->s_next; 44940266059SGregory Neil Shapiro continue; 45040266059SGregory Neil Shapiro } 45140266059SGregory Neil Shapiro 45240266059SGregory Neil Shapiro /* remove entry */ 45340266059SGregory Neil Shapiro SM_STAB_FREE(s->s_name); /* XXX */ 45440266059SGregory Neil Shapiro f = s; 45540266059SGregory Neil Shapiro s = s->s_next; 45640266059SGregory Neil Shapiro sm_free(f); /* XXX */ 45740266059SGregory Neil Shapiro if (p == NULL) 45840266059SGregory Neil Shapiro SymTab[i] = s; 45940266059SGregory Neil Shapiro else 46040266059SGregory Neil Shapiro p->s_next = s; 46140266059SGregory Neil Shapiro } 46240266059SGregory Neil Shapiro } 46340266059SGregory Neil Shapiro } 46440266059SGregory Neil Shapiro 46540266059SGregory Neil Shapiro #if SM_HEAP_CHECK 46640266059SGregory Neil Shapiro /* 46740266059SGregory Neil Shapiro ** DUMPSTAB -- dump symbol table. 46840266059SGregory Neil Shapiro ** 46940266059SGregory Neil Shapiro ** For debugging. 47040266059SGregory Neil Shapiro */ 47140266059SGregory Neil Shapiro 47240266059SGregory Neil Shapiro #define MAXSTTYPES (ST_MCI + 1) 47340266059SGregory Neil Shapiro 47440266059SGregory Neil Shapiro void 47540266059SGregory Neil Shapiro dumpstab() 47640266059SGregory Neil Shapiro { 47740266059SGregory Neil Shapiro int i, t, total, types[MAXSTTYPES]; 47840266059SGregory Neil Shapiro STAB *s; 47940266059SGregory Neil Shapiro static int prevt[MAXSTTYPES], prev = 0; 48040266059SGregory Neil Shapiro 48140266059SGregory Neil Shapiro total = 0; 48240266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 48340266059SGregory Neil Shapiro types[i] = 0; 48440266059SGregory Neil Shapiro for (i = 0; i < STABSIZE; i++) 48540266059SGregory Neil Shapiro { 48640266059SGregory Neil Shapiro s = SymTab[i]; 48740266059SGregory Neil Shapiro while (s != NULL) 48840266059SGregory Neil Shapiro { 48940266059SGregory Neil Shapiro ++total; 49040266059SGregory Neil Shapiro t = s->s_symtype; 49140266059SGregory Neil Shapiro if (t > MAXSTTYPES - 1) 49240266059SGregory Neil Shapiro t = MAXSTTYPES - 1; 49340266059SGregory Neil Shapiro types[t]++; 49440266059SGregory Neil Shapiro s = s->s_next; 49540266059SGregory Neil Shapiro } 49640266059SGregory Neil Shapiro } 49740266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: total=%d (%d)", total, total - prev); 49840266059SGregory Neil Shapiro prev = total; 49940266059SGregory Neil Shapiro for (i = 0; i < MAXSTTYPES; i++) 50040266059SGregory Neil Shapiro { 50140266059SGregory Neil Shapiro if (types[i] != 0) 50240266059SGregory Neil Shapiro { 50340266059SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, "stab: type[%2d]=%2d (%d)", 50440266059SGregory Neil Shapiro i, types[i], types[i] - prevt[i]); 50540266059SGregory Neil Shapiro } 50640266059SGregory Neil Shapiro prevt[i] = types[i]; 50740266059SGregory Neil Shapiro } 50840266059SGregory Neil Shapiro } 50940266059SGregory Neil Shapiro #endif /* SM_HEAP_CHECK */ 510