isync

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

commit 904858365d636d5d949253c6e6a18227249f8ef7
parent cbac8aa75ce041384155d360f040aec5049d1de5
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Sun,  8 Apr 2018 18:17:10 +0200

Merge branch '1.3'

Conflicts:
	configure.ac

Diffstat:
M.gitignore | 1+
Mconfigure.ac | 17+++++++++++++++++
Msrc/config.c | 2++
Msrc/drv_imap.c | 4++--
Msrc/drv_maildir.c | 21+++++++++++----------
Msrc/main.c | 4++--
Msrc/socket.h | 4+---
Msrc/sync.c | 2+-
Msrc/util.c | 27++++++++++-----------------
9 files changed, 47 insertions(+), 35 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -21,6 +21,7 @@ /install-sh /isync.spec /isync-*.tar.gz +/isync-*.tar.gz.asc /missing /patch-stamp /stamp-h diff --git a/configure.ac b/configure.ac @@ -11,6 +11,23 @@ fi CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" +AC_CHECK_PROG(PERL, perl, perl) +if test "x$PERL" = "x"; then + AC_MSG_ERROR([perl not found]) +fi + +need_perl=5.14 +AC_CACHE_CHECK([whether perl is recent enough], ob_cv_perl_ver, [ + if $PERL -e "use v$need_perl;"; then + ob_cv_perl_ver=yes + else + ob_cv_perl_ver=no + fi +]) +if test "x$ob_cv_perl_ver" = "xno"; then + AC_MSG_ERROR([perl is too old]) +fi + AC_CACHE_CHECK([whether strftime supports %z], ob_cv_strftime_z, [AC_TRY_RUN( [#include <time.h> diff --git a/src/config.c b/src/config.c @@ -355,6 +355,8 @@ load_config( const char *where, int pseudo ) if (store) { if (!store->max_size) store->max_size = INT_MAX; + if (!store->flat_delim) + store->flat_delim = ""; *storeapp = store; storeapp = &store->next; *storeapp = 0; diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -2250,7 +2250,7 @@ imap_open_store_namespace( imap_store_t *ctx ) ctx->state = SST_HALF; ctx->prefix = cfg->gen.path; - ctx->delimiter[0] = cfg->delimiter ? cfg->delimiter : 0; + ctx->delimiter[0] = cfg->delimiter; if (((!ctx->prefix && cfg->use_namespace) || !cfg->delimiter) && CAP(NAMESPACE)) { /* get NAMESPACE info */ if (!ctx->got_namespace) @@ -2388,7 +2388,7 @@ imap_open_box_p2( imap_store_t *ctx, imap_cmd_t *gcmd, int response ) INIT_IMAP_CMD(imap_cmd_open_box_t, cmd, cmdp->callback, cmdp->callback_aux) cmd->gen.param.lastuid = 1; imap_exec( ctx, &cmd->gen, imap_open_box_p3, - "UID FETCH *:* (UID)" ); + "UID FETCH * (UID)" ); } static void diff --git a/src/drv_maildir.c b/src/drv_maildir.c @@ -1153,28 +1153,29 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t *msglist ) goto retry; } int off, in_msgid = 0; - while ((want_tuid || want_msgid) && fgets( nbuf, sizeof(nbuf), f )) { - int bufl = strlen( nbuf ); - if (bufl && nbuf[bufl - 1] == '\n') + char lnbuf[1000]; // Says RFC2822 + while ((want_tuid || want_msgid) && fgets( lnbuf, sizeof(lnbuf), f )) { + int bufl = strlen( lnbuf ); + if (bufl && lnbuf[bufl - 1] == '\n') --bufl; - if (bufl && nbuf[bufl - 1] == '\r') + if (bufl && lnbuf[bufl - 1] == '\r') --bufl; if (!bufl) break; - if (want_tuid && starts_with( nbuf, bufl, "X-TUID: ", 8 )) { + if (want_tuid && starts_with( lnbuf, bufl, "X-TUID: ", 8 )) { if (bufl < 8 + TUIDL) { error( "Maildir error: malformed X-TUID header (UID %u)\n", uid ); continue; } - memcpy( entry->tuid, nbuf + 8, TUIDL ); + memcpy( entry->tuid, lnbuf + 8, TUIDL ); want_tuid = 0; in_msgid = 0; continue; } - if (want_msgid && starts_with_upper( nbuf, bufl, "MESSAGE-ID:", 11 )) { + if (want_msgid && starts_with_upper( lnbuf, bufl, "MESSAGE-ID:", 11 )) { off = 11; } else if (in_msgid) { - if (!isspace( nbuf[0] )) { + if (!isspace( lnbuf[0] )) { in_msgid = 0; continue; } @@ -1182,13 +1183,13 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t *msglist ) } else { continue; } - while (off < bufl && isspace( nbuf[off] )) + while (off < bufl && isspace( lnbuf[off] )) off++; if (off == bufl) { in_msgid = 1; continue; } - entry->msgid = nfstrndup( nbuf + off, bufl - off ); + entry->msgid = nfstrndup( lnbuf + off, bufl - off ); want_msgid = 0; in_msgid = 0; } diff --git a/src/main.c b/src/main.c @@ -983,7 +983,7 @@ store_connected( int sts, void *aux ) flags |= LIST_INBOX; } else if (c == '/') { /* Flattened sub-folders of INBOX actually end up in Path. */ - if (mvars->ctx[t]->conf->flat_delim) + if (mvars->ctx[t]->conf->flat_delim[0]) flags |= LIST_PATH; else flags |= LIST_INBOX; @@ -1027,7 +1027,7 @@ store_listed( int sts, string_list_t *boxes, void *aux ) return; case DRV_OK: for (box = boxes; box; box = box->next) { - if (mvars->ctx[t]->conf->flat_delim) { + if (mvars->ctx[t]->conf->flat_delim[0]) { string_list_t *nbox; if (map_name( box->string, (char **)&nbox, offsetof(string_list_t, string), mvars->ctx[t]->conf->flat_delim, "/" ) < 0) { error( "Error: flattened mailbox name '%s' contains canonical hierarchy delimiter\n", box->string ); diff --git a/src/socket.h b/src/socket.h @@ -30,9 +30,7 @@ #endif #ifdef HAVE_LIBSSL -typedef struct ssl_st SSL; -typedef struct ssl_ctx_st SSL_CTX; -typedef struct stack_st _STACK; +# include <openssl/ssl.h> enum { SSLv3 = 2, diff --git a/src/sync.c b/src/sync.c @@ -1014,7 +1014,7 @@ sync_boxes( store_t *ctx[], const char *names[], int present[], channel_conf_t * svars->orig_name[t] = (!names[t] || (ctx[t]->conf->map_inbox && !strcmp( ctx[t]->conf->map_inbox, names[t] ))) ? "INBOX" : names[t]; - if (!ctx[t]->conf->flat_delim) { + if (!ctx[t]->conf->flat_delim[0]) { svars->box_name[t] = nfstrdup( svars->orig_name[t] ); } else if (map_name( svars->orig_name[t], &svars->box_name[t], 0, "/", ctx[t]->conf->flat_delim ) < 0) { error( "Error: canonical mailbox name '%s' contains flattened hierarchy delimiter\n", svars->orig_name[t] ); diff --git a/src/util.c b/src/util.c @@ -479,19 +479,20 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha char *p; int i, l, ll, num, inl, outl; + assert( arg ); l = strlen( arg ); - if (!in) { + assert( in ); + inl = strlen( in ); + if (!inl) { copy: *result = nfmalloc( reserve + l + 1 ); memcpy( *result + reserve, arg, l + 1 ); return 0; } - inl = strlen( in ); - if (out) { - outl = strlen( out ); - if (inl == outl && !memcmp( in, out, inl )) - goto copy; - } + assert( out ); + outl = strlen( out ); + if (equals( in, inl, out, outl )) + goto copy; for (num = 0, i = 0; i < l; ) { for (ll = 0; ll < inl; ll++) if (arg[i + ll] != in[ll]) @@ -500,7 +501,7 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha i += inl; continue; fout: - if (out) { + if (outl) { for (ll = 0; ll < outl; ll++) if (arg[i + ll] != out[ll]) goto fnexti; @@ -511,7 +512,7 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha } if (!num) goto copy; - if (!out) + if (!outl) return -2; *result = nfmalloc( reserve + l + num * (outl - inl) + 1 ); p = *result + reserve; @@ -519,15 +520,7 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha for (ll = 0; ll < inl; ll++) if (arg[i + ll] != in[ll]) goto rnexti; -#ifdef __GNUC__ -# pragma GCC diagnostic push -/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42145 */ -# pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -#endif memcpy( p, out, outl ); -#ifdef __GNUC__ -# pragma GCC diagnostic pop -#endif p += outl; i += inl; continue;