53#include "hcache/hcversion.h"
57#if !(defined(HAVE_BDB) || defined(HAVE_GDBM) || defined(HAVE_KC) || \
58 defined(HAVE_LMDB) || defined(HAVE_QDBM) || defined(HAVE_ROCKSDB) || \
59 defined(HAVE_TC) || defined(HAVE_TDB))
60#error "No hcache backend defined"
71 return sizeof(int) +
sizeof(uint32_t);
99 memcpy(&e_dump, e,
sizeof(
struct Email));
125 memcpy(d + *off, &e_dump,
sizeof(
struct Email));
126 *off +=
sizeof(
struct Email);
150 off +=
sizeof(uint32_t);
153 off +=
sizeof(
unsigned int);
157 memcpy(e, d + off,
sizeof(
struct Email));
158 off +=
sizeof(
struct Email);
195#ifdef USE_HCACHE_COMPRESSION
197 if (c_header_cache_compress_method)
201 rk.
len = snprintf(rk.
key,
sizeof(rk.
key),
"%s-%s", key, cops->
name);
206 memcpy(rk.
key, key, keylen + 1);
224 char *p = strrchr(dir,
'/');
235 mutt_error(
_(
"Can't create %s: %s"), dir, strerror(errno));
265 struct stat st = { 0 };
268 int rc = stat(path, &st);
269 bool slash = (path[
plen - 1] ==
'/');
271 if (((rc == 0) && !S_ISDIR(st.st_mode)) || ((rc == -1) && !slash))
283 namer(folder, hcfile);
294#ifdef USE_HCACHE_COMPRESSION
296 const char *cm = c_header_cache_compress_method;
323 if (!realpath(folder, p))
346 unsigned char charval[16];
379#ifdef USE_HCACHE_COMPRESSION
381 if (c_header_cache_compress_method)
386 hc->
cctx = cops->
open(c_header_cache_compress_level);
401 if (!path || (path[0] ==
'\0'))
449#ifdef USE_HCACHE_COMPRESSION
451 if (c_header_cache_compress_method)
474 void *to_free = data;
489 assert((
size_t) off == hlen);
495#ifdef USE_HCACHE_COMPRESSION
497 if (c_header_cache_compress_method)
501 void *dblob = cops->
decompress(hc->cctx, (
char *) data + hlen, dlen - hlen);
506 data = (
char *) dblob - hlen;
530 size_t keylen,
size_t *dlen)
553 if (!hc || !ops || !data || !*data)
563 struct Email *e, uint32_t uidvalidity)
569 char *data =
dump(hc, e, &dlen, uidvalidity);
571#ifdef USE_HCACHE_COMPRESSION
573 if (c_header_cache_compress_method)
583 void *cdata = cops->
compress(hc->
cctx, data + hlen, dlen - hlen, &clen);
591 memcpy(whole, data, hlen);
592 memcpy(whole + hlen, cdata, clen);
621 size_t keylen,
void *data,
size_t dlen)
struct Buffer mutt_buffer_make(size_t size)
Make a new buffer on the stack.
void mutt_buffer_dealloc(struct Buffer *buf)
Release the memory allocated by a buffer.
int mutt_buffer_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
void mutt_buffer_reset(struct Buffer *buf)
Reset an existing Buffer.
size_t mutt_buffer_concat_path(struct Buffer *buf, const char *dir, const char *fname)
Join a directory name and a filename.
static const char * mutt_buffer_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
const struct ComprOps * compress_get_ops(const char *compr)
Get the API functions for a compress backend.
API for the header cache compression.
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
short cs_subset_number(const struct ConfigSubset *sub, const char *name)
Get a number config item by name.
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
time_t mutt_date_epoch(void)
Return the number of seconds since the Unix epoch.
struct Body * mutt_body_new(void)
Create a new Body.
struct Email * email_new(void)
Create a new Email.
Structs that make up an email.
struct Envelope * mutt_env_new(void)
Create a new Envelope.
int mutt_file_mkdir(const char *path, mode_t mode)
Recursively create directories.
struct ReplaceList SpamList
List of regexes and patterns to match spam emails.
struct RegexList NoSpamList
List of regexes to whitelist non-spam emails.
#define mutt_debug(LEVEL,...)
void(* hcache_namer_t)(const char *path, struct Buffer *dest)
static struct RealKey * realkey(const char *key, size_t keylen)
Compute the real key used in the backend, taking into account the compression method.
int mutt_hcache_store(struct HeaderCache *hc, const char *key, size_t keylen, struct Email *e, uint32_t uidvalidity)
Multiplexor for StoreOps::store.
void mutt_hcache_close(struct HeaderCache *hc)
Multiplexor for StoreOps::close.
void * mutt_hcache_fetch_raw(struct HeaderCache *hc, const char *key, size_t keylen, size_t *dlen)
Fetch a message's header from the cache.
struct HeaderCache * mutt_hcache_open(const char *path, const char *folder, hcache_namer_t namer)
Multiplexor for StoreOps::open.
static bool create_hcache_dir(const char *path)
Create parent dirs for the hcache database.
int mutt_hcache_delete_record(struct HeaderCache *hc, const char *key, size_t keylen)
Multiplexor for StoreOps::delete_record.
static void * dump(struct HeaderCache *hc, const struct Email *e, int *off, uint32_t uidvalidity)
Serialise an Email object.
static struct Email * restore(const unsigned char *d)
Restore an Email from data retrieved from the cache.
int mutt_hcache_store_raw(struct HeaderCache *hc, const char *key, size_t keylen, void *data, size_t dlen)
Store a key / data pair.
struct HCacheEntry mutt_hcache_fetch(struct HeaderCache *hc, const char *key, size_t keylen, uint32_t uidvalidity)
Multiplexor for StoreOps::fetch.
void mutt_hcache_free_raw(struct HeaderCache *hc, void **data)
Multiplexor for StoreOps::free.
static size_t header_size(void)
Compute the size of the header with uuid validity and crc.
static unsigned int hcachever
static void hcache_per_folder(struct Buffer *hcpath, const char *path, const char *folder, hcache_namer_t namer)
Generate the hcache pathname.
static char * get_foldername(const char *folder)
Where should the cache be stored?
@ LL_DEBUG3
Log at debug level 3.
void * mutt_md5(const char *str, void *buf)
Calculate the MD5 hash of a NULL-terminated string.
void mutt_md5_process_bytes(const void *buf, size_t buflen, struct Md5Ctx *md5ctx)
Process a block of data.
void mutt_md5_process(const char *str, struct Md5Ctx *md5ctx)
Process a NULL-terminated string.
void mutt_md5_init_ctx(struct Md5Ctx *md5ctx)
Initialise the MD5 computation.
void * mutt_md5_finish_ctx(struct Md5Ctx *md5ctx, void *resbuf)
Process the remaining bytes in the buffer.
void mutt_md5_toascii(const void *digest, char *resbuf)
Convert a binary MD5 digest into ASCII Hexadecimal.
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
void * mutt_mem_malloc(size_t size)
Allocate memory on the heap.
bool CharsetIsUtf8
Is the user's current character set utf-8?
Convenience wrapper for the library headers.
char * mutt_str_dup(const char *str)
Copy a string, safely.
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
void mutt_encode_path(struct Buffer *buf, const char *src)
Convert a path to 'us-ascii'.
Some miscellaneous functions.
static size_t plen
Length of cached packet.
void mutt_buffer_pool_release(struct Buffer **pbuf)
Free a Buffer from the pool.
struct Buffer * mutt_buffer_pool_get(void)
Get a Buffer from the pool.
#define STAILQ_INIT(head)
#define STAILQ_FOREACH(var, head, field)
void serial_restore_tags(struct TagList *tags, const unsigned char *d, int *off)
Unpack a TagList from a binary blob.
void serial_restore_envelope(struct Envelope *env, const unsigned char *d, int *off, bool convert)
Unpack an Envelope from a binary blob.
unsigned char * serial_dump_uint32_t(uint32_t s, unsigned char *d, int *off)
Pack a uint32_t into a binary blob.
unsigned char * serial_dump_int(unsigned int i, unsigned char *d, int *off)
Pack an integer into a binary blob.
void lazy_realloc(void *ptr, size_t size)
Reallocate some memory.
unsigned char * serial_dump_envelope(struct Envelope *env, unsigned char *d, int *off, bool convert)
Pack an Envelope into a binary blob.
unsigned char * serial_dump_body(struct Body *c, unsigned char *d, int *off, bool convert)
Pack an Body into a binary blob.
void serial_restore_body(struct Body *c, const unsigned char *d, int *off, bool convert)
Unpack a Body from a binary blob.
void serial_restore_int(unsigned int *i, const unsigned char *d, int *off)
Unpack an integer from a binary blob.
unsigned char * serial_dump_tags(const struct TagList *tags, unsigned char *d, int *off)
Pack a TagList into a binary blob.
void serial_restore_uint32_t(uint32_t *s, const unsigned char *d, int *off)
Unpack an uint32_t from a binary blob.
const struct StoreOps * store_get_backend_ops(const char *str)
Get the API functions for an store backend.
String manipulation buffer.
char * data
Pointer to data.
void(* close)(void **cctx)
void *(* open)(short level)
void *(* decompress)(void *cctx, const char *cbuf, size_t clen)
void *(* compress)(void *cctx, const char *data, size_t dlen, size_t *clen)
const char * name
Compression name.
The envelope/body of an email.
bool searched
Email has been searched.
bool matched
Search matches this Email.
bool visible
Is this message part of the view?
bool recip_valid
Is_recipient is valid.
bool attach_valid
true when the attachment count is valid
struct Envelope * env
Envelope information.
void * edata
Driver-specific data.
bool collapsed
Is this message part of a collapsed thread?
struct Body * body
List of MIME parts.
char * tree
Character string to print thread tree.
size_t num_hidden
Number of hidden messages in this view (only valid when collapsed is set)
struct AttrColor * attr_color
Color-pair to use when displaying in the index.
bool changed
Email has been edited.
bool threaded
Used for threading.
struct ListHead chain
Mixmaster chain.
struct TagList tags
For drivers that support server tagging.
struct Notify * notify
Notifications: NotifyEmail, EventEmail.
char * path
Path of Email (for local Mailboxes)
size_t sequence
Sequence number assigned on creation.
short recipient
User_is_recipient()'s return value, cached.
bool tagged
Email is tagged.
struct MuttThread * thread
Thread of Emails.
Wrapper for Email retrieved from the header cache.
uint32_t uidvalidity
IMAP-specific UIDVALIDITY.
struct Email * email
Retrieved email.
unsigned int crc
CRC of Email/Body/etc structs.
Cursor for the MD5 hashing.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
Hcache key name (including compression method)
List of regular expressions.
struct Regex * regex
Regex containing a regular expression.
char * pattern
printable version
List of regular expressions.
char * templ
Template to match.
struct Regex * regex
Regex containing a regular expression.
void *(* fetch)(void *store, const char *key, size_t klen, size_t *vlen)
void(* free)(void *store, void **ptr)
int(* delete_record)(void *store, const char *key, size_t klen)
const char * name
Store name.
int(* store)(void *store, const char *key, size_t klen, void *value, size_t vlen)
void *(* open)(const char *path)
void(* close)(void **ptr)