usr/src/lib/libc/port/gen/getgrnam_r.c
author eschrock
Fri, 19 Aug 2005 11:56:37 -0700
changeset 380 4ae8f505c115
parent 0 68f95e015346
child 1914 8a8c5f225b1b
permissions -rw-r--r--
6307489 getmntany() should not stat meaningless special devices
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#pragma weak endgrent = _endgrent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#pragma weak setgrent = _setgrent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#pragma weak getgrnam_r = _getgrnam_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#pragma weak getgrgid_r = _getgrgid_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#pragma weak getgrent_r = _getgrent_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#pragma weak fgetgrent_r = _fgetgrent_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <grp.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <memory.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <nsswitch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <sys/mman.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#define	__NSS_PRIVATE_INTERFACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include "nsswitch_priv.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#undef	__NSS_PRIVATE_INTERFACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
extern int _getgroupsbymember(const char *, gid_t[], int, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
int str2group(const char *, int, void *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static DEFINE_NSS_DB_ROOT(db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static DEFINE_NSS_GETENT(context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#define	USE_NETID_STR	"NETID_AUTHORITATIVE=TRUE"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
_nss_initf_group(nss_db_params_t *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	p->name	= NSS_DBNAM_GROUP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	p->default_config = NSS_DEFCONF_GROUP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include <getxby_door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include <sys/door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
process_getgr(struct group *result, char *buffer, int buflen,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
    nsc_data_t *sptr, int ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
_uncached_getgrnam_r(const char *name, struct group *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
    int buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
_uncached_getgrgid_r(gid_t gid, struct group *result, char *buffer, int buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 * POSIX.1c Draft-6 version of the function getgrnam_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 * It was implemented by Solaris 2.3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
_getgrnam_r(const char *name, struct group *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	 * allocate room on the stack for the nscd to return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	 * group and group member information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
		nsc_data_t	s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		char		s_b[8192];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	} space;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	nsc_data_t	*sptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	int		ndata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	int		adata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	struct group	*resptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if ((name == (const char *)NULL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	    (strlen(name) >= (sizeof (space) - sizeof (nsc_data_t)))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		errno = ERANGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	ndata = sizeof (space);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	adata = strlen(name) + sizeof (nsc_call_t) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	space.s_d.nsc_call.nsc_callnumber = GETGRNAM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	(void) strcpy(space.s_d.nsc_call.nsc_u.name, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	sptr = &space.s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	switch (_nsc_trydoorcall(&sptr, &ndata, &adata)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	case SUCCESS:	/* positive cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	case NOTFOUND:	/* negative cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		return ((struct group *)_uncached_getgrnam_r(name, result,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		    buffer, buflen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	resptr = process_getgr(result, buffer, buflen, sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	 * check to see if doors reallocated memory underneath us
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	 * if they did munmap the memory or suffer a memory leak
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	if (sptr != &space.s_d)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		munmap((void *)sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	return (resptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
 * POSIX.1c Draft-6 version of the function getgrgid_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
 * It was implemented by Solaris 2.3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
_getgrgid_r(gid_t gid, struct group *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	 * allocate room on the stack for the nscd to return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	 * group and group member information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		nsc_data_t	s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		char		s_b[8192];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	} space;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	nsc_data_t	*sptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	int		ndata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	int		adata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	struct group	*resptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	ndata = sizeof (space);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	adata = sizeof (nsc_call_t) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	space.s_d.nsc_call.nsc_callnumber = GETGRGID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	space.s_d.nsc_call.nsc_u.gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	sptr = &space.s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	switch (_nsc_trydoorcall(&sptr, &ndata, &adata)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	case SUCCESS:	/* positive cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	case NOTFOUND:	/* negative cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		return ((struct group *)_uncached_getgrgid_r(gid, result,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		    buffer, buflen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	resptr = process_getgr(result, buffer, buflen, sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	 * check to see if doors reallocated memory underneath us
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	 * if they did munmap the memory or suffer a memory leak
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	if (sptr != &space.s_d)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		munmap((void *)sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	return (resptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 *  This routine should be rewritten - there's no reason it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 *  cannot be the same code for 32 and 64 bit w/ a bit of care.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
/* ARGSUSED4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
static struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
process_getgr(struct group *result, char *buffer, int buflen,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
    nsc_data_t *sptr, int ndata)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	char *fixed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	char	*buffer32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	char	**gr_mem32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	uptr32_t	index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	struct group	group64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
#endif	/*	_LP64	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
/* align buffer on a pointer boundry 4bytes in 32bits and 8 bytes in 64bits */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	fixed = (char *)(((uintptr_t)buffer + 7) & ~7);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	fixed = (char *)(((uintptr_t)buffer + 3) & ~3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
#endif	/*	_LP64	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	if (buflen <= fixed - buffer) { /* watch out for wrap-around */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		errno = ERANGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	buflen -= fixed - buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	buffer = fixed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	 * this is just a rationality check; we need to make
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	 * sure that there's enough space for the gr_mem array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	 * as well... easiest place to do that is when we copy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	 * them in place.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	if (sptr->nsc_ret.nsc_bufferbytesused +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		 * ^^^ number of bytes from nscd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	    (sizeof (char **)) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
		 * ^^^ we need 8 bytes for gr_mem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	    (sizeof (char *) - 1) -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
		 * ^^^ plus space for pssibly fixing aligment of gr_mem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	    sizeof (group32_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		 * ^^^ because we don't put this in the usr buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	    > buflen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	if (sptr->nsc_ret.nsc_bufferbytesused - sizeof (struct group)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	    > buflen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
#endif	/*	_LP64	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		errno = ERANGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	if (sptr->nsc_ret.nsc_return_code != SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
 * ncsd is a 32bit application, so use 32bit data items if we are in 64bit mode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	(void) memcpy(buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	    (sptr->nsc_ret.nsc_u.buff + sizeof (group32_t)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	    (sptr->nsc_ret.nsc_bufferbytesused - sizeof (group32_t)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	group64.gr_name = (char *)(sptr->nsc_ret.nsc_u.grp.gr_name +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	group64.gr_passwd = (char *)(sptr->nsc_ret.nsc_u.grp.gr_passwd +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	group64.gr_gid = sptr->nsc_ret.nsc_u.grp.gr_gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	group64.gr_mem = (char **)((uintptr_t)buffer +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
			sptr->nsc_ret.nsc_bufferbytesused - sizeof (group32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	group64.gr_mem = (char **)(((uintptr_t)group64.gr_mem + 7) & ~7);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	gr_mem32 = (char **)(uintptr_t)sptr->nsc_ret.nsc_u.grp.gr_mem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	buffer32 = buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	for (i = 0; ; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		index = *((uptr32_t *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		    ((uintptr_t)gr_mem32 + (uintptr_t)buffer32));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		 * make sure there's enough space to copy the pointer...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		if (&group64.gr_mem[i + 1] >
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		    (char **)((uintptr_t)buffer + buflen)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			errno = ERANGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		if (index == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		group64.gr_mem[i] = (char *)(index + buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		buffer32 += sizeof (uptr32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	group64.gr_mem[i] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	*result = group64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	(void) memcpy(buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	    (sptr->nsc_ret.nsc_u.buff + sizeof (struct group)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	    (sptr->nsc_ret.nsc_bufferbytesused - sizeof (struct group)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	sptr->nsc_ret.nsc_u.grp.gr_name += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	sptr->nsc_ret.nsc_u.grp.gr_passwd += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	sptr->nsc_ret.nsc_u.grp.gr_mem =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	    (char **)((uintptr_t)sptr->nsc_ret.nsc_u.grp.gr_mem +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	while (sptr->nsc_ret.nsc_u.grp.gr_mem[i]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		sptr->nsc_ret.nsc_u.grp.gr_mem[i] += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		i++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	*result = sptr->nsc_ret.nsc_u.grp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
#endif	/*	_LP64	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	return (result);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
_uncached_getgrgid_r(gid_t gid, struct group *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
    int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2group);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	arg.key.gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	(void) nss_search(&db_root, _nss_initf_group,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
				NSS_DBOP_GROUP_BYGID, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	return ((struct group *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
 * POSIX.1c standard version of the function getgrgid_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
 * User gets it via static getgrgid_r from the header file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
__posix_getgrgid_r(gid_t gid, struct group *grp, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
    size_t bufsize, struct group **result)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	int nerrno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	int oerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	if ((*result = _getgrgid_r(gid, grp, buffer, (uintptr_t)bufsize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		== NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
			nerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	errno = oerrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	return (nerrno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
extern struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
_getgrnam_r(const char *name, struct group *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	int buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
_uncached_getgrnam_r(const char *name, struct group *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2group);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	arg.key.name = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	(void) nss_search(&db_root, _nss_initf_group,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			NSS_DBOP_GROUP_BYNAME, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	return ((struct group *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
 * POSIX.1c standard version of the function getgrnam_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 * User gets it via static getgrnam_r from the header file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
__posix_getgrnam_r(const char *name, struct group *grp, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
    size_t bufsize, struct group **result)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	int nerrno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	int oerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	if ((*result = _getgrnam_r(name, grp, buffer, (uintptr_t)bufsize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		== NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
			nerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	errno = oerrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	return (nerrno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
setgrent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	nss_setent(&db_root, _nss_initf_group, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
endgrent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	nss_endent(&db_root, _nss_initf_group, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	nss_delete(&db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
getgrent_r(struct group *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	char		*nam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	/* In getXXent_r(), protect the unsuspecting caller from +/- entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		NSS_XbyY_INIT(&arg, result, buffer, buflen, str2group);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		/* No key to fill in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		(void) nss_getent(&db_root, _nss_initf_group, &context, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	} while (arg.returnval != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		(nam = ((struct group *)arg.returnval)->gr_name) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		(*nam == '+' || *nam == '-'));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	return ((struct group *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
struct group *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
fgetgrent_r(FILE *f, struct group *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	extern void	_nss_XbyY_fgets(FILE *, nss_XbyY_args_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	nss_XbyY_args_t	arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	/* ... but in fgetXXent_r, the caller deserves any +/- entry he gets */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	/* No key to fill in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2group);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	_nss_XbyY_fgets(f, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	return ((struct group *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
 * _getgroupsbymember(uname, gid_array, maxgids, numgids):
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
 *	Private interface for initgroups().  It returns the group ids of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
 *	groups of which the specified user is a member.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
 * Arguments:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
 *   username	Username of the putative member
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
 *   gid_array	Space in which to return the gids.  The first [numgids]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
 *		elements are assumed to already contain valid gids.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
 *   maxgids	Maximum number of elements in gid_array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
 *   numgids	Number of elements (normally 0 or 1) that already contain
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
 *		valid gids.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
 * Return value:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
 *   number of valid gids in gid_array (may be zero)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
 *	or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
 *   -1 (and errno set appropriately) on errors (none currently defined)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
static nss_status_t process_cstr(const char *, int, struct nss_groupsbymem *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
_getgroupsbymember(const char *username, gid_t gid_array[],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
    int maxgids, int numgids)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	struct nss_groupsbymem	arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	char defval[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	__NSL_FILE *defl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	arg.username	= username;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	arg.gid_array	= gid_array;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	arg.maxgids	= maxgids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	arg.numgids	= numgids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	arg.str2ent	= str2group;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	arg.process_cstr = process_cstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	 * The old value being provided here was 0, ie do the quick
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	 * way.  Given that this was never actually used under NIS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	 * and had the wrong (now corrected) meaning for NIS+ we need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	 * to change the default to be 1 (TRUE) as we now need the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	 * admin to decided to use netid, setting NETID_AUTHORITATIVE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	 * in /etc/default/nss to TRUE gets us a value of 0 for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	 * force_slow_way - don't you just love double negatives ;-)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	 * We need to do this to preserve the behaviour seen when the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	 * admin makes no changes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	arg.force_slow_way = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	 * The "easy" way to do /etc/default/nss is to use the defread()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	 * stuff from libcmd, but since we are in libc we don't want to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	 * link ourselfs against libcmd, so instead we just do it by hand
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	if ((defl = __nsl_c_fopen(__NSW_DEFAULT_FILE, "r")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
		while (__nsl_c_fgets(defval, sizeof (defval), defl) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
			if (strncmp(USE_NETID_STR, defval,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
			    sizeof (USE_NETID_STR) - 1) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
				arg.force_slow_way = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
		(void) __nsl_c_fclose(defl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	(void) nss_search(&db_root, _nss_initf_group,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
			NSS_DBOP_GROUP_BYMEMBER, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
#ifdef	undef
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	 * Only do this if there's existing code somewhere that relies on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	 *   initgroups() doing an endgrent() -- most unlikely.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	endgrent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
#endif	/* undef */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	return (arg.numgids);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
gettok(char **nextpp, char sep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	char	*p = *nextpp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	char	*q = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	char	c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	if (p == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	while ((c = *q) != '\0' && c != sep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
		q++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	if (c == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
		*nextpp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		*q++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		*nextpp = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
 * Return values: 0 = success, 1 = parse error, 2 = erange ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
 * The structure pointer passed in is a structure in the caller's space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
 * wherein the field pointers would be set to areas in the buffer if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
 * need be. instring and buffer should be separate areas.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
str2group(const char *instr, int lenstr, void *ent, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	struct group		*group	= (struct group *)ent;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	char			*p, *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	int			black_magic;	/* "+" or "-" entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	char			**memlist, **limit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	if (lenstr + 1 > buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
		return (NSS_STR_PARSE_ERANGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	 * We copy the input string into the output buffer and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	 * operate on it in place.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	(void) memcpy(buffer, instr, lenstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	buffer[lenstr] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	next = buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	 * Parsers for passwd and group have always been pretty rigid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	 * we wouldn't want to buck a Unix tradition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	group->gr_name = p = gettok(&next, ':');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	if (*p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
		/* Empty group-name;  not allowed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
		return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	/* Always return at least an empty gr_mem list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	memlist	= (char **)ROUND_UP(buffer + lenstr + 1, sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	limit	= (char **)ROUND_DOWN(buffer + buflen, sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	*memlist = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	group->gr_mem = memlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	black_magic = (*p == '+' || *p == '-');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	if (black_magic) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		/* Then the rest of the group entry is optional */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		group->gr_passwd = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		group->gr_gid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	group->gr_passwd = p = gettok(&next, ':');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	p = next;					/* gid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	if (p == 0 || *p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	if (!black_magic) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		group->gr_gid = (gid_t)strtol(p, &next, 10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		if (next == p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
			/* gid field should be nonempty */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
		 * gids should be non-negative; anything else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
		 * is administrative policy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
		if (group->gr_gid < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
			group->gr_gid = GID_NOBODY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	if (*next++ != ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
		/* Parse error, even for a '+' entry (which should have	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		/*   an empty gid field, since it's always overridden)	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
		return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	/* === Could check and complain if there are any extra colons */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	while (memlist < limit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
		p = gettok(&next, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
		if (p == 0 || *p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
			*memlist = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			/* Successfully parsed and stored */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		*memlist++ = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	/* Out of space;  error even for black_magic */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	return (NSS_STR_PARSE_ERANGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
static nss_status_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
process_cstr(const char *instr, int instr_len, struct nss_groupsbymem *gbm)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	 * It's possible to do a much less inefficient version of this by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	 * selectively duplicating code from str2group().  For now,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	 * however, we'll take the easy way out and implement this on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	 * top of str2group().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	const char		*username = gbm->username;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	nss_XbyY_buf_t		*buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
	struct group		*grp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
	char			**memp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	char			*mem;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	int	parsestat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	buf = _nss_XbyY_buf_alloc(sizeof (struct group), NSS_BUFLEN_GROUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	if (buf == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
		return (NSS_UNAVAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	grp = (struct group *)buf->result;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	parsestat = (*gbm->str2ent)(instr, instr_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
				    grp, buf->buffer, buf->buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	if (parsestat != NSS_STR_PARSE_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		_nss_XbyY_buf_free(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
		return (NSS_NOTFOUND);	/* === ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	if (grp->gr_mem) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
		for (memp = grp->gr_mem; (memp) && ((mem = *memp) != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
								memp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
			if (strcmp(mem, username) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
				gid_t	gid 	= grp->gr_gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
				gid_t	*gidp	= gbm->gid_array;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
				int	numgids	= gbm->numgids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
				int	i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
				_nss_XbyY_buf_free(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
				for (i = 0; i < numgids && *gidp != gid; i++,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
								gidp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
					;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
				if (i >= numgids) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
					if (i >= gbm->maxgids) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
					/* Filled the array;  stop searching */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
						return (NSS_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
					*gidp = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
					gbm->numgids = numgids + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
				return (NSS_NOTFOUND);	/* Explained in   */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
							/* <nss_dbdefs.h> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	_nss_XbyY_buf_free(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	return (NSS_NOTFOUND);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
}