@@ -116,12 +116,35 @@ kpathsea_fsyscp_xfopen (kpathsea kpse, const char *filename, const char *mode)
116
116
FILE * f ;
117
117
wchar_t * fnamew , modew [4 ];
118
118
int i ;
119
-
119
+ unsigned char * fnn ;
120
+ unsigned char * p ;
120
121
assert (filename && mode );
121
-
122
- fnamew = get_wstring_from_mbstring (kpse -> File_system_codepage , filename , fnamew = NULL );
122
+ /*
123
+ Support very long input path name, longer than _MAX_PATH for
124
+ Windows, if it really exists and input name is given in
125
+ full-absolute path in a command line.
126
+ */
127
+ fnn = xmalloc (strlen (filename ) + 10 );
128
+ if ((filename [0 ] == '/' && filename [1 ] == '/' ) ||
129
+ (filename [0 ] == '\\' && filename [1 ] == '\\' )) {
130
+ filename += 2 ;
131
+ strcpy (fnn , "\\\\?\\UNC\\" );
132
+ strcat (fnn , filename );
133
+ } else if (filename [1 ] == ':' ) {
134
+ strcpy (fnn , "\\\\?\\" );
135
+ strcat (fnn , filename );
136
+ } else {
137
+ strcpy (fnn , filename );
138
+ }
139
+ for (p = fnn ; * p ; p ++ ) {
140
+ if (* p == '/' )
141
+ * p = '\\' ;
142
+ }
143
+
144
+ fnamew = get_wstring_from_mbstring (kpse -> File_system_codepage , fnn , fnamew = NULL );
123
145
for (i = 0 ; (modew [i ]= (wchar_t )mode [i ]); i ++ ) {} /* mode[i] must be ASCII */
124
146
f = _wfopen (fnamew , modew );
147
+ free (fnn );
125
148
if (f == NULL )
126
149
FATAL_PERROR (filename );
127
150
if (KPATHSEA_DEBUG_P (KPSE_DEBUG_FOPEN )) {
@@ -149,12 +172,35 @@ kpathsea_fsyscp_fopen (kpathsea kpse, const char *filename, const char *mode)
149
172
FILE * f ;
150
173
wchar_t * fnamew , modew [4 ];
151
174
int i ;
152
-
175
+ unsigned char * fnn ;
176
+ unsigned char * p ;
153
177
assert (filename && mode );
178
+ /*
179
+ Support very long input path name, longer than _MAX_PATH for
180
+ Windows, if it really exists and input name is given in
181
+ full-absolute path in a command line.
182
+ */
183
+ fnn = xmalloc (strlen (filename ) + 10 );
184
+ if ((filename [0 ] == '/' && filename [1 ] == '/' ) ||
185
+ (filename [0 ] == '\\' && filename [1 ] == '\\' )) {
186
+ filename += 2 ;
187
+ strcpy (fnn , "\\\\?\\UNC\\" );
188
+ strcat (fnn , filename );
189
+ } else if (filename [1 ] == ':' ) {
190
+ strcpy (fnn , "\\\\?\\" );
191
+ strcat (fnn , filename );
192
+ } else {
193
+ strcpy (fnn , filename );
194
+ }
195
+ for (p = fnn ; * p ; p ++ ) {
196
+ if (* p == '/' )
197
+ * p = '\\' ;
198
+ }
154
199
155
- fnamew = get_wstring_from_mbstring (kpse -> File_system_codepage , filename , fnamew = NULL );
200
+ fnamew = get_wstring_from_mbstring (kpse -> File_system_codepage , fnn , fnamew = NULL );
156
201
for (i = 0 ; (modew [i ]= (wchar_t )mode [i ]); i ++ ) {} /* mode[i] must be ASCII */
157
202
f = _wfopen (fnamew , modew );
203
+ free (fnn );
158
204
if (f != NULL ) {
159
205
if (KPATHSEA_DEBUG_P (KPSE_DEBUG_FOPEN )) {
160
206
DEBUGF_START ();
0 commit comments