Я застрял, чтобы отправить stasis_message для самодельного модуля в ARI.
Я пытаюсь использовать пример кода из документации:
https://wiki.asterisk.org/wiki/display/AST/Stasis+Message+Bus
Вместо примера я использую звездочку 13 (кто использует 12), и некоторые подписи изменены.
Вот инициализация:
struct stasis_topic *foo_topic;
static int load_module(void)
{
// Register to stasis.
stasis_app_register(app, callback_stasis, 0);
// Create a bridge on witch ARI can conenct.
stasis_app_bridge_create("mixing", app, "11000");
// Create the topic
foo_topic = stasis_topic_create(app);
return ast_register_application_xml(app, exec);
}
И метод кода, который звонит, когда приходит телефон:
static int exec()
{
publish_foo();
}
static void publish_foo()
{
printf("Trace 1\n");
char* test = "dataToSend";
RAII_VAR(struct stasis_message_type*, foo_type, NULL, ao2_cleanup);
stasis_message_type_create(app, NULL, &foo_type);
RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
printf("Trace 3\n");
msg = stasis_message_create(type, test);
if (!msg)
return;
stasis_publish(foo_topic, msg);
printf("PASSING MESSAGE 4\n");
}
Я всегда получаю сообщение типа:
плохое магическое число 0x332065 для объекта 0x7f2ea5ab8ec5
И эта ошибка добавляется в метод stasis_create_message().
[Редактировать]
Я не понимаю ошибку, поэтому любая помощь приветствуется.
Как предполагают археопы, есть функция, создающая проблему. По-видимому, мой объект не может быть преобразован в объект Asterisk. Вероятно, структура, которую мне нужно отправить в функцию create_message_function, должна иметь тип astobj2.
static struct astobj2 *INTERNAL_OBJ(void *user_data)
{
struct astobj2 *p;
if (!user_data) {
ast_log(LOG_ERROR, "user_data is NULL\n");
return NULL;
}
p = (struct astobj2 *) ((char *) user_data - sizeof(*p));
if (AO2_MAGIC != p->priv_data.magic) {
if (p->priv_data.magic) {
ast_log(LOG_ERROR, "bad magic number 0x%x for object %p\n",
p->priv_data.magic, user_data);
} else {
ast_log(LOG_ERROR,
"bad magic number for object %p. Object is likely destroyed.\n",
user_data);
}
ast_assert(0);
return NULL;
}
return p;
}
И структура определения astobj2:
struct astobj2
{
struct __priv_data priv_data;
void *user_data[0];
};
Я попытался создать объект a2, как описано здесь, и я получаю сообщение об ошибке:
*** Ошибка в `asterisk': free(): недопустимый указатель:
Спасибо