From: Wilfried Goesgens Date: Thu, 22 Mar 2012 23:42:23 +0000 (+0100) Subject: FileRecvChunked(): implement non splice version for legacy linux & bsd X-Git-Tag: v8.11~125 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=53433fbc9a17577bbf4d61bf10a227b283dc4125 FileRecvChunked(): implement non splice version for legacy linux & bsd --- diff --git a/libcitadel/lib/stringbuf.c b/libcitadel/lib/stringbuf.c index 1219401b4..892963152 100644 --- a/libcitadel/lib/stringbuf.c +++ b/libcitadel/lib/stringbuf.c @@ -3862,9 +3862,10 @@ int FileSendChunked(FDIOBuffer *FDB, const char **Err) int FileRecvChunked(FDIOBuffer *FDB, const char **Err) { -#ifdef LINUX_SENDFILE ssize_t sent, pipesize; +#ifdef LINUX_SENDFILE + pipesize = splice(FDB->IOB->fd, NULL, FDB->SplicePipe[1], NULL, FDB->ChunkSendRemain, @@ -3886,6 +3887,32 @@ int FileRecvChunked(FDIOBuffer *FDB, const char **Err) FDB->ChunkSendRemain -= sent; return sent; #else + + sent = read(FDB->IOB->fd, FDB->ChunkBuffer->buf, FDB->ChunkSendRemain); + if (sent > 0) { + int nWritten = 0; + int rc; + + FDB->ChunkBuffer->BufUsed = sent; + + while (nWritten < FDB->ChunkBuffer->BufUsed) { + rc = write(FDB->OtherFD, FDB->ChunkBuffer->buf + nWritten, FDB->ChunkBuffer->BufUsed - nWritten); + if (rc < 0) { + *Err = strerror(errno); + return rc; + } + nWritten += rc; + + } + FDB->ChunkBuffer->BufUsed = 0; + FDB->TotalSentAlready += sent; + FDB->ChunkSendRemain -= sent; + return FDB->ChunkSendRemain; + } + else if (sent < 0) { + *Err = strerror(errno); + return sent; + } #endif return 0;