changeset 19897:548734abdb21

doveadm-dict: Remove i_fatal() usage
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Mon, 29 Feb 2016 17:13:32 +0200
parents 68a9266211e6
children 130ebf573dde
files src/doveadm/doveadm-dict.c
diffstat 1 files changed, 45 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-dict.c	Mon Feb 29 16:46:02 2016 +0200
+++ b/src/doveadm/doveadm-dict.c	Mon Feb 29 17:13:32 2016 +0200
@@ -10,13 +10,14 @@
 
 static void dict_cmd_help(doveadm_command_t *cmd);
 
-static struct dict *
+static int
 cmd_dict_init_full(int *argc, char **argv[], int own_arg_count, int key_arg_idx,
-		   doveadm_command_t *cmd, enum dict_iterate_flags *iter_flags)
+		   doveadm_command_t *cmd, enum dict_iterate_flags *iter_flags,
+		   struct dict **dict_r)
 {
 	const char *getopt_args = iter_flags == NULL ? "u:" : "1Ru:V";
 	struct dict *dict;
-	const char *error, *username = "";
+	const char *dict_uri, *error, *username = "";
 	int c;
 
 	while ((c = getopt(*argc, *argv, getopt_args)) > 0) {
@@ -46,11 +47,7 @@
 	if (*argc != 1 + own_arg_count)
 		dict_cmd_help(cmd);
 
-	dict_drivers_register_builtin();
-	if (dict_init((*argv)[0], DICT_DATA_TYPE_STRING, username,
-		      doveadm_settings->base_dir, &dict, &error) < 0)
-		i_fatal("dict_init(%s) failed: %s", (*argv)[0], error);
-
+	dict_uri = (*argv)[0];
 	*argc += 1;
 	*argv += 1;
 
@@ -59,23 +56,37 @@
 
 		if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) != 0 &&
 		    strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) != 0) {
-			i_fatal("Key must begin with '"DICT_PATH_PRIVATE
+			i_error("Key must begin with '"DICT_PATH_PRIVATE
 				"' or '"DICT_PATH_SHARED"': %s", key);
+			doveadm_exit_code = EX_USAGE;
+			return -1;
 		}
 		if (username[0] == '\0' &&
-		    strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0)
-			i_fatal("-u must be specified for "DICT_PATH_PRIVATE" keys");
+		    strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0) {
+			i_error("-u must be specified for "DICT_PATH_PRIVATE" keys");
+			doveadm_exit_code = EX_USAGE;
+			return -1;
+		}
 	}
-	return dict;
+
+	dict_drivers_register_builtin();
+	if (dict_init(dict_uri, DICT_DATA_TYPE_STRING, username,
+		      doveadm_settings->base_dir, &dict, &error) < 0) {
+		i_error("dict_init(%s) failed: %s", dict_uri, error);
+		doveadm_exit_code = EX_TEMPFAIL;
+		return -1;
+	}
+	*dict_r = dict;
+	return 0;
 }
 
-static struct dict *
+static int
 cmd_dict_init(int *argc, char **argv[],
 	      int own_arg_count, int key_arg_idx,
-	      doveadm_command_t *cmd)
+	      doveadm_command_t *cmd, struct dict **dict_r)
 {
 	return cmd_dict_init_full(argc, argv, own_arg_count,
-				  key_arg_idx, cmd, NULL);
+				  key_arg_idx, cmd, NULL, dict_r);
 }
 
 static void cmd_dict_get(int argc, char *argv[])
@@ -84,7 +95,8 @@
 	const char *value;
 	int ret;
 
-	dict = cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_get);
+	if (cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_get, &dict) < 0)
+		return;
 
 	doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
 	doveadm_print_header("value", "", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
@@ -107,7 +119,9 @@
 	struct dict *dict;
 	struct dict_transaction_context *trans;
 
-	dict = cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_set);
+	if (cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_set, &dict) < 0)
+		return;
+
 	trans = dict_transaction_begin(dict);
 	dict_set(trans, argv[0], argv[1]);
 	if (dict_transaction_commit(&trans) <= 0) {
@@ -122,7 +136,9 @@
 	struct dict *dict;
 	struct dict_transaction_context *trans;
 
-	dict = cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_unset);
+	if (cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_unset, &dict) < 0)
+		return;
+
 	trans = dict_transaction_begin(dict);
 	dict_unset(trans, argv[0]);
 	if (dict_transaction_commit(&trans) <= 0) {
@@ -139,9 +155,15 @@
 	long long diff;
 	int ret;
 
-	dict = cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_inc);
-	if (str_to_llong(argv[1], &diff) < 0)
-		i_fatal("Invalid diff: %s", argv[1]);
+	if (cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_inc, &dict) < 0)
+		return;
+
+	if (str_to_llong(argv[1], &diff) < 0) {
+		i_error("Invalid diff: %s", argv[1]);
+		doveadm_exit_code = EX_USAGE;
+		dict_deinit(&dict);
+		return;
+	}
 
 	trans = dict_transaction_begin(dict);
 	dict_atomic_inc(trans, argv[0], diff);
@@ -163,7 +185,8 @@
 	enum dict_iterate_flags iter_flags = 0;
 	const char *key, *value;
 
-	dict = cmd_dict_init_full(&argc, &argv, 1, 0, cmd_dict_iter, &iter_flags);
+	if (cmd_dict_init_full(&argc, &argv, 1, 0, cmd_dict_iter, &iter_flags, &dict) < 0)
+		return;
 
 	doveadm_print_init(DOVEADM_PRINT_TYPE_TAB);
 	doveadm_print_header_simple("key");