usr/src/lib/libc/port/gen/getpwnam_r.c
author eschrock
Fri, 19 Aug 2005 11:56:37 -0700
changeset 380 4ae8f505c115
parent 0 68f95e015346
child 2830 5228d1267a01
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 endpwent = _endpwent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#pragma weak setpwent = _setpwent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#pragma weak getpwnam_r = _getpwnam_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#pragma weak getpwuid_r = _getpwuid_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#pragma weak getpwent_r = _getpwent_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#pragma weak fgetpwent_r = _fgetpwent_r
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <pwd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/mman.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
int str2passwd(const char *, int, void *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
static DEFINE_NSS_DB_ROOT(db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
static DEFINE_NSS_GETENT(context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
_nss_initf_passwd(nss_db_params_t *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	p->name	= NSS_DBNAM_PASSWD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	p->default_config = NSS_DEFCONF_PASSWD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <getxby_door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
_uncached_getpwuid_r(uid_t uid, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	int buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
_uncached_getpwnam_r(const char *name, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
    int buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
static struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
process_getpw(struct passwd *result, char *buffer, int buflen,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	nsc_data_t *sptr, int ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
/* ARGSUSED4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
static struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
process_getpw(struct passwd *result, char *buffer, int buflen,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	nsc_data_t *sptr, int ndata)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	char *fixed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	struct passwd	pass64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	fixed = (char *)(((uintptr_t)buffer + 7) & ~7);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	fixed = (char *)(((uintptr_t)buffer + 3) & ~3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	buflen -= fixed - buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	buffer = fixed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	if (sptr->nsc_ret.nsc_return_code != SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	if (sptr->nsc_ret.nsc_bufferbytesused - (int)sizeof (passwd32_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	    > buflen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	if (sptr->nsc_ret.nsc_bufferbytesused - (int)sizeof (struct passwd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	    > buflen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		errno = ERANGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
#ifdef	_LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	(void) memcpy(buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	    (sptr->nsc_ret.nsc_u.buff + sizeof (passwd32_t)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	    (sptr->nsc_ret.nsc_bufferbytesused - sizeof (passwd32_t)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	pass64.pw_name = (char *)(sptr->nsc_ret.nsc_u.pwd.pw_name +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	pass64.pw_passwd = (char *)(sptr->nsc_ret.nsc_u.pwd.pw_passwd +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	pass64.pw_uid = sptr->nsc_ret.nsc_u.pwd.pw_uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	pass64.pw_gid = sptr->nsc_ret.nsc_u.pwd.pw_gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	pass64.pw_age = (char *)(sptr->nsc_ret.nsc_u.pwd.pw_age +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	pass64.pw_comment = (char *)(sptr->nsc_ret.nsc_u.pwd.pw_comment +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	pass64.pw_gecos = (char *)(sptr->nsc_ret.nsc_u.pwd.pw_gecos +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	pass64.pw_dir = (char *)(sptr->nsc_ret.nsc_u.pwd.pw_dir +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	pass64.pw_shell = (char *)(sptr->nsc_ret.nsc_u.pwd.pw_shell +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
				(uintptr_t)buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	*result = pass64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	sptr->nsc_ret.nsc_u.pwd.pw_name += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	sptr->nsc_ret.nsc_u.pwd.pw_passwd += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	sptr->nsc_ret.nsc_u.pwd.pw_age += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	sptr->nsc_ret.nsc_u.pwd.pw_comment += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	sptr->nsc_ret.nsc_u.pwd.pw_gecos += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	sptr->nsc_ret.nsc_u.pwd.pw_dir += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	sptr->nsc_ret.nsc_u.pwd.pw_shell += (uintptr_t)buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	*result = sptr->nsc_ret.nsc_u.pwd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	(void) memcpy(buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	    (sptr->nsc_ret.nsc_u.buff + sizeof (struct passwd)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	    (sptr->nsc_ret.nsc_bufferbytesused - sizeof (struct passwd)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	return (result);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
 * POSIX.1c Draft-6 version of the function getpwnam_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
 * It was implemented by Solaris 2.3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
_getpwnam_r(const char *name, struct passwd *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	 * allocate data on the stack for passwd information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		nsc_data_t 	s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		char		s_b[1024];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	} space;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	nsc_data_t	*sptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	int		ndata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	int		adata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	struct passwd	*resptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	if ((name == (const char *)NULL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	    (strlen(name) >= (sizeof (space) - sizeof (nsc_data_t)))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		errno = ERANGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		return ((struct passwd *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	ndata = sizeof (space);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	adata = strlen(name) + sizeof (nsc_call_t) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	space.s_d.nsc_call.nsc_callnumber = GETPWNAM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	(void) strcpy(space.s_d.nsc_call.nsc_u.name, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	sptr = &space.s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	switch (_nsc_trydoorcall(&sptr, &ndata, &adata)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	case SUCCESS:	/* positive cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	case NOTFOUND:	/* negative cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		return ((struct passwd *)_uncached_getpwnam_r(name, result,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
		    buffer, buflen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	resptr = process_getpw(result, buffer, buflen, sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	 * check if doors reallocated the memory underneath us
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	 * if they did munmap it or suffer a memory leak
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	if (sptr != &space.s_d)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		munmap((void *)sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	return (resptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 * POSIX.1c Draft-6 version of the function getpwuid_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
 * It was implemented by Solaris 2.3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
_getpwuid_r(uid_t uid, struct passwd *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
		nsc_data_t	s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		char		s_b[1024];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	} space;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	nsc_data_t	*sptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	int		ndata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	int		adata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	struct passwd	*resptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	ndata = sizeof (space);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	adata = sizeof (nsc_call_t) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	space.s_d.nsc_call.nsc_callnumber = GETPWUID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	space.s_d.nsc_call.nsc_u.uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	sptr = &space.s_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	switch (_nsc_trydoorcall(&sptr, &ndata, &adata)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	case SUCCESS:	/* positive cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	case NOTFOUND:	/* negative cache hit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		return ((struct passwd *)_uncached_getpwuid_r(uid, result,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		    buffer, buflen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	resptr = process_getpw(result, buffer, buflen, sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	 * check if doors reallocated the memory underneath us
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	 * if they did munmap it or suffer a memory leak
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	if (sptr != &space.s_d)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		munmap((void *)sptr, ndata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	return (resptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
_uncached_getpwuid_r(uid_t uid, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	arg.key.uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	(void) nss_search(&db_root, _nss_initf_passwd, NSS_DBOP_PASSWD_BYUID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
				&arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
}
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
 * POSIX.1c standard version of the function getpwuid_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
 * User gets it via static getpwuid_r from the header file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
__posix_getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
    size_t bufsize, struct passwd **result)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	int nerrno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	int oerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	if ((*result = _getpwuid_r(uid, pwd, buffer, (uintptr_t)bufsize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		== NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
			nerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	errno = oerrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	return (nerrno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
_uncached_getpwnam_r(const char *name, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	arg.key.name = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	(void) nss_search(&db_root, _nss_initf_passwd, NSS_DBOP_PASSWD_BYNAME,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
				&arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
}
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
 * POSIX.1c standard version of the function getpwnam_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
 * User gets it via static getpwnam_r from the header file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
__posix_getpwnam_r(const char *name, struct passwd *pwd, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
    size_t bufsize, struct passwd **result)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	int nerrno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	int oerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	if ((*result = _getpwnam_r(name, pwd, buffer, (uintptr_t)bufsize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		== NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
			nerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	errno = oerrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	return (nerrno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
setpwent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	nss_setent(&db_root, _nss_initf_passwd, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
endpwent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	nss_endent(&db_root, _nss_initf_passwd, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	nss_delete(&db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
getpwent_r(struct passwd *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	char		*nam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	/* In getXXent_r(), protect the unsuspecting caller from +/- entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		/* No key to fill in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		(void) nss_getent(&db_root, _nss_initf_passwd, &context, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	} while (arg.returnval != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	    (nam = ((struct passwd *)arg.returnval)->pw_name) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		(*nam == '+' || *nam == '-'));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
fgetpwent_r(FILE *f, struct passwd *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	extern void	_nss_XbyY_fgets(FILE *, nss_XbyY_args_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	nss_XbyY_args_t	arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	/* ... but in fgetXXent_r, the caller deserves any +/- entry he gets */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	/* No key to fill in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	_nss_XbyY_fgets(f, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
gettok(char **nextpp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	char	*p = *nextpp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	char	*q = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	char	c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	if (p == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	while ((c = *q) != '\0' && c != ':')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		q++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	if (c == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		*nextpp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		*q++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		*nextpp = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	return (p);
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 * Return values: 0 = success, 1 = parse error, 2 = erange ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
 * The structure pointer passed in is a structure in the caller's space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
 * wherein the field pointers would be set to areas in the buffer if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
 * need be. instring and buffer should be separate areas.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
str2passwd(const char *instr, int lenstr, void *ent, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	struct passwd	*passwd	= (struct passwd *)ent;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	char		*p, *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	int		black_magic;	/* "+" or "-" entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	if (lenstr + 1 > buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		return (NSS_STR_PARSE_ERANGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	 * We copy the input string into the output buffer and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	 * operate on it in place.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	(void) memcpy(buffer, instr, lenstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	buffer[lenstr] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	next = buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	passwd->pw_name = p = gettok(&next);		/* username */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	if (*p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		/* Empty username;  not allowed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	black_magic = (*p == '+' || *p == '-');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	if (black_magic) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
		passwd->pw_uid = UID_NOBODY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		passwd->pw_gid = GID_NOBODY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		 *  pwconv tests pw_passwd and pw_age == NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		passwd->pw_passwd  = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		passwd->pw_age	= "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		 * the rest of the passwd entry is "optional"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		passwd->pw_comment = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		passwd->pw_gecos = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		passwd->pw_dir	= "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		passwd->pw_shell = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	passwd->pw_passwd = p = gettok(&next);		/* password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	for (; *p != '\0';  p++) {			/* age */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		if (*p == ',') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
			*p++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	passwd->pw_age = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	p = next;					/* uid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	if (p == 0 || *p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	if (!black_magic) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		passwd->pw_uid = (uid_t)strtol(p, &next, 10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		if (next == p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
			/* uid field should be nonempty */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
		 * The old code (in 2.0 through 2.5) would check
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		 * for the uid being negative, or being greater
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		 * than 60001 (the rfs limit).  If it met either of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
		 * these conditions, the uid was translated to 60001.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		 * Now we just check for negative uids; anything else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		 * is administrative policy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
		if (passwd->pw_uid < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
			passwd->pw_uid = UID_NOBODY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	if (*next++ != ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
			(void) gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	p = next;					/* gid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	if (p == 0 || *p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	if (!black_magic) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		passwd->pw_gid = (gid_t)strtol(p, &next, 10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		if (next == p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
			/* gid field should be nonempty */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
		 * gid should be non-negative; anything else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
		 * is administrative policy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		if (passwd->pw_gid < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
			passwd->pw_gid = GID_NOBODY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	if (*next++ != ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
			(void) gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	passwd->pw_gecos = passwd->pw_comment = p = gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	passwd->pw_dir = p = gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	passwd->pw_shell = p = gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
			return (NSS_STR_PARSE_PARSE);
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
	/* Better not be any more fields... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	if (next == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
		/* Successfully parsed and stored */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
}