[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