return tab;
}
+static int
+imap_client_var_expand_func_userdb(const char *data, void *context,
+ const char **value_r, const char **error_r ATTR_UNUSED)
+{
+ const char *const *fields = (const char *const *)context;
+ const char *field_name = t_strdup_printf("%s=",t_strcut(data, ':'));
+ const char *default_value = i_strchr_to_next(data, ':');
+ const char *value = NULL;
+
+ for(;*fields != NULL; fields++) {
+ if (strncmp(*fields, field_name, strlen(field_name)) == 0) {
+ value = *fields+strlen(field_name);
+ break;
+ }
+ }
+
+ *value_r = value != NULL ? value : default_value;
+
+ return 1;
+}
+
static void imap_client_io_activate_user(struct imap_client *client)
{
i_set_failure_prefix("%s", client->log_prefix);
struct imap_client *
imap_client_create(int fd, const struct imap_client_state *state)
{
+ const struct var_expand_func_table funcs[] = {
+ { "userdb", imap_client_var_expand_func_userdb },
+ { NULL, NULL }
+ };
struct imap_client *client;
pool_t pool = pool_alloconly_create("imap client", 256);
void *statebuf;
}
T_BEGIN {
string_t *str;
-
+ const char *const *fields =
+ t_strsplit_tabescaped(client->state.userdb_fields);
str = t_str_new(256);
- if (var_expand(str, state->mail_log_prefix,
- imap_client_get_var_expand_table(client),
- &error) <= 0) {
+ if (var_expand_with_funcs(str, state->mail_log_prefix,
+ imap_client_get_var_expand_table(client),
+ funcs, (void*)fields, &error) <= 0) {
i_error("Failed to expand mail_log_prefix=%s: %s",
state->mail_log_prefix, error);
}