C - copy local file using sendfile, should I check sent bytes?

123 Views Asked by At

I copy file on linux with sendfile. Below is the example how I use it

struct stat statBuf;
fstat(fdFrom, &statBuf);
sendfile(fd, fdFrom, 0, statBuf.st_size);
close(fd);
close(fdFrom);

Documentation to sendfile says that it may not write all bytes at once. Is the way how I use it safe? Or I should implement loop in which I check result of sendfile until will be 0?

Descriptors are from local files.

Should be target file truncated to zero before copying bytes from source file?

1

There are 1 best solutions below

2
Ted Lyngmo On BEST ANSWER

Yes, you should loop and sum up the bytes transfered until you've sent all of them. It could look something like this:

ssize_t rv;
for(off_t tot = 0; tot != statBuf.st_size; tot += (off_t)rv) {
    rv = sendfile(fd, fdFrom, NULL, statBuf.st_size - tot);
    
    if(rv == -1) {
        // handle error
    }
}

Should be target file truncated to zero before copying bytes from source file?

If you want the target file to be an exact copy, then yes, open it with the O_TRUNC flag set - or call ftruncate(fd, statBuf.st_size); after the copying has been done just in case the previous content was larger than what you just copied.