authstaticlistsearch.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:2k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 2000 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #include "auth.h"
  6. #include "authstaticlist.h"
  7. #include <stdio.h>
  8. #include <errno.h>
  9. #include <ctype.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #if HAVE_FCNTL_H
  13. #include <fcntl.h>
  14. #endif
  15. #if HAVE_UNISTD_H
  16. #include <unistd.h>
  17. #endif
  18. static const char rcsid[]="$Id: authstaticlistsearch.c,v 1.1 2000/02/28 05:02:27 mrsam Exp $";
  19. static char *configfile=0;
  20. static int has_init;
  21. static void openconfigfile(const char *filename)
  22. {
  23. int fd=open(filename, O_RDONLY);
  24. char buf[BUFSIZ];
  25. int i;
  26. has_init=1;
  27. if (fd < 0)
  28. {
  29. if (errno != ENOENT)
  30. perror(filename);
  31. return;
  32. }
  33. i=read(fd, buf, sizeof(buf));
  34. close(fd);
  35. if (i < 0)
  36. {
  37. perror(filename);
  38. return;
  39. }
  40. if ((configfile=malloc(i+1)) == 0)
  41. {
  42. perror("malloc");
  43. return;
  44. }
  45. memcpy(configfile, buf, i);
  46. configfile[i]=0;
  47. }
  48. struct callback_func {
  49. int (*callback)(struct authinfo *, void *);
  50. /* Original callback func */
  51. void *callback_arg; /* Original callback arg */
  52. unsigned i; /* Current index in authstaticlist */
  53. } ;
  54. static int my_callback(struct authinfo *a, void *p)
  55. {
  56. struct callback_func *f=(struct callback_func *)p;
  57. a->staticindex=f->i;
  58. return ( (*f->callback)(a, f->callback_arg));
  59. }
  60. int authstaticlist_search(const char *userid, const char *service,
  61. const char *filename,
  62. int (*callback)(struct authinfo *, void *),
  63. void *callback_arg)
  64. {
  65. int i, rc;
  66. const char *p;
  67. char namebuf[32]; /* Names of authentication modules should fit in here */
  68. struct callback_func c;
  69. c.callback=callback;
  70. c.callback_arg=callback_arg;
  71. if (!has_init) openconfigfile(filename);
  72. if (!configfile)
  73. {
  74. for (i=0; authstaticlist[i].auth_name; i++)
  75. {
  76. c.i=i;
  77. if ((rc=(*authstaticlist[i].auth_prefunc)(userid,
  78. service,
  79. &my_callback, &c)) == 0)
  80. return (0);
  81. if (rc > 0) return (rc);
  82. }
  83. return (-1);
  84. }
  85. p=configfile;
  86. while (*p)
  87. {
  88. if ( isspace((int)(unsigned char)*p))
  89. {
  90. ++p;
  91. continue;
  92. }
  93. for (i=0; p[i] && !isspace((int)(unsigned char)p[i]); i++)
  94. ;
  95. namebuf[0]=0;
  96. strncat(namebuf, p, i < sizeof(namebuf)-1 ? i:
  97. sizeof(namebuf)-1);
  98. p += i;
  99. for (i=0; authstaticlist[i].auth_name; i++)
  100. {
  101. if (strcmp(authstaticlist[i].auth_name, namebuf))
  102. continue;
  103. c.i=i;
  104. if ((rc=(*authstaticlist[i].auth_prefunc)(userid,
  105. service,
  106. &my_callback, &c)) >= 0)
  107. return (rc);
  108. break;
  109. }
  110. }
  111. return (-1);
  112. }