Module Name: src Committed By: christos Date: Wed Aug 18 08:06:40 UTC 2010
Modified Files: src/usr.sbin/pwd_mkdb: pwd_mkdb.8 pwd_mkdb.c Log Message: add syslog logging. To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/usr.sbin/pwd_mkdb/pwd_mkdb.8 cvs rdiff -u -r1.51 -r1.52 src/usr.sbin/pwd_mkdb/pwd_mkdb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/pwd_mkdb/pwd_mkdb.8 diff -u src/usr.sbin/pwd_mkdb/pwd_mkdb.8:1.26 src/usr.sbin/pwd_mkdb/pwd_mkdb.8:1.27 --- src/usr.sbin/pwd_mkdb/pwd_mkdb.8:1.26 Fri Jun 19 01:50:39 2009 +++ src/usr.sbin/pwd_mkdb/pwd_mkdb.8 Wed Aug 18 04:06:39 2010 @@ -1,4 +1,4 @@ -.\" $NetBSD: pwd_mkdb.8,v 1.26 2009/06/19 05:50:39 wiz Exp $ +.\" $NetBSD: pwd_mkdb.8,v 1.27 2010/08/18 08:06:39 christos Exp $ .\" .\" Copyright (c) 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" from: @(#)pwd_mkdb.8 8.2 (Berkeley) 4/27/95 .\" -.Dd June 18, 2009 +.Dd August 18, 2010 .Dt PWD_MKDB 8 .Os .Sh NAME @@ -37,7 +37,7 @@ .Nd generate the password databases .Sh SYNOPSIS .Nm -.Op Fl BLpsvw +.Op Fl BLlpsvw .Op Fl c Ar cachesize .Op Fl d Ar directory .Op Fl u Ar username @@ -84,6 +84,10 @@ .It Fl L Store data in little-endian format (see also .Fl B ) . +.It Fl l +Use +.Xr syslog 3 +to report errors. .It Fl p Create a Version 7 style password file and install it into .Dq Pa /etc/passwd . @@ -159,6 +163,7 @@ .Xr db 3 , .Xr getpwent 3 , .Xr pw_mkdb 3 , +.Xr syslog 3 , .Xr passwd 5 , .Xr useradd 8 , .Xr userdel 8 , Index: src/usr.sbin/pwd_mkdb/pwd_mkdb.c diff -u src/usr.sbin/pwd_mkdb/pwd_mkdb.c:1.51 src/usr.sbin/pwd_mkdb/pwd_mkdb.c:1.52 --- src/usr.sbin/pwd_mkdb/pwd_mkdb.c:1.51 Sun Jan 10 14:04:35 2010 +++ src/usr.sbin/pwd_mkdb/pwd_mkdb.c Wed Aug 18 04:06:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pwd_mkdb.c,v 1.51 2010/01/10 19:04:35 snj Exp $ */ +/* $NetBSD: pwd_mkdb.c,v 1.52 2010/08/18 08:06:39 christos Exp $ */ /* * Copyright (c) 2000, 2009 The NetBSD Foundation, Inc. @@ -90,7 +90,7 @@ The NetBSD Foundation, Inc. All rights reserved.\ Copyright (c) 1991, 1993, 1994\ The Regents of the University of California. All rights reserved."); -__RCSID("$NetBSD: pwd_mkdb.c,v 1.51 2010/01/10 19:04:35 snj Exp $"); +__RCSID("$NetBSD: pwd_mkdb.c,v 1.52 2010/08/18 08:06:39 christos Exp $"); #endif /* not lint */ #if HAVE_NBTOOL_CONFIG_H @@ -111,10 +111,12 @@ #include <err.h> #include <errno.h> #include <fcntl.h> +#include <syslog.h> #include <limits.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> +#include <stdarg.h> #include <string.h> #include <unistd.h> #include <util.h> @@ -158,6 +160,7 @@ static char prefix[MAXPATHLEN]; static char oldpwdfile[MAX(MAXPATHLEN, LINE_MAX * 2)]; static int lorder = BYTE_ORDER; +static int logsyslog; static int clean; static int verbose; static int warning; @@ -167,7 +170,8 @@ void bailout(void) __attribute__((__noreturn__)); void cp(const char *, const char *, mode_t); void deldbent(struct pwddb *, int, void *); -void error(const char *); +void mkpw_error(const char *, ...); +void mkpw_warning(const char *, ...); int getdbent(struct pwddb *, int, void *, struct passwd **); void inconsistency(void); void install(const char *, const char *); @@ -214,7 +218,7 @@ db->db = dbopen(db->dbname, flags, perm, DB_HASH, &openinfo); if (db->db == NULL) - error(db->dbname); + mkpw_error("Cannot open `%s'", db->dbname); db->fname = dbname; db->rversion = getversion(dbname); @@ -224,28 +228,25 @@ db->wversion = req_version; if (warning && db->rversion == 0 && db->wversion == 0) { - warnx("Database %s is a version %u database.", + mkpw_warning("Database %s is a version %u database.", db->fname, db->rversion); - warnx("Use %s -V 1 to upgrade once you've recompiled " + mkpw_warning("Use %s -V 1 to upgrade once you've recompiled " "all your binaries.", getprogname()); } if (db->wversion != db->rversion) { if (username != NULL) { - (void)fprintf(stderr, "%s: you cannot change a single " + mkpw_warning("You cannot change a single " "record from version %u to version %u\n", - getprogname(), db->rversion, db->wversion); + db->rversion, db->wversion); bailout(); } else if (verbose) { - (void)fprintf(stderr, "%s: changing %s from version " - "%u to version %u\n", - getprogname(), db->fname, - db->rversion, db->wversion); + mkpw_warning("Changing %s from version %u to version %u", + db->fname, db->rversion, db->wversion); } } else { if (verbose) - (void)fprintf(stderr, "%s: %s version %u " - "requested %u\n", getprogname(), db->fname, - db->rversion, db->wversion); + mkpw_warning("File `%s' version %u requested %u", + db->fname, db->rversion, db->wversion); } setversion(db); @@ -276,9 +277,10 @@ cachesize = 0; verbose = 0; warning = 0; + logsyslog = 0; req_version = ~0U; - while ((ch = getopt(argc, argv, "BLc:d:psu:V:vw")) != -1) + while ((ch = getopt(argc, argv, "BLc:d:lpsu:V:vw")) != -1) switch (ch) { case 'B': /* big-endian output */ lorder = BIG_ENDIAN; @@ -292,6 +294,10 @@ case 'd': /* set prefix */ (void)strlcpy(prefix, optarg, sizeof(prefix)); break; + case 'l': + openlog(getprogname(), LOG_PID, LOG_AUTH); + logsyslog = 1; + break; case 'p': /* create V7 "file.orig" */ makeold = 1; break; @@ -303,8 +309,10 @@ break; case 'V': req_version = (uint32_t)atoi(optarg); - if (req_version > 1) - err(1, "Unknown version %u\n", req_version); + if (req_version > 1) { + mkpw_warning("Unknown version %u", req_version); + return EXIT_FAILURE; + } break; case 'v': verbose++; @@ -350,12 +358,12 @@ pname = *argv; /* Open the original password file */ if ((fp = fopen(pname, "r")) == NULL) - error(pname); + mkpw_error("Cannot open `%s'", pname); openinfo.lorder = lorder; if (fstat(fileno(fp), &st) == -1) - error(pname); + mkpw_error("Cannot stat `%s'", pname); if (cachesize) { openinfo.cachesize = cachesize; @@ -393,10 +401,10 @@ pname); if ((tfd = open(oldpwdfile, O_WRONLY | O_CREAT | O_EXCL, PERM_INSECURE)) < 0) - error(oldpwdfile); + mkpw_error("Cannot create `%s'", oldpwdfile); clean |= FILE_ORIG; if ((oldfp = fdopen(tfd, "w")) == NULL) - error(oldpwdfile); + mkpw_error("Cannot fdopen `%s'", oldpwdfile); } if (username != NULL) { @@ -444,11 +452,11 @@ if (pwd.pw_name[0] == '+') { if ((flags & _PASSWORD_NOUID) == 0 && pwd.pw_uid == 0) - warnx("line %d: superuser override " - "in YP inclusion", lineno); + mkpw_warning("line %d: superuser " + "override in YP inclusion", lineno); if ((flags & _PASSWORD_NOGID) == 0 && pwd.pw_gid == 0) - warnx("line %d: wheel override " + mkpw_warning("line %d: wheel override " "in YP inclusion", lineno); } @@ -461,7 +469,7 @@ continue; if (found) { - warnx("user `%s' listed twice in password file", + mkpw_warning("user `%s' listed twice in password file", username); bailout(); } @@ -537,7 +545,7 @@ if (hasyp) putyptoken(&sdb); } else if (!found) { - warnx("user `%s' not found in password file", username); + mkpw_warning("user `%s' not found in password file", username); bailout(); } @@ -592,9 +600,8 @@ * -- The Who */ if ((p = strchr(line, '\n')) == NULL) { - warnx("line too long"); errno = EFTYPE; /* XXX */ - error(pname); + mkpw_error("%s, %d: line too long", pname, *lineno); } *p = '\0'; if (strcmp(line, "+") == 0) { @@ -603,9 +610,8 @@ } oflags = 0; if (!pw_scan(line, pw, &oflags)) { - warnx("at line #%d", *lineno); errno = EFTYPE; /* XXX */ - error(pname); + mkpw_error("%s, %d: Syntax mkpw_error", pname, *lineno); } *flags = oflags; @@ -616,16 +622,10 @@ install(const char *from, const char *to) { char buf[MAXPATHLEN]; - char errbuf[BUFSIZ]; - int sverrno; (void)snprintf(buf, sizeof(buf), "%s%s", prefix, to); - if (rename(from, buf)) { - sverrno = errno; - (void)snprintf(errbuf, sizeof(errbuf), "%s to %s", from, buf); - errno = sverrno; - error(errbuf); - } + if (rename(from, buf)) + mkpw_error("Cannot rename `%s' to `%s'", from, buf); } void @@ -640,13 +640,13 @@ cp(const char *from, const char *to, mode_t mode) { static char buf[MAXBSIZE]; - int from_fd, to_fd, sverrno; + int from_fd, to_fd; ssize_t rcount, wcount; if ((from_fd = open(from, O_RDONLY, 0)) < 0) - error(from); + mkpw_error("Cannot open `%s'", from); if ((to_fd = open(to, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) - error(to); + mkpw_error("Cannot open `%s'", to); while ((rcount = read(from_fd, buf, MAXBSIZE)) > 0) { wcount = write(to_fd, buf, (size_t)rcount); if (rcount != wcount || wcount == -1) @@ -661,41 +661,50 @@ return; on_error: - sverrno = errno; - (void)snprintf(buf, sizeof(buf), "%s to %s", from, to); - errno = sverrno; - error(buf); + mkpw_error("Cannot copy `%s' to `%s'", from, to); } void wr_error(const char *str) { - char errbuf[BUFSIZ]; - int sverrno; - - sverrno = errno; - - (void)snprintf(errbuf, sizeof(errbuf), - "attempt to write %s failed", str); - - errno = sverrno; - error(errbuf); + mkpw_error("Cannot write `%s'", str); } void -error(const char *str) +mkpw_error(const char *fmt, ...) { - - warn("%s", str); + va_list ap; + va_start(ap, fmt); + if (logsyslog) { + int sverrno = errno; + char efmt[BUFSIZ]; + snprintf(efmt, sizeof(efmt), "%s (%%m)", fmt); + errno = sverrno; + vsyslog(LOG_ERR, efmt, ap); + } else + vwarn(fmt, ap); + va_end(ap); bailout(); } void +mkpw_warning(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (logsyslog) + vsyslog(LOG_WARNING, fmt, ap); + else + vwarnx(fmt, ap); + va_end(ap); +} + +void inconsistency(void) { - warnx("text files and databases are inconsistent"); - warnx("re-build the databases without -u"); + mkpw_warning("text files and databases are inconsistent"); + mkpw_warning("re-build the databases without -u"); bailout(); } @@ -726,7 +735,7 @@ /* If we are building on a separate root, assume version 1 */ if ((errno == EACCES || errno == ENOENT) && prefix[0]) return 1; - warn("Cannot open database %s", fname); + mkpw_warning("Cannot open database `%s'", fname); bailout(); } key.data = __UNCONST("VERSION"); @@ -734,22 +743,24 @@ switch (ret = (*db->get)(db, &key, &data, 0)) { case -1: /* Error */ - warn("Cannot get VERSION record from database"); + mkpw_warning("Cannot get VERSION record from database `%s'", + fname); goto out; case 0: if (data.size != sizeof(version)) { - warnx("Bad VERSION record in database"); + mkpw_warning("Bad VERSION record in database `%s'", fname); goto out; } (void)memcpy(&version, data.data, sizeof(version)); /*FALLTHROUGH*/ case 1: if (ret == 1) - warnx("Database %s has no version info", fname); + mkpw_warning("Database `%s' has no version info", + fname); (*db->close)(db); return version; default: - warnx("internal error db->get returns %d", ret); + mkpw_warning("internal mkpw_error db->get returns %d", ret); goto out; } out: @@ -769,7 +780,7 @@ data.size = sizeof(uint32_t); if ((*db->db->put)(db->db, &key, &data, 0) != 0) { - warn("Can't write VERSION record to %s", db->dbname); + mkpw_warning("Can't write VERSION record to `%s'", db->dbname); bailout(); } } @@ -947,7 +958,7 @@ if ((rv = (*db->db->get)(db->db, &key, &data, 0)) == 1) return (rv); if (rv == -1) - error(db->dbname); + mkpw_error("Error getting record from `%s'", db->dbname); p = (char *)data.data; @@ -1036,7 +1047,7 @@ { (void)fprintf(stderr, - "Usage: %s [-BLpsvw] [-c cachesize] [-d directory] [-u user] " + "Usage: %s [-BLlpsvw] [-c cachesize] [-d directory] [-u user] " "[-V version] file\n", getprogname()); exit(EXIT_FAILURE);