Home | History | Annotate | Line # | Download | only in mtree
getid.c revision 1.7.26.1
      1  1.7.26.1    tls /*	$NetBSD: getid.c,v 1.7.26.1 2014/08/20 00:05:10 tls Exp $	*/
      2       1.1  lukem /*	from: NetBSD: getpwent.c,v 1.48 2000/10/03 03:22:26 enami Exp */
      3       1.1  lukem /*	from: NetBSD: getgrent.c,v 1.41 2002/01/12 23:51:30 lukem Exp */
      4       1.1  lukem 
      5       1.1  lukem /*
      6       1.1  lukem  * Copyright (c) 1987, 1988, 1989, 1993, 1994, 1995
      7       1.1  lukem  *	The Regents of the University of California.  All rights reserved.
      8       1.1  lukem  *
      9       1.1  lukem  * Redistribution and use in source and binary forms, with or without
     10       1.1  lukem  * modification, are permitted provided that the following conditions
     11       1.1  lukem  * are met:
     12       1.1  lukem  * 1. Redistributions of source code must retain the above copyright
     13       1.1  lukem  *    notice, this list of conditions and the following disclaimer.
     14       1.1  lukem  * 2. Redistributions in binary form must reproduce the above copyright
     15       1.1  lukem  *    notice, this list of conditions and the following disclaimer in the
     16       1.1  lukem  *    documentation and/or other materials provided with the distribution.
     17       1.4    agc  * 3. Neither the name of the University nor the names of its contributors
     18       1.1  lukem  *    may be used to endorse or promote products derived from this software
     19       1.1  lukem  *    without specific prior written permission.
     20       1.1  lukem  *
     21       1.1  lukem  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22       1.1  lukem  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23       1.1  lukem  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24       1.1  lukem  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25       1.1  lukem  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26       1.1  lukem  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27       1.1  lukem  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28       1.1  lukem  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29       1.1  lukem  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30       1.1  lukem  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31       1.1  lukem  * SUCH DAMAGE.
     32       1.1  lukem  */
     33       1.1  lukem 
     34       1.1  lukem /*-
     35       1.1  lukem  * Copyright (c) 2002 The NetBSD Foundation, Inc.
     36       1.1  lukem  * All rights reserved.
     37       1.1  lukem  *
     38       1.1  lukem  * This code is derived from software contributed to The NetBSD Foundation
     39       1.1  lukem  * by Luke Mewburn of Wasabi Systems.
     40       1.1  lukem  *
     41       1.1  lukem  * Redistribution and use in source and binary forms, with or without
     42       1.1  lukem  * modification, are permitted provided that the following conditions
     43       1.1  lukem  * are met:
     44       1.1  lukem  * 1. Redistributions of source code must retain the above copyright
     45       1.1  lukem  *    notice, this list of conditions and the following disclaimer.
     46       1.1  lukem  * 2. Redistributions in binary form must reproduce the above copyright
     47       1.1  lukem  *    notice, this list of conditions and the following disclaimer in the
     48       1.1  lukem  *    documentation and/or other materials provided with the distribution.
     49       1.1  lukem  *
     50       1.1  lukem  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     51       1.1  lukem  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     52       1.1  lukem  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     53       1.1  lukem  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     54       1.1  lukem  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     55       1.1  lukem  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     56       1.1  lukem  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     57       1.1  lukem  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     58       1.1  lukem  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     59       1.1  lukem  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     60       1.1  lukem  * POSSIBILITY OF SUCH DAMAGE.
     61       1.1  lukem  */
     62       1.1  lukem 
     63       1.5    jmc #if HAVE_NBTOOL_CONFIG_H
     64       1.5    jmc #include "nbtool_config.h"
     65       1.5    jmc #endif
     66       1.5    jmc 
     67       1.6  lukem #include <sys/cdefs.h>
     68  1.7.26.1    tls __RCSID("$NetBSD: getid.c,v 1.7.26.1 2014/08/20 00:05:10 tls Exp $");
     69       1.6  lukem 
     70       1.1  lukem #include <sys/param.h>
     71       1.1  lukem 
     72       1.1  lukem #include <grp.h>
     73       1.1  lukem #include <limits.h>
     74       1.1  lukem #include <pwd.h>
     75       1.1  lukem #include <stdlib.h>
     76       1.1  lukem #include <stdio.h>
     77       1.1  lukem #include <string.h>
     78       1.1  lukem #include <time.h>
     79       1.1  lukem #include <unistd.h>
     80       1.1  lukem 
     81       1.3     tv #include "extern.h"
     82       1.1  lukem 
     83       1.1  lukem static	struct group *	gi_getgrnam(const char *);
     84       1.1  lukem static	struct group *	gi_getgrgid(gid_t);
     85       1.1  lukem static	int		gi_setgroupent(int);
     86       1.1  lukem static	void		gi_endgrent(void);
     87       1.1  lukem static	int		grstart(void);
     88       1.1  lukem static	int		grscan(int, gid_t, const char *);
     89       1.1  lukem static	int		grmatchline(int, gid_t, const char *);
     90       1.1  lukem 
     91       1.1  lukem static	struct passwd *	gi_getpwnam(const char *);
     92       1.1  lukem static	struct passwd *	gi_getpwuid(uid_t);
     93       1.1  lukem static	int		gi_setpassent(int);
     94       1.1  lukem static	void		gi_endpwent(void);
     95       1.1  lukem static	int		pwstart(void);
     96       1.1  lukem static	int		pwscan(int, uid_t, const char *);
     97       1.1  lukem static	int		pwmatchline(int, uid_t, const char *);
     98       1.1  lukem 
     99       1.1  lukem #define	MAXGRP		200
    100       1.1  lukem #define	MAXLINELENGTH	1024
    101       1.1  lukem 
    102       1.1  lukem static	FILE		*_gr_fp;
    103       1.1  lukem static	struct group	_gr_group;
    104       1.1  lukem static	int		_gr_stayopen;
    105       1.1  lukem static	int		_gr_filesdone;
    106       1.1  lukem static	FILE		*_pw_fp;
    107       1.1  lukem static	struct passwd	_pw_passwd;	/* password structure */
    108       1.1  lukem static	int		_pw_stayopen;	/* keep fd's open */
    109       1.1  lukem static	int		_pw_filesdone;
    110       1.1  lukem 
    111       1.2  lukem static	char		grfile[MAXPATHLEN];
    112       1.2  lukem static	char		pwfile[MAXPATHLEN];
    113       1.1  lukem 
    114       1.1  lukem static	char		*members[MAXGRP];
    115       1.1  lukem static	char		grline[MAXLINELENGTH];
    116       1.1  lukem static	char		pwline[MAXLINELENGTH];
    117       1.1  lukem 
    118       1.1  lukem int
    119       1.1  lukem setup_getid(const char *dir)
    120       1.1  lukem {
    121       1.1  lukem 	if (dir == NULL)
    122       1.1  lukem 		return (0);
    123       1.1  lukem 
    124       1.1  lukem 				/* close existing databases */
    125       1.1  lukem 	gi_endgrent();
    126       1.1  lukem 	gi_endpwent();
    127       1.1  lukem 
    128       1.1  lukem 				/* build paths to new databases */
    129       1.1  lukem 	snprintf(grfile, sizeof(grfile), "%s/group", dir);
    130       1.1  lukem 	snprintf(pwfile, sizeof(pwfile), "%s/master.passwd", dir);
    131       1.1  lukem 
    132       1.1  lukem 				/* try to open new databases */
    133       1.1  lukem 	if (!grstart() || !pwstart())
    134       1.1  lukem 		return (0);
    135       1.1  lukem 
    136       1.1  lukem 				/* switch pwcache(3) lookup functions */
    137       1.1  lukem 	if (pwcache_groupdb(gi_setgroupent, gi_endgrent,
    138       1.1  lukem 			    gi_getgrnam, gi_getgrgid) == -1
    139       1.1  lukem 	    || pwcache_userdb(gi_setpassent, gi_endpwent,
    140       1.1  lukem 			    gi_getpwnam, gi_getpwuid) == -1)
    141       1.1  lukem 		return (0);
    142       1.1  lukem 
    143       1.1  lukem 	return (1);
    144       1.1  lukem }
    145       1.1  lukem 
    146       1.1  lukem 
    147       1.1  lukem /*
    148       1.1  lukem  * group lookup functions
    149       1.1  lukem  */
    150       1.1  lukem 
    151       1.1  lukem static struct group *
    152       1.1  lukem gi_getgrnam(const char *name)
    153       1.1  lukem {
    154       1.1  lukem 	int rval;
    155       1.1  lukem 
    156       1.1  lukem 	if (!grstart())
    157       1.1  lukem 		return NULL;
    158       1.1  lukem 	rval = grscan(1, 0, name);
    159       1.1  lukem 	if (!_gr_stayopen)
    160       1.1  lukem 		endgrent();
    161       1.1  lukem 	return (rval) ? &_gr_group : NULL;
    162       1.1  lukem }
    163       1.1  lukem 
    164       1.1  lukem static struct group *
    165       1.1  lukem gi_getgrgid(gid_t gid)
    166       1.1  lukem {
    167       1.1  lukem 	int rval;
    168       1.1  lukem 
    169       1.1  lukem 	if (!grstart())
    170       1.1  lukem 		return NULL;
    171       1.1  lukem 	rval = grscan(1, gid, NULL);
    172       1.1  lukem 	if (!_gr_stayopen)
    173       1.1  lukem 		endgrent();
    174       1.1  lukem 	return (rval) ? &_gr_group : NULL;
    175       1.1  lukem }
    176       1.1  lukem 
    177       1.1  lukem static int
    178       1.1  lukem gi_setgroupent(int stayopen)
    179       1.1  lukem {
    180       1.1  lukem 
    181       1.1  lukem 	if (!grstart())
    182       1.1  lukem 		return 0;
    183       1.1  lukem 	_gr_stayopen = stayopen;
    184       1.1  lukem 	return 1;
    185       1.1  lukem }
    186       1.1  lukem 
    187       1.1  lukem static void
    188       1.1  lukem gi_endgrent(void)
    189       1.1  lukem {
    190       1.1  lukem 
    191       1.1  lukem 	_gr_filesdone = 0;
    192       1.1  lukem 	if (_gr_fp) {
    193       1.1  lukem 		(void)fclose(_gr_fp);
    194       1.1  lukem 		_gr_fp = NULL;
    195       1.1  lukem 	}
    196       1.1  lukem }
    197       1.1  lukem 
    198       1.1  lukem static int
    199       1.1  lukem grstart(void)
    200       1.1  lukem {
    201       1.1  lukem 
    202       1.1  lukem 	_gr_filesdone = 0;
    203       1.1  lukem 	if (_gr_fp) {
    204       1.1  lukem 		rewind(_gr_fp);
    205       1.1  lukem 		return 1;
    206       1.1  lukem 	}
    207       1.2  lukem 	if (grfile[0] == '\0')			/* sanity check */
    208       1.2  lukem 		return 0;
    209  1.7.26.1    tls 
    210  1.7.26.1    tls 	_gr_fp = fopen(grfile, "r");
    211  1.7.26.1    tls 	if (_gr_fp != NULL)
    212  1.7.26.1    tls 		return 1;
    213  1.7.26.1    tls 	warn("Can't open `%s'", grfile);
    214  1.7.26.1    tls 	return 0;
    215       1.1  lukem }
    216       1.1  lukem 
    217       1.1  lukem 
    218       1.1  lukem static int
    219       1.1  lukem grscan(int search, gid_t gid, const char *name)
    220       1.1  lukem {
    221       1.1  lukem 
    222       1.1  lukem 	if (_gr_filesdone)
    223       1.1  lukem 		return 0;
    224       1.1  lukem 	for (;;) {
    225       1.1  lukem 		if (!fgets(grline, sizeof(grline), _gr_fp)) {
    226       1.1  lukem 			if (!search)
    227       1.1  lukem 				_gr_filesdone = 1;
    228       1.1  lukem 			return 0;
    229       1.1  lukem 		}
    230       1.1  lukem 		/* skip lines that are too big */
    231       1.1  lukem 		if (!strchr(grline, '\n')) {
    232       1.1  lukem 			int ch;
    233       1.1  lukem 
    234       1.1  lukem 			while ((ch = getc(_gr_fp)) != '\n' && ch != EOF)
    235       1.1  lukem 				;
    236       1.1  lukem 			continue;
    237       1.1  lukem 		}
    238  1.7.26.1    tls 		/* skip comments */
    239  1.7.26.1    tls 		if (pwline[0] == '#')
    240  1.7.26.1    tls 			continue;
    241       1.1  lukem 		if (grmatchline(search, gid, name))
    242       1.1  lukem 			return 1;
    243       1.1  lukem 	}
    244       1.1  lukem 	/* NOTREACHED */
    245       1.1  lukem }
    246       1.1  lukem 
    247       1.1  lukem static int
    248       1.1  lukem grmatchline(int search, gid_t gid, const char *name)
    249       1.1  lukem {
    250       1.1  lukem 	unsigned long	id;
    251       1.1  lukem 	char		**m;
    252       1.1  lukem 	char		*cp, *bp, *ep;
    253       1.1  lukem 
    254       1.1  lukem 	/* name may be NULL if search is nonzero */
    255       1.1  lukem 
    256       1.1  lukem 	bp = grline;
    257       1.1  lukem 	memset(&_gr_group, 0, sizeof(_gr_group));
    258       1.1  lukem 	_gr_group.gr_name = strsep(&bp, ":\n");
    259       1.1  lukem 	if (search && name && strcmp(_gr_group.gr_name, name))
    260       1.1  lukem 		return 0;
    261       1.1  lukem 	_gr_group.gr_passwd = strsep(&bp, ":\n");
    262       1.1  lukem 	if (!(cp = strsep(&bp, ":\n")))
    263       1.1  lukem 		return 0;
    264       1.1  lukem 	id = strtoul(cp, &ep, 10);
    265       1.1  lukem 	if (id > GID_MAX || *ep != '\0')
    266       1.1  lukem 		return 0;
    267       1.1  lukem 	_gr_group.gr_gid = (gid_t)id;
    268       1.1  lukem 	if (search && name == NULL && _gr_group.gr_gid != gid)
    269       1.1  lukem 		return 0;
    270       1.1  lukem 	cp = NULL;
    271       1.1  lukem 	if (bp == NULL)
    272       1.1  lukem 		return 0;
    273       1.1  lukem 	for (_gr_group.gr_mem = m = members;; bp++) {
    274       1.1  lukem 		if (m == &members[MAXGRP - 1])
    275       1.1  lukem 			break;
    276       1.1  lukem 		if (*bp == ',') {
    277       1.1  lukem 			if (cp) {
    278       1.1  lukem 				*bp = '\0';
    279       1.1  lukem 				*m++ = cp;
    280       1.1  lukem 				cp = NULL;
    281       1.1  lukem 			}
    282       1.1  lukem 		} else if (*bp == '\0' || *bp == '\n' || *bp == ' ') {
    283       1.1  lukem 			if (cp) {
    284       1.1  lukem 				*bp = '\0';
    285       1.1  lukem 				*m++ = cp;
    286       1.1  lukem 			}
    287       1.1  lukem 			break;
    288       1.1  lukem 		} else if (cp == NULL)
    289       1.1  lukem 			cp = bp;
    290       1.1  lukem 	}
    291       1.1  lukem 	*m = NULL;
    292       1.1  lukem 	return 1;
    293       1.1  lukem }
    294       1.1  lukem 
    295       1.1  lukem 
    296       1.1  lukem /*
    297       1.1  lukem  * user lookup functions
    298       1.1  lukem  */
    299       1.1  lukem 
    300       1.1  lukem static struct passwd *
    301       1.1  lukem gi_getpwnam(const char *name)
    302       1.1  lukem {
    303       1.1  lukem 	int rval;
    304       1.1  lukem 
    305       1.1  lukem 	if (!pwstart())
    306       1.1  lukem 		return NULL;
    307       1.1  lukem 	rval = pwscan(1, 0, name);
    308       1.1  lukem 	if (!_pw_stayopen)
    309       1.1  lukem 		endpwent();
    310       1.1  lukem 	return (rval) ? &_pw_passwd : NULL;
    311       1.1  lukem }
    312       1.1  lukem 
    313       1.1  lukem static struct passwd *
    314       1.1  lukem gi_getpwuid(uid_t uid)
    315       1.1  lukem {
    316       1.1  lukem 	int rval;
    317       1.1  lukem 
    318       1.1  lukem 	if (!pwstart())
    319       1.1  lukem 		return NULL;
    320       1.1  lukem 	rval = pwscan(1, uid, NULL);
    321       1.1  lukem 	if (!_pw_stayopen)
    322       1.1  lukem 		endpwent();
    323       1.1  lukem 	return (rval) ? &_pw_passwd : NULL;
    324       1.1  lukem }
    325       1.1  lukem 
    326       1.1  lukem static int
    327       1.1  lukem gi_setpassent(int stayopen)
    328       1.1  lukem {
    329       1.1  lukem 
    330       1.1  lukem 	if (!pwstart())
    331       1.1  lukem 		return 0;
    332       1.1  lukem 	_pw_stayopen = stayopen;
    333       1.1  lukem 	return 1;
    334       1.1  lukem }
    335       1.1  lukem 
    336       1.1  lukem static void
    337       1.1  lukem gi_endpwent(void)
    338       1.1  lukem {
    339       1.1  lukem 
    340       1.1  lukem 	_pw_filesdone = 0;
    341       1.1  lukem 	if (_pw_fp) {
    342       1.1  lukem 		(void)fclose(_pw_fp);
    343       1.1  lukem 		_pw_fp = NULL;
    344       1.1  lukem 	}
    345       1.1  lukem }
    346       1.1  lukem 
    347       1.1  lukem static int
    348       1.1  lukem pwstart(void)
    349       1.1  lukem {
    350       1.1  lukem 
    351       1.1  lukem 	_pw_filesdone = 0;
    352       1.1  lukem 	if (_pw_fp) {
    353       1.1  lukem 		rewind(_pw_fp);
    354       1.1  lukem 		return 1;
    355       1.1  lukem 	}
    356       1.2  lukem 	if (pwfile[0] == '\0')			/* sanity check */
    357       1.2  lukem 		return 0;
    358  1.7.26.1    tls 	_pw_fp = fopen(pwfile, "r");
    359  1.7.26.1    tls 	if (_pw_fp != NULL)
    360  1.7.26.1    tls 		return 1;
    361  1.7.26.1    tls 	warn("Can't open `%s'", pwfile);
    362  1.7.26.1    tls 	return 0;
    363       1.1  lukem }
    364       1.1  lukem 
    365       1.1  lukem 
    366       1.1  lukem static int
    367       1.1  lukem pwscan(int search, uid_t uid, const char *name)
    368       1.1  lukem {
    369       1.1  lukem 
    370       1.1  lukem 	if (_pw_filesdone)
    371       1.1  lukem 		return 0;
    372       1.1  lukem 	for (;;) {
    373       1.1  lukem 		if (!fgets(pwline, sizeof(pwline), _pw_fp)) {
    374       1.1  lukem 			if (!search)
    375       1.1  lukem 				_pw_filesdone = 1;
    376       1.1  lukem 			return 0;
    377       1.1  lukem 		}
    378       1.1  lukem 		/* skip lines that are too big */
    379       1.1  lukem 		if (!strchr(pwline, '\n')) {
    380       1.1  lukem 			int ch;
    381       1.1  lukem 
    382       1.1  lukem 			while ((ch = getc(_pw_fp)) != '\n' && ch != EOF)
    383       1.1  lukem 				;
    384       1.1  lukem 			continue;
    385       1.1  lukem 		}
    386  1.7.26.1    tls 		/* skip comments */
    387  1.7.26.1    tls 		if (pwline[0] == '#')
    388  1.7.26.1    tls 			continue;
    389       1.1  lukem 		if (pwmatchline(search, uid, name))
    390       1.1  lukem 			return 1;
    391       1.1  lukem 	}
    392       1.1  lukem 	/* NOTREACHED */
    393       1.1  lukem }
    394       1.1  lukem 
    395       1.1  lukem static int
    396       1.1  lukem pwmatchline(int search, uid_t uid, const char *name)
    397       1.1  lukem {
    398       1.1  lukem 	unsigned long	id;
    399       1.1  lukem 	char		*cp, *bp, *ep;
    400       1.1  lukem 
    401       1.1  lukem 	/* name may be NULL if search is nonzero */
    402       1.1  lukem 
    403       1.1  lukem 	bp = pwline;
    404       1.1  lukem 	memset(&_pw_passwd, 0, sizeof(_pw_passwd));
    405       1.1  lukem 	_pw_passwd.pw_name = strsep(&bp, ":\n");		/* name */
    406       1.1  lukem 	if (search && name && strcmp(_pw_passwd.pw_name, name))
    407       1.1  lukem 		return 0;
    408       1.1  lukem 
    409       1.1  lukem 	_pw_passwd.pw_passwd = strsep(&bp, ":\n");		/* passwd */
    410       1.1  lukem 
    411       1.1  lukem 	if (!(cp = strsep(&bp, ":\n")))				/* uid */
    412       1.1  lukem 		return 0;
    413       1.1  lukem 	id = strtoul(cp, &ep, 10);
    414       1.1  lukem 	if (id > UID_MAX || *ep != '\0')
    415       1.1  lukem 		return 0;
    416       1.1  lukem 	_pw_passwd.pw_uid = (uid_t)id;
    417       1.1  lukem 	if (search && name == NULL && _pw_passwd.pw_uid != uid)
    418       1.1  lukem 		return 0;
    419       1.1  lukem 
    420       1.1  lukem 	if (!(cp = strsep(&bp, ":\n")))				/* gid */
    421       1.1  lukem 		return 0;
    422       1.1  lukem 	id = strtoul(cp, &ep, 10);
    423       1.1  lukem 	if (id > GID_MAX || *ep != '\0')
    424       1.1  lukem 		return 0;
    425       1.1  lukem 	_pw_passwd.pw_gid = (gid_t)id;
    426       1.1  lukem 
    427       1.1  lukem 	if (!(ep = strsep(&bp, ":")))				/* class */
    428       1.1  lukem 		return 0;
    429       1.1  lukem 	if (!(ep = strsep(&bp, ":")))				/* change */
    430       1.1  lukem 		return 0;
    431       1.1  lukem 	if (!(ep = strsep(&bp, ":")))				/* expire */
    432       1.1  lukem 		return 0;
    433       1.1  lukem 
    434       1.1  lukem 	if (!(_pw_passwd.pw_gecos = strsep(&bp, ":\n")))	/* gecos */
    435       1.1  lukem 		return 0;
    436       1.1  lukem 	if (!(_pw_passwd.pw_dir = strsep(&bp, ":\n")))		/* directory */
    437       1.1  lukem 		return 0;
    438       1.1  lukem 	if (!(_pw_passwd.pw_shell = strsep(&bp, ":\n")))	/* shell */
    439       1.1  lukem 		return 0;
    440       1.1  lukem 
    441       1.1  lukem 	if (strchr(bp, ':') != NULL)
    442       1.1  lukem 		return 0;
    443       1.1  lukem 
    444       1.1  lukem 	return 1;
    445       1.1  lukem }
    446       1.1  lukem 
    447