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)
|
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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user