diff options
author | Jason Evans <jasone@FreeBSD.org> | 2000-01-04 00:05:24 +0000 |
---|---|---|
committer | Jason Evans <jasone@FreeBSD.org> | 2000-01-04 00:05:24 +0000 |
commit | 1c274b738e16b74f7f1b1ce7ff1d83375da092e6 (patch) | |
tree | f819f4323deed8ddce9b0e2ba26c72ba906adaaf /devel/linuxthreads/files/getpw_r.c | |
parent | Correct typedef problem under 3.x (diff) |
Clean up the port considerably, and fix several serious bugs. There are
still some problems, at least with signal handling and locking on SMP.
Submitted by: dick
Diffstat (limited to 'devel/linuxthreads/files/getpw_r.c')
-rw-r--r-- | devel/linuxthreads/files/getpw_r.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/devel/linuxthreads/files/getpw_r.c b/devel/linuxthreads/files/getpw_r.c new file mode 100644 index 000000000000..5dd44e958ba5 --- /dev/null +++ b/devel/linuxthreads/files/getpw_r.c @@ -0,0 +1,108 @@ +#include <stddef.h> +#include <string.h> +#include <errno.h> +#include <pwd.h> +#include "pthread.h" + +static pthread_mutex_t getpw_mutex = PTHREAD_MUTEX_INITIALIZER; + +static int +convert (struct passwd *ret, struct passwd *result, + char *buf, int buflen) +{ + int len; + + if (!buf) return -1; + + *result = *ret; + + result->pw_name = (char *) buf; + /* This is the size. */ + len = strlen (ret->pw_name) + 1; + if (len > buflen) return -1; + buflen -= len; + buf += len; + strcpy (result->pw_name, ret->pw_name); + + result->pw_passwd = (char *) buf; + /* This is the size. */ + len = strlen (ret->pw_passwd) + 1; + if (len > buflen) return -1; + buflen -= len; + buf += len; + strcpy (result->pw_passwd, ret->pw_passwd); + + result->pw_gecos = (char *) buf; + /* This is the size. */ + len = strlen (ret->pw_gecos) + 1; + if (len > buflen) return -1; + buflen -= len; + buf += len; + strcpy (result->pw_gecos, ret->pw_gecos); + + result->pw_dir = (char *) buf; + /* This is the size. */ + len = strlen (ret->pw_dir) + 1; + if (len > buflen) return -1; + buflen -= len; + buf += len; + strcpy (result->pw_dir, ret->pw_dir); + + result->pw_shell = (char *) buf; + /* This is the size. */ + len = strlen (ret->pw_shell) + 1; + if (len > buflen) return -1; + buflen -= len; + buf += len; + strcpy (result->pw_shell, ret->pw_shell); + + return 0; +} + +int getpwnam_r (const char *name, struct passwd *result, + char *buffer, size_t buflen, + struct passwd ** resptr) +{ + struct passwd * p; + int retval; + + pthread_mutex_lock (&getpw_mutex); + p = getpwnam (name); + if (p == NULL) { + *resptr = NULL; + retval = ESRCH; + } else + if (convert (p, result, buffer, buflen) != 0) { + *resptr = NULL; + retval = ERANGE; + } else { + *resptr = result; + retval = 0; + } + pthread_mutex_unlock (&getpw_mutex); + return retval; +} + +int getpwuid_r (uid_t uid, struct passwd *result, + char *buffer, size_t buflen, + struct passwd ** resptr) +{ + struct passwd * p; + int retval; + + pthread_mutex_lock (&getpw_mutex); + p = getpwuid (uid); + if (p == NULL) { + *resptr = NULL; + retval = ESRCH; + } else + if (convert (p, result, buffer, buflen) != 0) { + *resptr = NULL; + retval = ERANGE; + } else { + *resptr = result; + retval = 0; + } + pthread_mutex_unlock (&getpw_mutex); + return retval; +} |