Cleanup copy functions (#1500)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled

This commit is contained in:
trapexit 2025-07-27 16:23:45 -05:00 • committed by GitHub
parent e8cd74cab0
commit 33fc26f81f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 164 additions and 151 deletions

View file

@ -17,82 +17,58 @@
#include "fs_copydata_readwrite.hpp"
#include "errno.hpp"
#include "fs_fstat.hpp"
#include "fs_lseek.hpp"
#include "fs_read.hpp"
#include "fs_write.hpp"
#include "fs_pread.hpp"
#include "fs_pwriten.hpp"
#include <vector>
static
s64
_writen(const int fd_,
const char *buf_,
const u64 size_)
{
s64 rv;
u64 nleft;
nleft = size_;
do
{
rv = fs::write(fd_,buf_,nleft);
if(rv == -EINTR)
continue;
if(rv == -EAGAIN)
continue;
if(rv == 0)
break;
if(rv < 0)
return rv;
nleft -= rv;
buf_ += rv;
}
while(nleft > 0);
return (size_ - nleft);
}
static
s64
_copydata_readwrite(const int src_fd_,
const int dst_fd_,
const u64 count_)
const u64 count_,
const u64 bufsize_)
{
int err;
s64 nr;
s64 nw;
s64 bufsize;
u64 totalwritten;
s64 offset;
std::vector<char> buf;
bufsize = (1024 * 1024);
buf.resize(bufsize);
if(bufsize_ == 0)
return -EINVAL;
totalwritten = 0;
while(totalwritten < count_)
buf.resize(bufsize_);
offset = 0;
while(offset < (s64)count_)
{
nr = fs::read(src_fd_,&buf[0],bufsize);
if(nr == 0)
return totalwritten;
if(nr == -EINTR)
continue;
if(nr == -EAGAIN)
continue;
if(nr < 0)
return nr;
nr = fs::pread(src_fd_,&buf[0],buf.size(),offset);
switch(nr)
{
case -EINTR:
case -EAGAIN:
continue;
case 0:
return offset;
default:
if(nr < 0)
return nr;
break;
}
nw = ::_writen(dst_fd_,&buf[0],nr);
if(nw < 0)
return nw;
nw = fs::pwriten(dst_fd_,&buf[0],nr,offset,&err);
if(err < 0)
return err;
totalwritten += nw;
offset += nw;
}
return totalwritten;
return offset;
}
#define BUF_SIZE (256 * 1024)
s64
fs::copydata_readwrite(const int src_fd_,
@ -101,5 +77,6 @@ fs::copydata_readwrite(const int src_fd_,
{
return ::_copydata_readwrite(src_fd_,
dst_fd_,
count_);
count_,
BUF_SIZE);
}