isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit 4da89af7be2d53e9a01981292edb289742b7be21
parent f61efdbb9d96a085742c19ee55de195761507947
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Thu,  1 Jan 2015 19:18:27 +0100

refactor maildir_set_uid() and maildir_store_uidval()

the latter now handles both the db and the plaintext file, so the former
can make use of it.

Diffstat:
Msrc/drv_maildir.c | 85++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 47 insertions(+), 38 deletions(-)

diff --git a/src/drv_maildir.c b/src/drv_maildir.c @@ -451,51 +451,42 @@ make_key( const char *info_stop, DBT *tkey, char *name ) tkey->data = name; tkey->size = u ? (size_t)(u - name) : strlen( name ); } - -static int -maildir_set_uid( maildir_store_t *ctx, const char *name, int *uid ) -{ - int ret, uv[2]; - - if (uid) - *uid = ++ctx->nuid; - key.data = (void *)"UIDVALIDITY"; - key.size = 11; - uv[0] = ctx->gen.uidvalidity; - uv[1] = ctx->nuid; - value.data = uv; - value.size = sizeof(uv); - if ((ret = ctx->db->put( ctx->db, 0, &key, &value, 0 ))) { - tbork: - ctx->db->err( ctx->db, ret, "Maildir error: db->put()" ); - return DRV_BOX_BAD; - } - if (uid) { - make_key( ((maildir_store_conf_t *)ctx->gen.conf)->info_stop, &key, (char *)name ); - value.data = uid; - value.size = sizeof(*uid); - if ((ret = ctx->db->put( ctx->db, 0, &key, &value, 0 ))) - goto tbork; - } - if ((ret = ctx->db->sync( ctx->db, 0 ))) { - ctx->db->err( ctx->db, ret, "Maildir error: db->sync()" ); - return DRV_BOX_BAD; - } - return DRV_OK; -} #endif /* USE_DB */ static int maildir_store_uidval( maildir_store_t *ctx ) { int n; +#ifdef USE_DB + int ret, uv[2]; +#endif char buf[128]; - n = sprintf( buf, "%d\n%d\n", ctx->gen.uidvalidity, ctx->nuid ); - lseek( ctx->uvfd, 0, SEEK_SET ); - if (write( ctx->uvfd, buf, n ) != n || ftruncate( ctx->uvfd, n ) || (UseFSync && fdatasync( ctx->uvfd ))) { - error( "Maildir error: cannot write UIDVALIDITY.\n" ); - return DRV_BOX_BAD; +#ifdef USE_DB + if (ctx->db) { + key.data = (void *)"UIDVALIDITY"; + key.size = 11; + uv[0] = ctx->gen.uidvalidity; + uv[1] = ctx->nuid; + value.data = uv; + value.size = sizeof(uv); + if ((ret = ctx->db->put( ctx->db, 0, &key, &value, 0 ))) { + ctx->db->err( ctx->db, ret, "Maildir error: db->put()" ); + return DRV_BOX_BAD; + } + if ((ret = ctx->db->sync( ctx->db, 0 ))) { + ctx->db->err( ctx->db, ret, "Maildir error: db->sync()" ); + return DRV_BOX_BAD; + } + } else +#endif /* USE_DB */ + { + n = sprintf( buf, "%d\n%d\n", ctx->gen.uidvalidity, ctx->nuid ); + lseek( ctx->uvfd, 0, SEEK_SET ); + if (write( ctx->uvfd, buf, n ) != n || ftruncate( ctx->uvfd, n ) || (UseFSync && fdatasync( ctx->uvfd ))) { + error( "Maildir error: cannot write UIDVALIDITY.\n" ); + return DRV_BOX_BAD; + } } conf_wakeup( &ctx->lcktmr, 2 ); return DRV_OK; @@ -511,7 +502,6 @@ maildir_init_uidval( maildir_store_t *ctx ) if (ctx->db) { u_int32_t count; ctx->db->truncate( ctx->db, 0, &count, 0 ); - return maildir_set_uid( ctx, 0, 0 ); } #endif /* USE_DB */ return maildir_store_uidval( ctx ); @@ -598,6 +588,25 @@ maildir_obtain_uid( maildir_store_t *ctx, int *uid ) return maildir_store_uidval( ctx ); } +#ifdef USE_DB +static int +maildir_set_uid( maildir_store_t *ctx, const char *name, int *uid ) +{ + int ret; + + *uid = ++ctx->nuid; + + make_key( ((maildir_store_conf_t *)ctx->gen.conf)->info_stop, &key, (char *)name ); + value.data = uid; + value.size = sizeof(*uid); + if ((ret = ctx->db->put( ctx->db, 0, &key, &value, 0 ))) { + ctx->db->err( ctx->db, ret, "Maildir error: db->put()" ); + return DRV_BOX_BAD; + } + return maildir_store_uidval( ctx ); +} +#endif + static int maildir_compare( const void *l, const void *r ) {