summaryrefslogtreecommitdiffstats
path: root/usr.sbin/makefs/getid.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/makefs/getid.c')
-rw-r--r--usr.sbin/makefs/getid.c429
1 files changed, 0 insertions, 429 deletions
diff --git a/usr.sbin/makefs/getid.c b/usr.sbin/makefs/getid.c
deleted file mode 100644
index 939d943..0000000
--- a/usr.sbin/makefs/getid.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/* $NetBSD: getid.c,v 1.5 2004/06/20 22:20:18 jmc Exp $ */
-/* from: NetBSD: getpwent.c,v 1.48 2000/10/03 03:22:26 enami Exp */
-/* from: NetBSD: getgrent.c,v 1.41 2002/01/12 23:51:30 lukem Exp */
-
-/*
- * Copyright (c) 1987, 1988, 1989, 1993, 1994, 1995
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*-
- * Copyright (c) 2002 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Luke Mewburn of Wasabi Systems.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-
-#include <grp.h>
-#include <limits.h>
-#include <pwd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "makefs.h"
-
-#include "mtree.h"
-#include "extern.h"
-
-static struct group * gi_getgrnam(const char *);
-static struct group * gi_getgrgid(gid_t);
-static int gi_setgroupent(int);
-static void gi_endgrent(void);
-static int grstart(void);
-static int grscan(int, gid_t, const char *);
-static int grmatchline(int, gid_t, const char *);
-
-static struct passwd * gi_getpwnam(const char *);
-static struct passwd * gi_getpwuid(uid_t);
-static int gi_setpassent(int);
-static void gi_endpwent(void);
-static int pwstart(void);
-static int pwscan(int, uid_t, const char *);
-static int pwmatchline(int, uid_t, const char *);
-
-#define MAXGRP 200
-#define MAXLINELENGTH 1024
-
-static FILE *_gr_fp;
-static struct group _gr_group;
-static int _gr_stayopen;
-static int _gr_filesdone;
-static FILE *_pw_fp;
-static struct passwd _pw_passwd; /* password structure */
-static int _pw_stayopen; /* keep fd's open */
-static int _pw_filesdone;
-
-static char grfile[MAXPATHLEN];
-static char pwfile[MAXPATHLEN];
-
-static char *members[MAXGRP];
-static char grline[MAXLINELENGTH];
-static char pwline[MAXLINELENGTH];
-
-int
-setup_getid(const char *dir)
-{
- if (dir == NULL)
- return (0);
-
- /* close existing databases */
- gi_endgrent();
- gi_endpwent();
-
- /* build paths to new databases */
- snprintf(grfile, sizeof(grfile), "%s/group", dir);
- snprintf(pwfile, sizeof(pwfile), "%s/master.passwd", dir);
-
- /* try to open new databases */
- if (!grstart() || !pwstart())
- return (0);
-
- /* switch pwcache(3) lookup functions */
- if (pwcache_groupdb(gi_setgroupent, gi_endgrent,
- gi_getgrnam, gi_getgrgid) == -1
- || pwcache_userdb(gi_setpassent, gi_endpwent,
- gi_getpwnam, gi_getpwuid) == -1)
- return (0);
-
- return (1);
-}
-
-
-/*
- * group lookup functions
- */
-
-static struct group *
-gi_getgrnam(const char *name)
-{
- int rval;
-
- if (!grstart())
- return NULL;
- rval = grscan(1, 0, name);
- if (!_gr_stayopen)
- endgrent();
- return (rval) ? &_gr_group : NULL;
-}
-
-static struct group *
-gi_getgrgid(gid_t gid)
-{
- int rval;
-
- if (!grstart())
- return NULL;
- rval = grscan(1, gid, NULL);
- if (!_gr_stayopen)
- endgrent();
- return (rval) ? &_gr_group : NULL;
-}
-
-static int
-gi_setgroupent(int stayopen)
-{
-
- if (!grstart())
- return 0;
- _gr_stayopen = stayopen;
- return 1;
-}
-
-static void
-gi_endgrent(void)
-{
-
- _gr_filesdone = 0;
- if (_gr_fp) {
- (void)fclose(_gr_fp);
- _gr_fp = NULL;
- }
-}
-
-static int
-grstart(void)
-{
-
- _gr_filesdone = 0;
- if (_gr_fp) {
- rewind(_gr_fp);
- return 1;
- }
- if (grfile[0] == '\0') /* sanity check */
- return 0;
- return (_gr_fp = fopen(grfile, "r")) ? 1 : 0;
-}
-
-
-static int
-grscan(int search, gid_t gid, const char *name)
-{
-
- if (_gr_filesdone)
- return 0;
- for (;;) {
- if (!fgets(grline, sizeof(grline), _gr_fp)) {
- if (!search)
- _gr_filesdone = 1;
- return 0;
- }
- /* skip lines that are too big */
- if (!strchr(grline, '\n')) {
- int ch;
-
- while ((ch = getc(_gr_fp)) != '\n' && ch != EOF)
- ;
- continue;
- }
- if (grmatchline(search, gid, name))
- return 1;
- }
- /* NOTREACHED */
-}
-
-static int
-grmatchline(int search, gid_t gid, const char *name)
-{
- unsigned long id;
- char **m;
- char *cp, *bp, *ep;
-
- /* name may be NULL if search is nonzero */
-
- bp = grline;
- memset(&_gr_group, 0, sizeof(_gr_group));
- _gr_group.gr_name = strsep(&bp, ":\n");
- if (search && name && strcmp(_gr_group.gr_name, name))
- return 0;
- _gr_group.gr_passwd = strsep(&bp, ":\n");
- if (!(cp = strsep(&bp, ":\n")))
- return 0;
- id = strtoul(cp, &ep, 10);
- if (id > GID_MAX || *ep != '\0')
- return 0;
- _gr_group.gr_gid = (gid_t)id;
- if (search && name == NULL && _gr_group.gr_gid != gid)
- return 0;
- cp = NULL;
- if (bp == NULL)
- return 0;
- for (_gr_group.gr_mem = m = members;; bp++) {
- if (m == &members[MAXGRP - 1])
- break;
- if (*bp == ',') {
- if (cp) {
- *bp = '\0';
- *m++ = cp;
- cp = NULL;
- }
- } else if (*bp == '\0' || *bp == '\n' || *bp == ' ') {
- if (cp) {
- *bp = '\0';
- *m++ = cp;
- }
- break;
- } else if (cp == NULL)
- cp = bp;
- }
- *m = NULL;
- return 1;
-}
-
-
-/*
- * user lookup functions
- */
-
-static struct passwd *
-gi_getpwnam(const char *name)
-{
- int rval;
-
- if (!pwstart())
- return NULL;
- rval = pwscan(1, 0, name);
- if (!_pw_stayopen)
- endpwent();
- return (rval) ? &_pw_passwd : NULL;
-}
-
-static struct passwd *
-gi_getpwuid(uid_t uid)
-{
- int rval;
-
- if (!pwstart())
- return NULL;
- rval = pwscan(1, uid, NULL);
- if (!_pw_stayopen)
- endpwent();
- return (rval) ? &_pw_passwd : NULL;
-}
-
-static int
-gi_setpassent(int stayopen)
-{
-
- if (!pwstart())
- return 0;
- _pw_stayopen = stayopen;
- return 1;
-}
-
-static void
-gi_endpwent(void)
-{
-
- _pw_filesdone = 0;
- if (_pw_fp) {
- (void)fclose(_pw_fp);
- _pw_fp = NULL;
- }
-}
-
-static int
-pwstart(void)
-{
-
- _pw_filesdone = 0;
- if (_pw_fp) {
- rewind(_pw_fp);
- return 1;
- }
- if (pwfile[0] == '\0') /* sanity check */
- return 0;
- return (_pw_fp = fopen(pwfile, "r")) ? 1 : 0;
-}
-
-
-static int
-pwscan(int search, uid_t uid, const char *name)
-{
-
- if (_pw_filesdone)
- return 0;
- for (;;) {
- if (!fgets(pwline, sizeof(pwline), _pw_fp)) {
- if (!search)
- _pw_filesdone = 1;
- return 0;
- }
- /* skip lines that are too big */
- if (!strchr(pwline, '\n')) {
- int ch;
-
- while ((ch = getc(_pw_fp)) != '\n' && ch != EOF)
- ;
- continue;
- }
- if (pwmatchline(search, uid, name))
- return 1;
- }
- /* NOTREACHED */
-}
-
-static int
-pwmatchline(int search, uid_t uid, const char *name)
-{
- unsigned long id;
- char *cp, *bp, *ep;
-
- /* name may be NULL if search is nonzero */
-
- bp = pwline;
- memset(&_pw_passwd, 0, sizeof(_pw_passwd));
- _pw_passwd.pw_name = strsep(&bp, ":\n"); /* name */
- if (search && name && strcmp(_pw_passwd.pw_name, name))
- return 0;
-
- _pw_passwd.pw_passwd = strsep(&bp, ":\n"); /* passwd */
-
- if (!(cp = strsep(&bp, ":\n"))) /* uid */
- return 0;
- id = strtoul(cp, &ep, 10);
- if (id > UID_MAX || *ep != '\0')
- return 0;
- _pw_passwd.pw_uid = (uid_t)id;
- if (search && name == NULL && _pw_passwd.pw_uid != uid)
- return 0;
-
- if (!(cp = strsep(&bp, ":\n"))) /* gid */
- return 0;
- id = strtoul(cp, &ep, 10);
- if (id > GID_MAX || *ep != '\0')
- return 0;
- _pw_passwd.pw_gid = (gid_t)id;
-
- if (!(ep = strsep(&bp, ":"))) /* class */
- return 0;
- if (!(ep = strsep(&bp, ":"))) /* change */
- return 0;
- if (!(ep = strsep(&bp, ":"))) /* expire */
- return 0;
-
- if (!(_pw_passwd.pw_gecos = strsep(&bp, ":\n"))) /* gecos */
- return 0;
- if (!(_pw_passwd.pw_dir = strsep(&bp, ":\n"))) /* directory */
- return 0;
- if (!(_pw_passwd.pw_shell = strsep(&bp, ":\n"))) /* shell */
- return 0;
-
- if (strchr(bp, ':') != NULL)
- return 0;
-
- return 1;
-}
OpenPOWER on IntegriCloud