#define SHOW_ME_VAPPEND_PRINTF
#include <stdarg.h>
#ifndef LINUX_SENDFILE
-#include <bits/fcntl.h>
#include <sys/sendfile.h>
#endif
#include "libcitadel.h"
return StrLength(FB->Buf) - (FB->ReadWritePointer - FB->Buf->buf);
}
-
-
void FDIOBufferInit(FDIOBuffer *FDB, IOBuffer *IO, int FD, long TotalSendSize)
{
memset(FDB, 0, sizeof(FDIOBuffer));
FDB->TotalSendSize = TotalSendSize;
FDB->IOB = IO;
#ifndef LINUX_SENDFILE
- FDB->ChunkBuffer = NewStrBuf();
+ FDB->ChunkBuffer = NewStrBufPlain(NULL, TotalSendSize + 1);
#else
pipe(FDB->SplicePipe);
#endif
FDB->OtherFD = FD;
}
-int FileSendChunked(FDIOBuffer *FDB, const char **Err)
+void FDIOBufferDelete(FDIOBuffer *FDB)
{
+#ifndef LINUX_SENDFILE
+ FreeStrBuf(&FDB->ChunkBuffer);
+#else
+ close(FDB->SplicePipe[0]);
+ close(FDB->SplicePipe[1]);
+
+#endif
+ close(FDB->OtherFD);
+ memset(FDB, 0, sizeof(FDIOBuffer));
+}
+int FileSendChunked(FDIOBuffer *FDB, const char **Err)
+{
+ char *pRead;
+ long nRead = 0;
+
#ifdef LINUX_SENDFILE
ssize_t sent;
sent = sendfile(FDB->IOB->fd, FDB->OtherFD, &FDB->TotalSentAlready, FDB->ChunkSendRemain);
return sent;
}
FDB->ChunkSendRemain -= sent;
+ FDB->TotalSentAlready += sent;
return FDB->ChunkSendRemain;
#else
+ pRead = FDB->ChunkBuffer->buf;
+ while ((FDB->ChunkBuffer->BufUsed < FDB->TotalSendSize) && (nRead >= 0))
+ {
+ nRead = read(FDB->OtherFD, pRead, FDB->TotalSendSize - FDB->ChunkBuffer->BufUsed);
+ if (nRead > 0) {
+ FDB->ChunkBuffer->BufUsed += nRead;
+ FDB->ChunkBuffer->buf[FDB->ChunkBuffer->BufUsed] = '\0';
+ }
+ else if (nRead == 0) {}
+ else return nRead;
+
+ }
+
+ nRead = write(FDB->IOB->fd, FDB->ChunkBuffer->buf + FDB->TotalSentAlready, FDB->ChunkSendRemain);
+
+ if (nRead >= 0) {
+ FDB->TotalSentAlready += nRead;
+ FDB->ChunkSendRemain -= nRead;
+ return FDB->ChunkSendRemain;
+ }
+ else {
+ return nRead;
+ }
#endif
- return 0;
}
int FileRecvChunked(FDIOBuffer *FDB, const char **Err)
{
+ ssize_t sent, pipesize;
#ifdef LINUX_SENDFILE
- ssize_t sent, pipesize;
- long foo = 0;
pipesize = splice(FDB->IOB->fd, NULL,
FDB->SplicePipe[1], NULL,
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;
}
b++; a++;
}
}
- if ((RemoveTrailingSlash) && (*(b - 1) != '/')){
- *b = '/';
- b++;
+ if ((RemoveTrailingSlash) &&
+ (b > Dir->buf) &&
+ (*(b - 1) == '/')){
+ b--;
}
*b = '\0';
Dir->BufUsed = b - Dir->buf;