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

[Lost] [Patch] fopen und open



Dieser Patch bringt unserem fopen den Modus r+ bei und sorgt dafür, dass sich 
open verhält wie vorgeschrieben, wenn O_CREAT im Spiel ist.
Index: src/modules/lib/stdlibc/file.c
===================================================================
--- src/modules/lib/stdlibc/file.c	(Revision 703)
+++ src/modules/lib/stdlibc/file.c	(Arbeitskopie)
@@ -70,6 +71,9 @@
         switch (mode[i]) {
             case 'r':
                 *attr |= IO_OPEN_MODE_READ;
+                if (mode[i + 1] == '+') {
+                    *attr |= IO_OPEN_MODE_WRITE;
+                }
                 break;
 
             case 'w':
Index: src/modules/include/fcntl.h
===================================================================
--- src/modules/include/fcntl.h	(Revision 703)
+++ src/modules/include/fcntl.h	(Arbeitskopie)
@@ -39,12 +39,12 @@
 
 #define O_RDONLY 1
 #define O_WRONLY 2
-#define O_RDWR 3
-#define O_APPEND 4
-#define O_CREAT 8
-#define O_EXCL 16
-#define O_TRUNC 32
-#define O_BINARY 64
+#define O_RDWR 4
+#define O_APPEND 8
+#define O_CREAT 16
+#define O_EXCL 32
+#define O_TRUNC 64
+#define O_BINARY 128
 
 /// Emulierter Unix-Syscall zum oeffnen von Dateien
 int open(const char* filename, int flags, ...);
Index: src/modules/lib/posix/posix_files.c
===================================================================
--- src/modules/lib/posix/posix_files.c	(Revision 703)
+++ src/modules/lib/posix/posix_files.c	(Arbeitskopie)
@@ -150,6 +151,35 @@
     char* fopen_flags = "   ";
     size_t flags_size = 0;
 
+    // Wenn O_CREAT und O_EXCL gleichzeitig gesetzt ist, muessen wir abbrechen
+    // wenn die Datei existiert.
+    if ((flags & O_CREAT) && (flags & O_EXCL)) {
+        FILE* f = fopen(filename, "r");
+        if (f != NULL) {
+            fclose(f);
+            errno = EEXIST;
+            return -1;
+        }
+    } else if ((flags & O_CREAT) == 0) {
+        // Wenn die Datei nicht existiert und nicht angelegt werden soll, ist
+        // der Fall auch klar.
+        FILE* f = fopen(filename, "r");
+        if (f == NULL) {
+            errno = ENOENT;
+            return -1;
+        }
+        fclose(f);
+    }
+    
+    if (flags & O_CREAT) {
+        // Sicherstellen, dass die Datei existiert
+        FILE* f = fopen(filename, "r");
+        if (f == NULL) {
+            f = fopen(filename, "w");
+        }
+        fclose(f);
+    }
+
     // Open-Flags auf fopen-Kompatible uebersetzen
     if ((flags & O_RDONLY)) {
         fopen_flags[flags_size++] = 'r';
@@ -159,7 +189,6 @@
         fopen_flags[flags_size++] = 'r';
         fopen_flags[flags_size++] = '+';
     } else if ((flags & O_RDWR)) {
-        // FIXME
         fopen_flags[flags_size++] = 'r';
         fopen_flags[flags_size++] = '+';
     }