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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** usercache.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 usercache_refresh = 120;
  21. int usercache_ttl = 120;
  22. int usercache_gc_interval = 600;
  23. int usercache_size = 101;
  24. static cache_t username_cache;
  25. static void userinfo_free(void *data)
  26. {
  27.     struct userinfo *uip = data;
  28.     
  29.     
  30.     if (debug > 2)
  31. fprintf(stderr, "userinfo_free(), user=%sn", uip->pwb.pw_name);
  32.     s_free(data);
  33. }
  34. static int userinfo_update(void *key,
  35.    unsigned int keylen,
  36.    void *data,
  37.    void **new_data,
  38.    void *misc)
  39. {
  40.     struct userinfo *uip;
  41.     unsigned int flags;
  42.     
  43.     flags = (misc ? *(unsigned int *)misc : 0);
  44.     if (debug > 2)
  45. fprintf(stderr, "userinfo_update(), user=%s, flags=%dn",
  46. (char *) key, flags);
  47.     uip = s_malloc(sizeof(struct userinfo));
  48.     if (s_getpwnam_r((const char *) key, 
  49.      &uip->pwb,
  50.      uip->buf, sizeof(uip->buf)) == NULL)
  51.     {
  52. s_free(uip);
  53. *new_data = NULL;
  54.     }
  55.     else
  56. *new_data = uip;
  57.     return 1;
  58. }
  59. void usercache_init(void)
  60. {
  61.     cache_init(&username_cache,
  62.        usercache_refresh, usercache_ttl, usercache_gc_interval,
  63.        usercache_size, NULL, userinfo_free, userinfo_update);
  64. }
  65. void usercache_release(void *cache_key)
  66. {
  67.     if (debug > 2)
  68. fprintf(stderr, "usercache_release(), p-key=%08xn",
  69. (unsigned int) cache_key);
  70.     cache_release(cache_key);
  71. }
  72. void *usercache_lookup(char *username,
  73.        unsigned int flags,
  74.        struct passwd **pwp)
  75. {
  76.     cacheentry_t *cep;
  77.     struct userinfo *uip;
  78.     
  79.     if (debug > 2)
  80. fprintf(stderr, "usercache_lookup(), user=%sn", username);
  81.     cep = cache_lookup(&username_cache,
  82.        username, 0,
  83.        NULL, flags);
  84.     uip = cep->data;
  85.     *pwp = &uip->pwb;
  86.     return cep;
  87. }
  88.     
  89.     
  90. int usercache_getstats(cachestat_t *csp)
  91. {
  92.     return cache_getstats(&username_cache, csp);
  93. }