[libxml2] Support long path names on WNT



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]