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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include "dbobj.h"
  9. #include "userdb.h"
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <errno.h>
  13. #include <time.h>
  14. #include <sys/types.h>
  15. #if HAVE_SYS_STAT_H
  16. #include <sys/stat.h>
  17. #endif
  18. static const char rcsid[]="$Id: userdb.c,v 1.3 1999/12/15 05:22:48 mrsam Exp $";
  19. static struct dbobj d;
  20. static time_t dt;
  21. static ino_t di;
  22. static int initialized=0;
  23. /* Open userdb.dat, if already opened, see if it changed, if so reopen */
  24. void userdb_init(const char *n)
  25. {
  26. struct stat stat_buf;
  27. if (initialized)
  28. {
  29. if (stat(n, &stat_buf) ||
  30. stat_buf.st_mtime != dt ||
  31. stat_buf.st_ino != di)
  32. {
  33. dbobj_close(&d);
  34. initialized=0;
  35. dt=stat_buf.st_mtime;
  36. di=stat_buf.st_ino;
  37. }
  38. }
  39. else if (stat(n, &stat_buf))
  40. {
  41. return;
  42. }
  43. else
  44. {
  45. dt=stat_buf.st_mtime;
  46. di=stat_buf.st_ino;
  47. }
  48. if (!initialized)
  49. {
  50. if (dbobj_open(&d, n, "R"))
  51. {
  52. return;
  53. }
  54. initialized=1;
  55. }
  56. }
  57. void userdb_close()
  58. {
  59. if (initialized)
  60. {
  61. dbobj_close(&d);
  62. initialized=0;
  63. }
  64. }
  65. /* Fetch a record from userdb.dat */
  66. char *userdb(const char *u)
  67. {
  68. char *p,*q;
  69. size_t l;
  70. if (!initialized)
  71. {
  72. errno=ENOENT;
  73. return (0);
  74. }
  75. q=dbobj_fetch(&d, u, strlen(u), &l, "");
  76. if (!q)
  77. {
  78. errno=ENOENT;
  79. return(0);
  80. }
  81. p=malloc(l+1);
  82. if (!p) return (0);
  83. if (l) memcpy(p, q, l);
  84. free(q);
  85. p[l]=0;
  86. return (p);
  87. }
  88. /* Return a pointer to a specific field in this record */
  89. const char *userdb_get(const char *u, const char *n, int *l)
  90. {
  91. int nl=strlen(n);
  92. while (u && *u)
  93. {
  94. if (memcmp(u, n, nl) == 0 &&
  95. (u[nl] == 0 || u[nl] == '=' || u[nl] == '|'))
  96. {
  97. u += nl;
  98. *l=0;
  99. if (*u == '=')
  100. {
  101. ++u;
  102. while ( u[*l] && u[*l] != '|')
  103. ++ *l;
  104. }
  105. return (u);
  106. }
  107. u=strchr(u, '|');
  108. if (u) ++u;
  109. }
  110. return (0);
  111. }
  112. /* Extract field as an unsigned int */
  113. unsigned userdb_getu(const char *u, const char *n, unsigned defnum)
  114. {
  115. unsigned l;
  116. const char *p;
  117. if ((p=userdb_get(u, n, &l)) != 0)
  118. {
  119. defnum=0;
  120. while (l && *p >= '0' && *p <= '9')
  121. {
  122. defnum = defnum * 10 + (*p++ - '0');
  123. --l;
  124. }
  125. }
  126. return (defnum);
  127. }
  128. /* Extract a field into a dynamically allocated buffer */
  129. char *userdb_gets(const char *u, const char *n)
  130. {
  131. unsigned l;
  132. const char *p;
  133. char *q;
  134. if ((p=userdb_get(u, n, &l)) != 0)
  135. {
  136. q=malloc(l+1);
  137. if (!q)
  138. return (0);
  139. if (l) memcpy(q, p, l);
  140. q[l]=0;
  141. return (q);
  142. }
  143. errno=ENOENT;
  144. return (0);
  145. }
  146. /* Create a userdbs structure based upon a uid (reverse lookup) */
  147. struct userdbs *userdb_createsuid(uid_t u)
  148. {
  149. char buf[80];
  150. char *p=buf+sizeof(buf)-1, *q;
  151. struct userdbs *s;
  152. /* Lookup uid= record */
  153. *p=0;
  154. *--p='=';
  155. do
  156. {
  157. *--p= "0123456789"[u % 10];
  158. u=u/10;
  159. } while (u);
  160. p=userdb(p);
  161. if (!p) return (0);
  162. /* Have account name, now look it up. */
  163. q=userdb(p);
  164. if (!q)
  165. {
  166. free(p);
  167. return (0);
  168. }
  169. s=userdb_creates(q);
  170. if (s)
  171. s->udb_name=p;
  172. else
  173. free(p);
  174. free(q);
  175. return (s);
  176. }
  177. /* Extracted a userdb.dat record, convert it to a userdbs structure */
  178. struct userdbs *userdb_creates(const char *u)
  179. {
  180. struct userdbs *udbs=(struct userdbs *)malloc(sizeof(struct userdbs));
  181. char *s;
  182. if (!udbs) return (0);
  183. memset((char *)udbs, 0, sizeof(*udbs));
  184. if ((udbs->udb_dir=userdb_gets(u, "home")) == 0)
  185. {
  186. userdb_frees(udbs);
  187. return (0);
  188. }
  189. if ((s=userdb_gets(u, "uid")) != 0)
  190. {
  191. udbs->udb_uid=atol(s);
  192. free(s);
  193. if ((s=userdb_gets(u, "gid")) != 0)
  194. {
  195. udbs->udb_gid=atol(s);
  196. free(s);
  197. if ((s=userdb_gets(u, "shell")) != 0)
  198. udbs->udb_shell=s;
  199. else if (errno != ENOENT)
  200. {
  201. userdb_frees(udbs);
  202. return (0);
  203. }
  204. if ((s=userdb_gets(u, "mail")) != 0)
  205. udbs->udb_mailbox=s;
  206. else if (errno != ENOENT)
  207. {
  208. userdb_frees(udbs);
  209. return (0);
  210. }
  211. if ((s=userdb_gets(u, "quota")) != 0)
  212. udbs->udb_quota=s;
  213. else if (errno != ENOENT)
  214. {
  215. userdb_frees(udbs);
  216. return (0);
  217. }
  218. if ((s=userdb_gets(u, "gecos")) != 0)
  219. udbs->udb_gecos=s;
  220. else if (errno != ENOENT)
  221. {
  222. userdb_frees(udbs);
  223. return (0);
  224. }
  225. return (udbs);
  226. }
  227. }
  228. userdb_frees(udbs);
  229. return (0);
  230. }
  231. void userdb_frees(struct userdbs *u)
  232. {
  233. if (u->udb_name) free(u->udb_name);
  234. if (u->udb_gecos) free(u->udb_gecos);
  235. if (u->udb_dir) free(u->udb_dir);
  236. if (u->udb_shell) free(u->udb_shell);
  237. if (u->udb_mailbox) free(u->udb_mailbox);
  238. if (u->udb_quota) free(u->udb_quota);
  239. free(u);
  240. }