From 2df6ec266734b392d71038aa5dafe6f77e2bbc84 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 3 Aug 2007 01:14:22 +0000 Subject: [PATCH] Fixed copy or regular files across devices --- src/mv.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/mv.c b/src/mv.c index 4f6772e..5685b63 100644 --- a/src/mv.c +++ b/src/mv.c @@ -176,21 +176,32 @@ static int _single_symlink(char const * src, char const * dst) static int _single_regular(char const * src, char const * dst) { - FILE * fp; + int ret = 0; + FILE * fsrc; + FILE * fdst; char buf[BUFSIZ]; - size_t i; + size_t size; - if((fp = fopen(dst, "w+")) == NULL) + if((fsrc = fopen(src, "r")) == NULL) return _mv_error(dst, 1); - while((i = fread(buf, sizeof(char), sizeof(buf), fp)) > 0) - if(fwrite(buf, sizeof(char), i, fp) != i) + if((fdst = fopen(dst, "w")) == NULL) + { + ret |= _mv_error(dst, 1); + fclose(fsrc); + return ret; + } + while((size = fread(buf, sizeof(char), sizeof(buf), fsrc)) > 0) + if(fwrite(buf, sizeof(char), size, fdst) != size) break; - if(fclose(fp) != 0 - || i != 0) - return _mv_error(dst, 1); + if(!feof(fsrc)) + ret |= _mv_error(size == 0 ? src : dst, 1); + if(fclose(fsrc) != 0) + ret |= _mv_error(src, 1); + if(fclose(fdst) != 0) + ret |= _mv_error(dst, 1); if(unlink(src) != 0) _mv_error(src, 0); - return 0; + return ret; } static int _single_p(char const * dst, struct stat const * st)