@matheusbsbs / matheus-bagliano / commits / 444dc90322
Fork 0

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 +}