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

[tyndur-devel] [PATCH 1/3] libc: Etwas besser gefaktes rename



+ libc: rename() kann jetzt Dateien verschieben (durch kopieren und
  loeschen). Verzeichnisse gehen nach wie vor nicht.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/modules/lib/stdlibc/file.c |   55 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/src/modules/lib/stdlibc/file.c b/src/modules/lib/stdlibc/file.c
index 5bb60cd..7ec650e 100644
--- a/src/modules/lib/stdlibc/file.c
+++ b/src/modules/lib/stdlibc/file.c
@@ -857,14 +857,65 @@ int remove(const char* filename)
 }
 
 #ifndef CONFIG_LIBC_NO_STUBS
+#include <errno.h>
+#include <dir.h>
+#define BUFFER_SIZE 4096
 /**
  * Datei verschieben
  */
 int rename(const char* oldpath, const char* newpath)
 {
-    printf("[file.c] FIXME: rename aufgerufen, aber nicht implementiert\n");
-    return -1;
+    const char* src_path = oldpath;
+    const char* dst_path = newpath;
+
+    printf("[file.c] rename %s => %s\n", oldpath, newpath);
+
+    FILE* src = fopen(src_path, "r");
+    if (src == NULL) {
+        fprintf(stderr, "Konnte die Quelldatei nicht oeffnen\n");
+        errno = ENOENT;
+        return -1;
+    }
+
+    FILE* dst;
+    if (is_directory(dst_path)) {
+        fprintf(stderr, "Ziel ist ein Verzeichnis\n");
+        errno = EEXIST;
+        return -1;
+    } else {
+        dst = fopen(dst_path, "w");
+    }
+
+    if (dst == NULL) {
+        fprintf(stderr, "Konnte die Zieldatei nicht oeffnen\n");
+        fclose(src);
+        errno = EACCES;
+        return -1;
+    }
+
+    uint8_t buffer[BUFFER_SIZE];
+
+    while (!feof(src)) {
+        size_t length = fread(buffer, BUFFER_SIZE, 1, src);
+        if (length == 0) {
+            fprintf(stderr, "Fehler beim Kopieren: %d\n", length);
+            fclose(src);
+            fclose(dst);
+            errno = EIO;
+            return -1;
+        }
+
+        fwrite(buffer, length, 1, dst);
+    }
+
+    fclose(src);
+    fclose(dst);
+
+    unlink(src_path);
+
+    return 0;
 }
+#undef BUFFER_SIZE
 #endif
 
 /**
-- 
1.6.0.2