for (i = 0; i < cgroup_num_hierarchies(); i++) {
char **controllers = NULL, *fullname;
- char *path;
+ char *path, *tmp;
if (!cgroup_get_hierarchies(i, &controllers)) {
ERROR("failed to get hierarchy %d", i);
}
}
- if (!lxc_deslashify(&path)) {
- ERROR("failed to deslashify %s", path);
+ tmp = lxc_deslashify(path);
+ if (!tmp) {
+ ERROR("Failed to remove extraneous slashes from \"%s\"",
+ path);
free(path);
goto err;
}
+ free(path);
+ path = tmp;
fullname = lxc_string_join(",", (const char **) controllers, false);
if (!fullname) {
return components;
}
-bool lxc_deslashify(char **path)
+char *lxc_deslashify(const char *path)
{
- bool ret = false;
- char *p;
+ char *dup, *p;
char **parts = NULL;
size_t n, len;
- parts = lxc_normalize_path(*path);
- if (!parts)
- return false;
+ dup = strdup(path);
+ if (!dup)
+ return NULL;
+
+ parts = lxc_normalize_path(dup);
+ if (!parts) {
+ free(dup);
+ return NULL;
+ }
/* We'll end up here if path == "///" or path == "". */
if (!*parts) {
- len = strlen(*path);
+ len = strlen(dup);
if (!len) {
- ret = true;
- goto out;
+ lxc_free_array((void **)parts, free);
+ return dup;
}
- n = strcspn(*path, "/");
+ n = strcspn(dup, "/");
if (n == len) {
+ free(dup);
+ lxc_free_array((void **)parts, free);
+
p = strdup("/");
if (!p)
- goto out;
- free(*path);
- *path = p;
- ret = true;
- goto out;
+ return NULL;
+
+ return p;
}
}
- p = lxc_string_join("/", (const char **)parts, **path == '/');
- if (!p)
- goto out;
-
- free(*path);
- *path = p;
- ret = true;
-
-out:
+ p = lxc_string_join("/", (const char **)parts, *dup == '/');
+ free(dup);
lxc_free_array((void **)parts, free);
- return ret;
+ return p;
}
char *lxc_append_paths(const char *first, const char *second)
*/
extern char **lxc_normalize_path(const char *path);
/* remove multiple slashes from the path, e.g. ///foo//bar -> /foo/bar */
-extern bool lxc_deslashify(char **path);
+extern char *lxc_deslashify(const char *path);
extern char *lxc_append_paths(const char *first, const char *second);
/* Note: the following two functions use strtok(), so they will never
* consider an empty element, even if two delimiters are next to
void test_lxc_deslashify(void)
{
- char *s = strdup("/A///B//C/D/E/");
- if (!s)
+ char *s = "/A///B//C/D/E/";
+ char *t;
+
+ t = lxc_deslashify(s);
+ if (!t)
exit(EXIT_FAILURE);
- lxc_test_assert_abort(lxc_deslashify(&s));
- lxc_test_assert_abort(strcmp(s, "/A/B/C/D/E") == 0);
- free(s);
+ lxc_test_assert_abort(strcmp(t, "/A/B/C/D/E") == 0);
+ free(t);
- s = strdup("/A");
- if (!s)
+ s = "/A";
+
+ t = lxc_deslashify(s);
+ if (!t)
exit(EXIT_FAILURE);
- lxc_test_assert_abort(lxc_deslashify(&s));
- lxc_test_assert_abort(strcmp(s, "/A") == 0);
- free(s);
+ lxc_test_assert_abort(strcmp(t, "/A") == 0);
+ free(t);
- s = strdup("");
- if (!s)
+ s = "";
+ t = lxc_deslashify(s);
+ if (!t)
exit(EXIT_FAILURE);
- lxc_test_assert_abort(lxc_deslashify(&s));
- lxc_test_assert_abort(strcmp(s, "") == 0);
- free(s);
+ lxc_test_assert_abort(strcmp(t, "") == 0);
+ free(t);
+
+ s = "//";
- s = strdup("//");
- if (!s)
+ t = lxc_deslashify(s);
+ if (!t)
exit(EXIT_FAILURE);
- lxc_test_assert_abort(lxc_deslashify(&s));
- lxc_test_assert_abort(strcmp(s, "/") == 0);
- free(s);
+ lxc_test_assert_abort(strcmp(t, "/") == 0);
+ free(t);
}
/* /proc/int_as_str/ns/mnt\0 = (5 + 21 + 7 + 1) */