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.