update for HEAD-2003091401
[reactos.git] / lib / msvcrt / sys_stat / wstat.c
index 8d37299..a63f232 100644 (file)
@@ -8,10 +8,13 @@
 #include <msvcrt/internal/file.h>
 
 
+/*
+ * @implemented
+ */
 int _wstat (const wchar_t *path, struct stat *buffer)
 {
-  HANDLE findHandle;
-  WIN32_FIND_DATAW findData;
+  WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
+  wchar_t *ext;
 
   if (!buffer)
   {
@@ -21,88 +24,50 @@ int _wstat (const wchar_t *path, struct stat *buffer)
 
   if(wcschr(path, L'*') || wcschr(path, L'?'))
   {
-    __set_errno(EINVAL);
-    return -1;
-  }
-
-  findHandle = FindFirstFileW(path, &findData);
-  if (findHandle == INVALID_HANDLE_VALUE)
-  {
     __set_errno(ENOENT);
     return -1;
   }
 
-  FindClose(findHandle);
-
-  memset (buffer, 0, sizeof(struct stat));
-
-  buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
-  buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
-  buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
-
-//  statbuf->st_dev = fd;
-  buffer->st_size = findData.nFileSizeLow;
-  buffer->st_mode = S_IREAD;
-  if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
-    buffer->st_mode |= S_IFDIR;
-  else
-    buffer->st_mode |= S_IFREG;
-  if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
-    buffer->st_mode |= S_IWRITE;
-
-  return 0;
-}
-
-__int64 _stati64 (const char *path, struct _stati64 *buffer)
-{
-  HANDLE findHandle;
-  WIN32_FIND_DATAA findData;
-
-  if (!buffer)
-  {
-    __set_errno(EINVAL);
-    return -1;
-  }
-
-  if(strchr(path, '*') || strchr(path, '?'))
-  {
-    __set_errno(EINVAL);
-    return -1;
-  }
-
-  findHandle = FindFirstFileA(path, &findData);
-  if (findHandle == INVALID_HANDLE_VALUE)
+  if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
   {
     __set_errno(ENOENT);
     return -1;
   }
 
-  FindClose(findHandle);
-
   memset (buffer, 0, sizeof(struct stat));
 
-  buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
-  buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
-  buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
+  buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
+  buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
+  buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
 
 //  statbuf->st_dev = fd;
-  buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) +
-             findData.nFileSizeLow;
+  buffer->st_size = fileAttributeData.nFileSizeLow;
   buffer->st_mode = S_IREAD;
-  if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
+  if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     buffer->st_mode |= S_IFDIR;
   else
+  {
     buffer->st_mode |= S_IFREG;
-  if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
+    ext = wcsrchr(path, L'.');
+    if (ext && (!_wcsicmp(ext, L".exe") || 
+               !_wcsicmp(ext, L".com") || 
+               !_wcsicmp(ext, L".bat") || 
+               !_wcsicmp(ext, L".cmd")))
+      buffer->st_mode |= S_IEXEC;
+  }
+  if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
     buffer->st_mode |= S_IWRITE;
 
   return 0;
 }
 
+/*
+ * @implemented
+ */
 __int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
 {
-  HANDLE findHandle;
-  WIN32_FIND_DATAW findData;
+  WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
+  wchar_t *ext;
 
   if (!buffer)
   {
@@ -112,34 +77,39 @@ __int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
 
   if(wcschr(path, L'*') || wcschr(path, L'?'))
   {
-    __set_errno(EINVAL);
+    __set_errno(ENOENT);
     return -1;
   }
 
-  findHandle = FindFirstFileW(path, &findData);
-  if (findHandle == INVALID_HANDLE_VALUE)
+  if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
   {
     __set_errno(ENOENT);
     return -1;
   }
 
-  FindClose(findHandle);
-
-  memset (buffer, 0, sizeof(struct stat));
+  memset (buffer, 0, sizeof(struct _stati64));
 
-  buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
-  buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
-  buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
+  buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
+  buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
+  buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
 
 //  statbuf->st_dev = fd;
-  buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) +
-             findData.nFileSizeLow;
+  buffer->st_size = ((((__int64)fileAttributeData.nFileSizeHigh) << 16) << 16) +
+             fileAttributeData.nFileSizeLow;
   buffer->st_mode = S_IREAD;
-  if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
+  if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     buffer->st_mode |= S_IFDIR;
   else
+  {
     buffer->st_mode |= S_IFREG;
-  if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
+    ext = wcsrchr(path, L'.');
+    if (ext && (!_wcsicmp(ext, L".exe") || 
+               !_wcsicmp(ext, L".com") || 
+               !_wcsicmp(ext, L".bat") || 
+               !_wcsicmp(ext, L".cmd")))
+      buffer->st_mode |= S_IEXEC;
+  }
+  if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
     buffer->st_mode |= S_IWRITE;
 
   return 0;