From: Aki Tuomi Date: Mon, 29 Feb 2016 15:13:32 +0000 (+0200) Subject: doveadm-dict: Remove i_fatal() usage X-Git-Tag: 2.2.22.rc1~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aea3116a9a5d4ba53ddcff460ba213d26058af81;p=thirdparty%2Fdovecot%2Fcore.git doveadm-dict: Remove i_fatal() usage --- diff --git a/src/doveadm/doveadm-dict.c b/src/doveadm/doveadm-dict.c index 72f61c4035..ddb159922a 100644 --- a/src/doveadm/doveadm-dict.c +++ b/src/doveadm/doveadm-dict.c @@ -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 @@ cmd_dict_init_full(int *argc, char **argv[], int own_arg_count, int key_arg_idx, 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 @@ cmd_dict_init_full(int *argc, char **argv[], int own_arg_count, int key_arg_idx, 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 @@ static void cmd_dict_get(int argc, char *argv[]) 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 @@ static void cmd_dict_set(int argc, char *argv[]) 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 @@ static void cmd_dict_unset(int argc, char *argv[]) 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 @@ static void cmd_dict_inc(int argc, char *argv[]) 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 @@ static void cmd_dict_iter(int argc, char *argv[]) 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");