X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-path.c;h=d324b78661ee16a046349bbfdcfd24c381e0aa79;hb=5325e0902fe2836f16869f6451ee3632c451289e;hp=c2a510ad586b8cf80933e2d33c088fefddcea75f;hpb=e51a9b6ba1a93bc981639a706c93bee413099fd6;p=mono.git diff --git a/mono/utils/mono-path.c b/mono/utils/mono-path.c index c2a510ad586..d324b78661e 100644 --- a/mono/utils/mono-path.c +++ b/mono/utils/mono-path.c @@ -13,12 +13,21 @@ #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif /* This is only needed for the mono_path_canonicalize code, MAXSYMLINKS, could be moved */ +#ifdef HAVE_SYS_PARAM_H #include +#endif #include "mono-path.h" +/* Embedded systems lack MAXSYMLINKS */ +#ifndef MAXSYMLINKS +#define MAXSYMLINKS 3 +#endif + /* Resolves '..' and '.' references in a path. If the path provided is relative, * it will be relative to the current directory */ gchar * @@ -35,6 +44,9 @@ mono_path_canonicalize (const char *path) g_free (tmpdir); } +#ifdef HOST_WIN32 + g_strdelimit (abspath, "/", '\\'); +#endif abspath = g_strreverse (abspath); backc = 0; @@ -60,6 +72,11 @@ mono_path_canonicalize (const char *path) lastpos = pos + 1; pos = strchr (lastpos, G_DIR_SEPARATOR); } + +#ifdef HOST_WIN32 /* For UNC paths the first '\' is removed. */ + if (*(lastpos-1) == G_DIR_SEPARATOR && *(lastpos-2) == G_DIR_SEPARATOR) + lastpos = lastpos-1; +#endif if (dest != lastpos) strcpy (dest, lastpos); return g_strreverse (abspath); @@ -69,12 +86,10 @@ mono_path_canonicalize (const char *path) * This ensures that the path that we store points to the final file * not a path to a symlink. */ -gchar * -mono_path_resolve_symlinks (const char *path) +#if !defined(PLATFORM_NO_SYMLINKS) +static gchar * +resolve_symlink (const char *path) { -#if PLATFORM_WIN32 - return mono_path_canonicalize (path); -#else char *p, *concat, *dir; char buffer [PATH_MAX+1]; int n, iterations = 0; @@ -103,6 +118,39 @@ mono_path_resolve_symlinks (const char *path) g_free (concat); } while (iterations < MAXSYMLINKS); + return p; +} +#endif + +gchar * +mono_path_resolve_symlinks (const char *path) +{ +#if defined(PLATFORM_NO_SYMLINKS) + return mono_path_canonicalize (path); +#else + gchar **split = g_strsplit (path, G_DIR_SEPARATOR_S, -1); + gchar *p = g_strdup (""); + int i; + + for (i = 0; split [i] != NULL; i++) { + gchar *tmp = NULL; + + // resolve_symlink of "" goes into canonicalize which resolves to cwd + if (strcmp (split [i], "") != 0) { + tmp = g_strdup_printf ("%s%s", p, split [i]); + g_free (p); + p = resolve_symlink (tmp); + g_free (tmp); + } + + if (split [i+1] != NULL) { + tmp = g_strdup_printf ("%s%s", p, G_DIR_SEPARATOR_S); + g_free (p); + p = tmp; + } + } + + g_free (split); return p; #endif }