summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/src/stab.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/src/stab.c')
-rw-r--r--contrib/sendmail/src/stab.c475
1 files changed, 0 insertions, 475 deletions
diff --git a/contrib/sendmail/src/stab.c b/contrib/sendmail/src/stab.c
deleted file mode 100644
index 6dacdfa..0000000
--- a/contrib/sendmail/src/stab.c
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright (c) 1998-2001, 2003 Sendmail, Inc. and its suppliers.
- * All rights reserved.
- * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * By using this file, you agree to the terms and conditions set
- * forth in the LICENSE file which can be found at the top level of
- * the sendmail distribution.
- *
- */
-
-#include <sendmail.h>
-
-SM_RCSID("@(#)$Id: stab.c,v 8.89 2006/08/15 23:24:58 ca Exp $")
-
-/*
-** STAB -- manage the symbol table
-**
-** Parameters:
-** name -- the name to be looked up or inserted.
-** type -- the type of symbol.
-** op -- what to do:
-** ST_ENTER -- enter the name if not already present.
-** ST_FIND -- find it only.
-**
-** Returns:
-** pointer to a STAB entry for this name.
-** NULL if not found and not entered.
-**
-** Side Effects:
-** can update the symbol table.
-*/
-
-#define STABSIZE 2003
-#define SM_LOWER(c) ((isascii(c) && isupper(c)) ? tolower(c) : (c))
-
-static STAB *SymTab[STABSIZE];
-
-STAB *
-stab(name, type, op)
- char *name;
- int type;
- int op;
-{
- register STAB *s;
- register STAB **ps;
- register int hfunc;
- register char *p;
- int len;
-
- if (tTd(36, 5))
- sm_dprintf("STAB: %s %d ", name, type);
-
- /*
- ** Compute the hashing function
- */
-
- hfunc = type;
- for (p = name; *p != '\0'; p++)
- hfunc = ((hfunc << 1) ^ (SM_LOWER(*p) & 0377)) % STABSIZE;
-
- if (tTd(36, 9))
- sm_dprintf("(hfunc=%d) ", hfunc);
-
- ps = &SymTab[hfunc];
- if (type == ST_MACRO || type == ST_RULESET)
- {
- while ((s = *ps) != NULL &&
- (s->s_symtype != type || strcmp(name, s->s_name)))
- ps = &s->s_next;
- }
- else
- {
- while ((s = *ps) != NULL &&
- (s->s_symtype != type || sm_strcasecmp(name, s->s_name)))
- ps = &s->s_next;
- }
-
- /*
- ** Dispose of the entry.
- */
-
- if (s != NULL || op == ST_FIND)
- {
- if (tTd(36, 5))
- {
- if (s == NULL)
- sm_dprintf("not found\n");
- else
- {
- long *lp = (long *) s->s_class;
-
- sm_dprintf("type %d val %lx %lx %lx %lx\n",
- s->s_symtype, lp[0], lp[1], lp[2], lp[3]);
- }
- }
- return s;
- }
-
- /*
- ** Make a new entry and link it in.
- */
-
- if (tTd(36, 5))
- sm_dprintf("entered\n");
-
- /* determine size of new entry */
- switch (type)
- {
- case ST_CLASS:
- len = sizeof(s->s_class);
- break;
-
- case ST_ADDRESS:
- len = sizeof(s->s_address);
- break;
-
- case ST_MAILER:
- len = sizeof(s->s_mailer);
- break;
-
- case ST_ALIAS:
- len = sizeof(s->s_alias);
- break;
-
- case ST_MAPCLASS:
- len = sizeof(s->s_mapclass);
- break;
-
- case ST_MAP:
- len = sizeof(s->s_map);
- break;
-
- case ST_HOSTSIG:
- len = sizeof(s->s_hostsig);
- break;
-
- case ST_NAMECANON:
- len = sizeof(s->s_namecanon);
- break;
-
- case ST_MACRO:
- len = sizeof(s->s_macro);
- break;
-
- case ST_RULESET:
- len = sizeof(s->s_ruleset);
- break;
-
- case ST_HEADER:
- len = sizeof(s->s_header);
- break;
-
- case ST_SERVICE:
- len = sizeof(s->s_service);
- break;
-
-#if LDAPMAP
- case ST_LMAP:
- len = sizeof(s->s_lmap);
- break;
-#endif /* LDAPMAP */
-
-#if MILTER
- case ST_MILTER:
- len = sizeof(s->s_milter);
- break;
-#endif /* MILTER */
-
- case ST_QUEUE:
- len = sizeof(s->s_quegrp);
- break;
-
-#if SOCKETMAP
- case ST_SOCKETMAP:
- len = sizeof(s->s_socketmap);
- break;
-#endif /* SOCKETMAP */
-
- default:
- /*
- ** Each mailer has its own MCI stab entry:
- **
- ** s = stab(host, ST_MCI + m->m_mno, ST_ENTER);
- **
- ** Therefore, anything ST_MCI or larger is an s_mci.
- */
-
- if (type >= ST_MCI)
- len = sizeof(s->s_mci);
- else
- {
- syserr("stab: unknown symbol type %d", type);
- len = sizeof(s->s_value);
- }
- break;
- }
- len += sizeof(*s) - sizeof(s->s_value);
-
- if (tTd(36, 15))
- sm_dprintf("size of stab entry: %d\n", len);
-
- /* make new entry */
- s = (STAB *) sm_pmalloc_x(len);
- memset((char *) s, '\0', len);
- s->s_name = sm_pstrdup_x(name);
- s->s_symtype = type;
-
- /* link it in */
- *ps = s;
-
- /* set a default value for rulesets */
- if (type == ST_RULESET)
- s->s_ruleset = -1;
-
- return s;
-}
-/*
-** STABAPPLY -- apply function to all stab entries
-**
-** Parameters:
-** func -- the function to apply. It will be given two
-** parameters (the stab entry and the arg).
-** arg -- an arbitrary argument, passed to func.
-**
-** Returns:
-** none.
-*/
-
-void
-stabapply(func, arg)
- void (*func)__P((STAB *, int));
- int arg;
-{
- register STAB **shead;
- register STAB *s;
-
- for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
- {
- for (s = *shead; s != NULL; s = s->s_next)
- {
- if (tTd(36, 90))
- sm_dprintf("stabapply: trying %d/%s\n",
- s->s_symtype, s->s_name);
- func(s, arg);
- }
- }
-}
-/*
-** QUEUEUP_MACROS -- queueup the macros in a class
-**
-** Write the macros listed in the specified class into the
-** file referenced by qfp.
-**
-** Parameters:
-** class -- class ID.
-** qfp -- file pointer to the queue file.
-** e -- the envelope.
-**
-** Returns:
-** none.
-*/
-
-void
-queueup_macros(class, qfp, e)
- int class;
- SM_FILE_T *qfp;
- ENVELOPE *e;
-{
- register STAB **shead;
- register STAB *s;
-
- if (e == NULL)
- return;
-
- class = bitidx(class);
- for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
- {
- for (s = *shead; s != NULL; s = s->s_next)
- {
- int m;
- char *p;
-
- if (s->s_symtype == ST_CLASS &&
- bitnset(bitidx(class), s->s_class) &&
- (m = macid(s->s_name)) != 0 &&
- (p = macvalue(m, e)) != NULL)
- {
- (void) sm_io_fprintf(qfp, SM_TIME_DEFAULT,
- "$%s%s\n",
- s->s_name,
- denlstring(p, true,
- false));
- }
- }
- }
-}
-/*
-** COPY_CLASS -- copy class members from one class to another
-**
-** Parameters:
-** src -- source class.
-** dst -- destination class.
-**
-** Returns:
-** none.
-*/
-
-void
-copy_class(src, dst)
- int src;
- int dst;
-{
- register STAB **shead;
- register STAB *s;
-
- src = bitidx(src);
- dst = bitidx(dst);
- for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
- {
- for (s = *shead; s != NULL; s = s->s_next)
- {
- if (s->s_symtype == ST_CLASS &&
- bitnset(src, s->s_class))
- setbitn(dst, s->s_class);
- }
- }
-}
-
-/*
-** RMEXPSTAB -- remove expired entries from SymTab.
-**
-** These entries need to be removed in long-running processes,
-** e.g., persistent queue runners, to avoid consuming memory.
-**
-** XXX It might be useful to restrict the maximum TTL to avoid
-** caching data very long.
-**
-** Parameters:
-** none.
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** can remove entries from the symbol table.
-*/
-
-#define SM_STAB_FREE(x) \
- do \
- { \
- char *o = (x); \
- (x) = NULL; \
- if (o != NULL) \
- sm_free(o); \
- } while (0)
-
-void
-rmexpstab()
-{
- int i;
- STAB *s, *p, *f;
- time_t now;
-
- now = curtime();
- for (i = 0; i < STABSIZE; i++)
- {
- p = NULL;
- s = SymTab[i];
- while (s != NULL)
- {
- switch (s->s_symtype)
- {
- case ST_HOSTSIG:
- if (s->s_hostsig.hs_exp >= now)
- goto next; /* not expired */
- SM_STAB_FREE(s->s_hostsig.hs_sig); /* XXX */
- break;
-
- case ST_NAMECANON:
- if (s->s_namecanon.nc_exp >= now)
- goto next; /* not expired */
- SM_STAB_FREE(s->s_namecanon.nc_cname); /* XXX */
- break;
-
- default:
- if (s->s_symtype >= ST_MCI)
- {
- /* call mci_uncache? */
- SM_STAB_FREE(s->s_mci.mci_status);
- SM_STAB_FREE(s->s_mci.mci_rstatus);
- SM_STAB_FREE(s->s_mci.mci_heloname);
-#if 0
- /* not dynamically allocated */
- SM_STAB_FREE(s->s_mci.mci_host);
- SM_STAB_FREE(s->s_mci.mci_tolist);
-#endif /* 0 */
-#if SASL
- /* should always by NULL */
- SM_STAB_FREE(s->s_mci.mci_sasl_string);
-#endif /* SASL */
- if (s->s_mci.mci_rpool != NULL)
- {
- sm_rpool_free(s->s_mci.mci_rpool);
- s->s_mci.mci_macro.mac_rpool = NULL;
- s->s_mci.mci_rpool = NULL;
- }
- break;
- }
- next:
- p = s;
- s = s->s_next;
- continue;
- }
-
- /* remove entry */
- SM_STAB_FREE(s->s_name); /* XXX */
- f = s;
- s = s->s_next;
- sm_free(f); /* XXX */
- if (p == NULL)
- SymTab[i] = s;
- else
- p->s_next = s;
- }
- }
-}
-
-#if SM_HEAP_CHECK
-/*
-** DUMPSTAB -- dump symbol table.
-**
-** For debugging.
-*/
-
-#define MAXSTTYPES (ST_MCI + 1)
-
-void
-dumpstab()
-{
- int i, t, total, types[MAXSTTYPES];
- STAB *s;
- static int prevt[MAXSTTYPES], prev = 0;
-
- total = 0;
- for (i = 0; i < MAXSTTYPES; i++)
- types[i] = 0;
- for (i = 0; i < STABSIZE; i++)
- {
- s = SymTab[i];
- while (s != NULL)
- {
- ++total;
- t = s->s_symtype;
- if (t > MAXSTTYPES - 1)
- t = MAXSTTYPES - 1;
- types[t]++;
- s = s->s_next;
- }
- }
- sm_syslog(LOG_INFO, NOQID, "stab: total=%d (%d)", total, total - prev);
- prev = total;
- for (i = 0; i < MAXSTTYPES; i++)
- {
- if (types[i] != 0)
- {
- sm_syslog(LOG_INFO, NOQID, "stab: type[%2d]=%2d (%d)",
- i, types[i], types[i] - prevt[i]);
- }
- prevt[i] = types[i];
- }
-}
-#endif /* SM_HEAP_CHECK */
OpenPOWER on IntegriCloud