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);

Reply via email to