X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Flibcitadel.h;h=d520eae4c96d8733104465bc58402629ada5b796;hb=4b4dc864ede7c5d8d956febe4a0afb422b78e7c4;hp=d223a506ecf55fec4d30da66b125c881d2a9a594;hpb=0547befd0561641dc4368bdc7535baa96a0c9391;p=citadel.git diff --git a/libcitadel/lib/libcitadel.h b/libcitadel/lib/libcitadel.h index d223a506e..d520eae4c 100644 --- a/libcitadel/lib/libcitadel.h +++ b/libcitadel/lib/libcitadel.h @@ -1,5 +1,15 @@ /* * 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. */ @@ -15,8 +25,10 @@ #include #include #include +#include +#include -#define LIBCITADEL_VERSION_NUMBER 789 +#define LIBCITADEL_VERSION_NUMBER 810 /* * Here's a bunch of stupid magic to make the MIME parser portable. @@ -26,26 +38,6 @@ #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, @@ -106,9 +98,12 @@ typedef enum _room_views { 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 #ifndef IsEmptyStr #define IsEmptyStr(a) ((a)[0] == '\0') @@ -240,9 +235,6 @@ int StrBufTCP_read_buffered_line_fast(StrBuf *Line, int selectresolution, const char **Error); - -int StrBufSipLine(StrBuf *LineBuf, StrBuf *Buf, const char **Ptr); - typedef enum _eReadState { eReadFail, eReadSuccess, @@ -258,13 +250,33 @@ typedef struct _file_buffer { 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); @@ -332,6 +344,7 @@ int StrBufSanitizeAscii(StrBuf *Buf, const char Mute); #define QU (3) void StrBufUrlescAppend(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); long StrECMAEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn); long StrHtmlEcmaEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn, int nbsp, int nolinebreaks); @@ -357,12 +370,16 @@ const char *GetIconFilename(char *MimeType, size_t len); /* URL parsing & connection data */ typedef struct ParsedURL ParsedURL; struct ParsedURL { + int Priority; StrBuf *URL; + StrBuf *UrlWithoutCred; + StrBuf *CurlCreds; unsigned Port; const char *Host; const char *User; const char *Pass; const char *LocalPart; + const char *PlainUrl; int IsIP; int IPv6; int af; @@ -373,6 +390,7 @@ struct ParsedURL { void FreeURL(ParsedURL** Url); int ParseURL(ParsedURL **Url, StrBuf *UrlStr, unsigned short DefaultPort); +void CurlPrepareURL(ParsedURL *Url); /* tools */ @@ -474,6 +492,8 @@ long lFlathash(const char *str, long len); #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); @@ -621,4 +641,11 @@ void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount, extern ConstStr RoomNetCfgStrs[maxRoomNetCfg]; +/* 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