clinuxsendfile

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


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?


Solution

  • 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.