diff options
| author | jtc <jtc@NetBSD.org> | 1996-05-15 23:19:09 +0000 |
|---|---|---|
| committer | jtc <jtc@NetBSD.org> | 1996-05-15 23:19:09 +0000 |
| commit | a65aba5bdbfac8302dca0d528a2ac6d98ea76f32 (patch) | |
| tree | 3e66a3736c8ad0d694de0397d5898034fe4074b0 | |
| parent | 0534b81c29f5d7f83fce9611d68123603f5d6f7f (diff) | |
Updated to use new password file functions in libutil.
From Greg Hudson <ghudson@MIT.EDU>.
| -rw-r--r-- | usr.sbin/pwd_mkdb/Makefile | 6 | ||||
| -rw-r--r-- | usr.sbin/pwd_mkdb/pw_scan.c | 137 | ||||
| -rw-r--r-- | usr.sbin/pwd_mkdb/pw_scan.h | 36 | ||||
| -rw-r--r-- | usr.sbin/pwd_mkdb/pwd_mkdb.c | 5 | ||||
| -rw-r--r-- | usr.sbin/vipw/Makefile | 6 | ||||
| -rw-r--r-- | usr.sbin/vipw/pw_util.c | 222 | ||||
| -rw-r--r-- | usr.sbin/vipw/pw_util.h | 44 | ||||
| -rw-r--r-- | usr.sbin/vipw/vipw.c | 30 |
8 files changed, 26 insertions, 460 deletions
diff --git a/usr.sbin/pwd_mkdb/Makefile b/usr.sbin/pwd_mkdb/Makefile index a8ad1883108..01547a6577d 100644 --- a/usr.sbin/pwd_mkdb/Makefile +++ b/usr.sbin/pwd_mkdb/Makefile @@ -1,9 +1,11 @@ # from: @(#)Makefile 8.1 (Berkeley) 6/6/93 -# $Id: Makefile,v 1.5 1994/12/22 11:38:49 cgd Exp $ +# $Id: Makefile,v 1.6 1996/05/15 23:19:09 jtc Exp $ PROG= pwd_mkdb -SRCS= pw_scan.c pwd_mkdb.c getpwent.c +SRCS= pwd_mkdb.c getpwent.c MAN= pwd_mkdb.8 +LDADD+= -lutil +DPADD+= ${LIBUTIL} .PATH: ${.CURDIR}/../../lib/libc/gen diff --git a/usr.sbin/pwd_mkdb/pw_scan.c b/usr.sbin/pwd_mkdb/pw_scan.c deleted file mode 100644 index 66b1fcbe71c..00000000000 --- a/usr.sbin/pwd_mkdb/pw_scan.c +++ /dev/null @@ -1,137 +0,0 @@ -/*- - * Copyright (c) 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Portions Copyright(C) 1995, Jason Downs. 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. 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. - */ - -#ifndef lint -/*static char sccsid[] = "from: @(#)pw_scan.c 8.3 (Berkeley) 4/2/94";*/ -static char *rcsid = "$Id: pw_scan.c,v 1.4 1995/07/28 07:11:30 phil Exp $"; -#endif /* not lint */ - -/* - * This module is used to "verify" password entries by chpass(1) and - * pwd_mkdb(8). - */ - -#include <sys/param.h> - -#include <err.h> -#include <fcntl.h> -#include <pwd.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> - -#include "pw_scan.h" - -int -pw_scan(bp, pw, flags) - char *bp; - struct passwd *pw; - int *flags; -{ - long id; - int root; - char *p, *sh; - - if (flags != (int *)NULL) - *flags = 0; - - if (!(pw->pw_name = strsep(&bp, ":"))) /* login */ - goto fmt; - root = !strcmp(pw->pw_name, "root"); - - if (!(pw->pw_passwd = strsep(&bp, ":"))) /* passwd */ - goto fmt; - - if (!(p = strsep(&bp, ":"))) /* uid */ - goto fmt; - id = atol(p); - if (root && id) { - warnx("root uid should be 0"); - return (0); - } - if (id > USHRT_MAX) { - warnx("%s > max uid value (%d)", p, USHRT_MAX); - return (0); - } - pw->pw_uid = id; - if ((*p == '\0') && (flags != (int *)NULL)) - *flags |= _PASSWORD_NOUID; - - if (!(p = strsep(&bp, ":"))) /* gid */ - goto fmt; - id = atol(p); - if (id > USHRT_MAX) { - warnx("%s > max gid value (%d)", p, USHRT_MAX); - return (0); - } - pw->pw_gid = id; - if ((*p == '\0') && (flags != (int *)NULL)) - *flags |= _PASSWORD_NOGID; - - pw->pw_class = strsep(&bp, ":"); /* class */ - if (!(p = strsep(&bp, ":"))) /* change */ - goto fmt; - pw->pw_change = atol(p); - if ((*p == '\0') && (flags != (int *)NULL)) - *flags |= _PASSWORD_NOCHG; - if (!(p = strsep(&bp, ":"))) /* expire */ - goto fmt; - pw->pw_expire = atol(p); - if ((*p == '\0') && (flags != (int *)NULL)) - *flags |= _PASSWORD_NOEXP; - pw->pw_gecos = strsep(&bp, ":"); /* gecos */ - pw->pw_dir = strsep(&bp, ":"); /* directory */ - if (!(pw->pw_shell = strsep(&bp, ":"))) /* shell */ - goto fmt; - - p = pw->pw_shell; - if (root && *p) /* empty == /bin/sh */ - for (setusershell();;) { - if (!(sh = getusershell())) { - warnx("warning, unknown root shell"); - break; - } - if (!strcmp(p, sh)) - break; - } - - if (p = strsep(&bp, ":")) { /* too many */ -fmt: warnx("corrupted entry"); - return (0); - } - - return (1); -} diff --git a/usr.sbin/pwd_mkdb/pw_scan.h b/usr.sbin/pwd_mkdb/pw_scan.h deleted file mode 100644 index f1ff78c1f64..00000000000 --- a/usr.sbin/pwd_mkdb/pw_scan.h +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * Copyright (c) 1994 - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. 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. - * - * @(#)pw_scan.h 8.1 (Berkeley) 4/1/94 - */ - -extern int pw_scan __P((char *, struct passwd *, int *)); diff --git a/usr.sbin/pwd_mkdb/pwd_mkdb.c b/usr.sbin/pwd_mkdb/pwd_mkdb.c index 7e5163c6692..302305e52db 100644 --- a/usr.sbin/pwd_mkdb/pwd_mkdb.c +++ b/usr.sbin/pwd_mkdb/pwd_mkdb.c @@ -40,7 +40,7 @@ static char copyright[] = #ifndef lint /*static char sccsid[] = "from: @(#)pwd_mkdb.c 8.5 (Berkeley) 4/20/94";*/ -static char *rcsid = "$Id: pwd_mkdb.c,v 1.6 1995/07/28 07:13:52 phil Exp $"; +static char *rcsid = "$Id: pwd_mkdb.c,v 1.7 1996/05/15 23:19:16 jtc Exp $"; #endif /* not lint */ #include <sys/param.h> @@ -57,8 +57,7 @@ static char *rcsid = "$Id: pwd_mkdb.c,v 1.6 1995/07/28 07:13:52 phil Exp $"; #include <stdlib.h> #include <string.h> #include <unistd.h> - -#include "pw_scan.h" +#include <util.h> #define INSECURE 1 #define SECURE 2 diff --git a/usr.sbin/vipw/Makefile b/usr.sbin/vipw/Makefile index e89edcc054c..8b1123cc125 100644 --- a/usr.sbin/vipw/Makefile +++ b/usr.sbin/vipw/Makefile @@ -1,8 +1,10 @@ -# $NetBSD: Makefile,v 1.4 1995/01/20 19:19:53 mycroft Exp $ +# $NetBSD: Makefile,v 1.5 1996/05/15 23:23:45 jtc Exp $ # @(#)Makefile 8.1 (Berkeley) 6/6/93 PROG= vipw -SRCS= pw_util.c vipw.c +SRCS= vipw.c +DPADD= ${LIBUTIL} +LDADD= -lutil MAN= vipw.8 .include <bsd.prog.mk> diff --git a/usr.sbin/vipw/pw_util.c b/usr.sbin/vipw/pw_util.c deleted file mode 100644 index ddafa60d57d..00000000000 --- a/usr.sbin/vipw/pw_util.c +++ /dev/null @@ -1,222 +0,0 @@ -/* $NetBSD: pw_util.c,v 1.6 1995/01/20 19:45:39 mycroft Exp $ */ - -/*- - * Copyright (c) 1990, 1993, 1994 - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. 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. - */ - -#ifndef lint -static char sccsid[] = "@(#)pw_util.c 8.3 (Berkeley) 4/2/94"; -#endif /* not lint */ - -/* - * This file is used by all the "password" programs; vipw(8), chpass(1), - * and passwd(1). - */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/stat.h> -#include <sys/wait.h> - -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <paths.h> -#include <pwd.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "pw_util.h" - -extern char *tempname; -static pid_t editpid = -1; -static int lockfd; - -void -pw_cont(sig) - int sig; -{ - - if (editpid != -1) - kill(editpid, sig); -} - -void -pw_init() -{ - struct rlimit rlim; - - /* Unlimited resource limits. */ - rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY; - (void)setrlimit(RLIMIT_CPU, &rlim); - (void)setrlimit(RLIMIT_FSIZE, &rlim); - (void)setrlimit(RLIMIT_STACK, &rlim); - (void)setrlimit(RLIMIT_DATA, &rlim); - (void)setrlimit(RLIMIT_RSS, &rlim); - - /* Don't drop core (not really necessary, but GP's). */ - rlim.rlim_cur = rlim.rlim_max = 0; - (void)setrlimit(RLIMIT_CORE, &rlim); - - /* Turn off signals. */ - (void)signal(SIGALRM, SIG_IGN); - (void)signal(SIGHUP, SIG_IGN); - (void)signal(SIGINT, SIG_IGN); - (void)signal(SIGPIPE, SIG_IGN); - (void)signal(SIGQUIT, SIG_IGN); - (void)signal(SIGTERM, SIG_IGN); - (void)signal(SIGCONT, pw_cont); - - /* Create with exact permissions. */ - (void)umask(0); -} - -int -pw_lock() -{ - /* - * If the master password file doesn't exist, the system is hosed. - * Might as well try to build one. Set the close-on-exec bit so - * that users can't get at the encrypted passwords while editing. - * Open should allow flock'ing the file; see 4.4BSD. XXX - */ - lockfd = open(_PATH_MASTERPASSWD, O_RDONLY, 0); - if (lockfd < 0 || fcntl(lockfd, F_SETFD, 1) == -1) - err(1, "%s", _PATH_MASTERPASSWD); - if (flock(lockfd, LOCK_EX|LOCK_NB)) - errx(1, "the password db file is busy"); - return (lockfd); -} - -int -pw_tmp() -{ - static char path[MAXPATHLEN] = _PATH_MASTERPASSWD; - int fd; - char *p; - - if (p = strrchr(path, '/')) - ++p; - else - p = path; - strcpy(p, "pw.XXXXXX"); - if ((fd = mkstemp(path)) == -1) - err(1, "%s", path); - tempname = path; - return (fd); -} - -int -pw_mkdb() -{ - int pstat; - pid_t pid; - - warnx("rebuilding the database..."); - (void)fflush(stderr); - if (!(pid = vfork())) { - execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", tempname, NULL); - pw_error(_PATH_PWD_MKDB, 1, 1); - } - pid = waitpid(pid, &pstat, 0); - if (pid == -1 || !WIFEXITED(pstat) || WEXITSTATUS(pstat) != 0) - return (0); - warnx("done"); - return (1); -} - -void -pw_edit(notsetuid) - int notsetuid; -{ - int pstat; - char *p, *editor; - - if (!(editor = getenv("EDITOR"))) - editor = _PATH_VI; - if (p = strrchr(editor, '/')) - ++p; - else - p = editor; - - if (!(editpid = vfork())) { - if (notsetuid) { - (void)setgid(getgid()); - (void)setuid(getuid()); - } - execlp(editor, p, tempname, NULL); - _exit(1); - } - for (;;) { - editpid = waitpid(editpid, (int *)&pstat, WUNTRACED); - if (editpid == -1) - pw_error(editor, 1, 1); - else if (WIFSTOPPED(pstat)) - raise(WSTOPSIG(pstat)); - else if (WIFEXITED(pstat) && WEXITSTATUS(pstat) == 0) - break; - else - pw_error(editor, 1, 1); - } - editpid = -1; -} - -void -pw_prompt() -{ - int c; - - (void)printf("re-edit the password file? [y]: "); - (void)fflush(stdout); - c = getchar(); - if (c != EOF && c != '\n') - while (getchar() != '\n'); - if (c == 'n') - pw_error(NULL, 0, 0); -} - -void -pw_error(name, err, eval) - char *name; - int err, eval; -{ - if (err) - warn(name); - - warnx("%s: unchanged", _PATH_MASTERPASSWD); - (void)unlink(tempname); - exit(eval); -} diff --git a/usr.sbin/vipw/pw_util.h b/usr.sbin/vipw/pw_util.h deleted file mode 100644 index 46f811eb672..00000000000 --- a/usr.sbin/vipw/pw_util.h +++ /dev/null @@ -1,44 +0,0 @@ -/* $NetBSD: pw_util.h,v 1.2 1995/01/20 19:19:55 mycroft Exp $ */ - -/*- - * Copyright (c) 1994 - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. 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. - * - * @(#)pw_util.h 8.2 (Berkeley) 4/1/94 - */ - -void pw_edit __P((int)); -void pw_error __P((char *, int, int)); -void pw_init __P((void)); -int pw_lock __P((void)); -int pw_mkdb __P((void)); -void pw_prompt __P((void)); -int pw_tmp __P((void)); diff --git a/usr.sbin/vipw/vipw.c b/usr.sbin/vipw/vipw.c index 85fc0412eae..785b8087307 100644 --- a/usr.sbin/vipw/vipw.c +++ b/usr.sbin/vipw/vipw.c @@ -1,4 +1,4 @@ -/* $NetBSD: vipw.c,v 1.3 1995/01/20 19:19:57 mycroft Exp $ */ +/* $NetBSD: vipw.c,v 1.4 1996/05/15 23:23:50 jtc Exp $ */ /* * Copyright (c) 1987, 1993, 1994 @@ -52,10 +52,8 @@ static char sccsid[] = "@(#)vipw.c 8.3 (Berkeley) 4/2/94"; #include <stdlib.h> #include <string.h> #include <unistd.h> - -#include "pw_util.h" - -char *tempname; +#include <fcntl.h> +#include <util.h> void copyfile __P((int, int)); void usage __P((void)); @@ -83,22 +81,26 @@ main(argc, argv) usage(); pw_init(); - pfd = pw_lock(); - tfd = pw_tmp(); + tfd = pw_lock(0); + if (tfd < 0) + errx(1, "the passwd file is busy."); + pfd = open(_PATH_MASTERPASSWD, O_RDONLY, 0); + if (pfd < 0) + pw_error(_PATH_MASTERPASSWD, 1, 1); copyfile(pfd, tfd); (void)close(tfd); for (;;) { - if (stat(tempname, &begin)) - pw_error(tempname, 1, 1); - pw_edit(0); - if (stat(tempname, &end)) - pw_error(tempname, 1, 1); + if (stat(_PATH_MASTERPASSWD_LOCK, &begin)) + pw_error(_PATH_MASTERPASSWD_LOCK, 1, 1); + pw_edit(0, NULL); + if (stat(_PATH_MASTERPASSWD_LOCK, &end)) + pw_error(_PATH_MASTERPASSWD_LOCK, 1, 1); if (begin.st_mtime == end.st_mtime) { warnx("no changes made"); pw_error((char *)NULL, 0, 0); } - if (pw_mkdb()) + if (pw_mkdb() == 0) break; pw_prompt(); } @@ -115,7 +117,7 @@ copyfile(from, to) while ((nr = read(from, buf, sizeof(buf))) > 0) for (off = 0; off < nr; nr -= nw, off += nw) if ((nw = write(to, buf + off, nr)) < 0) - pw_error(tempname, 1, 1); + pw_error(_PATH_MASTERPASSWD_LOCK, 1, 1); if (nr < 0) pw_error(_PATH_MASTERPASSWD, 1, 1); } |
