Fixed copy or regular files across devices

This commit is contained in:
Pierre Pronchery 2007-08-03 01:14:22 +00:00
parent 03e144c8ee
commit 2df6ec2667

View File

@ -176,21 +176,32 @@ static int _single_symlink(char const * src, char const * dst)
static int _single_regular(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]; 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); return _mv_error(dst, 1);
while((i = fread(buf, sizeof(char), sizeof(buf), fp)) > 0) if((fdst = fopen(dst, "w")) == NULL)
if(fwrite(buf, sizeof(char), i, fp) != i) {
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; break;
if(fclose(fp) != 0 if(!feof(fsrc))
|| i != 0) ret |= _mv_error(size == 0 ? src : dst, 1);
return _mv_error(dst, 1); if(fclose(fsrc) != 0)
ret |= _mv_error(src, 1);
if(fclose(fdst) != 0)
ret |= _mv_error(dst, 1);
if(unlink(src) != 0) if(unlink(src) != 0)
_mv_error(src, 0); _mv_error(src, 0);
return 0; return ret;
} }
static int _single_p(char const * dst, struct stat const * st) static int _single_p(char const * dst, struct stat const * st)