getpwnamuid.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6. #if defined(LIBC_SCCS) && !defined(lint)
  7. static char sccsid[] = "@(#)getpwnamuid.c 5.3 (Berkeley) 12/21/87";
  8. #endif
  9. #include <stdio.h>
  10. #include <pwd.h>
  11. #include <sys/file.h>
  12. #include "pwd_internal.h"
  13. /*
  14.  * The following are shared with getpwent.c
  15.  */
  16. #ifdef DBM_PWD_SUPPORT
  17. static struct passwd *
  18. fetchpw(key)
  19. datum key;
  20. {
  21.     char *cp, *tp;
  22. pwf_context_t *_data;
  23. _data = _pw_get_data();
  24. if (!_data)
  25.     return 0;
  26.     if (key.dptr == 0)
  27.         return ((struct passwd *)NULL);
  28. key = dbm_fetch(_data->pw_db, key);
  29. if (key.dptr == 0)
  30.                 return ((struct passwd *)NULL);
  31.         cp = key.dptr;
  32. tp = _data->line;
  33. #define EXPAND(e) _data->passwd.e = tp; while (*tp++ = *cp++);
  34. EXPAND(pw_name);
  35. EXPAND(pw_passwd);
  36. memcpy((char *)&_data->passwd.pw_uid, cp, sizeof (int));
  37. cp += sizeof (int);
  38. memcpy((char *)&_data->passwd.pw_gid, cp, sizeof (int));
  39. cp += sizeof (int);
  40. EXPAND(pw_gecos);
  41. EXPAND(pw_dir);
  42. EXPAND(pw_shell);
  43.     return (&_data->passwd);
  44. }
  45. #endif /* DBM_PWD_SUPPORT */
  46. struct passwd *
  47. getpwnam(nam)
  48. const char *nam;
  49. {
  50. #ifdef DBM_PWD_SUPPORT
  51.     datum key;
  52. #endif
  53. struct passwd *pw, *getpwent();
  54. pwf_context_t *_data;
  55. _data = _pw_get_data();
  56. if (!_data)
  57.     return 0;
  58. #ifdef DBM_PWD_SUPPORT
  59.     if (_data->pw_db == (DBM *)0 &&
  60. (_data->pw_db = dbm_open(_data->pw_file, O_RDONLY)) == (DBM *)0) {
  61. oldcode:
  62. #endif
  63.   setpwent();
  64.   while ((pw = getpwent()) && strcmp(nam, pw->pw_name))
  65. ;
  66.   if (!_data->pw_stayopen)
  67. endpwent();
  68.   return (pw);
  69. #ifdef DBM_PWD_SUPPORT
  70. }
  71. if (flock(dbm_dirfno(_data->pw_db), LOCK_SH) < 0) {
  72. dbm_close(_data->pw_db);
  73. _data->pw_db = (DBM *)0;
  74. goto oldcode;
  75. }
  76. key.dptr = nam;
  77. key.dsize = strlen(nam);
  78. pw = fetchpw(key);
  79. (void) flock(dbm_dirfno(_data->pw_db), LOCK_UN);
  80. if (!_data->pw_stayopen) {
  81.   dbm_close(_data->pw_db);
  82.   _data->pw_db = (DBM *)0;
  83. }
  84. return (pw);
  85. #endif
  86. }
  87. struct passwd *
  88. getpwuid(uid)
  89. uid_t uid;
  90. {
  91. #ifdef DBM_PWD_SUPPORT
  92.         datum key;
  93. #endif
  94. struct passwd *pw, *getpwent();
  95. pwf_context_t *_data;
  96. _data = _pw_get_data();
  97. if (!_data)
  98.     return 0;
  99. #ifdef DBM_PWD_SUPPORT
  100.     if (_data->pw_db == (DBM *)0 &&
  101.     (_data->pw_db = dbm_open(_data->pw_file, O_RDONLY)) == (DBM *)0) {
  102. oldcode:
  103. #endif
  104.   setpwent();
  105.   while ((pw = getpwent()) && pw->pw_uid != uid)
  106. ;
  107.   if (!_data->pw_stayopen)
  108. endpwent();
  109.   return (pw);
  110. #ifdef DBM_PWD_SUPPORT
  111. }
  112. if (flock(dbm_dirfno(_data->pw_db), LOCK_SH) < 0) {
  113. dbm_close(_data->pw_db);
  114. _data->pw_db = (DBM *)0;
  115. goto oldcode;
  116. }
  117.     key.dptr = (char *) &uid;
  118.     key.dsize = sizeof uid;
  119. pw = fetchpw(key);
  120. (void) flock(dbm_dirfno(_data->pw_db), LOCK_UN);
  121. if (!_data->pw_stayopen) {
  122. dbm_close(_data->pw_db);
  123. _data->pw_db = (DBM *)0;
  124. }
  125.     return (pw);
  126. #endif
  127. }