char *
virFileCanonicalizePath(const char *path)
{
- return canonicalize_file_name(path); /* exempt from syntax-check */
+#ifdef WIN32
+ /* Does not resolve symlinks, only expands . & .. & repeated /.
+ * It will never fail, so sanitize errno to indicate success */
+ errno = 0;
+ return g_canonicalize_filename(path, NULL);
+#else
+ return realpath(path, NULL); /* exempt from syntax-check */
+#endif
}
/**
#if HAVE_LINUX_MAGIC_H
# include <linux/magic.h>
#endif
+#include <assert.h>
#include "virmock.h"
#include "virstring.h"
static FILE *(*real_setmntent)(const char *filename, const char *type);
static int (*real_statfs)(const char *path, struct statfs *buf);
-static char *(*real_canonicalize_file_name)(const char *path);
+static char *(*real_realpath)(const char *path, char *resolved);
static void
VIR_MOCK_REAL_INIT(setmntent);
VIR_MOCK_REAL_INIT(statfs);
- VIR_MOCK_REAL_INIT(canonicalize_file_name);
+ VIR_MOCK_REAL_INIT(realpath);
}
/* We don't need to do this in callers because real statfs(2)
* does that for us. However, in mocked implementation we
* need to do this. */
- if (!(canonPath = canonicalize_file_name(path)))
+ if (!(canonPath = realpath(path, NULL)))
return -1;
while (getmntent_r(f, &mb, mntbuf, sizeof(mntbuf))) {
char *
-canonicalize_file_name(const char *path)
+realpath(const char *path, char *resolved)
{
init_syms();
const char *p;
char *ret;
+ assert(resolved == NULL);
if ((p = STRSKIP(path, "/some/symlink")))
ret = g_strdup_printf("/gluster%s", p);
else
return ret;
}
- return real_canonicalize_file_name(path);
+ return real_realpath(path, resolved);
}