}
}
+/*
+ * Global data
+ */
+
+static struct sasl_server_mech_data *
+sasl_server_mech_data_init(struct sasl_server *server,
+ struct sasl_server_mech_def_reg *mech_dreg)
+{
+ struct sasl_server_mech_data *mdata;
+ const struct sasl_server_mech_def *mech_def = mech_dreg->def;
+
+ if (mech_def->funcs->data_new == NULL)
+ return NULL;
+ if (mech_dreg->data != NULL)
+ return mech_dreg->data;
+
+ mech_dreg->data = mdata = mech_def->funcs->data_new(server->pool);
+ mdata->pool = server->pool;
+ mdata->server = server;
+ mdata->def = mech_def;
+
+ return mdata;
+}
+
+static void
+sasl_server_mech_data_deinit(struct sasl_server_mech_def_reg *mech_dreg)
+{
+ struct sasl_server_mech_data *mdata = mech_dreg->data;
+
+ if (mdata == NULL)
+ return;
+ mech_dreg->data = NULL;
+
+ if (mdata->def->funcs->data_free == NULL)
+ return;
+ mdata->def->funcs->data_free(mdata);
+}
+
/*
* Registry
*/
mech = sasl_server_mech_create(sinst, def);
mech->reg = mech_reg;
+ mech->data = sasl_server_mech_data_init(sinst->server, mech_dreg);
mech_reg->mech = mech;
return mech;
DLLIST2_REMOVE(&server->mechs_head, &server->mechs_tail,
mech_dreg);
+ sasl_server_mech_data_deinit(mech_dreg);
mech_dreg->def = NULL;
}
}
sasl_server_mech_reg_list_free(sinst->mechs_hidden);
}
+void sasl_server_mech_registry_free(struct sasl_server *server)
+{
+ i_assert(server->mechs_head == NULL);
+}
+
/*
* Iterator
*/
void sasl_server_instance_mech_registry_free(
struct sasl_server_instance *sinst);
+void sasl_server_mech_registry_free(struct sasl_server *server);
+
#endif
struct auth_request;
struct sasl_server_mech_funcs;
struct sasl_server_mech_def;
+struct sasl_server_mech_data;
struct sasl_server_mech_request;
typedef void
const unsigned char *data, size_t data_size);
void (*auth_free)(struct sasl_server_mech_request *req);
+ /* Global data shared between server instances */
+ struct sasl_server_mech_data *(*data_new)(pool_t pool);
+ void (*data_free)(struct sasl_server_mech_data *mdata);
+
struct sasl_server_mech *(*mech_new)(pool_t pool);
void (*mech_free)(struct sasl_server_mech *mech);
};
buffer_t *handshake_cbind;
};
+struct sasl_server_mech_data {
+ struct sasl_server *server;
+ pool_t pool;
+
+ const struct sasl_server_mech_def *def;
+};
+
struct sasl_server_mech {
struct sasl_server_instance *sinst;
struct sasl_server_mech_reg *reg;
pool_t pool;
struct event *event;
+ struct sasl_server_mech_data *data;
const struct sasl_server_mech_def *def;
};
i_assert(server->instances == NULL);
i_assert(server->requests == 0);
+ sasl_server_mech_registry_free(server);
+
event_unref(&server->event);
pool_unref(&server->pool);
}