From: Timo Sirainen Date: Thu, 28 Aug 2014 12:56:41 +0000 (+0900) Subject: lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_fu... X-Git-Tag: 2.2.14.rc1~119 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=39ea5717264668e2c7f9f7986eb821d21785f47f;p=thirdparty%2Fdovecot%2Fcore.git lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full(). This allows giving more settings to dict in future as needed. Unfortunately it also breaks the internal dict API, but there aren't really any plugins widely using it, so it's not a big problem. --- diff --git a/src/lib-dict/dict-client.c b/src/lib-dict/dict-client.c index e531695665..375b859b85 100644 --- a/src/lib-dict/dict-client.c +++ b/src/lib-dict/dict-client.c @@ -477,9 +477,8 @@ static void client_dict_disconnect(struct client_dict *dict) static int client_dict_init(struct dict *driver, const char *uri, - enum dict_data_type value_type, const char *username, - const char *base_dir, struct dict **dict_r, - const char **error_r) + const struct dict_settings *set, + struct dict **dict_r, const char **error_r) { struct client_dict *dict; const char *dest_uri; @@ -496,8 +495,8 @@ client_dict_init(struct dict *driver, const char *uri, dict = p_new(pool, struct client_dict, 1); dict->pool = pool; dict->dict = *driver; - dict->value_type = value_type; - dict->username = p_strdup(pool, username); + dict->value_type = set->value_type; + dict->username = p_strdup(pool, set->username); dict->fd = -1; @@ -505,7 +504,7 @@ client_dict_init(struct dict *driver, const char *uri, /* path given */ dict->path = p_strdup_until(pool, uri, dest_uri); } else { - dict->path = p_strconcat(pool, base_dir, + dict->path = p_strconcat(pool, set->base_dir, "/"DEFAULT_DICT_SERVER_SOCKET_FNAME, NULL); } dict->uri = p_strdup(pool, dest_uri + 1); diff --git a/src/lib-dict/dict-file.c b/src/lib-dict/dict-file.c index 9ba1f4194a..198d05a687 100644 --- a/src/lib-dict/dict-file.c +++ b/src/lib-dict/dict-file.c @@ -3,6 +3,7 @@ #include "lib.h" #include "array.h" #include "hash.h" +#include "home-expand.h" #include "mkdir-parents.h" #include "file-lock.h" #include "file-dotlock.h" @@ -54,10 +55,8 @@ static struct dotlock_settings file_dict_dotlock_settings = { static int file_dict_init(struct dict *driver, const char *uri, - enum dict_data_type value_type ATTR_UNUSED, - const char *username ATTR_UNUSED, - const char *base_dir ATTR_UNUSED, struct dict **dict_r, - const char **error_r) + const struct dict_settings *set ATTR_UNUSED, + struct dict **dict_r, const char **error_r) { struct file_dict *dict; const char *p; @@ -77,7 +76,6 @@ file_dict_init(struct dict *driver, const char *uri, dict->lock_method = FILE_LOCK_METHOD_FLOCK; else { *error_r = t_strdup_printf("Invalid parameter: %s", p+1); - i_free(dict->path); i_free(dict); return -1; } diff --git a/src/lib-dict/dict-fs.c b/src/lib-dict/dict-fs.c index b7be479f60..9cb846faae 100644 --- a/src/lib-dict/dict-fs.c +++ b/src/lib-dict/dict-fs.c @@ -16,10 +16,8 @@ struct fs_dict { static int fs_dict_init(struct dict *driver, const char *uri, - enum dict_data_type value_type ATTR_UNUSED, - const char *username, - const char *base_dir, struct dict **dict_r, - const char **error_r) + const struct dict_settings *set, + struct dict **dict_r, const char **error_r) { struct fs_settings fs_set; struct fs *fs; @@ -36,14 +34,15 @@ fs_dict_init(struct dict *driver, const char *uri, } memset(&fs_set, 0, sizeof(fs_set)); - fs_set.base_dir = base_dir; + fs_set.username = set->username; + fs_set.base_dir = set->base_dir; if (fs_init(fs_driver, fs_args, &fs_set, &fs, error_r) < 0) return -1; dict = i_new(struct fs_dict, 1); dict->dict = *driver; dict->fs = fs; - dict->username = i_strdup(username); + dict->username = i_strdup(set->username); *dict_r = &dict->dict; return 0; diff --git a/src/lib-dict/dict-memcached-ascii.c b/src/lib-dict/dict-memcached-ascii.c index 93e8a64a86..d0b7c542f0 100644 --- a/src/lib-dict/dict-memcached-ascii.c +++ b/src/lib-dict/dict-memcached-ascii.c @@ -347,9 +347,7 @@ static const char *memcached_ascii_escape_username(const char *username) static int memcached_ascii_dict_init(struct dict *driver, const char *uri, - enum dict_data_type value_type ATTR_UNUSED, - const char *username, - const char *base_dir ATTR_UNUSED, + const struct dict_settings *set, struct dict **dict_r, const char **error_r) { struct memcached_ascii_dict *dict; @@ -411,11 +409,11 @@ memcached_ascii_dict_init(struct dict *driver, const char *uri, dict->conn.reply_str = str_new(default_pool, 256); dict->conn.dict = dict; - if (strchr(username, DICT_USERNAME_SEPARATOR) == NULL) - dict->username = i_strdup(username); + if (strchr(set->username, DICT_USERNAME_SEPARATOR) == NULL) + dict->username = i_strdup(set->username); else { /* escape the username */ - dict->username = i_strdup(memcached_ascii_escape_username(username)); + dict->username = i_strdup(memcached_ascii_escape_username(set->username)); } i_array_init(&dict->input_states, 4); i_array_init(&dict->replies, 4); diff --git a/src/lib-dict/dict-memcached.c b/src/lib-dict/dict-memcached.c index 51fc695c83..f806086831 100644 --- a/src/lib-dict/dict-memcached.c +++ b/src/lib-dict/dict-memcached.c @@ -169,10 +169,8 @@ static const struct connection_vfuncs memcached_conn_vfuncs = { static int memcached_dict_init(struct dict *driver, const char *uri, - enum dict_data_type value_type ATTR_UNUSED, - const char *username ATTR_UNUSED, - const char *base_dir ATTR_UNUSED, struct dict **dict_r, - const char **error_r) + const struct dict_settings *set ATTR_UNUSED, + struct dict **dict_r, const char **error_r) { struct memcached_dict *dict; const char *const *args; diff --git a/src/lib-dict/dict-private.h b/src/lib-dict/dict-private.h index 02cd83fab8..5cafaf33c8 100644 --- a/src/lib-dict/dict-private.h +++ b/src/lib-dict/dict-private.h @@ -5,8 +5,7 @@ struct dict_vfuncs { int (*init)(struct dict *dict_driver, const char *uri, - enum dict_data_type value_type, - const char *username, const char *base_dir, + const struct dict_settings *set, struct dict **dict_r, const char **error_r); void (*deinit)(struct dict *dict); int (*wait)(struct dict *dict); diff --git a/src/lib-dict/dict-redis.c b/src/lib-dict/dict-redis.c index a5d56662c5..a68b4ff694 100644 --- a/src/lib-dict/dict-redis.c +++ b/src/lib-dict/dict-redis.c @@ -311,10 +311,8 @@ static const char *redis_escape_username(const char *username) static int redis_dict_init(struct dict *driver, const char *uri, - enum dict_data_type value_type ATTR_UNUSED, - const char *username, - const char *base_dir ATTR_UNUSED, struct dict **dict_r, - const char **error_r) + const struct dict_settings *set, + struct dict **dict_r, const char **error_r) { struct redis_dict *dict; struct ip_addr ip; @@ -383,11 +381,11 @@ redis_dict_init(struct dict *driver, const char *uri, i_array_init(&dict->input_states, 4); i_array_init(&dict->replies, 4); - if (strchr(username, DICT_USERNAME_SEPARATOR) == NULL) - dict->username = i_strdup(username); + if (strchr(set->username, DICT_USERNAME_SEPARATOR) == NULL) + dict->username = i_strdup(set->username); else { /* escape the username */ - dict->username = i_strdup(redis_escape_username(username)); + dict->username = i_strdup(redis_escape_username(set->username)); } *dict_r = &dict->dict; diff --git a/src/lib-dict/dict-sql.c b/src/lib-dict/dict-sql.c index f8871ac52d..3bc20adfd2 100644 --- a/src/lib-dict/dict-sql.c +++ b/src/lib-dict/dict-sql.c @@ -73,8 +73,7 @@ static void sql_dict_prev_inc_flush(struct sql_dict_transaction_context *ctx); static int sql_dict_init(struct dict *driver, const char *uri, - enum dict_data_type value_type ATTR_UNUSED, - const char *username, const char *base_dir ATTR_UNUSED, + const struct dict_settings *set, struct dict **dict_r, const char **error_r) { struct sql_dict *dict; @@ -84,7 +83,7 @@ sql_dict_init(struct dict *driver, const char *uri, dict = p_new(pool, struct sql_dict, 1); dict->pool = pool; dict->dict = *driver; - dict->username = p_strdup(pool, username); + dict->username = p_strdup(pool, set->username); dict->set = dict_sql_settings_read(pool, uri, error_r); if (dict->set == NULL) { pool_unref(&pool); diff --git a/src/lib-dict/dict.c b/src/lib-dict/dict.c index 08460197d6..27fd2c0df7 100644 --- a/src/lib-dict/dict.c +++ b/src/lib-dict/dict.c @@ -55,11 +55,23 @@ void dict_driver_unregister(struct dict *driver) int dict_init(const char *uri, enum dict_data_type value_type, const char *username, const char *base_dir, struct dict **dict_r, const char **error_r) +{ + struct dict_settings set; + + memset(&set, 0, sizeof(set)); + set.value_type = value_type; + set.username = username; + set.base_dir = base_dir; + return dict_init_full(uri, &set, dict_r, error_r); +} + +int dict_init_full(const char *uri, const struct dict_settings *set, + struct dict **dict_r, const char **error_r) { struct dict *dict; const char *p, *name, *error; - i_assert(username != NULL); + i_assert(set->username != NULL); p = strchr(uri, ':'); if (p == NULL) { @@ -74,8 +86,7 @@ int dict_init(const char *uri, enum dict_data_type value_type, *error_r = t_strdup_printf("Unknown dict module: %s", name); return -1; } - if (dict->v.init(dict, p+1, value_type, username, base_dir, - dict_r, &error) < 0) { + if (dict->v.init(dict, p+1, set, dict_r, &error) < 0) { *error_r = t_strdup_printf("dict %s: %s", name, error); return -1; } diff --git a/src/lib-dict/dict.h b/src/lib-dict/dict.h index fc287a6a87..df489009f2 100644 --- a/src/lib-dict/dict.h +++ b/src/lib-dict/dict.h @@ -14,10 +14,16 @@ enum dict_iterate_flags { }; enum dict_data_type { - DICT_DATA_TYPE_STRING, + DICT_DATA_TYPE_STRING = 0, DICT_DATA_TYPE_UINT32 }; +struct dict_settings { + enum dict_data_type value_type; + const char *username; + const char *base_dir; +}; + typedef void dict_transaction_commit_callback_t(int ret, void *context); void dict_driver_register(struct dict *driver); @@ -34,6 +40,8 @@ void dict_drivers_unregister_all(void); int dict_init(const char *uri, enum dict_data_type value_type, const char *username, const char *base_dir, struct dict **dict_r, const char **error_r); +int dict_init_full(const char *uri, const struct dict_settings *set, + struct dict **dict_r, const char **error_r); /* Close dictionary. */ void dict_deinit(struct dict **dict); /* Wait for all pending asynchronous transaction commits to finish.