NeoMutt  2025-12-11-694-ga89709
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
lib.h File Reference

Body Caching (local copies of email bodies) More...

#include <stdio.h>
+ Include dependency graph for lib.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef int(* bcache_list_t) (const char *id, struct BodyCache *bcache, void *data)
 

Functions

void mutt_bcache_close (struct BodyCache **ptr)
 Close an Email-Body Cache.
 
int mutt_bcache_commit (struct BodyCache *bcache, const char *id)
 Move a temporary file into the Body Cache.
 
int mutt_bcache_del (struct BodyCache *bcache, const char *id)
 Delete a file from the Body Cache.
 
int mutt_bcache_exists (struct BodyCache *bcache, const char *id)
 Check if a file exists in the Body Cache.
 
FILE * mutt_bcache_get (struct BodyCache *bcache, const char *id)
 Open a file in the Body Cache.
 
int mutt_bcache_list (struct BodyCache *bcache, bcache_list_t want_id, void *data)
 Find matching entries in the Body Cache.
 
struct BodyCachemutt_bcache_open (struct ConnAccount *account, const char *mailbox)
 Open an Email-Body Cache.
 
FILE * mutt_bcache_put (struct BodyCache *bcache, const char *id)
 Create a file in the Body Cache.
 

Detailed Description

Body Caching (local copies of email bodies)

Authors
  • Richard Russon

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.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file lib.h.

Typedef Documentation

◆ bcache_list_t

typedef int(* bcache_list_t) (const char *id, struct BodyCache *bcache, void *data)

Definition at line 55 of file lib.h.

Function Documentation

◆ mutt_bcache_close()

void mutt_bcache_close ( struct BodyCache ** ptr)

Close an Email-Body Cache.

Parameters
[out]ptrBody cache

Free all memory of bcache and finally FREE() it, too.

Definition at line 167 of file bcache.c.

168{
169 if (!ptr || !*ptr)
170 return;
171
172 struct BodyCache *bcache = *ptr;
173 FREE(&bcache->path);
174
175 FREE(ptr);
176}
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
Local cache of email bodies.
Definition bcache.c:49
char * path
On-disk path to the file.
Definition bcache.c:50
+ Here is the caller graph for this function:

◆ mutt_bcache_commit()

int mutt_bcache_commit ( struct BodyCache * bcache,
const char * id )

Move a temporary file into the Body Cache.

Parameters
bcacheBody Cache from mutt_bcache_open()
idPer-mailbox unique identifier for the message
Return values
0Success
-1Failure

Definition at line 254 of file bcache.c.

255{
256 if (!id || (*id == '\0') || !bcache)
257 return -1;
258
259 struct Buffer *tmpid = buf_pool_get();
260 buf_printf(tmpid, "%s.tmp", id);
261
262 int rc = mutt_bcache_move(bcache, buf_string(tmpid), id);
263 buf_pool_release(&tmpid);
264 return rc;
265}
static int mutt_bcache_move(struct BodyCache *bcache, const char *id, const char *newid)
Change the id of a message in the cache.
Definition bcache.c:117
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition buffer.c:161
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
String manipulation buffer.
Definition buffer.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_bcache_del()

int mutt_bcache_del ( struct BodyCache * bcache,
const char * id )

Delete a file from the Body Cache.

Parameters
bcacheBody Cache from mutt_bcache_open()
idPer-mailbox unique identifier for the message
Return values
0Success
-1Failure

Definition at line 274 of file bcache.c.

275{
276 if (!id || (*id == '\0') || !bcache)
277 return -1;
278
279 struct Buffer *path = buf_pool_get();
280 buf_addstr(path, bcache->path);
281 buf_addstr(path, id);
282
283 mutt_debug(LL_DEBUG3, "bcache: del: '%s'\n", buf_string(path));
284
285 int rc = unlink(buf_string(path));
286 buf_pool_release(&path);
287 return rc;
288}
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition buffer.c:226
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
@ LL_DEBUG3
Log at debug level 3.
Definition logging2.h:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_bcache_exists()

int mutt_bcache_exists ( struct BodyCache * bcache,
const char * id )

Check if a file exists in the Body Cache.

Parameters
bcacheBody Cache from mutt_bcache_open()
idPer-mailbox unique identifier for the message
Return values
0Success
-1Failure

Definition at line 297 of file bcache.c.

298{
299 if (!id || (*id == '\0') || !bcache)
300 return -1;
301
302 struct Buffer *path = buf_pool_get();
303 buf_addstr(path, bcache->path);
304 buf_addstr(path, id);
305
306 int rc = 0;
307 struct stat st = { 0 };
308 if (stat(buf_string(path), &st) < 0)
309 rc = -1;
310 else
311 rc = (S_ISREG(st.st_mode) && (st.st_size != 0)) ? 0 : -1;
312
313 mutt_debug(LL_DEBUG3, "bcache: exists: '%s': %s\n", buf_string(path),
314 (rc == 0) ? "yes" : "no");
315
316 buf_pool_release(&path);
317 return rc;
318}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_bcache_get()

FILE * mutt_bcache_get ( struct BodyCache * bcache,
const char * id )

Open a file in the Body Cache.

Parameters
bcacheBody Cache from mutt_bcache_open()
idPer-mailbox unique identifier for the message
Return values
ptrSuccess
NULLFailure

Definition at line 185 of file bcache.c.

186{
187 if (!id || (*id == '\0') || !bcache)
188 return NULL;
189
190 struct Buffer *path = buf_pool_get();
191 buf_addstr(path, bcache->path);
192 buf_addstr(path, id);
193
194 FILE *fp = mutt_file_fopen(buf_string(path), "r");
195
196 mutt_debug(LL_DEBUG3, "bcache: get: '%s': %s\n", buf_string(path), fp ? "yes" : "no");
197
198 buf_pool_release(&path);
199 return fp;
200}
#define mutt_file_fopen(PATH, MODE)
Definition file.h:138
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_bcache_list()

int mutt_bcache_list ( struct BodyCache * bcache,
bcache_list_t want_id,
void * data )

Find matching entries in the Body Cache.

Parameters
bcacheBody Cache from mutt_bcache_open()
want_idCallback function called for each match
dataData to pass to the callback function
Return values
-1Failure
>=0count of matching items

This more or less "examines" the cache and calls a function with each id it finds if given.

The optional callback function gets the id of a message, the very same body cache handle mutt_bcache_list() is called with (to, perhaps, perform further operations on the bcache), and a data cookie which is just passed as-is. If the return value of the callback is non-zero, the listing is aborted and continued otherwise. The callback is optional so that this function can be used to count the items in the cache (see below for return value).

Definition at line 339 of file bcache.c.

340{
341 DIR *dir = NULL;
342 struct dirent *de = NULL;
343 int rc = -1;
344
345 if (!bcache || !(dir = mutt_file_opendir(bcache->path, MUTT_OPENDIR_NONE)))
346 goto out;
347
348 rc = 0;
349
350 mutt_debug(LL_DEBUG3, "bcache: list: dir: '%s'\n", bcache->path);
351
352 while ((de = readdir(dir)))
353 {
354 if (mutt_str_startswith(de->d_name, ".") || mutt_str_startswith(de->d_name, ".."))
355 {
356 continue;
357 }
358
359 mutt_debug(LL_DEBUG3, "bcache: list: dir: '%s', id :'%s'\n", bcache->path, de->d_name);
360
361 if (want_id && (want_id(de->d_name, bcache, data) != 0))
362 goto out;
363
364 rc++;
365 }
366
367out:
368 if (dir)
369 {
370 if (closedir(dir) < 0)
371 rc = -1;
372 }
373 mutt_debug(LL_DEBUG3, "bcache: list: did %d entries\n", rc);
374 return rc;
375}
DIR * mutt_file_opendir(const char *path, enum MuttOpenDirMode mode)
Open a directory.
Definition file.c:535
@ MUTT_OPENDIR_NONE
Plain opendir()
Definition file.h:63
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition string.c:234
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_bcache_open()

struct BodyCache * mutt_bcache_open ( struct ConnAccount * account,
const char * mailbox )

Open an Email-Body Cache.

Parameters
accountcurrent mailbox' account (required)
mailboxpath to the mailbox of the account (optional)
Return values
NULLFailure

The driver using it is responsible for ensuring that hierarchies are separated by '/' (if it knows of such a concepts like mailboxes or hierarchies)

Definition at line 146 of file bcache.c.

147{
148 if (!account)
149 return NULL;
150
151 struct BodyCache *bcache = MUTT_MEM_CALLOC(1, struct BodyCache);
152 if (bcache_path(account, mailbox, bcache) < 0)
153 {
154 mutt_bcache_close(&bcache);
155 return NULL;
156 }
157
158 return bcache;
159}
static int bcache_path(struct ConnAccount *account, const char *mailbox, struct BodyCache *bcache)
Create the cache path for a given account/mailbox.
Definition bcache.c:61
void mutt_bcache_close(struct BodyCache **ptr)
Close an Email-Body Cache.
Definition bcache.c:167
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_bcache_put()

FILE * mutt_bcache_put ( struct BodyCache * bcache,
const char * id )

Create a file in the Body Cache.

Parameters
bcacheBody Cache from mutt_bcache_open()
idPer-mailbox unique identifier for the message
Return values
ptrSuccess
NULLFailure

The returned FILE* is in a temporary location. Use mutt_bcache_commit to put it into place

Definition at line 212 of file bcache.c.

213{
214 if (!id || (*id == '\0') || !bcache)
215 return NULL;
216
217 struct Buffer *path = buf_pool_get();
218 buf_printf(path, "%s%s%s", bcache->path, id, ".tmp");
219
220 struct stat st = { 0 };
221 if (stat(bcache->path, &st) == 0)
222 {
223 if (!S_ISDIR(st.st_mode))
224 {
225 mutt_error(_("Message cache isn't a directory: %s"), bcache->path);
226 buf_pool_release(&path);
227 return NULL;
228 }
229 }
230 else
231 {
232 if (mutt_file_mkdir(bcache->path, S_IRWXU) < 0)
233 {
234 mutt_error(_("Can't create %s: %s"), bcache->path, strerror(errno));
235 buf_pool_release(&path);
236 return NULL;
237 }
238 }
239
240 mutt_debug(LL_DEBUG3, "bcache: put: '%s'\n", buf_string(path));
241
242 FILE *fp = mutt_file_fopen(buf_string(path), "w+");
243 buf_pool_release(&path);
244 return fp;
245}
int mutt_file_mkdir(const char *path, mode_t mode)
Recursively create directories.
Definition file.c:844
#define mutt_error(...)
Definition logging2.h:94
#define _(a)
Definition message.h:28
+ Here is the call graph for this function:
+ Here is the caller graph for this function: