/*
* Header file for libcitadel
+ *
+ * Copyright (c) 1987-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*/
#include <stdlib.h>
#include <stdarg.h>
#include <arpa/inet.h>
+#include <sys/types.h>
+#include <netinet/in.h>
-#define LIBCITADEL_VERSION_NUMBER 789
+#define LIBCITADEL_VERSION_NUMBER 810
/*
* Here's a bunch of stupid magic to make the MIME parser portable.
#endif
-/* Logging levels - correspond to syslog(3) */
-enum LogLevel {
- /* When about to exit the server for an unrecoverable error */
- CTDL_EMERG, /* system is unusable */
- /* Manual intervention is required to avoid an abnormal exit */
- CTDL_ALERT, /* action must be taken immediately */
- /* The server can continue to run with degraded functionality */
- CTDL_CRIT, /* critical conditions */
- /* An error occurs but the server continues to run normally */
- CTDL_ERR, /* error conditions */
- /* An abnormal condition was detected; server will continue normally */
- CTDL_WARNING, /* warning conditions */
- /* Normal messages (login/out, activity, etc.) */
- CTDL_NOTICE, /* normal but significant condition */
- /* Unimportant progress messages, etc. */
- CTDL_INFO, /* informational */
- /* Debugging messages */
- CTDL_DEBUG /* debug-level messages */
-};
-
typedef enum AXLevel {
AxDeleted = 0,
AxNewU = 1,
VIEW_JOURNAL = 8, /* Journal view */
VIEW_DRAFTS = 9, /* Drafts view */
VIEW_BLOG = 10, /* Blog view */
- VIEW_MAX
+ VIEW_QUEUE = 11, /* SMTP/... QUEUE rooms */
+ VIEW_MAX,
+ VIEW_JSON_LIST,
} ROOM_VIEWS;
#define BLOG_EUIDBUF_SIZE 40
int selectresolution,
const char **Error);
-
-int StrBufSipLine(StrBuf *LineBuf, StrBuf *Buf, const char **Ptr);
-
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);
int StrBufExtract_token(StrBuf *dest, const StrBuf *Source, int parmnum, char separator);
int StrBufSub(StrBuf *dest, const StrBuf *Source, unsigned long Offset, size_t nChars);
#define RB (2)
#define QU (3)
void StrBufUrlescAppend(StrBuf *OutBuf, const StrBuf *In, const char *PlainIn);
+void StrBufUrlescUPAppend(StrBuf *OutBuf, const StrBuf *In, const char *PlainIn);
void StrBufHexescAppend(StrBuf *OutBuf, const StrBuf *In, const char *PlainIn);
void StrBufHexEscAppend(StrBuf *OutBuf, const StrBuf *In, const unsigned char *PlainIn, long PlainInLen);
long StrEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn, int nbsp, int nolinebreaks);
/* URL parsing & connection data */
typedef struct ParsedURL ParsedURL;
struct ParsedURL {
+ int Priority;
StrBuf *URL;
StrBuf *UrlWithoutCred;
StrBuf *CurlCreds;
#define IKEY(a) (const char*) &a, sizeof(a)
#define LKEY(a) (const char*) &a, sizeof(a)
+int TestValidateHash(HashList *TestHash);
+
HashList *NewHash(int Uniq, HashFunc F);
void DeleteHash(HashList **Hash);
void DeleteHashContent(HashList **Hash);
/* 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