static struct dict * 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) { const char *getopt_args = iter_flags == NULL ? "u:" : "1Ru:V"; struct dict *dict; const char *error, *username = ""; int c; while ((c = getopt(*argc, *argv, getopt_args)) > 0) { switch (c) { case '1': i_assert(iter_flags != NULL); *iter_flags |= DICT_ITERATE_FLAG_EXACT_KEY; break; case 'R': i_assert(iter_flags != NULL); *iter_flags |= DICT_ITERATE_FLAG_RECURSE; break; case 'V': i_assert(iter_flags != NULL); *iter_flags |= DICT_ITERATE_FLAG_NO_VALUE; break; case 'u': username = optarg; break; default: dict_cmd_help(cmd); } } *argc -= optind; *argv += optind; 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); *argc += 1; *argv += 1; if (key_arg_idx >= 0) { const char *key = (*argv)[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 "' or '"DICT_PATH_SHARED"': %s", key); } 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"); } return dict; }
void dict_drivers_register_all(void) { dict_drivers_register_builtin(); dict_sql_register(); }
struct mail_storage_service_ctx * mail_storage_service_init(struct master_service *service, const struct setting_parser_info *set_roots[], enum mail_storage_service_flags flags) { struct mail_storage_service_ctx *ctx; const char *version; pool_t pool; unsigned int count; version = master_service_get_version_string(service); if (version != NULL && strcmp(version, PACKAGE_VERSION) != 0) { i_fatal("Version mismatch: libdovecot-storage.so is '%s', " "while the running Dovecot binary is '%s'", PACKAGE_VERSION, version); } if ((flags & MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP) != 0 && getuid() != 0) { /* service { user } isn't root. the permission drop can't be temporary. */ flags &= ~MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP; } (void)umask(0077); io_loop_set_time_moved_callback(current_ioloop, mail_storage_service_time_moved); mail_storage_init(); mail_storage_register_all(); mailbox_list_register_all(); pool = pool_alloconly_create("mail storage service", 2048); ctx = p_new(pool, struct mail_storage_service_ctx, 1); ctx->pool = pool; ctx->service = service; ctx->flags = flags; /* @UNSAFE */ if (set_roots == NULL) count = 0; else for (count = 0; set_roots[count] != NULL; count++) ; ctx->set_roots = p_new(pool, const struct setting_parser_info *, count + 2); ctx->set_roots[0] = &mail_user_setting_parser_info; if (set_roots != NULL) { memcpy(ctx->set_roots + 1, set_roots, sizeof(*ctx->set_roots) * count); } /* do all the global initialization. delay initializing plugins until we drop privileges the first time. */ if ((flags & MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT) == 0) { /* note: we may not have read any settings yet, so this logging may still be going to wrong location */ ctx->default_log_prefix = p_strconcat(pool, service->name, ": ", NULL); master_service_init_log(service, ctx->default_log_prefix); } dict_drivers_register_builtin(); return ctx; }