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) {
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;
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[])
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);
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) {
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) {
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);
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");