[libxml2] Support long path names on WNT
- From: Daniel Veillard <veillard src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libxml2] Support long path names on WNT
- Date: Fri, 7 Sep 2012 04:20:56 +0000 (UTC)
commit 55b899a23acfa2e1bb36026b50a8f7cb36dc4fda
Author: Michael Stahl <mstahl redhat com>
Date: Fri Sep 7 12:14:00 2012 +0800
Support long path names on WNT
so we've got this patch to libxml2 2.7.6 in the LibreOffice code base,
inherited from OOo. it fixes a definite problem, which is that Windows
has a rather low maximum path length restriction, and there is a special
trick on NT whereby path names can be prefixed with "\\?\", in which
case the maximum length is 32k, which ought to be sufficient even for
bloated office suites :)
I'll attach the patch to the xmlCanonicPath function. note that i
didn't write this and am by no means an expert on either Microsoftean
platforms or libxml so maybe it's not the best way to do it.
uri.c | 15 ++++++++++++++-
xmlIO.c | 14 +++++++++++---
2 files changed, 25 insertions(+), 4 deletions(-)
---
diff --git a/uri.c b/uri.c
index 0b747a7..4ab0ce2 100644
--- a/uri.c
+++ b/uri.c
@@ -2397,7 +2397,20 @@ xmlCanonicPath(const xmlChar *path)
if (path == NULL)
return(NULL);
- /* sanitize filename starting with // so it can be used as URI */
+#if defined(_WIN32)
+ /*
+ * We must not change the backslashes to slashes if the the path
+ * starts with \\?\
+ * Those paths can be up to 32k characters long.
+ * Was added specifically for OpenOffice, those paths can't be converted
+ * to URIs anyway.
+ */
+ if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') &&
+ (path[3] == '\\') )
+ return xmlStrdup((const xmlChar *) path);
+#endif
+
+ /* sanitize filename starting with // so it can be used as URI */
if ((path[0] == '/') && (path[1] == '/') && (path[2] != '/'))
path++;
diff --git a/xmlIO.c b/xmlIO.c
index 0e2ef71..c6fef66 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -771,13 +771,21 @@ int
xmlCheckFilename (const char *path)
{
#ifdef HAVE_STAT
- struct stat stat_buffer;
+ struct stat stat_buffer;
#endif
- if (path == NULL)
- return(0);
+ if (path == NULL)
+ return(0);
#ifdef HAVE_STAT
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
+ /*
+ * On Windows stat and wstat do not work with long pathname,
+ * which start with '\\?\'
+ */
+ if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') &&
+ (path[3] == '\\') )
+ return 1;
+
if (xmlWrapStat(path, &stat_buffer) == -1)
return 0;
#else
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]