getpw_r.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:2k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #include <stddef.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <pwd.h>
  5. #include "pthread.h"
  6. static pthread_mutex_t getpw_mutex = PTHREAD_MUTEX_INITIALIZER;
  7. static int
  8. convert (struct passwd *ret, struct passwd *result,
  9.        char *buf, int buflen)
  10. {
  11.   int len;
  12.   if (!buf) return -1;
  13.   *result = *ret;
  14.   result->pw_name = (char *) buf;
  15.   /* This is the size. */
  16.   len = strlen (ret->pw_name) + 1;
  17.   if (len > buflen) return -1;
  18.   buflen -= len;
  19.   buf += len;
  20.   strcpy (result->pw_name, ret->pw_name);
  21.   result->pw_passwd = (char *) buf;
  22.   /* This is the size. */
  23.   len = strlen (ret->pw_passwd) + 1;
  24.   if (len > buflen) return -1;
  25.   buflen -= len;
  26.   buf += len;
  27.   strcpy (result->pw_passwd, ret->pw_passwd);
  28.   result->pw_gecos = (char *) buf;
  29.   /* This is the size. */
  30.   len = strlen (ret->pw_gecos) + 1;
  31.   if (len > buflen) return -1;
  32.   buflen -= len;
  33.   buf += len;
  34.   strcpy (result->pw_gecos, ret->pw_gecos);
  35.   result->pw_dir = (char *) buf;
  36.   /* This is the size. */
  37.   len = strlen (ret->pw_dir) + 1;
  38.   if (len > buflen) return -1;
  39.   buflen -= len;
  40.   buf += len;
  41.   strcpy (result->pw_dir, ret->pw_dir);
  42.   result->pw_shell = (char *) buf;
  43.   /* This is the size. */
  44.   len = strlen (ret->pw_shell) + 1;
  45.   if (len > buflen) return -1;
  46.   buflen -= len;
  47.   buf += len;
  48.   strcpy (result->pw_shell, ret->pw_shell);
  49.   return 0;
  50. }
  51. int getpwnam_r (const char *name, struct passwd *result,
  52.                 char *buffer, size_t buflen,
  53.                 struct passwd ** resptr)
  54. {
  55.   struct passwd * p;
  56.   int retval;
  57.   pthread_mutex_lock (&getpw_mutex);
  58.   p = getpwnam (name);
  59.   if (p == NULL) {
  60.     *resptr = NULL;
  61.     retval = ESRCH;
  62.   } else
  63.   if (convert (p, result, buffer, buflen) != 0) {
  64.     *resptr = NULL;
  65.     retval = ERANGE;
  66.   } else {
  67.     *resptr = result;
  68.     retval = 0;
  69.   }
  70.   pthread_mutex_unlock (&getpw_mutex);
  71.   return retval;
  72. }
  73. int getpwuid_r (uid_t uid, struct passwd *result, 
  74.                 char *buffer, size_t buflen,
  75.                 struct passwd ** resptr)
  76. {
  77.   struct passwd * p;
  78.   int retval;
  79.   pthread_mutex_lock (&getpw_mutex);
  80.   p = getpwuid (uid);
  81.   if (p == NULL) {
  82.     *resptr = NULL;
  83.     retval = ESRCH;
  84.   } else
  85.   if (convert (p, result, buffer, buflen) != 0) {
  86.     *resptr = NULL;
  87.     retval = ERANGE;
  88.   } else {
  89.     *resptr = result;
  90.     retval = 0;
  91.   }
  92.   pthread_mutex_unlock (&getpw_mutex);
  93.   return retval;
  94. }