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++) {