[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);
}
/**