update for HEAD-2003091401
[reactos.git] / lib / msvcrt / sys_stat / stat.c
index 7dc1b67..c83422b 100644 (file)
@@ -8,10 +8,12 @@
 #include <msvcrt/internal/file.h>
 
 
+/*
+ * @implemented
+ */
 int _stat(const char* path, struct stat* buffer)
 {
-  HANDLE findHandle;
-  WIN32_FIND_DATAA findData;
+  WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
   char* ext;
 
   if (!buffer)
@@ -22,42 +24,94 @@ int _stat(const char* path, struct stat* buffer)
 
   if (strchr(path, '*') || strchr(path, '?'))
   {
+    __set_errno(ENOENT);
+    return -1;
+  }
+
+  if (!GetFileAttributesExA(path, GetFileExInfoStandard, &fileAttributeData))
+  {
+    __set_errno(ENOENT);
+    return -1;
+  }
+
+  memset (buffer, 0, sizeof(struct stat));
+
+  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 = fileAttributeData.nFileSizeLow;
+  buffer->st_mode = S_IREAD;
+  if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
+    buffer->st_mode |= S_IFDIR;
+  else
+  {
+    buffer->st_mode |= S_IFREG;
+    ext = strrchr(path, '.');
+    if (ext && (!_stricmp(ext, ".exe") || 
+               !_stricmp(ext, ".com") || 
+               !_stricmp(ext, ".bat") || 
+               !_stricmp(ext, ".cmd")))
+      buffer->st_mode |= S_IEXEC;
+  }
+  if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
+    buffer->st_mode |= S_IWRITE;
+
+  return 0;
+}
+
+/*
+ * @implemented
+ */
+__int64 _stati64 (const char *path, struct _stati64 *buffer)
+{
+  WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
+  char* ext;
+
+  if (!buffer)
+  {
     __set_errno(EINVAL);
     return -1;
   }
 
-  findHandle = FindFirstFileA(path, &findData);
-  if (findHandle == INVALID_HANDLE_VALUE)
+  if(strchr(path, '*') || strchr(path, '?'))
   {
     __set_errno(ENOENT);
     return -1;
   }
 
-  FindClose(findHandle);
+  if (!GetFileAttributesExA(path, GetFileExInfoStandard, &fileAttributeData))
+  {
+    __set_errno(ENOENT);
+    return -1;
+  }
 
-  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 = 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;
     ext = strrchr(path, '.');
-    if (ext && (!stricmp(ext, ".exe") || 
-               !stricmp(ext, ".com") || 
-               !stricmp(ext, ".bat") || 
-               !stricmp(ext, ".cmd")))
+    if (ext && (!_stricmp(ext, ".exe") || 
+               !_stricmp(ext, ".com") || 
+               !_stricmp(ext, ".bat") || 
+               !_stricmp(ext, ".cmd")))
       buffer->st_mode |= S_IEXEC;
   }
-  if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
+  if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) 
     buffer->st_mode |= S_IWRITE;
 
   return 0;
 }
+