From: Martin Willi Date: Fri, 7 Mar 2014 11:12:55 +0000 (+0100) Subject: utils: Support Windows path separators in path_basename/dirname X-Git-Tag: 5.2.0dr6~24^2~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8182631bc301d426f76164b8a7a869b0f6285e8d;p=thirdparty%2Fstrongswan.git utils: Support Windows path separators in path_basename/dirname --- diff --git a/src/libstrongswan/tests/suites/test_utils.c b/src/libstrongswan/tests/suites/test_utils.c index 0260726b21..04f0c46402 100644 --- a/src/libstrongswan/tests/suites/test_utils.c +++ b/src/libstrongswan/tests/suites/test_utils.c @@ -520,6 +520,24 @@ static struct { {"", ".", "."}, {".", ".", "."}, {"..", ".", ".."}, +#ifdef WIN32 + {"C:\\", "C:\\", "C:\\"}, + {"C:\\\\", "C:\\", "C:\\"}, + {"foo", ".", "foo"}, + {"f\\", ".", "f"}, + {"foo\\", ".", "foo"}, + {"foo\\\\", ".", "foo"}, + {"C:\\f", "C:\\", "f"}, + {"C:\\f\\", "\\", "f"}, + {"C:\\foo", "C:\\", "foo"}, + {"C:\\foo\\", "C:\\", "foo"}, + {"foo\\bar", "foo", "bar"}, + {"foo\\\\bar", "foo", "bar"}, + {"C:\\foo\\bar", "C:\\foo", "bar"}, + {"C:\\foo\\bar\\", "C:\\foo", "bar"}, + {"C:\\foo\\bar\\baz", "C:\\foo\\bar", "baz"}, + {"\\foo\\bar", "\\foo", "bar"}, +#else /* !WIN32 */ {"/", "/", "/"}, {"//", "/", "/"}, {"foo", ".", "foo"}, @@ -536,6 +554,7 @@ static struct { {"/foo/bar", "/foo", "bar"}, {"/foo/bar/", "/foo", "bar"}, {"/foo/bar/baz", "/foo/bar", "baz"}, +#endif }; START_TEST(test_path_dirname) diff --git a/src/libstrongswan/utils/utils.c b/src/libstrongswan/utils/utils.c index dc0608627a..1b3765a693 100644 --- a/src/libstrongswan/utils/utils.c +++ b/src/libstrongswan/utils/utils.c @@ -229,21 +229,21 @@ char* path_dirname(const char *path) { char *pos; - pos = path ? strrchr(path, '/') : NULL; + pos = path ? strrchr(path, DIRECTORY_SEPARATOR[0]) : NULL; if (pos && !pos[1]) { /* if path ends with slashes we have to look beyond them */ - while (pos > path && *pos == '/') + while (pos > path && *pos == DIRECTORY_SEPARATOR[0]) { /* skip trailing slashes */ pos--; } - pos = memrchr(path, '/', pos - path + 1); + pos = memrchr(path, DIRECTORY_SEPARATOR[0], pos - path + 1); } if (!pos) { return strdup("."); } - while (pos > path && *pos == '/') + while (pos > path && *pos == DIRECTORY_SEPARATOR[0]) { /* skip superfluous slashes */ pos--; } @@ -261,19 +261,19 @@ char* path_basename(const char *path) { return strdup("."); } - pos = strrchr(path, '/'); + pos = strrchr(path, DIRECTORY_SEPARATOR[0]); if (pos && !pos[1]) { /* if path ends with slashes we have to look beyond them */ - while (pos > path && *pos == '/') + while (pos > path && *pos == DIRECTORY_SEPARATOR[0]) { /* skip trailing slashes */ pos--; } - if (pos == path && *pos == '/') + if (pos == path && *pos == DIRECTORY_SEPARATOR[0]) { /* contains only slashes */ - return strdup("/"); + return strdup(DIRECTORY_SEPARATOR); } trail = pos + 1; - pos = memrchr(path, '/', trail - path); + pos = memrchr(path, DIRECTORY_SEPARATOR[0], trail - path); } pos = pos ? pos + 1 : (char*)path; return trail ? strndup(pos, trail - pos) : strdup(pos);