static ARRAY(struct atexit_callback) atexit_callbacks = ARRAY_INIT;
-void i_close_fd_real(int *fd, const char *arg, const char *func,
- const char *file, int line)
+void i_close_fd_path_real(int *fd, const char *path, const char *arg,
+ const char *func, const char *file, int line)
{
int saved_errno;
saved_errno = errno;
if (unlikely(close(*fd) < 0))
- i_error("%s: close(%s) @ %s:%d failed (fd=%d): %m",
- func, arg, file, line, *fd);
+ i_error("%s: close(%s%s%s) @ %s:%d failed (fd=%d): %m",
+ func, arg,
+ (path == NULL) ? "" : " = ",
+ (path == NULL) ? "" : path,
+ file, line, *fd);
errno = saved_errno;
*fd = -1;
/* Close the fd and set it to -1. This assert-crashes if fd == 0, and is a
no-op if fd == -1. Normally fd == 0 would happen only if an uninitialized
fd is attempted to be closed, which is a bug. */
-void i_close_fd_real(int *fd, const char *arg, const char *func, const char *file, int line);
-#define i_close_fd(fd) i_close_fd_real((fd), #fd, __func__, __FILE__, __LINE__)
+void i_close_fd_path_real(int *fd, const char *path, const char *arg,
+ const char *func, const char *file, int line);
+#define i_close_fd(fd) i_close_fd_path_real((fd), NULL, #fd, __func__, __FILE__, __LINE__)
+#define i_close_fd_path(fd, path) i_close_fd_path_real((fd), (path), #fd, __func__, __FILE__, __LINE__)
#ifndef STATIC_CHECKER
# define i_unreached() \