#include <search.h>
#include <assert.h>
+#include "nss_utils.h"
/*
* Defining _POSIX_PTHREAD_SEMANTICS before including pwd.h and grp.h gives us
* the posix getpwnam_r(), getpwuid_r(), getgrnam_r and getgrgid_r calls on
nwrap_gr->idx = 0;
}
-static int nwrap_gr_copy_r(const struct group *src, struct group *dst,
- char *buf, size_t buflen, struct group **dstp)
-{
- char *p = NULL;
- uintptr_t align = 0;
- unsigned int gr_mem_cnt = 0;
- unsigned i;
- size_t total_len;
- size_t gr_name_len = strlen(src->gr_name) + 1;
- size_t gr_passwd_len = strlen(src->gr_passwd) + 1;
- union {
- char *ptr;
- char **data;
- } g_mem;
-
- for (i = 0; src->gr_mem[i] != NULL; i++) {
- gr_mem_cnt++;
- }
-
- /* Align the memory for storing pointers */
- align = __alignof__(char *) - ((p - (char *)0) % __alignof__(char *));
- total_len = align +
- (1 + gr_mem_cnt) * sizeof(char *) +
- gr_name_len + gr_passwd_len;
-
- if (total_len > buflen) {
- errno = ERANGE;
- return -1;
- }
- buflen -= total_len;
-
- /* gr_mem */
- p = buf + align;
- g_mem.ptr = p;
- dst->gr_mem = g_mem.data;
-
- /* gr_name */
- p += (1 + gr_mem_cnt) * sizeof(char *);
- dst->gr_name = p;
-
- /* gr_passwd */
- p += gr_name_len;
- dst->gr_passwd = p;
-
- /* gr_mem[x] */
- p += gr_passwd_len;
-
- /* gr_gid */
- dst->gr_gid = src->gr_gid;
-
- memcpy(dst->gr_name, src->gr_name, gr_name_len);
-
- memcpy(dst->gr_passwd, src->gr_passwd, gr_passwd_len);
-
- /* Set the terminating entry */
- dst->gr_mem[gr_mem_cnt] = NULL;
-
- /* Now add the group members content */
- total_len = 0;
- for (i = 0; i < gr_mem_cnt; i++) {
- size_t len = strlen(src->gr_mem[i]) + 1;
-
- dst->gr_mem[i] = p;
- total_len += len;
- p += len;
- }
-
- if (total_len > buflen) {
- errno = ERANGE;
- return -1;
- }
-
- for (i = 0; i < gr_mem_cnt; i++) {
- size_t len = strlen(src->gr_mem[i]) + 1;
-
- memcpy(dst->gr_mem[i],
- src->gr_mem[i],
- len);
- }
-
- if (dstp != NULL) {
- *dstp = dst;
- }
-
- return 0;
-}
-
static struct nwrap_entlist *nwrap_entlist_init(struct nwrap_entdata *ed)
{
struct nwrap_entlist *el;