summaryrefslogtreecommitdiff
path: root/devel/linuxthreads/files/getpw_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'devel/linuxthreads/files/getpw_r.c')
-rw-r--r--devel/linuxthreads/files/getpw_r.c108
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;
+}