usr/src/lib/libc/port/gen/getpwnam_r.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 10386 935ab057bcbb
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
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
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
    23
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
0
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
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
    27
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <pwd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/mman.h>
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
    37
#include <errno.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
int str2passwd(const char *, int, void *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
	char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
static DEFINE_NSS_DB_ROOT(db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
static DEFINE_NSS_GETENT(context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
_nss_initf_passwd(nss_db_params_t *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	p->name	= NSS_DBNAM_PASSWD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
	p->default_config = NSS_DEFCONF_PASSWD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <getxby_door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
_uncached_getpwuid_r(uid_t uid, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	int buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
_uncached_getpwnam_r(const char *name, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
    int buflen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 * POSIX.1c Draft-6 version of the function getpwnam_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 * It was implemented by Solaris 2.3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
struct passwd *
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
    67
getpwnam_r(const char *name, struct passwd *result, char *buffer, int buflen)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
{
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    69
	nss_XbyY_args_t arg;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    71
	if (name == (const char *)NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
		errno = ERANGE;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    73
		return (NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	}
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    75
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    76
	arg.key.name = name;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    77
	(void) nss_search(&db_root, _nss_initf_passwd, NSS_DBOP_PASSWD_BYNAME,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
    78
	    &arg);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    79
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 * POSIX.1c Draft-6 version of the function getpwuid_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 * It was implemented by Solaris 2.3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
struct passwd *
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
    87
getpwuid_r(uid_t uid, struct passwd *result, char *buffer, int buflen)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
{
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    89
	nss_XbyY_args_t arg;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    91
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    92
	arg.key.uid = uid;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    93
	(void) nss_search(&db_root, _nss_initf_passwd, NSS_DBOP_PASSWD_BYUID,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
    94
	    &arg);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    95
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
_uncached_getpwuid_r(uid_t uid, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	arg.key.uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	(void) nss_search(&db_root, _nss_initf_passwd, NSS_DBOP_PASSWD_BYUID,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
   108
	    &arg);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 * POSIX.1c standard version of the function getpwuid_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
 * User gets it via static getpwuid_r from the header file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
__posix_getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
    size_t bufsize, struct passwd **result)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	int nerrno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	int oerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	errno = 0;
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
   125
	if ((*result = getpwuid_r(uid, pwd, buffer, (uintptr_t)bufsize))
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
   126
	    == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
			nerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	errno = oerrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	return (nerrno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
_uncached_getpwnam_r(const char *name, struct passwd *result, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	arg.key.name = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	(void) nss_search(&db_root, _nss_initf_passwd, NSS_DBOP_PASSWD_BYNAME,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
   142
	    &arg);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
 * POSIX.1c standard version of the function getpwnam_r.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 * User gets it via static getpwnam_r from the header file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
__posix_getpwnam_r(const char *name, struct passwd *pwd, char *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
    size_t bufsize, struct passwd **result)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	int nerrno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	int oerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	errno = 0;
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
   158
	if ((*result = getpwnam_r(name, pwd, buffer, (uintptr_t)bufsize))
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
   159
	    == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
			nerrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	errno = oerrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	return (nerrno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
setpwent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	nss_setent(&db_root, _nss_initf_passwd, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
endpwent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	nss_endent(&db_root, _nss_initf_passwd, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	nss_delete(&db_root);
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
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
getpwent_r(struct passwd *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	char		*nam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	/* In getXXent_r(), protect the unsuspecting caller from +/- entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		/* No key to fill in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		(void) nss_getent(&db_root, _nss_initf_passwd, &context, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	} while (arg.returnval != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	    (nam = ((struct passwd *)arg.returnval)->pw_name) != 0 &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 4321
diff changeset
   193
	    (*nam == '+' || *nam == '-'));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
struct passwd *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
fgetpwent_r(FILE *f, struct passwd *result, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	extern void	_nss_XbyY_fgets(FILE *, nss_XbyY_args_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	nss_XbyY_args_t	arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	/* ... but in fgetXXent_r, the caller deserves any +/- entry he gets */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	/* No key to fill in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	NSS_XbyY_INIT(&arg, result, buffer, buflen, str2passwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	_nss_XbyY_fgets(f, &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	return ((struct passwd *)NSS_XbyY_FINI(&arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
gettok(char **nextpp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	char	*p = *nextpp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	char	*q = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	char	c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	if (p == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	while ((c = *q) != '\0' && c != ':')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		q++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	if (c == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		*nextpp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		*q++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		*nextpp = q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
}
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
 * Return values: 0 = success, 1 = parse error, 2 = erange ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
 * The structure pointer passed in is a structure in the caller's space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
 * wherein the field pointers would be set to areas in the buffer if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
 * need be. instring and buffer should be separate areas.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
str2passwd(const char *instr, int lenstr, void *ent, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	struct passwd	*passwd	= (struct passwd *)ent;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	char		*p, *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	int		black_magic;	/* "+" or "-" entry */
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   246
	ulong_t		tmp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	if (lenstr + 1 > buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		return (NSS_STR_PARSE_ERANGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	 * We copy the input string into the output buffer and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	 * operate on it in place.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	 */
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   255
	if (instr != buffer) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   256
		/* Overlapping buffer copies are OK */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   257
		(void) memmove(buffer, instr, lenstr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   258
		buffer[lenstr] = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   259
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   260
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   261
	/* quick exit do not entry fill if not needed */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   262
	if (ent == (void *)NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   263
		return (NSS_STR_PARSE_SUCCESS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	next = buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	passwd->pw_name = p = gettok(&next);		/* username */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	if (*p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		/* Empty username;  not allowed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	black_magic = (*p == '+' || *p == '-');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	if (black_magic) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		passwd->pw_uid = UID_NOBODY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
		passwd->pw_gid = GID_NOBODY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		 *  pwconv tests pw_passwd and pw_age == NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		passwd->pw_passwd  = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		passwd->pw_age	= "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		 * the rest of the passwd entry is "optional"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		passwd->pw_comment = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		passwd->pw_gecos = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		passwd->pw_dir	= "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		passwd->pw_shell = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	passwd->pw_passwd = p = gettok(&next);		/* password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	for (; *p != '\0';  p++) {			/* age */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
		if (*p == ',') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			*p++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	passwd->pw_age = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	p = next;					/* uid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	if (p == 0 || *p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	if (!black_magic) {
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   313
		/*
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   314
		 * strtoul returns unsigned long which is
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   315
		 * 8 bytes on a 64-bit system. We don't want
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   316
		 * to assign it directly to passwd->pw_uid
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   317
		 * which is 4 bytes or else we will end up
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   318
		 * truncating the value.
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   319
		 */
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
   320
		errno = 0;
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   321
		tmp = strtoul(p, &next, 10);
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
   322
		if (next == p || errno != 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			/* uid field should be nonempty */
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
   324
			/* also check errno from strtoul */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		 * The old code (in 2.0 through 2.5) would check
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		 * for the uid being negative, or being greater
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		 * than 60001 (the rfs limit).  If it met either of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		 * these conditions, the uid was translated to 60001.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		 *
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   333
		 * Now we just check for -1 (UINT32_MAX); anything else
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		 * is administrative policy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		 */
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   336
		if (tmp >= UINT32_MAX)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
			passwd->pw_uid = UID_NOBODY;
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   338
		else
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   339
			passwd->pw_uid = (uid_t)tmp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	if (*next++ != ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
			(void) gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	p = next;					/* gid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	if (p == 0 || *p == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	if (!black_magic) {
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
   355
		errno = 0;
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   356
		tmp = strtoul(p, &next, 10);
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
   357
		if (next == p || errno != 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
			/* gid field should be nonempty */
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
   359
			/* also check errno from strtoul */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
		/*
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   363
		 * gid should not be -1; anything else
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		 * is administrative policy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
		 */
10386
935ab057bcbb 6831257 getgrnam_r() and getpwnam_r() should check for valid gid
Pradhap Devarajan <Pradhap.Devarajan@Sun.COM>
parents: 8040
diff changeset
   366
		if (tmp >= UINT32_MAX)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			passwd->pw_gid = GID_NOBODY;
8040
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   368
		else
42abce45ef67 PSARC/2008/441 Active Directory name service module (nss_ad)
Baban Kenkre <Baban.Kenkre@Sun.COM>
parents: 6812
diff changeset
   369
			passwd->pw_gid = (gid_t)tmp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	if (*next++ != ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
			(void) gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	passwd->pw_gecos = passwd->pw_comment = p = gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	passwd->pw_dir = p = gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	passwd->pw_shell = p = gettok(&next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	if (p == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		if (black_magic)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
			return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
			return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	/* Better not be any more fields... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	if (next == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		/* Successfully parsed and stored */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		return (NSS_STR_PARSE_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	return (NSS_STR_PARSE_PARSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
}