summaryrefslogtreecommitdiff
path: root/compat/win32.h
diff options
context:
space:
mode:
authorDmitry Potapov <dpotapov@gmail.com>2008-09-27 12:43:01 +0400
committerShawn O. Pearce <spearce@spearce.org>2008-09-30 14:30:06 -0700
commit444dc90322fcd1e4ea1cb9c6a46372fa28d8ef9d (patch)
tree0caaed814507c026f03f40bdf98dd7de4fbaedf0 /compat/win32.h
parentd2b0708e1a65953ad93a4adfc27938de0f8df252 (diff)
downloadgit-444dc90322fcd1e4ea1cb9c6a46372fa28d8ef9d.tar.gz
mingw: move common functionality to win32.h
Some small Win32 specific functions will be shared by MinGW and Cygwin compatibility layer. Place them into a separate header. Signed-off-by: Dmitry Potapov <dpotapov@gmail.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'compat/win32.h')
-rw-r--r--compat/win32.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/compat/win32.h b/compat/win32.h
new file mode 100644
index 0000000000..c26384e595
--- /dev/null
+++ b/compat/win32.h
@@ -0,0 +1,34 @@
+/* common Win32 functions for MinGW and Cygwin */
+#include <windows.h>
+
+static inline int file_attr_to_st_mode (DWORD attr)
+{
+ int fMode = S_IREAD;
+ if (attr & FILE_ATTRIBUTE_DIRECTORY)
+ fMode |= S_IFDIR;
+ else
+ fMode |= S_IFREG;
+ if (!(attr & FILE_ATTRIBUTE_READONLY))
+ fMode |= S_IWRITE;
+ return fMode;
+}
+
+static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fdata)
+{
+ if (GetFileAttributesExA(fname, GetFileExInfoStandard, fdata))
+ return 0;
+
+ switch (GetLastError()) {
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ case ERROR_LOCK_VIOLATION:
+ case ERROR_SHARING_BUFFER_EXCEEDED:
+ return EACCES;
+ case ERROR_BUFFER_OVERFLOW:
+ return ENAMETOOLONG;
+ case ERROR_NOT_ENOUGH_MEMORY:
+ return ENOMEM;
+ default:
+ return ENOENT;
+ }
+}