Fixed copy or regular files across devices
This commit is contained in:
parent
03e144c8ee
commit
2df6ec2667
29
src/mv.c
29
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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user