@@ -38,10 +38,9 @@ using namespace llbuild::basic;
38
38
39
39
bool sys::chdir (const char *fileName) {
40
40
#if defined(_WIN32)
41
- llvm::SmallVector<wchar_t , MAX_PATH> wFileName;
42
- if (llvm::sys::path::widenPath (fileName, wFileName))
43
- return false ;
44
- return SetCurrentDirectoryW (wFileName.data ());
41
+ llvm::SmallVector<llvm::UTF16, 20 > wFileName;
42
+ llvm::convertUTF8ToUTF16String (fileName, wFileName);
43
+ return SetCurrentDirectoryW ((LPCWSTR)wFileName.data ());
45
44
#else
46
45
return ::chdir (fileName) == 0 ;
47
46
#endif
@@ -64,13 +63,10 @@ time_t filetimeToTime_t(FILETIME ft) {
64
63
65
64
int sys::lstat (const char *fileName, sys::StatStruct *buf) {
66
65
#if defined(_WIN32)
67
- llvm::SmallVector<wchar_t , MAX_PATH> wfilename;
68
- if (llvm::sys::path::widenPath (fileName, wfilename)) {
69
- errno = EINVAL;
70
- return -1 ;
71
- }
66
+ llvm::SmallVector<llvm::UTF16, 20 > wfilename;
67
+ llvm::convertUTF8ToUTF16String (fileName, wfilename);
72
68
HANDLE h = CreateFileW (
73
- /* lpFileName=*/ wfilename.data (),
69
+ /* lpFileName=*/ (LPCWSTR) wfilename.data (),
74
70
/* dwDesiredAccess=*/ 0 ,
75
71
/* dwShareMode=*/ FILE_SHARE_READ,
76
72
/* lpSecurityAttributes=*/ NULL ,
@@ -127,10 +123,7 @@ int sys::lstat(const char *fileName, sys::StatStruct *buf) {
127
123
128
124
bool sys::mkdir (const char * fileName) {
129
125
#if defined(_WIN32)
130
- llvm::SmallVector<wchar_t , MAX_PATH> wfilename;
131
- if (llvm::sys::path::widenPath (fileName, wfilename))
132
- return false ;
133
- return CreateDirectoryW (wfilename.data (), NULL ) != 0 ;
126
+ return _mkdir (fileName) == 0 ;
134
127
#else
135
128
return ::mkdir (fileName, S_IRWXU | S_IRWXG | S_IRWXO) == 0 ;
136
129
#endif
@@ -171,72 +164,15 @@ int sys::read(int fileHandle, void *destinationBuffer,
171
164
172
165
int sys::rmdir (const char *path) {
173
166
#if defined(_WIN32)
174
- llvm::SmallVector<wchar_t , MAX_PATH> wpath;
175
- if (llvm::sys::path::widenPath (path, wpath)) {
176
- errno = EINVAL;
177
- return -1 ;
178
- }
179
- if (RemoveDirectoryW (wpath.data ())) {
180
- return 0 ;
181
- }
182
- int err = GetLastError ();
183
- if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) {
184
- errno = ENOENT;
185
- } else if (err == ERROR_ACCESS_DENIED) {
186
- errno = EACCES;
187
- } else if (err == ERROR_DIR_NOT_EMPTY) {
188
- errno = ENOTEMPTY;
189
- } else {
190
- errno = EINVAL;
191
- }
192
- return -1 ;
167
+ return ::_rmdir (path);
193
168
#else
194
169
return ::rmdir (path);
195
170
#endif
196
171
}
197
172
198
173
int sys::stat (const char *fileName, StatStruct *buf) {
199
174
#if defined(_WIN32)
200
- llvm::SmallVector<wchar_t , MAX_PATH> wfilename;
201
- if (llvm::sys::path::widenPath (fileName, wfilename)) {
202
- errno = EINVAL;
203
- return -1 ;
204
- }
205
-
206
- WIN32_FILE_ATTRIBUTE_DATA fileData;
207
- if (!GetFileAttributesExW (wfilename.data (), GetFileExInfoStandard, &fileData)) {
208
- int err = GetLastError ();
209
- if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) {
210
- errno = ENOENT;
211
- } else if (err == ERROR_ACCESS_DENIED) {
212
- errno = EACCES;
213
- } else {
214
- errno = EINVAL;
215
- }
216
- return -1 ;
217
- }
218
-
219
- // Fill the stat structure
220
- buf->st_gid = 0 ;
221
- buf->st_atime = filetimeToTime_t (fileData.ftLastAccessTime );
222
- buf->st_ctime = filetimeToTime_t (fileData.ftCreationTime );
223
- buf->st_dev = 0 ;
224
- buf->st_ino = 0 ;
225
- buf->st_rdev = 0 ;
226
- buf->st_mode = (fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? _S_IFDIR : _S_IFREG;
227
- buf->st_mode |= (fileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? _S_IREAD : _S_IREAD | _S_IWRITE;
228
-
229
- llvm::StringRef extension = llvm::sys::path::extension (llvm::StringRef (fileName));
230
- if (extension == " .exe" || extension == " .cmd" || extension == " .bat" || extension == " .com" ) {
231
- buf->st_mode |= _S_IEXEC;
232
- }
233
-
234
- buf->st_mtime = filetimeToTime_t (fileData.ftLastWriteTime );
235
- buf->st_nlink = 1 ;
236
- buf->st_size = ((long long )fileData.nFileSizeHigh << 32 ) | fileData.nFileSizeLow ;
237
- buf->st_uid = 0 ;
238
-
239
- return 0 ;
175
+ return ::_stat (fileName, buf);
240
176
#else
241
177
return ::stat (fileName, buf);
242
178
#endif
@@ -245,21 +181,19 @@ int sys::stat(const char *fileName, StatStruct *buf) {
245
181
// Create a symlink named linkPath which contains the string pointsTo
246
182
int sys::symlink (const char *pointsTo, const char *linkPath) {
247
183
#if defined(_WIN32)
248
- llvm::SmallVector<wchar_t , MAX_PATH> wPointsTo;
249
- if (llvm::sys::path::widenPath (pointsTo, wPointsTo))
250
- return -1 ;
251
- llvm::SmallVector<wchar_t , MAX_PATH> wLinkPath;
252
- if (llvm::sys::path::widenPath (linkPath, wLinkPath))
253
- return -1 ;
254
- DWORD attributes = GetFileAttributesW (wPointsTo.data ());
184
+ llvm::SmallVector<llvm::UTF16, 20 > wPointsTo;
185
+ llvm::convertUTF8ToUTF16String (pointsTo, wPointsTo);
186
+ llvm::SmallVector<llvm::UTF16, 20 > wLinkPath;
187
+ llvm::convertUTF8ToUTF16String (linkPath, wLinkPath);
188
+ DWORD attributes = GetFileAttributesW ((LPCWSTR)wPointsTo.data ());
255
189
DWORD directoryFlag = (attributes != INVALID_FILE_ATTRIBUTES &&
256
190
attributes & FILE_ATTRIBUTE_DIRECTORY)
257
191
? SYMBOLIC_LINK_FLAG_DIRECTORY
258
192
: 0 ;
259
193
// Note that CreateSymbolicLinkW takes its arguments in reverse order
260
194
// compared to symlink/_symlink
261
195
return !::CreateSymbolicLinkW (
262
- wLinkPath.data (), wPointsTo.data (),
196
+ (LPCWSTR) wLinkPath.data (), (LPCWSTR) wPointsTo.data (),
263
197
SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE | directoryFlag);
264
198
#else
265
199
return ::symlink (pointsTo, linkPath);
@@ -268,23 +202,7 @@ int sys::symlink(const char *pointsTo, const char *linkPath) {
268
202
269
203
int sys::unlink (const char *fileName) {
270
204
#if defined(_WIN32)
271
- llvm::SmallVector<wchar_t , MAX_PATH> wfilename;
272
- if (llvm::sys::path::widenPath (fileName, wfilename)) {
273
- errno = EINVAL;
274
- return -1 ;
275
- }
276
- if (DeleteFileW (wfilename.data ())) {
277
- return 0 ;
278
- }
279
- int err = GetLastError ();
280
- if (err == ERROR_FILE_NOT_FOUND) {
281
- errno = ENOENT;
282
- } else if (err == ERROR_ACCESS_DENIED) {
283
- errno = EACCES;
284
- } else {
285
- errno = EINVAL;
286
- }
287
- return -1 ;
205
+ return ::_unlink (fileName);
288
206
#else
289
207
return ::unlink (fileName);
290
208
#endif
@@ -345,15 +263,14 @@ int sys::raiseOpenFileLimit(llbuild_rlim_t limit) {
345
263
sys::MATCH_RESULT sys::filenameMatch (const std::string& pattern,
346
264
const std::string& filename) {
347
265
#if defined(_WIN32)
348
- llvm::SmallVector<wchar_t , MAX_PATH > wpattern;
349
- llvm::SmallVector<wchar_t , MAX_PATH > wfilename;
266
+ llvm::SmallVector<llvm::UTF16, 20 > wpattern;
267
+ llvm::SmallVector<llvm::UTF16, 20 > wfilename;
350
268
351
- if (llvm::sys::path::widenPath (pattern, wpattern) ||
352
- llvm::sys::path::widenPath (filename, wfilename))
353
- return sys::MATCH_ERROR;
269
+ llvm::convertUTF8ToUTF16String (pattern, wpattern);
270
+ llvm::convertUTF8ToUTF16String (filename, wfilename);
354
271
355
272
bool result =
356
- PathMatchSpecW (wfilename.data (), wpattern.data ());
273
+ PathMatchSpecW ((LPCWSTR) wfilename.data (), (LPCWSTR) wpattern.data ());
357
274
return result ? sys::MATCH : sys::NO_MATCH;
358
275
#else
359
276
int result = fnmatch (pattern.c_str (), filename.c_str (), 0 );
@@ -425,17 +342,9 @@ std::string sys::makeTmpDir() {
425
342
#if defined(_WIN32)
426
343
char path[MAX_PATH];
427
344
tmpnam_s (path, MAX_PATH);
428
- llvm::SmallVector<wchar_t , MAX_PATH> wPath;
429
- if (llvm::sys::path::widenPath (path, wPath))
430
- return std::string ();
431
- if (!CreateDirectoryW (wPath.data (), NULL )) {
432
- DWORD error = GetLastError ();
433
- if (error != ERROR_ALREADY_EXISTS) {
434
- fprintf (stderr, " Failed to create temporary directory '%s': error code %lu\n " ,
435
- path, (unsigned long )error);
436
- return std::string ();
437
- }
438
- }
345
+ llvm::SmallVector<llvm::UTF16, 20 > wPath;
346
+ llvm::convertUTF8ToUTF16String (path, wPath);
347
+ CreateDirectoryW ((LPCWSTR)wPath.data (), NULL );
439
348
return std::string (path);
440
349
#else
441
350
if (const char *tmpDir = std::getenv (" TMPDIR" )) {
@@ -462,10 +371,15 @@ std::string sys::getPathSeparators() {
462
371
463
372
sys::ModuleTraits<>::Handle sys::OpenLibrary (const char *path) {
464
373
#if defined(_WIN32)
465
- llvm::SmallVector<wchar_t , MAX_PATH> wPath;
466
- if (llvm::sys::path::widenPath (path, wPath))
467
- return nullptr ;
468
- return LoadLibraryW (wPath.data ());
374
+ int cchLength =
375
+ MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, path, strlen (path),
376
+ nullptr , 0 );
377
+ std::u16string buffer (cchLength + 1 , 0 );
378
+ MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, path, strlen (path),
379
+ const_cast <LPWSTR>(reinterpret_cast <LPCWSTR>(buffer.data ())),
380
+ buffer.size ());
381
+
382
+ return LoadLibraryW (reinterpret_cast <LPCWSTR>(buffer.data ()));
469
383
#else
470
384
return dlopen (path, RTLD_LAZY);
471
385
#endif
@@ -487,3 +401,4 @@ void sys::CloseLibrary(sys::ModuleTraits<>::Handle handle) {
487
401
dlclose (handle);
488
402
#endif
489
403
}
404
+
0 commit comments