On Sat, Jul 04 14:11, Kevin Wolf wrote: > + 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]; Den hätte ich lieber ein paar Zeilen weiter oben. > + > + 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); Wenn du schon brav auf IO-Probleme prüfst, dann doch hier auch gleich. ;-) > + } > + > + fclose(src); > + fclose(dst); > + > + unlink(src_path); > + > + return 0; > } > +#undef BUFFER_SIZE > #endif > > /** Hm, die Fehlermeldungen finde ich irgendwie etwas seltsam... ;-) Aber sonst sieht das vernünftig aus. Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx> -- Antoine Kaufmann <toni@xxxxxxxxxxxxxxxx>
Attachment:
pgpY76KPr6pUg.pgp
Description: PGP signature