aboutsummaryrefslogtreecommitdiff
path: root/src/os.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-02-04 21:26:50 -0500
committerAndrew Kelley <andrew@ziglang.org>2019-02-04 21:26:50 -0500
commitf32f7a937fa7150aaba450b1282bba9f01918807 (patch)
treeecb462e15546a50b2e948b8f2907872dd39a2dc6 /src/os.cpp
parent1411df4e2705e677003e6e5b5cbe1ca30bf637d7 (diff)
parent8c6fa982cd0a02775264b616c37da9907cc603bb (diff)
downloadzig-f32f7a937fa7150aaba450b1282bba9f01918807.tar.gz
zig-f32f7a937fa7150aaba450b1282bba9f01918807.zip
Merge remote-tracking branch 'origin/master' into llvm8
Diffstat (limited to 'src/os.cpp')
-rw-r--r--src/os.cpp62
1 files changed, 31 insertions, 31 deletions
diff --git a/src/os.cpp b/src/os.cpp
index 2f0379c09b..8eb6b34654 100644
--- a/src/os.cpp
+++ b/src/os.cpp
@@ -1808,7 +1808,7 @@ Error os_self_exe_shared_libs(ZigList<Buf *> &paths) {
#endif
}
-Error os_file_open_r(Buf *full_path, OsFile *out_file) {
+Error os_file_open_r(Buf *full_path, OsFile *out_file, OsTimeStamp *mtime) {
#if defined(ZIG_OS_WINDOWS)
// TODO use CreateFileW
HANDLE result = CreateFileA(buf_ptr(full_path), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
@@ -1834,8 +1834,18 @@ Error os_file_open_r(Buf *full_path, OsFile *out_file) {
return ErrorUnexpected;
}
}
-
*out_file = result;
+
+ if (mtime != nullptr) {
+ FILETIME last_write_time;
+ if (!GetFileTime(result, nullptr, nullptr, &last_write_time)) {
+ CloseHandle(result);
+ return ErrorUnexpected;
+ }
+ mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;
+ mtime->nsec = 0;
+ }
+
return ErrorNone;
#else
for (;;) {
@@ -1858,7 +1868,26 @@ Error os_file_open_r(Buf *full_path, OsFile *out_file) {
return ErrorFileSystem;
}
}
+ struct stat statbuf;
+ if (fstat(fd, &statbuf) == -1) {
+ close(fd);
+ return ErrorFileSystem;
+ }
+ if (S_ISDIR(statbuf.st_mode)) {
+ close(fd);
+ return ErrorIsDir;
+ }
*out_file = fd;
+
+ if (mtime != nullptr) {
+#if defined(ZIG_OS_DARWIN)
+ mtime->sec = statbuf.st_mtimespec.tv_sec;
+ mtime->nsec = statbuf.st_mtimespec.tv_nsec;
+#else
+ mtime->sec = statbuf.st_mtim.tv_sec;
+ mtime->nsec = statbuf.st_mtim.tv_nsec;
+#endif
+ }
return ErrorNone;
}
#endif
@@ -1948,35 +1977,6 @@ Error os_file_open_lock_rw(Buf *full_path, OsFile *out_file) {
#endif
}
-Error os_file_mtime(OsFile file, OsTimeStamp *mtime) {
-#if defined(ZIG_OS_WINDOWS)
- FILETIME last_write_time;
- if (!GetFileTime(file, nullptr, nullptr, &last_write_time))
- return ErrorUnexpected;
- mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;
- mtime->nsec = 0;
- return ErrorNone;
-#elif defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
- struct stat statbuf;
- if (fstat(file, &statbuf) == -1)
- return ErrorFileSystem;
-
- mtime->sec = statbuf.st_mtim.tv_sec;
- mtime->nsec = statbuf.st_mtim.tv_nsec;
- return ErrorNone;
-#elif defined(ZIG_OS_DARWIN)
- struct stat statbuf;
- if (fstat(file, &statbuf) == -1)
- return ErrorFileSystem;
-
- mtime->sec = statbuf.st_mtimespec.tv_sec;
- mtime->nsec = statbuf.st_mtimespec.tv_nsec;
- return ErrorNone;
-#else
-#error unimplemented
-#endif
-}
-
Error os_file_read(OsFile file, void *ptr, size_t *len) {
#if defined(ZIG_OS_WINDOWS)
DWORD amt_read;