if (f != 0)
return -errno;
- safe_close(copy_fd);
- copy_fd = TAKE_FD(tmp_fd);
+ CLOSE_AND_REPLACE(copy_fd, tmp_fd);
remains = mfree(remains);
remains_size = 0;
goto finish;
}
- safe_close(null_fd);
- null_fd = copy;
+ CLOSE_AND_REPLACE(null_fd, copy);
}
}
_fd_; \
})
+/* Like free_and_replace(), but for file descriptors */
+#define CLOSE_AND_REPLACE(a, b) \
+ ({ \
+ int *_fdp_ = &(a); \
+ safe_close(*_fdp_); \
+ *_fdp_ = TAKE_FD(b); \
+ 0; \
+ })
+
+
int fd_reopen(int fd, int flags);
int read_nr_open(void);
return log_unit_error_errno(unit, errno, "Couldn't move exec fd up: %m");
}
- safe_close(exec_fd);
- exec_fd = moved_fd;
+ CLOSE_AND_REPLACE(exec_fd, moved_fd);
} else {
/* This fd should be FD_CLOEXEC already, but let's make sure. */
r = fd_cloexec(exec_fd, true);
(void) unlink(i->temp_path);
free_and_replace(i->temp_path, t);
-
- safe_close(i->output_fd);
- i->output_fd = TAKE_FD(converted_fd);
+ CLOSE_AND_REPLACE(i->output_fd, converted_fd);
return 1;
}
(void) unlink(i->temp_path);
free_and_replace(i->temp_path, t);
-
- safe_close(i->raw_job->disk_fd);
- i->raw_job->disk_fd = TAKE_FD(converted_fd);
+ CLOSE_AND_REPLACE(i->raw_job->disk_fd, converted_fd);
return 1;
}
if (r < 0)
return r;
- safe_close(acd->fd);
- acd->fd = r;
+ CLOSE_AND_REPLACE(acd->fd, r);
acd->defend_window = 0;
if (reset_conflicts)
/* For evdev devices, the file descriptor might be left uninitialized. This might happen while resuming
* into a session and logind has been restarted right before. */
- safe_close(sd->fd);
- sd->fd = r;
+ CLOSE_AND_REPLACE(sd->fd, r);
break;
case DEVICE_TYPE_UNKNOWN: