#include <stdlib.h>
#include <stdarg.h>
#include <arpa/inet.h>
+#include <sys/types.h>
+#include <netinet/in.h>
-#define LIBCITADEL_VERSION_NUMBER 800
+#define LIBCITADEL_VERSION_NUMBER 802
/*
* Here's a bunch of stupid magic to make the MIME parser portable.
VIEW_MAX
} ROOM_VIEWS;
+#define BLOG_EUIDBUF_SIZE 40
#ifndef IsEmptyStr
#define IsEmptyStr(a) ((a)[0] == '\0')
int selectresolution,
const char **Error);
-
-
typedef enum _eReadState {
eReadFail,
eReadSuccess,
int nBlobBytesWanted;
} IOBuffer;
+
+typedef struct __fd_iobuffer {
+ IOBuffer *IOB;
+ int OtherFD;
+ int SplicePipe[2];
+ long TotalSendSize;
+ long TotalSentAlready;
+ long ChunkSize;
+ long ChunkSendRemain;
+ StrBuf *ChunkBuffer; /* just used if we don't have sendfile */
+} FDIOBuffer;
+
+
+void FDIOBufferInit(FDIOBuffer *FDB, IOBuffer *IO, int FD, long TotalSendSize);
+void FDIOBufferDelete(FDIOBuffer *FDB);
+int FileSendChunked(FDIOBuffer *FDB, const char **Err);
+int FileRecvChunked(FDIOBuffer *FDB, const char **Err);
+eReadState WriteIOBAlreadyRead(FDIOBuffer *FDB, const char **Error);
+
long StrBuf_read_one_chunk_callback (int fd, short event, IOBuffer *FB);
int StrBuf_write_one_chunk_callback(int fd, short event, IOBuffer *FB);
eReadState StrBufChunkSipLine(StrBuf *LineBuf, IOBuffer *FB);
eReadState StrBufCheckBuffer(IOBuffer *FB);
+long IOBufferStrLength(IOBuffer *FB);
int StrBufSipLine(StrBuf *LineBuf, const StrBuf *Buf, const char **Ptr);
int StrBufReplaceToken(StrBuf *Buf, long where, long HowLong, const char *Repl, long ReplLen);
/* Convenience function to "perform a function and cut a log record if result != 0" */
#define CtdlLogResult(x) if (x) syslog(LOG_CRIT, "%s:%d %s", __FILE__, __LINE__, strerror(errno))
+/* a nice consistent place to define how we turn a message id into a thread id hash */
+#define ThreadIdHash(Buf) abs(HashLittle(ChrPtr(Buf), StrLength(Buf)))
+
+
#endif // LIBCITADEL_H