Use save_errno to protect errno in the 101 places i was calling
unlink(2) and then err(3), possibly reporting the wrong error message.
* LEN_ULONGs for time and pid. */
#define TMPNAMLEN 1 + 4 + HOST_NAME_MAX + LEN_ULONG + LEN_ULONG
* LEN_ULONGs for time and pid. */
#define TMPNAMLEN 1 + 4 + HOST_NAME_MAX + LEN_ULONG + LEN_ULONG
+/* Use this macro to perform some operation and saving the value errno
+ * had before that operation.
+ */
+#define save_errno(op) { \
+ int olderrno = errno; \
+ op; \
+ errno = olderrno; \
+}
+
static char rcsid[] = "$Id$";
/* Write all of buf, even if write(2) is interrupted. */
static char rcsid[] = "$Id$";
/* Write all of buf, even if write(2) is interrupted. */
r = read(STDIN_FILENO, buf, 5);
if (r != 5) {
r = read(STDIN_FILENO, buf, 5);
if (r != 5) {
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed read from stdin");
}
err(MDELIVER_EXITCODE, "Failed read from stdin");
}
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed read from stdin");
}
} else {
if (full_write(fd, buf, r) != r) {
err(MDELIVER_EXITCODE, "Failed read from stdin");
}
} else {
if (full_write(fd, buf, r) != r) {
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed write(%s)", fn);
}
}
err(MDELIVER_EXITCODE, "Failed write(%s)", fn);
}
}
while ((r = read(STDIN_FILENO, buf, BUFSIZ)) > 0
|| (r == -1 && errno == EINTR)) {
if (full_write(fd, buf, r) != r) {
while ((r = read(STDIN_FILENO, buf, BUFSIZ)) > 0
|| (r == -1 && errno == EINTR)) {
if (full_write(fd, buf, r) != r) {
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed write(%s)", fn);
}
}
if (r == -1) {
err(MDELIVER_EXITCODE, "Failed write(%s)", fn);
}
}
if (r == -1) {
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed read from stdin");
}
if (fsync(fd) < 0) {
err(MDELIVER_EXITCODE, "Failed read from stdin");
}
if (fsync(fd) < 0) {
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed fsync(%s)", fn);
}
if (close(fd) < 0) {
err(MDELIVER_EXITCODE, "Failed fsync(%s)", fn);
}
if (close(fd) < 0) {
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed close(%s)", fn);
}
}
err(MDELIVER_EXITCODE, "Failed close(%s)", fn);
}
}
memcpy(newfn, "new", 3);
if (rename(fn, newfn) != 0) {
memcpy(newfn, "new", 3);
if (rename(fn, newfn) != 0) {
+ save_errno( unlink(fn) );
err(MDELIVER_EXITCODE, "Failed rename(%s, new)", fn);
}
}
err(MDELIVER_EXITCODE, "Failed rename(%s, new)", fn);
}
}