@@ -96,7 +96,7 @@ GIT_INLINE(void) git_win32__filetime_to_timespec(
9696}
9797
9898GIT_INLINE (void ) git_win32__timeval_to_filetime (
99- FILETIME * ft , const struct timeval tv )
99+ FILETIME * ft , const struct p_timeval tv )
100100{
101101 long long ticks = (tv .tv_sec * 10000000LL ) +
102102 (tv .tv_usec * 10LL ) + 116444736000000000LL ;
@@ -105,32 +105,65 @@ GIT_INLINE(void) git_win32__timeval_to_filetime(
105105 ft -> dwLowDateTime = (ticks & 0xffffffffLL );
106106}
107107
108- GIT_INLINE (int ) git_win32__file_attribute_to_stat (
108+ GIT_INLINE (void ) git_win32__stat_init (
109109 struct stat * st ,
110- const WIN32_FILE_ATTRIBUTE_DATA * attrdata ,
111- const wchar_t * path )
110+ DWORD dwFileAttributes ,
111+ DWORD nFileSizeHigh ,
112+ DWORD nFileSizeLow ,
113+ FILETIME ftCreationTime ,
114+ FILETIME ftLastAccessTime ,
115+ FILETIME ftLastWriteTime )
112116{
113117 mode_t mode = S_IREAD ;
114118
115- if (attrdata -> dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
119+ memset (st , 0 , sizeof (struct stat ));
120+
121+ if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
116122 mode |= S_IFDIR ;
117123 else
118124 mode |= S_IFREG ;
119125
120- if ((attrdata -> dwFileAttributes & FILE_ATTRIBUTE_READONLY ) == 0 )
126+ if ((dwFileAttributes & FILE_ATTRIBUTE_READONLY ) == 0 )
121127 mode |= S_IWRITE ;
122128
123129 st -> st_ino = 0 ;
124130 st -> st_gid = 0 ;
125131 st -> st_uid = 0 ;
126132 st -> st_nlink = 1 ;
127133 st -> st_mode = mode ;
128- st -> st_size = ((git_off_t )attrdata -> nFileSizeHigh << 32 ) + attrdata -> nFileSizeLow ;
134+ st -> st_size = ((git_off_t )nFileSizeHigh << 32 ) + nFileSizeLow ;
129135 st -> st_dev = _getdrive () - 1 ;
130136 st -> st_rdev = st -> st_dev ;
131- git_win32__filetime_to_timespec (& (attrdata -> ftLastAccessTime ), & (st -> st_atim ));
132- git_win32__filetime_to_timespec (& (attrdata -> ftLastWriteTime ), & (st -> st_mtim ));
133- git_win32__filetime_to_timespec (& (attrdata -> ftCreationTime ), & (st -> st_ctim ));
137+ git_win32__filetime_to_timespec (& ftLastAccessTime , & (st -> st_atim ));
138+ git_win32__filetime_to_timespec (& ftLastWriteTime , & (st -> st_mtim ));
139+ git_win32__filetime_to_timespec (& ftCreationTime , & (st -> st_ctim ));
140+ }
141+
142+ GIT_INLINE (void ) git_win32__file_information_to_stat (
143+ struct stat * st ,
144+ const BY_HANDLE_FILE_INFORMATION * fileinfo )
145+ {
146+ git_win32__stat_init (st ,
147+ fileinfo -> dwFileAttributes ,
148+ fileinfo -> nFileSizeHigh ,
149+ fileinfo -> nFileSizeLow ,
150+ fileinfo -> ftCreationTime ,
151+ fileinfo -> ftLastAccessTime ,
152+ fileinfo -> ftLastWriteTime );
153+ }
154+
155+ GIT_INLINE (int ) git_win32__file_attribute_to_stat (
156+ struct stat * st ,
157+ const WIN32_FILE_ATTRIBUTE_DATA * attrdata ,
158+ const wchar_t * path )
159+ {
160+ git_win32__stat_init (st ,
161+ attrdata -> dwFileAttributes ,
162+ attrdata -> nFileSizeHigh ,
163+ attrdata -> nFileSizeLow ,
164+ attrdata -> ftCreationTime ,
165+ attrdata -> ftLastAccessTime ,
166+ attrdata -> ftLastWriteTime );
134167
135168 if (attrdata -> dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT && path ) {
136169 git_win32_path target ;
@@ -139,7 +172,7 @@ GIT_INLINE(int) git_win32__file_attribute_to_stat(
139172 st -> st_mode = (st -> st_mode & ~S_IFMT ) | S_IFLNK ;
140173
141174 /* st_size gets the UTF-8 length of the target name, in bytes,
142- * not counting the NULL terminator */
175+ * not counting the NULL terminator */
143176 if ((st -> st_size = git__utf16_to_8 (NULL , 0 , target )) < 0 ) {
144177 giterr_set (GITERR_OS , "Could not convert reparse point name for '%s'" , path );
145178 return -1 ;
0 commit comments