isync

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

commit 16e5aade3f0cb5a9de74b12a3a046eb9710aa33d
parent 725a122e916ebdcd50c28564716d5a0ccc9dea2a
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Sat, 15 Sep 2012 11:46:42 +0200

store config error status in conffile_t object

this makes passing it around more straight-forward

Diffstat:
Msrc/config.c | 37+++++++++++++++++++------------------
Msrc/drv_imap.c | 16++++++++--------
Msrc/drv_maildir.c | 4++--
Msrc/isync.h | 5+++--
4 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/src/config.c b/src/config.c @@ -296,7 +296,7 @@ load_config( const char *where, int pseudo ) group_conf_t *group, **groupapp = &groups; string_list_t *chanlist, **chanlistapp; char *arg, *p; - int err, len, cops, gcops, max_size, ms, i; + int len, cops, gcops, max_size, ms, i; char path[_POSIX_PATH_MAX]; char buf[1024]; @@ -317,14 +317,15 @@ load_config( const char *where, int pseudo ) cfile.buf = buf; cfile.bufl = sizeof(buf) - 1; cfile.line = 0; + cfile.err = 0; - gcops = err = 0; + gcops = 0; reloop: while (getcline( &cfile )) { if (!cfile.cmd) continue; for (i = 0; i < N_DRIVERS; i++) - if (drivers[i]->parse_store( &cfile, &store, &err )) { + if (drivers[i]->parse_store( &cfile, &store )) { if (store) { if (!store->path) store->path = ""; @@ -362,7 +363,7 @@ load_config( const char *where, int pseudo ) if (*cfile.val != ':' || !(p = strchr( cfile.val + 1, ':' ))) { error( "%s:%d: malformed mailbox spec\n", cfile.file, cfile.line ); - err = 1; + cfile.err = 1; continue; } *p = 0; @@ -373,24 +374,24 @@ load_config( const char *where, int pseudo ) } error( "%s:%d: unknown store '%s'\n", cfile.file, cfile.line, cfile.val + 1 ); - err = 1; + cfile.err = 1; continue; stpcom: if (*++p) channel->boxes[ms] = nfstrdup( p ); } else if (!getopt_helper( &cfile, &cops, channel->ops, &channel->sync_state )) { error( "%s:%d: unknown keyword '%s'\n", cfile.file, cfile.line, cfile.cmd ); - err = 1; + cfile.err = 1; } } if (!channel->stores[M]) { error( "channel '%s' refers to no master store\n", channel->name ); - err = 1; + cfile.err = 1; } else if (!channel->stores[S]) { error( "channel '%s' refers to no slave store\n", channel->name ); - err = 1; + cfile.err = 1; } else if (merge_ops( cops, channel->ops )) - err = 1; + cfile.err = 1; else { if (max_size >= 0) channel->stores[M]->max_size = channel->stores[S]->max_size = max_size; @@ -429,7 +430,7 @@ load_config( const char *where, int pseudo ) { error( "%s:%d: unknown keyword '%s'\n", cfile.file, cfile.line, cfile.cmd ); - err = 1; + cfile.err = 1; } } break; @@ -438,7 +439,7 @@ load_config( const char *where, int pseudo ) { error( "%s:%d: unknown section keyword '%s'\n", cfile.file, cfile.line, cfile.cmd ); - err = 1; + cfile.err = 1; while (getcline( &cfile )) if (!cfile.cmd) goto reloop; @@ -446,16 +447,16 @@ load_config( const char *where, int pseudo ) } } fclose (cfile.fp); - err |= merge_ops( gcops, global_ops ); + cfile.err |= merge_ops( gcops, global_ops ); if (!global_sync_state) global_sync_state = expand_strdup( "~/." EXE "/" ); - if (!err && pseudo) + if (!cfile.err && pseudo) unlink( where ); - return err; + return cfile.err; } void -parse_generic_store( store_conf_t *store, conffile_t *cfg, int *err ) +parse_generic_store( store_conf_t *store, conffile_t *cfg ) { if (!strcasecmp( "Trash", cfg->cmd )) store->trash = nfstrdup( cfg->val ); @@ -471,15 +472,15 @@ parse_generic_store( store_conf_t *store, conffile_t *cfg, int *err ) int sl = strlen( cfg->val ); if (sl != 1) { error( "%s:%d: malformed flattened hierarchy delimiter\n", cfg->file, cfg->line ); - *err = 1; + cfg->err = 1; } else if (cfg->val[0] == '/') { error( "%s:%d: flattened hierarchy delimiter cannot be the canonical delimiter '/'\n", cfg->file, cfg->line ); - *err = 1; + cfg->err = 1; } else { store->flat_delim = cfg->val[0]; } } else { error( "%s:%d: unknown keyword '%s'\n", cfg->file, cfg->line, cfg->cmd ); - *err = 1; + cfg->err = 1; } } diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -1876,7 +1876,7 @@ imap_commit( store_t *gctx ) imap_server_conf_t *servers, **serverapp = &servers; static int -imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) +imap_parse_store( conffile_t *cfg, store_conf_t **storep ) { imap_store_conf_t *store; imap_server_conf_t *server, *srv, sserver; @@ -1937,7 +1937,7 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) else if (!strcasecmp( "PipelineDepth", cfg->cmd )) { if ((server->max_in_progress = parse_int( cfg )) < 1) { error( "%s:%d: PipelineDepth must be at least 1\n", cfg->file, cfg->line ); - *err = 1; + cfg->err = 1; } } #ifdef HAVE_LIBSSL @@ -1946,7 +1946,7 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) if (access( server->sconf.cert_file, R_OK )) { sys_error( "%s:%d: CertificateFile '%s'", cfg->file, cfg->line, server->sconf.cert_file ); - *err = 1; + cfg->err = 1; } } else if (!strcasecmp( "RequireSSL", cfg->cmd )) server->require_ssl = parse_bool( cfg ); @@ -1969,7 +1969,7 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) if (srv->name && !strcmp( srv->name, cfg->val )) goto gotsrv; error( "%s:%d: unknown IMAP account '%s'\n", cfg->file, cfg->line, cfg->val ); - *err = 1; + cfg->err = 1; continue; gotsrv: store->server = srv; @@ -1980,11 +1980,11 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) else if (!strcasecmp( "PathDelimiter", cfg->cmd )) store->delimiter = *cfg->val; else - parse_generic_store( &store->gen, cfg, err ); + parse_generic_store( &store->gen, cfg ); continue; } else { error( "%s:%d: unknown/misplaced keyword '%s'\n", cfg->file, cfg->line, cfg->cmd ); - *err = 1; + cfg->err = 1; continue; } acc_opt = 1; @@ -1995,7 +1995,7 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) error( "IMAP store '%s' has incomplete/missing connection details\n", store->gen.name ); else error( "IMAP account '%s' has incomplete/missing connection details\n", server->name ); - *err = 1; + cfg->err = 1; return 1; } } @@ -2006,7 +2006,7 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) store->server->name = store->gen.name; } else if (acc_opt) { error( "IMAP store '%s' has both Account and account-specific options\n", store->gen.name ); - *err = 1; + cfg->err = 1; } } return 1; diff --git a/src/drv_maildir.c b/src/drv_maildir.c @@ -1417,7 +1417,7 @@ maildir_commit( store_t *gctx ) } static int -maildir_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) +maildir_parse_store( conffile_t *cfg, store_conf_t **storep ) { maildir_store_conf_t *store; @@ -1437,7 +1437,7 @@ maildir_parse_store( conffile_t *cfg, store_conf_t **storep, int *err ) store->alt_map = parse_bool( cfg ); #endif /* USE_DB */ else - parse_generic_store( &store->gen, cfg, err ); + parse_generic_store( &store->gen, cfg ); if (!store->inbox) store->inbox = expand_strdup( "~/Maildir" ); *storep = &store->gen; diff --git a/src/isync.h b/src/isync.h @@ -113,6 +113,7 @@ typedef struct { char *buf; int bufl; int line; + int err; char *cmd, *val, *rest; } conffile_t; @@ -267,7 +268,7 @@ struct driver { int flags; /* Parse configuration. */ - int (*parse_store)( conffile_t *cfg, store_conf_t **storep, int *err ); + int (*parse_store)( conffile_t *cfg, store_conf_t **storep ); /* Close remaining server connections. All stores must be disowned first. */ void (*cleanup)( void ); @@ -486,7 +487,7 @@ int parse_size( conffile_t *cfile ); int getcline( conffile_t *cfile ); int merge_ops( int cops, int ops[] ); int load_config( const char *filename, int pseudo ); -void parse_generic_store( store_conf_t *store, conffile_t *cfg, int *err ); +void parse_generic_store( store_conf_t *store, conffile_t *cfg ); /* drv_*.c */ extern driver_t maildir_driver, imap_driver;