This patch is generated by coccinelle, but I reviewed it.  I changed the
lpr patch to use warnc() so it has less code executing inside
PRIV_START.

I targeted if statements where it modifies errno before warn or err is
called.  It checked a list of functions that are typically used in error
handling and may set errno: close, fclose, unlink, rmdir, fflush and
kill.


Index: bin/systrace/intercept.c
===================================================================
RCS file: /cvs/src/bin/systrace/intercept.c,v
retrieving revision 1.61
diff -u -p -d -r1.61 intercept.c
--- bin/systrace/intercept.c    24 Apr 2014 01:57:06 -0000      1.61
+++ bin/systrace/intercept.c    12 Jul 2014 04:27:22 -0000
@@ -356,22 +356,26 @@ intercept_run(int bg, int *fdp, uid_t ui
        
        /* Setup done, restore signal handling state */
        if (signal(SIGUSR1, ohandler) == SIG_ERR) {
+               int saved_errno = errno;
                kill(pid, SIGKILL);
-               err(1, "signal");
+               errc(1, saved_errno, "signal");
        }
        if (sigprocmask(SIG_SETMASK, &oset, NULL) == -1) {
+               int saved_errno = errno;
                kill(pid, SIGKILL);
-               err(1, "sigprocmask");
+               errc(1, saved_errno, "sigprocmask");
        }
 
        if (bg) {
                if (daemon(1, 1) == -1) {
+                       int saved_errno = errno;
                        kill(pid, SIGKILL);
-                       err(1, "daemon");
+                       errc(1, saved_errno, "daemon");
                }
                if ((*fdp = intercept_open()) == -1) {
+                       int saved_errno = errno;
                        kill(pid, SIGKILL);
-                       err(1, "intercept_open");
+                       errc(1, saved_errno, "intercept_open");
                }
        }
 
Index: regress/lib/libc/stdio_threading/fgetln/fgetln_test.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/stdio_threading/fgetln/fgetln_test.c,v
retrieving revision 1.1
diff -u -p -d -r1.1 fgetln_test.c
--- regress/lib/libc/stdio_threading/fgetln/fgetln_test.c       19 Nov 2009 
08:06:06 -0000      1.1
+++ regress/lib/libc/stdio_threading/fgetln/fgetln_test.c       12 Jul 2014 
04:29:16 -0000
@@ -50,11 +50,12 @@ main(void)
        strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
        if ((fd = mkstemp(sfn)) == -1 ||
            (sfp = fdopen(fd, "w+")) == NULL) {
+               int saved_errno = errno;
                if (fd != -1) {
                        unlink(sfn);
                        close(fd);
                }
-               err(1, "could not open temporary file");
+               errc(1, saved_errno, "could not open temporary file");
        }
 
        for (i = 0; i < 4096 * THREAD_COUNT; i++)
Index: regress/lib/libc/stdio_threading/fgets/fgets_test.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/stdio_threading/fgets/fgets_test.c,v
retrieving revision 1.1
diff -u -p -d -r1.1 fgets_test.c
--- regress/lib/libc/stdio_threading/fgets/fgets_test.c 19 Nov 2009 08:06:06 
-0000      1.1
+++ regress/lib/libc/stdio_threading/fgets/fgets_test.c 12 Jul 2014 04:29:16 
-0000
@@ -49,11 +49,12 @@ main(void)
        strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
        if ((fd = mkstemp(sfn)) == -1 ||
            (sfp = fdopen(fd, "w+")) == NULL) {
+               int saved_errno = errno;
                if (fd != -1) {
                        unlink(sfn);
                        close(fd);
                }
-               err(1, "could not open temporary file");
+               errc(1, saved_errno, "could not open temporary file");
        }
 
        for (i = 0; i < 4096 * THREAD_COUNT; i++)
Index: regress/lib/libc/stdio_threading/fputs/fputs_test.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/stdio_threading/fputs/fputs_test.c,v
retrieving revision 1.1
diff -u -p -d -r1.1 fputs_test.c
--- regress/lib/libc/stdio_threading/fputs/fputs_test.c 19 Nov 2009 08:06:06 
-0000      1.1
+++ regress/lib/libc/stdio_threading/fputs/fputs_test.c 12 Jul 2014 04:29:16 
-0000
@@ -46,11 +46,12 @@ main(void)
        strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
        if ((fd = mkstemp(sfn)) == -1 ||
            (sfp = fdopen(fd, "w+")) == NULL) {
+               int saved_errno = errno;
                if (fd != -1) {
                        unlink(sfn);
                        close(fd);
                }
-               err(1, "could not open temporary file");
+               errc(1, saved_errno, "could not open temporary file");
        }
 
        run_threads(fputs_thread, sfp);
Index: regress/lib/libc/stdio_threading/fread/fread_test.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/stdio_threading/fread/fread_test.c,v
retrieving revision 1.1
diff -u -p -d -r1.1 fread_test.c
--- regress/lib/libc/stdio_threading/fread/fread_test.c 19 Nov 2009 08:06:06 
-0000      1.1
+++ regress/lib/libc/stdio_threading/fread/fread_test.c 12 Jul 2014 04:29:16 
-0000
@@ -51,11 +51,12 @@ main(void)
        strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
        if ((fd = mkstemp(sfn)) == -1 ||
            (sfp = fdopen(fd, "w+")) == NULL) {
+               int saved_errno = errno;
                if (fd != -1) {
                        unlink(sfn);
                        close(fd);
                }
-               err(1, "could not open temporary file");
+               errc(1, saved_errno, "could not open temporary file");
        }
 
        for (i = 0; i < 4096 * THREAD_COUNT; i++)
Index: regress/lib/libc/stdio_threading/fwrite/fwrite_test.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/stdio_threading/fwrite/fwrite_test.c,v
retrieving revision 1.1
diff -u -p -d -r1.1 fwrite_test.c
--- regress/lib/libc/stdio_threading/fwrite/fwrite_test.c       19 Nov 2009 
08:06:06 -0000      1.1
+++ regress/lib/libc/stdio_threading/fwrite/fwrite_test.c       12 Jul 2014 
04:29:16 -0000
@@ -46,11 +46,12 @@ main(void)
        strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
        if ((fd = mkstemp(sfn)) == -1 ||
            (sfp = fdopen(fd, "w+")) == NULL) {
+               int saved_errno = errno;
                if (fd != -1) {
                        unlink(sfn);
                        close(fd);
                }
-               err(1, "could not open temporary file");
+               errc(1, saved_errno, "could not open temporary file");
        }
 
        run_threads(fwrite_thread, sfp);
Index: regress/lib/libc/stdio_threading/include/local.h
===================================================================
RCS file: /cvs/src/regress/lib/libc/stdio_threading/include/local.h,v
retrieving revision 1.3
diff -u -p -d -r1.3 local.h
--- regress/lib/libc/stdio_threading/include/local.h    20 May 2014 01:25:24 
-0000      1.3
+++ regress/lib/libc/stdio_threading/include/local.h    12 Jul 2014 04:29:16 
-0000
@@ -14,6 +14,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
Index: regress/sys/kern/getpeereid/getpeereid_test.c
===================================================================
RCS file: /cvs/src/regress/sys/kern/getpeereid/getpeereid_test.c,v
retrieving revision 1.1
diff -u -p -d -r1.1 getpeereid_test.c
--- regress/sys/kern/getpeereid/getpeereid_test.c       23 Oct 2006 15:18:47 
-0000      1.1
+++ regress/sys/kern/getpeereid/getpeereid_test.c       12 Jul 2014 04:29:32 
-0000
@@ -85,15 +85,17 @@ server(struct sockaddr_un *sun)
        if (bind(s, (struct sockaddr *)sun, sizeof(*sun)) != 0)
                err(1, "bind");
        if (listen(s, 5) != 0) {
+               int saved_errno = errno;
                unlink(path);
                rmdir(dir);
-               err(1, "listen");
+               errc(1, saved_errno, "listen");
        }
        fd = accept(s, (struct sockaddr *)&client_addr, &client_len);
        if (fd == -1) {
+               int saved_errno = errno;
                unlink(path);
                rmdir(dir);
-               err(1, "accept");
+               errc(1, saved_errno, "accept");
        }
        problem = check_id(fd);
        if (problem)  {
Index: sbin/bioctl/bioctl.c
===================================================================
RCS file: /cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.120
diff -u -p -d -r1.120 bioctl.c
--- sbin/bioctl/bioctl.c        22 Apr 2014 20:42:01 -0000      1.120
+++ sbin/bioctl/bioctl.c        12 Jul 2014 04:29:40 -0000
@@ -926,8 +926,9 @@ bio_createraid(u_int16_t level, char *de
                if (fd == -1)
                        err(1, "could not open %s", key_disk);
                if (fstat(fd, &sb) == -1) {
+                       int saved_errno = errno;
                        close(fd);
-                       err(1, "could not stat %s", key_disk);
+                       errc(1, saved_errno, "could not stat %s", key_disk);
                }
                close(fd);
                create.bc_key_disk = sb.st_rdev;
@@ -1026,8 +1027,9 @@ bio_parse_devlist(char *lst, dev_t *dt)
                        if (fd == -1)
                                err(1, "could not open %s", dev);
                        if (fstat(fd, &sb) == -1) {
+                               int saved_errno = errno;
                                close(fd);
-                               err(1, "could not stat %s", dev);
+                               errc(1, saved_errno, "could not stat %s", dev);
                        }
                        close(fd);
                        dt[no_dev] = sb.st_rdev;
Index: sbin/disklabel/disklabel.c
===================================================================
RCS file: /cvs/src/sbin/disklabel/disklabel.c,v
retrieving revision 1.195
diff -u -p -d -r1.195 disklabel.c
--- sbin/disklabel/disklabel.c  5 May 2014 16:33:34 -0000       1.195
+++ sbin/disklabel/disklabel.c  12 Jul 2014 04:29:41 -0000
@@ -816,9 +816,9 @@ edit(struct disklabel *lp, int f)
        u_int64_t total_sectors, starting_sector, ending_sector;
 
        if ((fd = mkstemp(tmpfil)) == -1 || (fp = fdopen(fd, "w")) == NULL) {
+               warn("%s", tmpfil);
                if (fd != -1)
                        close(fd);
-               warn("%s", tmpfil);
                return (1);
        }
        display(fp, lp, 0, 1);
Index: sbin/newfs/newfs.c
===================================================================
RCS file: /cvs/src/sbin/newfs/newfs.c,v
retrieving revision 1.95
diff -u -p -d -r1.95 newfs.c
--- sbin/newfs/newfs.c  22 Nov 2013 04:12:48 -0000      1.95
+++ sbin/newfs/newfs.c  12 Jul 2014 04:29:42 -0000
@@ -755,11 +755,12 @@ copy(char *src, char *dst, struct mfs_ar
                mount_args.fspec = src;
                ret = mount(MOUNT_FFS, mountpoint, MNT_RDONLY, &mount_args);
                if (ret != 0) {
+                       int saved_errno = errno;
                        if (created && rmdir(mountpoint) != 0)
                                warn("rmdir %s", mountpoint);
                        if (unmount(dst, 0) != 0)
                                warn("unmount %s", dst);
-                       err(1, "mount %s %s", src, mountpoint);
+                       errc(1, saved_errno, "mount %s %s", src, mountpoint);
                }
        }
        ret = do_exec(mountpoint, "/bin/pax", argv);
Index: sbin/restore/dirs.c
===================================================================
RCS file: /cvs/src/sbin/restore/dirs.c,v
retrieving revision 1.35
diff -u -p -d -r1.35 dirs.c
--- sbin/restore/dirs.c 25 Apr 2013 06:43:20 -0000      1.35
+++ sbin/restore/dirs.c 12 Jul 2014 04:29:43 -0000
@@ -45,6 +45,7 @@
 #include <protocols/dumprestore.h>
 
 #include <err.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <paths.h>
 #include <stdio.h>
@@ -148,9 +149,11 @@ extractdirs(int genmode)
        } else
                fd = open(dirfile, O_RDWR|O_CREAT|O_EXCL, 0666);
        if (fd == -1 || (df = fdopen(fd, "w")) == NULL) {
+               int saved_errno = errno;
                if (fd != -1)
                        close(fd);
-               err(1, "cannot create directory temporary %s", dirfile);
+               errc(1, saved_errno,
+                   "cannot create directory temporary %s", dirfile);
        }
        if (genmode != 0) {
                (void)snprintf(modefile, sizeof(modefile), "%s/rstmode%lld",
@@ -161,9 +164,11 @@ extractdirs(int genmode)
                } else
                        fd = open(modefile, O_RDWR|O_CREAT|O_EXCL, 0666);
                if (fd == -1 || (mf = fdopen(fd, "w")) == NULL) {
+                       int saved_errno = errno;
                        if (fd != -1)
                                close(fd);
-                       err(1, "cannot create modefile %s", modefile);
+                       errc(1, saved_errno,
+                           "cannot create modefile %s", modefile);
                }
        }
        nulldir.d_ino = 0;
Index: sys/dev/microcode/bwi/build/build.c
===================================================================
RCS file: /cvs/src/sys/dev/microcode/bwi/build/build.c,v
retrieving revision 1.1
diff -u -p -d -r1.1 build.c
--- sys/dev/microcode/bwi/build/build.c 4 Oct 2007 17:46:09 -0000       1.1
+++ sys/dev/microcode/bwi/build/build.c 12 Jul 2014 04:30:00 -0000
@@ -20,6 +20,7 @@
 #include <sys/stat.h>
 
 #include <err.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -104,12 +105,14 @@ main(int argc, char *argv[])
 
        /* write header */
        if (write(fdout, &nfiles, sizeof(nfiles)) < 1) {
+               int saved_errno = errno;
                close(fdout);
-               err(1, "write header 1 to output file failed\n");
+               errc(1, saved_errno, "write header 1 to output file failed\n");
        }
        if (write(fdout, h, headersize - sizeof(nfiles)) < 1) {
+               int saved_errno = errno;
                close(fdout);
-               err(1, "write header 2 to output file failed\n");
+               errc(1, saved_errno, "write header 2 to output file failed\n");
        }
 
        /* network to host byte order */
@@ -122,25 +125,29 @@ main(int argc, char *argv[])
        /* write each file */
        for (i = 0; i < nfiles; i++) {
                if ((fdin = open(h[i].filename, O_RDONLY)) == -1) {
+                       int saved_errno = errno;
                        close(fdout);
-                       err(1, "open input file failed\n");
+                       errc(1, saved_errno, "open input file failed\n");
                }
                if ((p = malloc(h[i].filesize)) == NULL) {
+                       int saved_errno = errno;
                        close(fdout);
                        close(fdin);
-                       err(1, "malloc");
+                       errc(1, saved_errno, "malloc");
                }
                if (read(fdin, p, h[i].filesize) < 1) {
+                       int saved_errno = errno;
                        free(p);
                        close(fdout);
                        close(fdin);
-                       err(1, "read input file failed\n");
+                       errc(1, saved_errno, "read input file failed\n");
                }
                if (write(fdout, p, h[i].filesize) < 1) {
+                       int saved_errno = errno;
                        free(p);
                        close(fdout);
                        close(fdin);
-                       err(1, "write to output file failed\n");
+                       errc(1, saved_errno, "write to output file failed\n");
                }
                free(p);
                close(fdin);
Index: usr.bin/indent/indent.c
===================================================================
RCS file: /cvs/src/usr.bin/indent/indent.c,v
retrieving revision 1.24
diff -u -p -d -r1.24 indent.c
--- usr.bin/indent/indent.c     20 May 2014 01:25:23 -0000      1.24
+++ usr.bin/indent/indent.c     12 Jul 2014 04:30:08 -0000
@@ -1200,7 +1200,8 @@ bakcopy(void)
     /* now the original input file will be the output */
     output = fopen(in_name, "w");
     if (output == NULL) {
+       int saved_errno = errno;
        unlink(bakfile);
-       err(1, "%s", in_name);
+       errc(1, saved_errno, "%s", in_name);
     }
 }
Index: usr.bin/nc/netcat.c
===================================================================
RCS file: /cvs/src/usr.bin/nc/netcat.c,v
retrieving revision 1.121
diff -u -p -d -r1.121 netcat.c
--- usr.bin/nc/netcat.c 10 Jun 2014 16:35:42 -0000      1.121
+++ usr.bin/nc/netcat.c 12 Jul 2014 04:30:10 -0000
@@ -753,8 +753,9 @@ readwrite(int nfd)
                        sleep(iflag);
 
                if ((n = poll(pfd, 2 - dflag, timeout)) < 0) {
+                       int saved_errno = errno;
                        close(nfd);
-                       err(1, "Polling Error");
+                       errc(1, saved_errno, "Polling Error");
                }
 
                if (n == 0)
Index: usr.sbin/edquota/edquota.c
===================================================================
RCS file: /cvs/src/usr.sbin/edquota/edquota.c,v
retrieving revision 1.52
diff -u -p -d -r1.52 edquota.c
--- usr.sbin/edquota/edquota.c  18 May 2014 05:08:07 -0000      1.52
+++ usr.sbin/edquota/edquota.c  12 Jul 2014 04:30:22 -0000
@@ -153,8 +153,9 @@ main(int argc, char *argv[])
                        exit(1);
                }
                if (editit(tmpfil) == -1) {
+                       int saved_errno = errno;
                        unlink(tmpfil);
-                       err(1, "error starting editor");
+                       errc(1, saved_errno, "error starting editor");
                }
                if (readtimes(protoprivs, tmpfd))
                        putprivs(0, quotatype, protoprivs);
Index: usr.sbin/ikectl/ikeca.c
===================================================================
RCS file: /cvs/src/usr.sbin/ikectl/ikeca.c,v
retrieving revision 1.26
diff -u -p -d -r1.26 ikeca.c
--- usr.sbin/ikectl/ikeca.c     18 Apr 2014 21:29:20 -0000      1.26
+++ usr.sbin/ikectl/ikeca.c     12 Jul 2014 04:30:22 -0000
@@ -473,8 +473,9 @@ fcopy(char *src, char *dst, mode_t mode)
                err(1, "open %s", src);
 
        if ((ofd = open(dst, O_WRONLY|O_CREAT|O_TRUNC, mode)) == -1) {
+               int saved_errno = errno;
                close(ifd);
-               err(1, "open %s", dst);
+               errc(1, saved_errno, "open %s", dst);
        }
 
        while ((r = read(ifd, buf, sizeof(buf))) > 0) {
Index: usr.sbin/kvm_mkdb/kvm_mkdb.c
===================================================================
RCS file: /cvs/src/usr.sbin/kvm_mkdb/kvm_mkdb.c,v
retrieving revision 1.17
diff -u -p -d -r1.17 kvm_mkdb.c
--- usr.sbin/kvm_mkdb/kvm_mkdb.c        27 Oct 2009 23:59:51 -0000      1.17
+++ usr.sbin/kvm_mkdb/kvm_mkdb.c        12 Jul 2014 04:30:24 -0000
@@ -161,8 +161,8 @@ kvm_mkdb(int fd, const char *dbdir, char
                return(1);
        }
        if (create_knlist(nlistpath, fd, db) != 0) {
-               (void)unlink(dbtemp);
                warn("cannot determine executable type of %s", nlistpath);
+               (void)unlink(dbtemp);
                return(1);
        }
        if (db->close(db)) {
Index: usr.sbin/lpr/common_source/startdaemon.c
===================================================================
RCS file: /cvs/src/usr.sbin/lpr/common_source/startdaemon.c,v
retrieving revision 1.13
diff -u -p -d -r1.13 startdaemon.c
--- usr.sbin/lpr/common_source/startdaemon.c    27 Oct 2009 23:59:51 -0000      
1.13
+++ usr.sbin/lpr/common_source/startdaemon.c    12 Jul 2014 04:30:24 -0000
@@ -67,6 +67,7 @@ startdaemon(char *printer)
        siginterrupt(SIGINT, 1);
        PRIV_START;
        if (connect(s, (struct sockaddr *)&un, SUN_LEN(&un)) < 0) {
+               int saved_errno = errno;
                if (errno == EINTR && gotintr) {
                        PRIV_END;
                        siginterrupt(SIGINT, 0);
@@ -75,7 +76,7 @@ startdaemon(char *printer)
                }
                PRIV_END;
                siginterrupt(SIGINT, 0);
-               warn("connect");
+               warnc(saved_errno, "connect");
                (void)close(s);
                return(0);
        }
Index: usr.sbin/smtpd/enqueue.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/enqueue.c,v
retrieving revision 1.81
diff -u -p -d -r1.81 enqueue.c
--- usr.sbin/smtpd/enqueue.c    6 Jun 2014 15:02:08 -0000       1.81
+++ usr.sbin/smtpd/enqueue.c    12 Jul 2014 04:30:27 -0000
@@ -288,11 +288,12 @@ enqueue(int argc, char *argv[])
 
        if ((fd = mkstemp(sfn)) == -1 ||
            (fp = fdopen(fd, "w+")) == NULL) {
+               int saved_errno = errno;
                if (fd != -1) {
                        unlink(sfn);
                        close(fd);
                }
-               err(EX_UNAVAILABLE, "mkstemp");
+               errc(EX_UNAVAILABLE, saved_errno, "mkstemp");
        }
        unlink(sfn);
        noheader = parse_message(stdin, fake_from == NULL, tflag, fp);
Index: usr.sbin/smtpd/smtpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/smtpctl.c,v
retrieving revision 1.123
diff -u -p -d -r1.123 smtpctl.c
--- usr.sbin/smtpd/smtpctl.c    8 Jul 2014 20:14:46 -0000       1.123
+++ usr.sbin/smtpd/smtpctl.c    12 Jul 2014 04:30:28 -0000
@@ -1089,11 +1089,12 @@ display(const char *s)
 
                if ((fd = mkstemp(sfn)) == -1 ||
                    (ofp = fdopen(fd, "w+")) == NULL) {
+                       int saved_errno = errno;
                        if (fd != -1) {
                                unlink(sfn);
                                close(fd);
                        }
-                       err(1, "mkstemp");
+                       errc(1, saved_errno, "mkstemp");
                }
                unlink(sfn);
 
Index: usr.sbin/user/user.c
===================================================================
RCS file: /cvs/src/usr.sbin/user/user.c,v
retrieving revision 1.98
diff -u -p -d -r1.98 user.c
--- usr.sbin/user/user.c        23 Nov 2013 17:14:05 -0000      1.98
+++ usr.sbin/user/user.c        12 Jul 2014 04:30:29 -0000
@@ -38,6 +38,7 @@
 #include <ctype.h>
 #include <dirent.h>
 #include <err.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <grp.h>
 #include <login_cap.h>
@@ -341,15 +342,15 @@ creategid(char *group, gid_t gid, const 
        (void) fstat(fileno(from), &st);
        (void) snprintf(f, sizeof(f), "%s.XXXXXXXX", _PATH_GROUP);
        if ((fd = mkstemp(f)) < 0) {
-               (void) fclose(from);
                warn("can't create gid: mkstemp failed");
+               (void) fclose(from);
                return 0;
        }
        if ((to = fdopen(fd, "w")) == NULL) {
+               warn("can't create gid: fdopen `%s' failed", f);
                (void) fclose(from);
                (void) close(fd);
                (void) unlink(f);
-               warn("can't create gid: fdopen `%s' failed", f);
                return 0;
        }
        while ((buf = fgetln(from, &len)) != NULL && len > 0) {
@@ -360,10 +361,10 @@ creategid(char *group, gid_t gid, const 
                }
                if (ret == -1 ||
                    fprintf(to, "%*.*s", (int)len, (int)len, buf) != len) {
+                       warn("can't create gid: short write to `%s'", f);
                        (void) fclose(from);
                        (void) fclose(to);
                        (void) unlink(f);
-                       warn("can't create gid: short write to `%s'", f);
                        return 0;
                }
        }
@@ -372,14 +373,14 @@ creategid(char *group, gid_t gid, const 
                ret = fprintf(to, "%s:*:%u:%s\n", group, gid, name);
        (void) fclose(from);
        if (fclose(to) == EOF || ret == -1) {
-               (void) unlink(f);
                warn("can't create gid: short write to `%s'", f);
+               (void) unlink(f);
                return 0;
        }
        if (rename(f, _PATH_GROUP) < 0) {
-               (void) unlink(f);
                warn("can't create gid: can't rename `%s' to `%s'", f,
                    _PATH_GROUP);
+               (void) unlink(f);
                return 0;
        }
        (void) chmod(_PATH_GROUP, st.st_mode & 07777);
@@ -413,15 +414,15 @@ modify_gid(char *group, char *newent)
        (void) fstat(fileno(from), &st);
        (void) snprintf(f, sizeof(f), "%s.XXXXXXXX", _PATH_GROUP);
        if ((fd = mkstemp(f)) < 0) {
-               (void) fclose(from);
                warn("can't modify gid: mkstemp failed");
+               (void) fclose(from);
                return 0;
        }
        if ((to = fdopen(fd, "w")) == NULL) {
+               warn("can't modify gid: fdopen `%s' failed", f);
                (void) fclose(from);
                (void) close(fd);
                (void) unlink(f);
-               warn("can't modify gid: fdopen `%s' failed", f);
                return 0;
        }
        groupc = strlen(group);
@@ -459,22 +460,22 @@ modify_gid(char *group, char *newent)
                        }
                }
                if (fwrite(buf, cc, 1, to) != 1) {
+                       warn("can't modify gid: short write to `%s'", f);
                        (void) fclose(from);
                        (void) fclose(to);
                        (void) unlink(f);
-                       warn("can't modify gid: short write to `%s'", f);
                        return 0;
                }
        }
        (void) fclose(from);
        if (fclose(to) == EOF) {
-               (void) unlink(f);
                warn("can't modify gid: short write to `%s'", f);
+               (void) unlink(f);
                return 0;
        }
        if (rename(f, _PATH_GROUP) < 0) {
-               (void) unlink(f);
                warn("can't modify gid: can't rename `%s' to `%s'", f, 
_PATH_GROUP);
+               (void) unlink(f);
                return 0;
        }
        (void) chmod(_PATH_GROUP, st.st_mode & 07777);
@@ -535,15 +536,15 @@ append_group(char *user, int ngroups, co
        (void) fstat(fileno(from), &st);
        (void) snprintf(f, sizeof(f), "%s.XXXXXXXX", _PATH_GROUP);
        if ((fd = mkstemp(f)) < 0) {
-               (void) fclose(from);
                warn("can't append group: mkstemp failed");
+               (void) fclose(from);
                return 0;
        }
        if ((to = fdopen(fd, "w")) == NULL) {
+               warn("can't append group: fdopen `%s' failed", f);
                (void) fclose(from);
                (void) close(fd);
                (void) unlink(f);
-               warn("can't append group: fdopen `%s' failed", f);
                return 0;
        }
        while (fgets(buf, sizeof(buf), from) != NULL) {
@@ -586,22 +587,22 @@ append_group(char *user, int ngroups, co
                        }
                }
                if (fwrite(buf, cc, 1, to) != 1) {
+                       warn("can't append group: short write to `%s'", f);
                        (void) fclose(from);
                        (void) fclose(to);
                        (void) unlink(f);
-                       warn("can't append group: short write to `%s'", f);
                        return 0;
                }
        }
        (void) fclose(from);
        if (fclose(to) == EOF) {
-               (void) unlink(f);
                warn("can't append group: short write to `%s'", f);
+               (void) unlink(f);
                return 0;
        }
        if (rename(f, _PATH_GROUP) < 0) {
-               (void) unlink(f);
                warn("can't append group: can't rename `%s' to `%s'", f, 
_PATH_GROUP);
+               (void) unlink(f);
                return 0;
        }
        (void) chmod(_PATH_GROUP, st.st_mode & 07777);
@@ -980,15 +981,17 @@ adduser(char *login_name, user_t *up)
        }
        pw_init();
        if ((ptmpfd = pw_lock(WAITSECS)) < 0) {
+               int saved_errno = errno;
                (void) close(masterfd);
-               err(EXIT_FAILURE, "can't obtain pw_lock");
+               errc(EXIT_FAILURE, saved_errno, "can't obtain pw_lock");
        }
        if ((fp = fdopen(masterfd, "r")) == NULL) {
+               int saved_errno = errno;
                (void) close(masterfd);
                (void) close(ptmpfd);
                pw_abort();
-               err(EXIT_FAILURE, "can't fdopen `%s' for reading",
-                   _PATH_MASTERPASSWD);
+               errc(EXIT_FAILURE, saved_errno,
+                   "can't fdopen `%s' for reading", _PATH_MASTERPASSWD);
        }
        while (fgets(buf, sizeof(buf), fp) != NULL) {
                cc = strlen(buf);
@@ -1002,17 +1005,21 @@ adduser(char *login_name, user_t *up)
                        break;
                }
                if (write(ptmpfd, buf, (size_t)(cc)) != cc) {
+                       int saved_errno = errno;
                        (void) fclose(fp);
                        (void) close(ptmpfd);
                        pw_abort();
-                       err(EXIT_FAILURE, "short write to /etc/ptmp (not %d 
chars)", cc);
+                       errc(EXIT_FAILURE, saved_errno,
+                           "short write to /etc/ptmp (not %d chars)", cc);
                }
        }
        if (ferror(fp)) {
+               int saved_errno = errno;
                (void) fclose(fp);
                (void) close(ptmpfd);
                pw_abort();
-               err(EXIT_FAILURE, "read error on %s", _PATH_MASTERPASSWD);
+               errc(EXIT_FAILURE, saved_errno, "read error on %s",
+                   _PATH_MASTERPASSWD);
        }
        /* if no uid was specified, get next one in [low_uid..high_uid] range */
        sync_uid_gid = (strcmp(up->u_primgrp, "=uid") == 0);
@@ -1132,9 +1139,10 @@ adduser(char *login_name, user_t *up)
                errx(EXIT_FAILURE, "can't add `%s', line too long", buf);
        }
        if (write(ptmpfd, buf, (size_t) cc) != cc) {
+               int saved_errno = errno;
                (void) close(ptmpfd);
                pw_abort();
-               err(EXIT_FAILURE, "can't add `%s'", buf);
+               errc(EXIT_FAILURE, saved_errno, "can't add `%s'", buf);
        }
        if (yp) {
                /* put back the + line */
@@ -1145,25 +1153,31 @@ adduser(char *login_name, user_t *up)
                        errx(EXIT_FAILURE, "can't add `%s', line too long", 
buf);
                }
                if (write(ptmpfd, buf, (size_t) cc) != cc) {
+                       int saved_errno = errno;
                        (void) close(ptmpfd);
                        pw_abort();
-                       err(EXIT_FAILURE, "can't add `%s'", buf);
+                       errc(EXIT_FAILURE, saved_errno, "can't add `%s'", buf);
                }
                /* copy the entries following it, if any */
                while (fgets(buf, sizeof(buf), fp) != NULL) {
                        cc = strlen(buf);
                        if (write(ptmpfd, buf, (size_t)(cc)) != cc) {
+                               int saved_errno = errno;
                                (void) fclose(fp);
                                (void) close(ptmpfd);
                                pw_abort();
-                               err(EXIT_FAILURE, "short write to /etc/ptmp 
(not %d chars)", cc);
+                               errc(EXIT_FAILURE, saved_errno,
+                                   "short write to /etc/ptmp (not %d chars)",
+                                   cc);
                        }
                }
                if (ferror(fp)) {
+                       int saved_errno = errno;
                        (void) fclose(fp);
                        (void) close(ptmpfd);
                        pw_abort();
-                       err(EXIT_FAILURE, "read error on %s", 
_PATH_MASTERPASSWD);
+                       errc(EXIT_FAILURE, saved_errno, "read error on %s",
+                           _PATH_MASTERPASSWD);
                }
        }
        if (up->u_flags & F_MKDIR) {
@@ -1174,9 +1188,11 @@ adduser(char *login_name, user_t *up)
                            home);
                } else {
                        if (asystem("%s -p %s", MKDIR, home) != 0) {
+                               int saved_errno = errno;
                                (void) close(ptmpfd);
                                pw_abort();
-                               err(EXIT_FAILURE, "can't mkdir `%s'", home);
+                               errc(EXIT_FAILURE, saved_errno,
+                                   "can't mkdir `%s'", home);
                        }
                        (void) copydotfiles(up->u_skeldir, up->u_uid, gid, 
home);
                        (void) asystem("%s -R -P %u:%u %s", CHOWN, up->u_uid,
@@ -1233,16 +1249,16 @@ rm_user_from_groups(char *login_name)
        (void) fstat(fileno(from), &st);
        (void) snprintf(f, sizeof(f), "%s.XXXXXXXX", _PATH_GROUP);
        if ((fd = mkstemp(f)) < 0) {
-               (void) fclose(from);
                warn("can't remove gid for `%s': mkstemp failed", login_name);
+               (void) fclose(from);
                return 0;
        }
        if ((to = fdopen(fd, "w")) == NULL) {
+               warn("can't remove gid for `%s': fdopen `%s' failed",
+                   login_name, f);
                (void) fclose(from);
                (void) close(fd);
                (void) unlink(f);
-               warn("can't remove gid for `%s': fdopen `%s' failed",
-                   login_name, f);
                return 0;
        }
        while (fgets(buf, sizeof(buf), from) != NULL) {
@@ -1281,26 +1297,26 @@ rm_user_from_groups(char *login_name)
                        }
                }
                if (fwrite(buf, strlen(buf), 1, to) != 1) {
+                       warn("can't remove gid for `%s': short write to `%s'",
+                           login_name, f);
                        (void) fclose(from);
                        (void) fclose(to);
                        (void) unlink(f);
-                       warn("can't remove gid for `%s': short write to `%s'",
-                           login_name, f);
                        return 0;
                }
        }
        (void) fchmod(fileno(to), st.st_mode & 07777);
        (void) fclose(from);
        if (fclose(to) == EOF) {
-               (void) unlink(f);
                warn("can't remove gid for `%s': short write to `%s'",
                    login_name, f);
+               (void) unlink(f);
                return 0;
        }
        if (rename(f, _PATH_GROUP) < 0) {
-               (void) unlink(f);
                warn("can't remove gid for `%s': can't rename `%s' to `%s'",
                    login_name, f, _PATH_GROUP);
+               (void) unlink(f);
                return 0;
        }
        return 1;
@@ -1394,14 +1410,17 @@ moduser(char *login_name, char *newlogin
        }
        pw_init();
        if ((ptmpfd = pw_lock(WAITSECS)) < 0) {
+               int saved_errno = errno;
                (void) close(masterfd);
-               err(EXIT_FAILURE, "can't obtain pw_lock");
+               errc(EXIT_FAILURE, saved_errno, "can't obtain pw_lock");
        }
        if ((master = fdopen(masterfd, "r")) == NULL) {
+               int saved_errno = errno;
                (void) close(masterfd);
                (void) close(ptmpfd);
                pw_abort();
-               err(EXIT_FAILURE, "can't fdopen fd for %s", _PATH_MASTERPASSWD);
+               errc(EXIT_FAILURE, saved_errno, "can't fdopen fd for %s",
+                   _PATH_MASTERPASSWD);
        }
        if (up != NULL) {
                if (up->u_flags & F_USERNAME) {
@@ -1585,18 +1604,22 @@ moduser(char *login_name, char *newlogin
                                            newlogin));
                                }
                                if (write(ptmpfd, buf, len) != len) {
+                                       int saved_errno = errno;
                                        (void) close(ptmpfd);
                                        pw_abort();
-                                       err(EXIT_FAILURE, "can't add `%s'", 
buf);
+                                       errc(EXIT_FAILURE, saved_errno,
+                                           "can't add `%s'", buf);
                                }
                        }
                } else {
                        len = strlen(buf);
                        if ((cc = write(ptmpfd, buf, len)) != len) {
+                               int saved_errno = errno;
                                (void) close(masterfd);
                                (void) close(ptmpfd);
                                pw_abort();
-                               err(EXIT_FAILURE, "short write to /etc/ptmp 
(%lld not %lld chars)",
+                               errc(EXIT_FAILURE, saved_errno,
+                                   "short write to /etc/ptmp (%lld not %lld 
chars)",
                                    (long long)cc, (long long)len);
                        }
                }
@@ -1604,10 +1627,11 @@ moduser(char *login_name, char *newlogin
        if (up != NULL) {
                if ((up->u_flags & F_MKDIR) &&
                    asystem("%s %s %s", MV, homedir, pwp->pw_dir) != 0) {
+                       int saved_errno = errno;
                        (void) close(ptmpfd);
                        pw_abort();
-                       err(EXIT_FAILURE, "can't move `%s' to `%s'",
-                           homedir, pwp->pw_dir);
+                       errc(EXIT_FAILURE, saved_errno,
+                           "can't move `%s' to `%s'", homedir, pwp->pw_dir);
                }
                if (up->u_flags & F_SETSECGROUP) {
                    for (i = 0 ; i < up->u_groupc ; i++) {

Reply via email to