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)
{
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)