extern int parse_range(const char *str, int *lower, int *upper, int def);
+extern int streq_except_trailing_slash(const char *s1, const char *s2);
+
#endif
return 0;
}
+/*
+ * Compare two strings for equality, ignoring at most one trailing
+ * slash.
+ */
+int streq_except_trailing_slash(const char *s1, const char *s2)
+{
+ int equal;
+
+ if (!s1 && !s2)
+ return 1;
+ if (!s1 || !s2)
+ return 0;
+
+ equal = !strcmp(s1, s2);
+
+ if (!equal) {
+ size_t len1 = strlen(s1);
+ size_t len2 = strlen(s2);
+
+ if (len1 && *(s1 + len1 - 1) == '/')
+ len1--;
+ if (len2 && *(s2 + len2 - 1) == '/')
+ len2--;
+ if (len1 != len2)
+ return 0;
+
+ equal = !strncmp(s1, s2, len1);
+ }
+
+ return equal;
+}
+
#ifdef TEST_PROGRAM
#include <stddef.h>
#include "mountP.h"
+#include "strutils.h"
/**
* mnt_new_fs:
return 0;
/* 1) native paths/tags */
- if (!strcmp(source, fs->source))
+ if (streq_except_trailing_slash(source, fs->source))
return 1;
if (!cache)
/* 2) canonicalized and native */
src = mnt_fs_get_srcpath(fs);
- if (src && !strcmp(cn, src))
+ if (src && streq_except_trailing_slash(cn, src))
return 1;
/* 3) canonicalized and canonicalized */
#include <blkid.h>
#include "mountP.h"
+#include "strutils.h"
/**
* mnt_new_table:
if (path == NULL && src == NULL)
return fs; /* source is "none" */
- if (path && p && strcmp(p, path) == 0)
+ if (path && p && streq_except_trailing_slash(p, path))
return fs;
if (!p && src)
ntags++; /* mnt_fs_get_srcpath() returs nothing, it's TAG */
mnt_reset_iter(&itr, direction);
while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
p = mnt_fs_get_srcpath(fs);
- if (p && strcmp(p, cn) == 0)
+ if (p && streq_except_trailing_slash(p, cn))
return fs;
}
}
if (mnt_fs_get_tag(fs, &t, &v))
continue;
x = mnt_resolve_tag(t, v, tb->cache);
- if (x && !strcmp(x, cn))
+ if (x && streq_except_trailing_slash(x, cn))
return fs;
}
}
p = mnt_fs_get_srcpath(fs);
if (p)
p = mnt_resolve_path(p, tb->cache);
- if (p && strcmp(cn, p) == 0)
+ if (p && streq_except_trailing_slash(cn, p))
return fs;
}
}
*t = mnt_fs_get_target(fs),
*r = mnt_fs_get_root(fs);
+ /*
+ * Note that kernel can add tailing slash to the
+ * network filesystem source paths.
+ */
if (t && s && r &&
- !strcmp(t, tgt) && !strcmp(s, src) && !strcmp(r, root))
+ strcmp(t, tgt) == 0 &&
+ streq_except_trailing_slash(s, src) &&
+ strcmp(r, root) == 0)
break;
}
if (fs)
#include "mangle.h"
#include "mountP.h"
#include "pathnames.h"
+#include "strutils.h"
static inline char *skip_spaces(char *s)
{
if (fs->flags & MNT_FS_MERGED)
continue;
- if (s && t && r && !strcmp(t, target) &&
- !strcmp(s, src) && !strcmp(r, root))
+ /*
+ * Note that kernel can add tailing slash to the network
+ * filesystem source path
+ */
+ if (s && t && r &&
+ strcmp(t, target) == 0 &&
+ streq_except_trailing_slash(s, src) &&
+ strcmp(r, root) == 0)
break;
}
#include "pathnames.h"
#include "nls.h"
#include "usleep.h"
+#include "strutils.h"
#define streq(s, t) (strcmp ((s), (t)) == 0)
ok = has_uuid(dev, fs + 5);
} else {
fs = canonicalize_spec(mc->m.mnt_fsname);
- ok = streq(fs, dev);
+ ok = streq_except_trailing_slash(fs, dev);
my_free(fs);
}
}