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>
Dmitry Potapov committed
Sep 27, 2008 at 12:43 UTC
444dc90322fcd1e4ea1cb9c6a46372fa28d8ef9d
2 files changed
+38
-38
compat/mingw.c
+4
-38
@@ -1,4 +1,5 @@
1
#include "../git-compat-util.h"
2
+#include "win32.h"
3
#include "../strbuf.h"
4
5
unsigned int _CRT_fmode = _O_BINARY;
@@ -39,46 +40,19 @@ static int do_lstat(const char *file_name, struct stat *buf)
40
{
41
WIN32_FILE_ATTRIBUTE_DATA fdata;
42
42
- if (GetFileAttributesExA(file_name, GetFileExInfoStandard, &fdata)) {
43
- int fMode = S_IREAD;
44
- if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
45
- fMode |= S_IFDIR;
46
- else
47
- fMode |= S_IFREG;
48
- if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
49
- fMode |= S_IWRITE;
50
-
43
+ if (!(errno = get_file_attr(file_name, &fdata))) {
44
buf->st_ino = 0;
45
buf->st_gid = 0;
46
buf->st_uid = 0;
47
buf->st_nlink = 1;
55
- buf->st_mode = fMode;
48
+ buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
49
buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since it's not a stat64 */
50
buf->st_dev = buf->st_rdev = 0; /* not used by Git */
51
buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
52
buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
53
buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
61
- errno = 0;
54
return 0;
55
}
64
-
65
- switch (GetLastError()) {
66
- case ERROR_ACCESS_DENIED:
67
- case ERROR_SHARING_VIOLATION:
68
- case ERROR_LOCK_VIOLATION:
69
- case ERROR_SHARING_BUFFER_EXCEEDED:
70
- errno = EACCES;
71
- break;
72
- case ERROR_BUFFER_OVERFLOW:
73
- errno = ENAMETOOLONG;
74
- break;
75
- case ERROR_NOT_ENOUGH_MEMORY:
76
- errno = ENOMEM;
77
- break;
78
- default:
79
- errno = ENOENT;
80
- break;
81
- }
56
return -1;
57
}
58
@@ -130,19 +104,11 @@ int mingw_fstat(int fd, struct stat *buf)
104
return fstat(fd, buf);
105
106
if (GetFileInformationByHandle(fh, &fdata)) {
133
- int fMode = S_IREAD;
134
- if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
135
- fMode |= S_IFDIR;
136
- else
137
- fMode |= S_IFREG;
138
- if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
139
- fMode |= S_IWRITE;
140
-
107
buf->st_ino = 0;
108
buf->st_gid = 0;
109
buf->st_uid = 0;
110
buf->st_nlink = 1;
145
- buf->st_mode = fMode;
111
+ buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
112
buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since it's not a stat64 */
113
buf->st_dev = buf->st_rdev = 0; /* not used by Git */
114
buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
compat/win32.h
new
+34
@@ -0,0 +1,34 @@
1
+/* common Win32 functions for MinGW and Cygwin */
2
+#include <windows.h>
3
+
4
+static inline int file_attr_to_st_mode (DWORD attr)
5
+{
6
+ int fMode = S_IREAD;
7
+ if (attr & FILE_ATTRIBUTE_DIRECTORY)
8
+ fMode |= S_IFDIR;
9
+ else
10
+ fMode |= S_IFREG;
11
+ if (!(attr & FILE_ATTRIBUTE_READONLY))
12
+ fMode |= S_IWRITE;
13
+ return fMode;
14
+}
15
+
16
+static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fdata)
17
+{
18
+ if (GetFileAttributesExA(fname, GetFileExInfoStandard, fdata))
19
+ return 0;
20
+
21
+ switch (GetLastError()) {
22
+ case ERROR_ACCESS_DENIED:
23
+ case ERROR_SHARING_VIOLATION:
24
+ case ERROR_LOCK_VIOLATION:
25
+ case ERROR_SHARING_BUFFER_EXCEEDED:
26
+ return EACCES;
27
+ case ERROR_BUFFER_OVERFLOW:
28
+ return ENAMETOOLONG;
29
+ case ERROR_NOT_ENOUGH_MEMORY:
30
+ return ENOMEM;
31
+ default:
32
+ return ENOENT;
33
+ }
34
+}