_cleanup_close_ int fd = -EBADF;
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(!isempty(path));
r = extract_subvolume_name(path, &subvolume);
int r;
assert(path);
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
if (!can_openat2)
return -EOPNOTSUPP;
assert(!FLAGS_SET(flags, CHASE_PREFIX_ROOT));
assert(!FLAGS_SET(flags, CHASE_STEP|CHASE_EXTRACT_FILENAME));
assert(!FLAGS_SET(flags, CHASE_NO_AUTOFS|CHASE_TRIGGER_AUTOFS));
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
- assert(root_fd >= 0 || IN_SET(root_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
+ assert(wildcard_fd_is_valid(root_fd));
/* AT_FDCWD for dir_fd is only allowed when there is no chroot boundary: otherwise the current
* working directory might live outside root_fd's subtree. */
assert(dir_fd != AT_FDCWD || IN_SET(root_fd, AT_FDCWD, XAT_FDROOT));
struct stat st = {};
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(original_path);
assert(path);
assert(name);
int r;
assert(path);
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(ret);
int log_level = conf_files_log_level(flags);
assert(dir);
assert(original_dirpath);
assert(resolved_dirpath);
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(files);
assert(masked);
const ConfFile *inserted = NULL;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(ret);
root = empty_to_root(root);
_cleanup_free_ char *root = NULL;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(ret);
if (DEBUG_LOGGING)
_cleanup_free_ char *root = NULL;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(ret_files);
assert(ret_n_files);
int fd_get_path(int fd, char **ret) {
int r;
- assert(fd >= 0 || IN_SET(fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(fd));
if (fd == AT_FDCWD)
return safe_getcwd(ret);
}
int fd_reopen(int fd, int flags) {
- assert(fd >= 0 || IN_SET(fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(fd));
assert(!FLAGS_SET(flags, O_CREAT));
/* Reopens the specified fd with new flags. This is useful for convert an O_PATH fd into a regular one, or to
}
int path_is_root_at(int dir_fd, const char *path) {
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
if (dir_fd == XAT_FDROOT && isempty(path))
return true;
struct statx sx1, sx2;
int r;
- assert(fd1 >= 0 || IN_SET(fd1, AT_FDCWD, XAT_FDROOT));
- assert(fd2 >= 0 || IN_SET(fd2, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(fd1));
+ assert(wildcard_fd_is_valid(fd2));
r = xstatx(fd1, /* path = */ NULL, AT_EMPTY_PATH,
STATX_TYPE|STATX_INO|STATX_MNT_ID,
assert_cc(XAT_FDROOT != AT_FDCWD);
assert_cc(XAT_FDROOT < -ERRNO_MAX);
+/* Checks whether the specified fd is acceptable as a *at() directory fd that supports the two "wildcard"
+ * values: it's either a regular, valid fd (i.e. >= 0), or one of the special AT_FDCWD/XAT_FDROOT values. */
+static inline bool wildcard_fd_is_valid(int fd) {
+ return fd >= 0 || IN_SET(fd, AT_FDCWD, XAT_FDROOT);
+}
+
int close_nointr(int fd);
int safe_close(int fd);
void safe_close_pair(int p[static 2]);
_cleanup_fclose_ FILE *f = NULL;
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(filename);
assert(ret);
_cleanup_free_ char *s = NULL;
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(filename);
r = read_one_line_file_at(dir_fd, filename, &s);
/* A combination of fopen() with openat() */
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(mode);
assert(ret);
FILE *f;
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(ret);
sk = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
FILE *f = NULL; /* avoid false maybe-uninitialized warning */
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(mode);
assert(ret);
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
/* This is a cousin of write_string_file_atomic(), but operates with arbitrary struct iovec binary
* data (rather than strings), works without FILE* streams, and does direct syscalls instead. */
bool made_dir = false, made_file = false;
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
/* An inode can only be one of a directory, a regular file or a socket at the same time. */
assert(FLAGS_SET(open_flags, O_DIRECTORY) + FLAGS_SET(xopen_flags, XO_REGULAR) + FLAGS_SET(xopen_flags, XO_SOCKET) <= 1);
int is_mount_point_at(int dir_fd, const char *path, int flags) {
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert((flags & ~AT_SYMLINK_FOLLOW) == 0);
if (path_equal(path, "/"))
struct statx sx;
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(ret);
r = xstatx(dir_fd, path,
const char *e;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
e = secure_getenv("SYSTEMD_OS_RELEASE");
if (e)
const char *p;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(!extension || (image_class >= 0 && image_class < _IMAGE_CLASS_MAX));
if (!extension)
_cleanup_free_ char *p = NULL;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
r = open_extension_release_at(rfd, image_class, extension, relax_extension_release_check, &p, &fd);
if (r < 0)
va_list ap;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
va_start(ap, extension);
r = parse_extension_release_atv(rfd, image_class, extension, relax_extension_release_check, ap);
_cleanup_close_ int inode_fd = -EBADF;
assert(fd >= 0);
- assert(IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT) || dir_fd >= 0);
+ assert(wildcard_fd_is_valid(dir_fd));
/* Connects to the specified AF_UNIX socket in the file system. Works around the 108 byte size limit
* in sockaddr_un, by going via O_PATH if needed. This hence works for any kind of path. */
struct stat st;
int r;
- assert(fd >= 0 || IN_SET(fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(fd));
assert(!isempty(path) || !follow);
assert(verify_func);
* STATX_MNT_ID if not.
*/
- assert(fd >= 0 || IN_SET(fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(fd));
assert((mandatory_mask & optional_mask) == 0);
assert(!FLAGS_SET(xstatx_flags, XSTATX_MNT_ID_BEST) || !((mandatory_mask|optional_mask) & (STATX_MNT_ID|STATX_MNT_ID_UNIQUE)));
assert(ret);
int xstatfsat(int dir_fd, const char *path, struct statfs *ret) {
_cleanup_close_ int fd = -EBADF;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(ret);
if (!isempty(path)) {
assert(source);
assert(ret);
- assert(source->rfd >= 0 || source->rfd == AT_FDCWD || source->rfd == XAT_FDROOT);
+ assert(wildcard_fd_is_valid(source->rfd));
_cleanup_(context_done) Context copy = (Context) {
.rfd = source->rfd,
int id128_read_at(int dir_fd, const char *path, Id128Flag f, sd_id128_t *ret) {
_cleanup_close_ int fd = -EBADF;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
assert(path);
fd = xopenat(dir_fd, path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
int id128_get_machine_at(int rfd, sd_id128_t *ret) {
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
r = dir_fd_is_root_or_cwd(rfd);
if (r < 0)
_cleanup_fclose_ FILE *f = NULL;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(dir);
assert(type);
assert(*type == BOOT_ENTRY_TOKEN_AUTO);
static int entry_token_load(int rfd, const char *conf_root, BootEntryTokenType *type, char **token) {
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(type);
assert(*type == BOOT_ENTRY_TOKEN_AUTO);
assert(token);
_cleanup_free_ char *id = NULL, *image_id = NULL;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(type);
assert(IN_SET(*type, BOOT_ENTRY_TOKEN_AUTO, BOOT_ENTRY_TOKEN_OS_IMAGE_ID, BOOT_ENTRY_TOKEN_OS_ID));
assert(token);
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(type);
assert(token);
* ret - the returned block device
*/
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
fd = xopenat(dir_fd, path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
if (fd < 0)
/* Normalizes a root dir specification: if root_fd is already valid, keep it. Otherwise, we open the
* specified dir */
- if (*root_fd >= 0 || IN_SET(*root_fd, AT_FDCWD, XAT_FDROOT)) {
+ if (wildcard_fd_is_valid(*root_fd)) {
*ret_opened_fd = -EBADF;
return 0;
}
unprivileged_mode = FLAGS_SET(flags, VERIFY_ESP_UNPRIVILEGED_MODE);
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(path);
/* This logs about all errors, except:
VerifyESPFlags flags;
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
/* This logs about all errors except:
*
unprivileged_mode = FLAGS_SET(flags, VERIFY_ESP_UNPRIVILEGED_MODE);
int r;
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
assert(path);
_cleanup_free_ char *p = NULL;
/* Similar to find_esp_and_warn(), but finds the XBOOTLDR partition. Returns the same errors. */
- assert(rfd >= 0 || IN_SET(rfd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(rfd));
flags = verify_esp_flags_init(unprivileged_mode, "SYSTEMD_RELAX_XBOOTLDR_CHECKS");
};
int r;
- assert(root_fd >= 0 || IN_SET(root_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(root_fd));
if (conf_root) {
_cleanup_free_ char *conf = path_join(conf_root, "install.conf");
_cleanup_close_ int fd = -EBADF;
int r;
- assert(dir_fd >= 0 || IN_SET(dir_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(dir_fd));
fd = xopenat(dir_fd, filename, O_RDONLY|O_CLOEXEC);
if (fd < 0)
_cleanup_free_ char *resolved_path = NULL;
int r;
- assert(toplevel_fd >= 0 || IN_SET(toplevel_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(toplevel_fd));
assert(inode_path);
assert(filter);
assert(ret);
_cleanup_close_ int inode_fd = TAKE_FD(_inode_fd);
int r;
- assert(toplevel_fd >= 0 || IN_SET(toplevel_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(toplevel_fd));
assert(inode_path);
assert(filter);
assert(ret);
uint32_t filter_type_mask;
int r;
- assert(toplevel_fd >= 0 || IN_SET(toplevel_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(toplevel_fd));
assert(path);
assert(filter);
assert(ret);
_cleanup_(pick_result_done) PickResult best = PICK_RESULT_NULL;
int r;
- assert(toplevel_fd >= 0 || IN_SET(toplevel_fd, AT_FDCWD, XAT_FDROOT));
+ assert(wildcard_fd_is_valid(toplevel_fd));
assert(path);
assert(filters || n_filters == 0);
assert(ret);