From ca341910e7cc1b550754fdbeeb08439230ca2d34 Mon Sep 17 00:00:00 2001 From: "Joshua C. Colp" Date: Wed, 16 Apr 2025 06:29:11 -0300 Subject: [PATCH] channel: Always provide cause code in ChannelHangupRequest. When queueing a channel to be hung up a cause code can be specified in one of two ways: 1. ast_queue_hangup_with_cause This function takes in a cause code and queues it as part of the hangup request, which ultimately results in it being set on the channel. 2. ast_channel_hangupcause_set + ast_queue_hangup This combination sets the hangup cause on the channel before queueing the hangup instead of as part of that process. In the #2 case the ChannelHangupRequest event would not contain the cause code. For consistency if a cause code has been set on the channel it will now be added to the event. Resolves: #1197 --- main/channel.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/main/channel.c b/main/channel.c index 176a0f5cfa..bff0b62332 100644 --- a/main/channel.c +++ b/main/channel.c @@ -1168,13 +1168,21 @@ int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin) /*! \brief Queue a hangup frame for channel */ int ast_queue_hangup(struct ast_channel *chan) { + RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref); struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP }; - int res; + int res, cause; /* Yeah, let's not change a lock-critical value without locking */ ast_channel_lock(chan); ast_channel_softhangup_internal_flag_add(chan, AST_SOFTHANGUP_DEV); - ast_channel_publish_blob(chan, ast_channel_hangup_request_type(), NULL); + + cause = ast_channel_hangupcause(chan); + if (cause) { + blob = ast_json_pack("{s: i}", + "cause", cause); + } + + ast_channel_publish_blob(chan, ast_channel_hangup_request_type(), blob); res = ast_queue_frame(chan, &f); ast_channel_unlock(chan); -- 2.47.2