texlive[54881] Build/source/texk/kpathsea: Support very long input

commits+kakuto at tug.org commits+kakuto at tug.org
Sun Apr 26 03:53:20 CEST 2020


Revision: 54881
          http://tug.org/svn/texlive?view=revision&revision=54881
Author:   kakuto
Date:     2020-04-26 03:53:20 +0200 (Sun, 26 Apr 2020)
Log Message:
-----------
Support very long input path name, longer than _MAX_PATH for Windows,
if it really exists, and given an absolute path in a command line (Windows only)

Modified Paths:
--------------
    trunk/Build/source/texk/kpathsea/ChangeLog
    trunk/Build/source/texk/kpathsea/knj.c
    trunk/Build/source/texk/kpathsea/readable.c

Modified: trunk/Build/source/texk/kpathsea/ChangeLog
===================================================================
--- trunk/Build/source/texk/kpathsea/ChangeLog	2020-04-25 23:55:09 UTC (rev 54880)
+++ trunk/Build/source/texk/kpathsea/ChangeLog	2020-04-26 01:53:20 UTC (rev 54881)
@@ -1,3 +1,10 @@
+2020-04-26  Akira Kakuto  <kakuto at w32tex.org>
+
+	* readable.c, knj.c: Support very long input path name,
+	longer than _MAX_PATH for Windows, if it really exists and
+	input name is given in full-absolute path in a command line.
+	(Windows only).
+
 2020-04-10  Karl Berry  <karl at tug.org>
 
 	* version.ac: now 6.3.3/dev since TL'20 is released.

Modified: trunk/Build/source/texk/kpathsea/knj.c
===================================================================
--- trunk/Build/source/texk/kpathsea/knj.c	2020-04-25 23:55:09 UTC (rev 54880)
+++ trunk/Build/source/texk/kpathsea/knj.c	2020-04-26 01:53:20 UTC (rev 54881)
@@ -116,12 +116,35 @@
     FILE *f;
     wchar_t *fnamew, modew[4];
     int i;
-
+    unsigned char *fnn;
+    unsigned char *p;
     assert(filename && mode);
-
-    fnamew = get_wstring_from_mbstring(kpse->File_system_codepage, filename, fnamew=NULL);
+/*
+  Support very long input path name, longer than _MAX_PATH for
+  Windows, if it really exists and input name is given in
+  full-absolute path in a command line.
+*/
+    fnn = xmalloc(strlen(filename) + 10);
+    if ((filename[0] == '/' && filename[1] == '/') ||
+        (filename[0] == '\\' && filename[1] == '\\')) {
+       filename += 2;
+       strcpy (fnn, "\\\\?\\UNC\\");
+       strcat (fnn, filename);
+    } else if (filename[1] == ':') {
+       strcpy (fnn, "\\\\?\\");
+       strcat (fnn, filename);
+    } else {
+       strcpy (fnn, filename);
+    }
+    for (p = fnn; *p; p++) {
+      if (*p == '/')
+         *p = '\\';
+    }
+    
+    fnamew = get_wstring_from_mbstring(kpse->File_system_codepage, fnn, fnamew=NULL);
     for(i=0; (modew[i]=(wchar_t)mode[i]); i++) {} /* mode[i] must be ASCII */
     f = _wfopen(fnamew, modew);
+    free (fnn);
     if (f == NULL)
         FATAL_PERROR(filename);
     if (KPATHSEA_DEBUG_P (KPSE_DEBUG_FOPEN)) {
@@ -149,12 +172,35 @@
     FILE *f;
     wchar_t *fnamew, modew[4];
     int i;
-
+    unsigned char *fnn;
+    unsigned char *p;
     assert(filename && mode);
+/*
+  Support very long input path name, longer than _MAX_PATH for
+  Windows, if it really exists and input name is given in
+  full-absolute path in a command line.
+*/
+    fnn = xmalloc(strlen(filename) + 10);
+    if ((filename[0] == '/' && filename[1] == '/') ||
+        (filename[0] == '\\' && filename[1] == '\\')) {
+       filename += 2;
+       strcpy (fnn, "\\\\?\\UNC\\");
+       strcat (fnn, filename);
+    } else if (filename[1] == ':') {
+       strcpy (fnn, "\\\\?\\");
+       strcat (fnn, filename);
+    } else {
+       strcpy (fnn, filename);
+    }
+    for (p = fnn; *p; p++) {
+      if (*p == '/')
+         *p = '\\';
+    }
 
-    fnamew = get_wstring_from_mbstring(kpse->File_system_codepage, filename, fnamew=NULL);
+    fnamew = get_wstring_from_mbstring(kpse->File_system_codepage, fnn, fnamew=NULL);
     for(i=0; (modew[i]=(wchar_t)mode[i]); i++) {} /* mode[i] must be ASCII */
     f = _wfopen(fnamew, modew);
+    free (fnn);
     if (f != NULL) {
         if (KPATHSEA_DEBUG_P (KPSE_DEBUG_FOPEN)) {
             DEBUGF_START ();

Modified: trunk/Build/source/texk/kpathsea/readable.c
===================================================================
--- trunk/Build/source/texk/kpathsea/readable.c	2020-04-25 23:55:09 UTC (rev 54880)
+++ trunk/Build/source/texk/kpathsea/readable.c	2020-04-26 01:53:20 UTC (rev 54881)
@@ -41,7 +41,33 @@
 READABLE(kpathsea kpse, const_string fn, unsigned int st)
 {
   wchar_t *fnw;
-  fnw = get_wstring_from_mbstring(kpse->File_system_codepage, fn, fnw=NULL);
+  unsigned char *fnn;
+  unsigned char *p;
+
+  fnn = xmalloc(strlen(fn) + 10);
+/*
+  Support very long input path name, longer than _MAX_PATH for
+  Windows, if it really exists and input name is given in
+  full-absolute path in a command line.
+*/
+  if ((fn[0] == '/' && fn[1] == '/') ||
+      (fn[0] == '\\' && fn[1] == '\\')) {
+    fn += 2;
+    strcpy (fnn, "\\\\?\\UNC\\");
+    strcat (fnn, fn);
+  } else if (fn[1] == ':') {
+    strcpy (fnn, "\\\\?\\");
+    strcat (fnn, fn);
+  } else {
+    strcpy (fnn, fn);
+  }
+
+  for (p = fnn; *p; p++) {
+    if (*p == '/')
+      *p = '\\';
+  }
+
+  fnw = get_wstring_from_mbstring(kpse->File_system_codepage, fnn, fnw=NULL);
   if ((st = GetFileAttributesW(fnw)) != 0xFFFFFFFF) {
     /* succeeded */
     errno = 0;
@@ -58,6 +84,7 @@
       break;
     }
   }
+  free (fnn);
   if (fnw)
     free (fnw);
   return ((st != 0xFFFFFFFF) && !(st & FILE_ATTRIBUTE_DIRECTORY));



More information about the tex-live-commits mailing list.