mirror of
https://github.com/systemd/systemd.git
synced 2025-01-24 06:04:05 +03:00
path-util: introduce skip_leading_slash and use it where appropriate
This commit is contained in:
parent
823ef2675d
commit
baaca3db6a
@ -76,6 +76,10 @@ char* path_extend_internal(char **x, ...);
|
||||
#define path_extend(x, ...) path_extend_internal(x, __VA_ARGS__, POINTER_MAX)
|
||||
#define path_join(...) path_extend_internal(NULL, __VA_ARGS__, POINTER_MAX)
|
||||
|
||||
static inline char* skip_leading_slash(const char *p) {
|
||||
return skip_leading_chars(p, "/");
|
||||
}
|
||||
|
||||
typedef enum PathSimplifyFlags {
|
||||
PATH_SIMPLIFY_KEEP_TRAILING_SLASH = 1 << 0,
|
||||
} PathSimplifyFlags;
|
||||
|
@ -316,13 +316,6 @@ static int make_bad(const char *prefix, uint64_t done, const char *suffix, char
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *skip_slash(const char *path) {
|
||||
assert(path);
|
||||
assert(path[0] == '/');
|
||||
|
||||
return path + 1;
|
||||
}
|
||||
|
||||
static int verb_status(int argc, char *argv[], void *userdata) {
|
||||
_cleanup_free_ char *path = NULL, *prefix = NULL, *suffix = NULL, *good = NULL, *bad = NULL;
|
||||
uint64_t left, done;
|
||||
@ -370,14 +363,14 @@ static int verb_status(int argc, char *argv[], void *userdata) {
|
||||
return log_error_errno(errno, "Failed to open $BOOT partition '%s': %m", *p);
|
||||
}
|
||||
|
||||
if (faccessat(fd, skip_slash(path), F_OK, 0) >= 0) {
|
||||
if (faccessat(fd, skip_leading_slash(path), F_OK, 0) >= 0) {
|
||||
puts("indeterminate");
|
||||
return 0;
|
||||
}
|
||||
if (errno != ENOENT)
|
||||
return log_error_errno(errno, "Failed to check if '%s' exists: %m", path);
|
||||
|
||||
if (faccessat(fd, skip_slash(good), F_OK, 0) >= 0) {
|
||||
if (faccessat(fd, skip_leading_slash(good), F_OK, 0) >= 0) {
|
||||
puts("good");
|
||||
return 0;
|
||||
}
|
||||
@ -385,7 +378,7 @@ static int verb_status(int argc, char *argv[], void *userdata) {
|
||||
if (errno != ENOENT)
|
||||
return log_error_errno(errno, "Failed to check if '%s' exists: %m", good);
|
||||
|
||||
if (faccessat(fd, skip_slash(bad), F_OK, 0) >= 0) {
|
||||
if (faccessat(fd, skip_leading_slash(bad), F_OK, 0) >= 0) {
|
||||
puts("bad");
|
||||
return 0;
|
||||
}
|
||||
@ -445,17 +438,17 @@ static int verb_set(int argc, char *argv[], void *userdata) {
|
||||
if (fd < 0)
|
||||
return log_error_errno(errno, "Failed to open $BOOT partition '%s': %m", *p);
|
||||
|
||||
r = rename_noreplace(fd, skip_slash(source1), fd, skip_slash(target));
|
||||
r = rename_noreplace(fd, skip_leading_slash(source1), fd, skip_leading_slash(target));
|
||||
if (r == -EEXIST)
|
||||
goto exists;
|
||||
if (r == -ENOENT) {
|
||||
|
||||
r = rename_noreplace(fd, skip_slash(source2), fd, skip_slash(target));
|
||||
r = rename_noreplace(fd, skip_leading_slash(source2), fd, skip_leading_slash(target));
|
||||
if (r == -EEXIST)
|
||||
goto exists;
|
||||
if (r == -ENOENT) {
|
||||
|
||||
if (faccessat(fd, skip_slash(target), F_OK, 0) >= 0) /* Hmm, if we can't find either source file, maybe the destination already exists? */
|
||||
if (faccessat(fd, skip_leading_slash(target), F_OK, 0) >= 0) /* Hmm, if we can't find either source file, maybe the destination already exists? */
|
||||
goto exists;
|
||||
|
||||
if (errno != ENOENT)
|
||||
@ -474,7 +467,7 @@ static int verb_set(int argc, char *argv[], void *userdata) {
|
||||
log_debug("Successfully renamed '%s' to '%s'.", source1, target);
|
||||
|
||||
/* First, fsync() the directory these files are located in */
|
||||
r = fsync_parent_at(fd, skip_slash(target));
|
||||
r = fsync_parent_at(fd, skip_leading_slash(target));
|
||||
if (r < 0)
|
||||
log_debug_errno(errno, "Failed to synchronize image directory, ignoring: %m");
|
||||
|
||||
|
@ -1473,17 +1473,6 @@ static void track_file_disposition(sd_journal *j, JournalFile *f) {
|
||||
j->has_persistent_files = true;
|
||||
}
|
||||
|
||||
static const char *skip_slash(const char *p) {
|
||||
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
while (*p == '/')
|
||||
p++;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static int add_any_file(
|
||||
sd_journal *j,
|
||||
int fd,
|
||||
@ -1503,7 +1492,7 @@ static int add_any_file(
|
||||
/* If there's a top-level fd defined make the path relative, explicitly, since otherwise
|
||||
* openat() ignores the first argument. */
|
||||
|
||||
fd = our_fd = openat(j->toplevel_fd, skip_slash(path), O_RDONLY|O_CLOEXEC|O_NONBLOCK);
|
||||
fd = our_fd = openat(j->toplevel_fd, skip_leading_slash(path), O_RDONLY|O_CLOEXEC|O_NONBLOCK);
|
||||
else
|
||||
fd = our_fd = open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
|
||||
if (fd < 0) {
|
||||
@ -1811,7 +1800,7 @@ static int directory_open(sd_journal *j, const char *path, DIR **ret) {
|
||||
else
|
||||
/* Open the specified directory relative to the toplevel fd. Enforce that the path specified is
|
||||
* relative, by dropping the initial slash */
|
||||
d = xopendirat(j->toplevel_fd, skip_slash(path), 0);
|
||||
d = xopendirat(j->toplevel_fd, skip_leading_slash(path), 0);
|
||||
if (!d)
|
||||
return -errno;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user