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

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



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