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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #include <pwd.h>
  13. #if HAVE_UNISTD_H
  14. #include <unistd.h>
  15. #endif
  16. #include "auth.h"
  17. #include "userdb/userdb.h"
  18. static const char rcsid[]="$Id: preauthuserdbcommon.c,v 1.13 2000/03/01 23:01:36 mrsam Exp $";
  19. int auth_userdb_pre_common(const char *userid, const char *service,
  20. int needpass,
  21. int (*callback)(struct authinfo *, void *),
  22.                         void *arg)
  23. {
  24. char *u;
  25. struct userdbs *udb;
  26. struct authinfo auth;
  27. char *udbs;
  28. char *services;
  29. char *passwords=0;
  30. int rc;
  31. userdb_init(USERDB ".dat");
  32.         if ( (u=userdb(userid)) == 0)
  33. {
  34. userdb_close();
  35. return (-1);
  36. }
  37.         if ((udb=userdb_creates(u)) == 0)
  38.         {
  39. free(u);
  40.                 return (-1);
  41.         }
  42. free(u);
  43.         memset(&auth, 0, sizeof(auth));
  44.         auth.sysusername=userid;
  45. auth.sysuserid= &udb->udb_uid;
  46.         auth.sysgroupid=udb->udb_gid;
  47.         auth.homedir=udb->udb_dir;
  48.         auth.address=userid;
  49.         auth.fullname=udb->udb_gecos;
  50. if (needpass)
  51. {
  52. udbs=userdbshadow(USERDB "shadow.dat", userid);
  53. if ((services=malloc(strlen(service)+sizeof("pw"))) == 0)
  54. {
  55. perror("malloc");
  56. if (udbs) free(udbs);
  57. userdb_frees(udb);
  58. return (1);
  59. }
  60. strcat(strcpy(services, service), "pw");
  61. passwords=udbs ? userdb_gets(udbs, services):0;
  62. free(services);
  63. if (passwords == 0)
  64. passwords=udbs ? userdb_gets(udbs, "systempw"):0;
  65. auth.passwd=passwords;
  66. if (udbs) free(udbs);
  67. }
  68. auth.maildir=udb->udb_mailbox;
  69. auth.quota=udb->udb_quota;
  70. rc= (*callback)(&auth, arg);
  71. if (passwords) free(passwords);
  72. userdb_frees(udb);
  73. return (rc);
  74. }
  75. void auth_userdb_cleanup()
  76. {
  77. userdb_close();
  78. }