From 53433fbc9a17577bbf4d61bf10a227b283dc4125 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Fri, 23 Mar 2012 00:42:23 +0100 Subject: [PATCH] FileRecvChunked(): implement non splice version for legacy linux & bsd --- libcitadel/lib/stringbuf.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) 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; -- 2.30.2