Преглед изворни кода

store config error status in conffile_t object

this makes passing it around more straight-forward
Oswald Buddenhagen пре 12 година
родитељ
комит
16e5aade3f
4 измењених фајлова са 32 додато и 30 уклоњено
  1. 19 18
      src/config.c
  2. 8 8
      src/drv_imap.c
  3. 2 2
      src/drv_maildir.c
  4. 3 2
      src/isync.h

+ 19 - 18
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;
 	}
 }

+ 8 - 8
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;

+ 2 - 2
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;

+ 3 - 2
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;