stab.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:5k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
  5.  * Copyright (c) 1988, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * By using this file, you agree to the terms and conditions set
  9.  * forth in the LICENSE file which can be found at the top level of
  10.  * the sendmail distribution.
  11.  *
  12.  */
  13. #ifndef lint
  14. static char id[] = "@(#)$Id: stab.c,v 8.40 1999/11/04 23:31:07 gshapiro Exp $";
  15. #endif /* ! lint */
  16. #include <sendmail.h>
  17. /*
  18. **  STAB -- manage the symbol table
  19. **
  20. ** Parameters:
  21. ** name -- the name to be looked up or inserted.
  22. ** type -- the type of symbol.
  23. ** op -- what to do:
  24. ** ST_ENTER -- enter the name if not
  25. ** already present.
  26. ** ST_FIND -- find it only.
  27. **
  28. ** Returns:
  29. ** pointer to a STAB entry for this name.
  30. ** NULL if not found and not entered.
  31. **
  32. ** Side Effects:
  33. ** can update the symbol table.
  34. */
  35. #define STABSIZE 2003
  36. static STAB *SymTab[STABSIZE];
  37. STAB *
  38. stab(name, type, op)
  39. char *name;
  40. int type;
  41. int op;
  42. {
  43. register STAB *s;
  44. register STAB **ps;
  45. register int hfunc;
  46. register char *p;
  47. int len;
  48. if (tTd(36, 5))
  49. dprintf("STAB: %s %d ", name, type);
  50. /*
  51. **  Compute the hashing function
  52. */
  53. hfunc = type;
  54. for (p = name; *p != ''; p++)
  55. hfunc = ((hfunc << 1) ^ (lower(*p) & 0377)) % STABSIZE;
  56. if (tTd(36, 9))
  57. dprintf("(hfunc=%d) ", hfunc);
  58. ps = &SymTab[hfunc];
  59. if (type == ST_MACRO || type == ST_RULESET)
  60. {
  61. while ((s = *ps) != NULL &&
  62.        (s->s_type != type || strcmp(name, s->s_name)))
  63. ps = &s->s_next;
  64. }
  65. else
  66. {
  67. while ((s = *ps) != NULL &&
  68.        (s->s_type != type || strcasecmp(name, s->s_name)))
  69. ps = &s->s_next;
  70. }
  71. /*
  72. **  Dispose of the entry.
  73. */
  74. if (s != NULL || op == ST_FIND)
  75. {
  76. if (tTd(36, 5))
  77. {
  78. if (s == NULL)
  79. dprintf("not foundn");
  80. else
  81. {
  82. long *lp = (long *) s->s_class;
  83. dprintf("type %d val %lx %lx %lx %lxn",
  84. s->s_type, lp[0], lp[1], lp[2], lp[3]);
  85. }
  86. }
  87. return s;
  88. }
  89. /*
  90. **  Make a new entry and link it in.
  91. */
  92. if (tTd(36, 5))
  93. dprintf("enteredn");
  94. /* determine size of new entry */
  95. switch (type)
  96. {
  97.   case ST_CLASS:
  98. len = sizeof s->s_class;
  99. break;
  100.   case ST_ADDRESS:
  101. len = sizeof s->s_address;
  102. break;
  103.   case ST_MAILER:
  104. len = sizeof s->s_mailer;
  105. break;
  106.   case ST_ALIAS:
  107. len = sizeof s->s_alias;
  108. break;
  109.   case ST_MAPCLASS:
  110. len = sizeof s->s_mapclass;
  111. break;
  112.   case ST_MAP:
  113. len = sizeof s->s_map;
  114. break;
  115.   case ST_HOSTSIG:
  116. len = sizeof s->s_hostsig;
  117. break;
  118.   case ST_NAMECANON:
  119. len = sizeof s->s_namecanon;
  120. break;
  121.   case ST_MACRO:
  122. len = sizeof s->s_macro;
  123. break;
  124.   case ST_RULESET:
  125. len = sizeof s->s_ruleset;
  126. break;
  127.   case ST_HEADER:
  128. len = sizeof s->s_header;
  129. break;
  130.   case ST_SERVICE:
  131. len = sizeof s->s_service;
  132. break;
  133. #ifdef LDAPMAP
  134.   case ST_LDAP:
  135. len = sizeof s->s_ldap;
  136. break;
  137. #endif /* LDAPMAP */
  138.   default:
  139. /*
  140. **  Each mailer has it's own MCI stab entry:
  141. **
  142. **  s = stab(host, ST_MCI + m->m_mno, ST_ENTER);
  143. **
  144. **  Therefore, anything ST_MCI or larger is an s_mci.
  145. */
  146. if (type >= ST_MCI)
  147. len = sizeof s->s_mci;
  148. else
  149. {
  150. syserr("stab: unknown symbol type %d", type);
  151. len = sizeof s->s_value;
  152. }
  153. break;
  154. }
  155. len += sizeof *s - sizeof s->s_value;
  156. if (tTd(36, 15))
  157. dprintf("size of stab entry: %dn", len);
  158. /* make new entry */
  159. s = (STAB *) xalloc(len);
  160. memset((char *) s, '', len);
  161. s->s_name = newstr(name);
  162. s->s_type = type;
  163. s->s_len = len;
  164. /* link it in */
  165. *ps = s;
  166. /* set a default value for rulesets */
  167. if (type == ST_RULESET)
  168. s->s_ruleset = -1;
  169. return s;
  170. }
  171. /*
  172. **  STABAPPLY -- apply function to all stab entries
  173. **
  174. ** Parameters:
  175. ** func -- the function to apply.  It will be given one
  176. ** parameter (the stab entry).
  177. ** arg -- an arbitrary argument, passed to func.
  178. **
  179. ** Returns:
  180. ** none.
  181. */
  182. void
  183. stabapply(func, arg)
  184. void (*func)__P((STAB *, int));
  185. int arg;
  186. {
  187. register STAB **shead;
  188. register STAB *s;
  189. for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
  190. {
  191. for (s = *shead; s != NULL; s = s->s_next)
  192. {
  193. if (tTd(36, 90))
  194. dprintf("stabapply: trying %d/%sn",
  195. s->s_type, s->s_name);
  196. func(s, arg);
  197. }
  198. }
  199. }
  200. /*
  201. **  QUEUEUP_MACROS -- queueup the macros in a class
  202. **
  203. ** Write the macros listed in the specified class into the
  204. ** file referenced by qfp.
  205. **
  206. ** Parameters:
  207. ** class -- class ID.
  208. ** qfp -- file pointer to the qf file.
  209. ** e -- the envelope.
  210. **
  211. ** Returns:
  212. ** none.
  213. */
  214. void
  215. queueup_macros(class, qfp, e)
  216. int class;
  217. FILE *qfp;
  218. ENVELOPE *e;
  219. {
  220. register STAB **shead;
  221. register STAB *s;
  222. if (e == NULL)
  223. return;
  224. for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
  225. {
  226. for (s = *shead; s != NULL; s = s->s_next)
  227. {
  228. int m;
  229. char *p;
  230. if (s->s_type == ST_CLASS &&
  231.     bitnset(class & 0xff, s->s_class) &&
  232.     (m = macid(s->s_name, NULL)) != '' &&
  233.     (p = macvalue(m, e)) != NULL)
  234. {
  235. fprintf(qfp, "$%s%sn",
  236. s->s_name,
  237. denlstring(p, TRUE, FALSE));
  238. }
  239. }
  240. }
  241. }
  242. /*
  243. **  COPY_CLASS -- copy class members from one class to another
  244. **
  245. ** Parameters:
  246. ** src -- source class.
  247. ** dst -- destination class.
  248. **
  249. ** Returns:
  250. ** none.
  251. */
  252. void
  253. copy_class(src, dst)
  254. int src;
  255. int dst;
  256. {
  257. register STAB **shead;
  258. register STAB *s;
  259. for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
  260. {
  261. for (s = *shead; s != NULL; s = s->s_next)
  262. {
  263. if (s->s_type == ST_CLASS &&
  264.     bitnset(src & 0xff, s->s_class))
  265. setbitn(dst, s->s_class);
  266. }
  267. }
  268. }