path-util: introduce path_compare_filename()
This commit is contained in:
+24
-16
@@ -491,25 +491,33 @@ bool path_equal_or_files_same(const char *a, const char *b, int flags) {
|
||||
return path_equal(a, b) || files_same(a, b, flags) > 0;
|
||||
}
|
||||
|
||||
bool path_equal_filename(const char *a, const char *b) {
|
||||
_cleanup_free_ char *a_basename = NULL, *b_basename = NULL;
|
||||
int r;
|
||||
int path_compare_filename(const char *a, const char *b) {
|
||||
_cleanup_free_ char *fa = NULL, *fb = NULL;
|
||||
int r, j, k;
|
||||
|
||||
assert(a);
|
||||
assert(b);
|
||||
/* Order NULL before non-NULL */
|
||||
r = CMP(!!a, !!b);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
r = path_extract_filename(a, &a_basename);
|
||||
if (r < 0) {
|
||||
log_debug_errno(r, "Failed to parse basename of %s: %m", a);
|
||||
return false;
|
||||
}
|
||||
r = path_extract_filename(b, &b_basename);
|
||||
if (r < 0) {
|
||||
log_debug_errno(r, "Failed to parse basename of %s: %m", b);
|
||||
return false;
|
||||
}
|
||||
j = path_extract_filename(a, &fa);
|
||||
k = path_extract_filename(b, &fb);
|
||||
|
||||
return path_equal(a_basename, b_basename);
|
||||
/* When one of paths is "." or root, then order it earlier. */
|
||||
r = CMP(j != -EADDRNOTAVAIL, k != -EADDRNOTAVAIL);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
/* When one of paths is invalid (or we get OOM), order invalid path after valid one. */
|
||||
r = CMP(j < 0, k < 0);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
/* fallback to use strcmp() if both paths are invalid. */
|
||||
if (j < 0)
|
||||
return strcmp(a, b);
|
||||
|
||||
return strcmp(fa, fb);
|
||||
}
|
||||
|
||||
char* path_extend_internal(char **x, ...) {
|
||||
|
||||
@@ -66,15 +66,18 @@ char *path_startswith_full(const char *path, const char *prefix, bool accept_dot
|
||||
static inline char* path_startswith(const char *path, const char *prefix) {
|
||||
return path_startswith_full(path, prefix, true);
|
||||
}
|
||||
int path_compare(const char *a, const char *b) _pure_;
|
||||
|
||||
int path_compare(const char *a, const char *b) _pure_;
|
||||
static inline bool path_equal(const char *a, const char *b) {
|
||||
return path_compare(a, b) == 0;
|
||||
}
|
||||
|
||||
int path_compare_filename(const char *a, const char *b);
|
||||
static inline bool path_equal_filename(const char *a, const char *b) {
|
||||
return path_compare_filename(a, b) == 0;
|
||||
}
|
||||
|
||||
bool path_equal_or_files_same(const char *a, const char *b, int flags);
|
||||
/* Compares only the last portion of the input paths, ie: the filenames */
|
||||
bool path_equal_filename(const char *a, const char *b);
|
||||
|
||||
char* path_extend_internal(char **x, ...);
|
||||
#define path_extend(x, ...) path_extend_internal(x, __VA_ARGS__, POINTER_MAX)
|
||||
|
||||
Reference in New Issue
Block a user