[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lost] [Patch] Bugfix für stat und fstat



! libc: Bugfix in stat beim aufrufen mit einem Verzeichnis als Pfad (wurde bis
        jetzt nicht richtig erkannt)
+ libc: Implementation fuer fstat
=== stat.c
==================================================================
--- stat.c	(revision 1409)
+++ stat.c	(revision 1415)
@@ -36,6 +36,8 @@
 #include <sys/stat.h>
 #include <stdio.h>
 #include <dir.h>
+#include <errno.h>
+#include <dirent.h>
 
 /**
  * Modus einer Datei Aendern. Der Modus entscheidet unter anderem ueber
@@ -83,32 +85,31 @@
 
     FILE* file = fopen(filename, "r");
     
-    // Wenn die Datei nicht geoeffnet werden kann wird sofort abgebrochen
+    // Wenn die Datei nicht geoeffnet werden kann, koennte es sich um ein
+    // Verzeichnis handeln, falls nicht wird sofort abgebrochen
     if (file == NULL) {
-        return -1;
-    }
+        DIR* dir = opendir(filename);
+        if (dir == NULL) {
+            errno = ENOENT;
+            return -1;
+        }
+        closedir(dir);
 
-    // TODO im Moment wird nur die Groesse eingetragen
-
-    fseek(file, 0, SEEK_END);
-    stat_buf->st_size = ftell(file);
-
-    stat_buf->st_blksize = 512;
-    stat_buf->st_blocks = stat_buf->st_size / stat_buf->st_blksize;
-    if (stat_buf->st_size % stat_buf->st_blksize != 0) {
-        stat_buf->st_blocks++;
-    }
-    
-    // Versuchen den Pfad als verzeichnis zu oeffen. Falls dies klappt wird der
-    // entsprehende Modus gesetzt
-    io_resource_t* dir = directory_open(filename);
-    if (dir != NULL) {
-        directory_close(dir);
         stat_buf->st_mode |= S_IFDIR;
     } else {
         stat_buf->st_mode |= S_IFREG;
+
+        // TODO im Moment wird nur die Groesse eingetragen
+
+        fseek(file, 0, SEEK_END);
+        stat_buf->st_size = ftell(file);
+
+        stat_buf->st_blksize = 512;
+        stat_buf->st_blocks = stat_buf->st_size / stat_buf->st_blksize;
+        if (stat_buf->st_size % stat_buf->st_blksize != 0) {
+            stat_buf->st_blocks++;
+        }
     }
-
     stat_buf->st_uid = 0;
     stat_buf->st_gid = 0;
 
@@ -141,8 +142,12 @@
  */
 int fstat(int file, struct stat* stat_buf)
 {
-    // TODO
-    return -1;
+    FILE* f = fdopen(file, "r");
+    if (f == NULL) {
+        errno = EBADF;
+        return -1;
+    }
+    return stat(f->path, stat_buf);
 }
 
 /**