]> code.citadel.org Git - citadel.git/blobdiff - libcitadel/lib/stringbuf.c
BSD compatibility: add missing include for AF_INET
[citadel.git] / libcitadel / lib / stringbuf.c
index 7dc07af46e18a57541628d1b9a9f522cf0f94ef0..892963152b0c653c3f18449c9f51e247f96aef11 100644 (file)
@@ -30,7 +30,6 @@
 #define SHOW_ME_VAPPEND_PRINTF
 #include <stdarg.h>
 #ifndef LINUX_SENDFILE
-#include <bits/fcntl.h>
 #include <sys/sendfile.h>
 #endif
 #include "libcitadel.h"
@@ -3791,8 +3790,6 @@ long IOBufferStrLength(IOBuffer *FB)
        return StrLength(FB->Buf) - (FB->ReadWritePointer - FB->Buf->buf);
 }
 
-
-
 void FDIOBufferInit(FDIOBuffer *FDB, IOBuffer *IO, int FD, long TotalSendSize)
 {
        memset(FDB, 0, sizeof(FDIOBuffer));
@@ -3800,16 +3797,31 @@ void FDIOBufferInit(FDIOBuffer *FDB, IOBuffer *IO, int FD, long TotalSendSize)
                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);
@@ -3819,18 +3831,40 @@ int FileSendChunked(FDIOBuffer *FDB, const char **Err)
                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, 
@@ -3853,6 +3887,33 @@ 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;
 }
@@ -4594,9 +4655,10 @@ void StrBufStripSlashes(StrBuf *Dir, int RemoveTrailingSlash)
                        b++; a++;
                }
        }
-       if ((RemoveTrailingSlash) && (*(b - 1) != '/')){
-               *b = '/';
-               b++;
+       if ((RemoveTrailingSlash) &&
+           (b > Dir->buf) && 
+           (*(b - 1) == '/')){
+               b--;
        }
        *b = '\0';
        Dir->BufUsed = b - Dir->buf;