Alexandre Julliard : ntdll: Use the common fill_stat_info function from the directory code too.

Alexandre Julliard julliard at winehq.org
Thu Nov 19 10:15:17 CST 2009


Module: wine
Branch: master
Commit: da1df74147698dd083d438688736f62ef0ad571c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=da1df74147698dd083d438688736f62ef0ad571c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Nov 18 17:23:55 2009 +0100

ntdll: Use the common fill_stat_info function from the directory code too.

---

 dlls/ntdll/directory.c  |   32 ++++----------------
 dlls/ntdll/file.c       |   74 ++++++++++++++++++++++++++++++++++++++---------
 dlls/ntdll/ntdll_misc.h |    2 +
 3 files changed, 68 insertions(+), 40 deletions(-)

diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c
index e7f1dd4..6784e68 100644
--- a/dlls/ntdll/directory.c
+++ b/dlls/ntdll/directory.c
@@ -933,6 +933,7 @@ static FILE_BOTH_DIR_INFORMATION *append_entry( void *info_ptr, ULONG_PTR *pos,
     WCHAR long_nameW[MAX_DIR_ENTRY_LEN];
     WCHAR short_nameW[12];
     UNICODE_STRING str;
+    ULONG attributes = 0;
 
     long_len = ntdll_umbstowcs( 0, long_name, strlen(long_name), long_nameW, MAX_DIR_ENTRY_LEN );
     if (long_len == -1) return NULL;
@@ -973,45 +974,24 @@ static FILE_BOTH_DIR_INFORMATION *append_entry( void *info_ptr, ULONG_PTR *pos,
 
     if (*pos + total_len > max_length) total_len = max_length - *pos;
 
-    info->FileAttributes = 0;
     if (lstat( long_name, &st ) == -1) return NULL;
     if (S_ISLNK( st.st_mode ))
     {
         if (stat( long_name, &st ) == -1) return NULL;
-        if (S_ISDIR( st.st_mode )) info->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+        if (S_ISDIR( st.st_mode )) attributes |= FILE_ATTRIBUTE_REPARSE_POINT;
     }
     if (is_ignored_file( &st ))
     {
         TRACE( "ignoring file %s\n", long_name );
         return NULL;
     }
+    if (!show_dot_files && long_name[0] == '.' && long_name[1] && (long_name[1] != '.' || long_name[2]))
+        attributes |= FILE_ATTRIBUTE_HIDDEN;
 
+    fill_stat_info( &st, info, FileBothDirectoryInformation );
     info->NextEntryOffset = total_len;
     info->FileIndex = 0;  /* NTFS always has 0 here, so let's not bother with it */
-
-    RtlSecondsSince1970ToTime( st.st_mtime, &info->CreationTime );
-    RtlSecondsSince1970ToTime( st.st_mtime, &info->LastWriteTime );
-    RtlSecondsSince1970ToTime( st.st_atime, &info->LastAccessTime );
-    RtlSecondsSince1970ToTime( st.st_ctime, &info->ChangeTime );
-
-    if (S_ISDIR(st.st_mode))
-    {
-        info->EndOfFile.QuadPart = info->AllocationSize.QuadPart = 0;
-        info->FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
-    }
-    else
-    {
-        info->EndOfFile.QuadPart = st.st_size;
-        info->AllocationSize.QuadPart = (ULONGLONG)st.st_blocks * 512;
-        info->FileAttributes |= FILE_ATTRIBUTE_ARCHIVE;
-    }
-
-    if (!(st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
-        info->FileAttributes |= FILE_ATTRIBUTE_READONLY;
-
-    if (!show_dot_files && long_name[0] == '.' && long_name[1] && (long_name[1] != '.' || long_name[2]))
-        info->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
-
+    info->FileAttributes |= attributes;
     info->EaSize = 0; /* FIXME */
     info->ShortNameLength = short_len * sizeof(WCHAR);
     for (i = 0; i < short_len; i++) info->ShortName[i] = toupperW(short_nameW[i]);
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 8014e15..32e5f93 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1486,8 +1486,26 @@ NTSTATUS WINAPI NtSetVolumeInformationFile(
 	return 0;
 }
 
+static inline void get_file_times( const struct stat *st, LARGE_INTEGER *mtime, LARGE_INTEGER *ctime,
+                                   LARGE_INTEGER *atime, LARGE_INTEGER *creation )
+{
+    RtlSecondsSince1970ToTime( st->st_mtime, mtime );
+    RtlSecondsSince1970ToTime( st->st_ctime, ctime );
+    RtlSecondsSince1970ToTime( st->st_atime, atime );
+#ifdef HAVE_STRUCT_STAT_ST_MTIM
+    mtime->QuadPart += st->st_mtim.tv_nsec / 100;
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_CTIM
+    ctime->QuadPart += st->st_ctim.tv_nsec / 100;
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_ATIM
+    atime->QuadPart += st->st_atim.tv_nsec / 100;
+#endif
+    *creation = *mtime;
+}
+
 /* fill in the file information that depends on the stat info */
-static NTSTATUS fill_stat_info( const struct stat *st, void *ptr, FILE_INFORMATION_CLASS class )
+NTSTATUS fill_stat_info( const struct stat *st, void *ptr, FILE_INFORMATION_CLASS class )
 {
     switch (class)
     {
@@ -1495,23 +1513,12 @@ static NTSTATUS fill_stat_info( const struct stat *st, void *ptr, FILE_INFORMATI
         {
             FILE_BASIC_INFORMATION *info = ptr;
 
+            get_file_times( st, &info->LastWriteTime, &info->ChangeTime,
+                            &info->LastAccessTime, &info->CreationTime );
             if (S_ISDIR(st->st_mode)) info->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;
             else info->FileAttributes = FILE_ATTRIBUTE_ARCHIVE;
             if (!(st->st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
                 info->FileAttributes |= FILE_ATTRIBUTE_READONLY;
-            RtlSecondsSince1970ToTime( st->st_mtime, &info->LastWriteTime );
-            RtlSecondsSince1970ToTime( st->st_ctime, &info->ChangeTime );
-            RtlSecondsSince1970ToTime( st->st_atime, &info->LastAccessTime );
-#ifdef HAVE_STRUCT_STAT_ST_MTIM
-            info->LastWriteTime.QuadPart += st->st_mtim.tv_nsec / 100;
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_CTIM
-            info->ChangeTime.QuadPart += st->st_ctim.tv_nsec / 100;
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_ATIM
-            info->LastAccessTime.QuadPart += st->st_atim.tv_nsec / 100;
-#endif
-            info->CreationTime = info->LastWriteTime;
         }
         break;
     case FileStandardInformation:
@@ -1552,6 +1559,45 @@ static NTSTATUS fill_stat_info( const struct stat *st, void *ptr, FILE_INFORMATI
             fill_stat_info( st, &info->InternalInformation, FileInternalInformation );
         }
         break;
+    /* all directory structures start with the FileDirectoryInformation layout */
+    case FileBothDirectoryInformation:
+    case FileFullDirectoryInformation:
+    case FileDirectoryInformation:
+        {
+            FILE_DIRECTORY_INFORMATION *info = ptr;
+
+            get_file_times( st, &info->LastWriteTime, &info->ChangeTime,
+                            &info->LastAccessTime, &info->CreationTime );
+            if (S_ISDIR(st->st_mode))
+            {
+                info->AllocationSize.QuadPart = 0;
+                info->EndOfFile.QuadPart      = 0;
+                info->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;
+            }
+            else
+            {
+                info->AllocationSize.QuadPart = (ULONGLONG)st->st_blocks * 512;
+                info->EndOfFile.QuadPart      = st->st_size;
+                info->FileAttributes = FILE_ATTRIBUTE_ARCHIVE;
+            }
+            if (!(st->st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
+                info->FileAttributes |= FILE_ATTRIBUTE_READONLY;
+        }
+        break;
+    case FileIdFullDirectoryInformation:
+        {
+            FILE_ID_FULL_DIRECTORY_INFORMATION *info = ptr;
+            info->FileId.QuadPart = st->st_ino;
+            fill_stat_info( st, info, FileDirectoryInformation );
+        }
+        break;
+    case FileIdBothDirectoryInformation:
+        {
+            FILE_ID_BOTH_DIRECTORY_INFORMATION *info = ptr;
+            info->FileId.QuadPart = st->st_ino;
+            fill_stat_info( st, info, FileDirectoryInformation );
+        }
+        break;
 
     default:
         return STATUS_INVALID_INFO_CLASS;
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index b3842e0..be6c770 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -138,7 +138,9 @@ extern NTSTATUS TAPE_DeviceIoControl(HANDLE hDevice,
                                      LPVOID lpOutBuffer, DWORD nOutBufferSize);
 
 /* file I/O */
+struct stat;
 extern NTSTATUS FILE_GetNtStatus(void);
+extern NTSTATUS fill_stat_info( const struct stat *st, void *ptr, FILE_INFORMATION_CLASS class );
 extern void DIR_init_windows_dir( const WCHAR *windir, const WCHAR *sysdir );
 extern BOOL DIR_is_hidden_file( const UNICODE_STRING *name );
 extern NTSTATUS DIR_unmount_device( HANDLE handle );




More information about the wine-cvs mailing list