hostcache.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:4k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** hostcache.c
  3. **
  4. ** Copyright (c) 1995 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include "phttpd.h"
  20. int hostcache_refresh = 120;
  21. int hostcache_ttl = 120;
  22. int hostcache_gc_interval = 600;
  23. int hostcache_size = 101;
  24. static cache_t hostname_cache;
  25. static cache_t hostaddr_cache;
  26. static void hostinfo_free(void *data)
  27. {
  28.     struct hostinfo *hip = data;
  29.     if (debug > 2)
  30. fprintf(stderr, "hostinfo_free(), hostname=%sn", hip->hb.h_name);
  31.     
  32.     s_free(data);
  33. }
  34. static int hostinfo_update_byname(void *key,
  35.   unsigned int keylen,
  36.   void *data,
  37.   void **new_data,
  38.   void *misc)
  39. {
  40.     struct hostinfo *hip;
  41.     unsigned int flags;
  42.     int h_errno;
  43.     
  44.     flags = (misc ? *(unsigned int *)misc : 0);
  45.     if (debug > 2)
  46. fprintf(stderr, "hostinfo_update_byname(), name=%s, flags=%dn",
  47. (char *) key, flags);
  48.     hip = s_malloc(sizeof(struct hostinfo));
  49.     if (s_gethostbyname_r((const char *) key, &hip->hb,
  50.   hip->buf, sizeof(hip->buf), &h_errno) == NULL)
  51.     {
  52. s_free(hip);
  53. *new_data = NULL;
  54.     }
  55.     else
  56. *new_data = hip;
  57.     return 1;
  58. }
  59. static int hostinfo_update_byaddr(void *key,
  60.   unsigned int keylen,
  61.   void *data,
  62.   void **new_data,
  63.   void *misc)
  64. {
  65.     struct hostinfo *hip;
  66.     struct in_addr *iap;
  67.     unsigned int flags;
  68.     int h_errno;
  69.     iap = key;
  70.     flags = (misc ? *(unsigned int *)misc : 0);
  71.     if (debug > 2)
  72. fprintf(stderr, "hostinfo_update_byaddr(), addr=%s, flags=%dn",
  73. inet_ntoa(*iap), flags);
  74.     hip = s_malloc(sizeof(struct hostinfo));
  75.     if (s_gethostbyaddr_r((const char *) iap,
  76.   sizeof(iap), AF_INET, &hip->hb,
  77.   hip->buf, sizeof(hip->buf), &h_errno) == NULL)
  78.     {
  79. s_free(hip);
  80. *new_data = NULL;
  81.     }
  82.     else
  83. *new_data = hip;
  84.     return 1;
  85. }
  86. void hostcache_init(void)
  87. {
  88.     cache_init(&hostname_cache,
  89.        hostcache_refresh, hostcache_ttl, hostcache_gc_interval,
  90.        hostcache_size, NULL,
  91.        hostinfo_free, hostinfo_update_byname);
  92.     
  93.     cache_init(&hostaddr_cache,
  94.        hostcache_refresh, hostcache_ttl, hostcache_gc_interval,
  95.        hostcache_size, NULL,
  96.        hostinfo_free, hostinfo_update_byaddr);
  97. }
  98. void hostcache_release(void *cache_key)
  99. {
  100.     if (debug > 2)
  101. fprintf(stderr, "hostcache_release(), p-key=%08xn",
  102. (unsigned int) cache_key);
  103.     
  104.     cache_release(cache_key);
  105. }
  106. void *hostcache_lookup_byname(char *hostname,
  107.       unsigned int flags,
  108.       struct hostent **hep)
  109. {
  110.     cacheentry_t *cep;
  111.     struct hostinfo *hip;
  112.     
  113.     if (debug > 2)
  114. fprintf(stderr, "hostcache_lookup_byname(), host=%sn", hostname);
  115.     
  116.     cep = cache_lookup(&hostname_cache,
  117.        hostname, 0,
  118.        NULL, flags);
  119.     hip = cep->data;
  120.     *hep = &hip->hb;
  121.     return cep;
  122. }
  123.     
  124. void *hostcache_lookup_byaddr(void *addr,
  125.       unsigned int flags,
  126.       struct hostent **hep)
  127. {
  128.     cacheentry_t *cep;
  129.     struct hostinfo *hip;
  130.     
  131.     if (debug > 2)
  132. fprintf(stderr, "hostcache_lookup_byaddr(), addr=%sn",
  133. inet_ntoa(*(struct in_addr *) addr));
  134.     
  135.     cep = cache_lookup(&hostaddr_cache,
  136.        addr, sizeof(struct in_addr),
  137.        NULL, flags);
  138.     hip = cep->data;
  139.     *hep = &hip->hb;
  140.     return cep;
  141. }
  142.     
  143. int hostcache_getstats_byname(cachestat_t *csp)
  144. {
  145.     return cache_getstats(&hostname_cache, csp);
  146. }
  147. int hostcache_getstats_byaddr(cachestat_t *csp)
  148. {
  149.     return cache_getstats(&hostaddr_cache, csp);
  150. }