From c19549820ec491d866f1dc4fbfc9a91439a3b402 Mon Sep 17 00:00:00 2001
From: Luigi Rizzo <rizzo@icir.org>
Date: Sun, 29 Jul 2007 10:13:14 +0000
Subject: [PATCH] build the version of sip_tech with no send_digit_begin at
 load time instead of duplicating the initializer. This should remove the risk
 of forgetting fields in the initializer.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@77684 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c | 38 +++++++++++++-------------------------
 1 file changed, 13 insertions(+), 25 deletions(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a679f65e90..894d74f64c 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1780,31 +1780,12 @@ static const struct ast_channel_tech sip_tech = {
 };
 
 /*! \brief This version of the sip channel tech has no send_digit_begin
- *  callback.  This is for use with channels using SIP INFO DTMF so that
- *  the core knows that the channel doesn't want DTMF BEGIN frames. */
-static const struct ast_channel_tech sip_tech_info = {
-	.type = "SIP",
-	.description = "Session Initiation Protocol (SIP)",
-	.capabilities = AST_FORMAT_AUDIO_MASK,	/* all audio formats */
-	.properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER,
-	.requester = sip_request_call,
-	.devicestate = sip_devicestate,
-	.call = sip_call,
-	.hangup = sip_hangup,
-	.answer = sip_answer,
-	.read = sip_read,
-	.write = sip_write,
-	.write_video = sip_write,
-	.write_text = sip_write,
-	.indicate = sip_indicate,
-	.transfer = sip_transfer,
-	.fixup = sip_fixup,
-	.send_digit_end = sip_senddigit_end,
-	.bridge = ast_rtp_bridge,
-	.early_bridge = ast_rtp_early_bridge,
-	.send_text = sip_sendtext,
-	.func_channel_read = acf_channel_read,
-};
+ * callback so that the core knows that the channel does not want
+ * DTMF BEGIN frames.
+ * The struct is initialized just before registering the channel driver,
+ * and is for use with channels using SIP INFO DTMF.
+ */
+static struct ast_channel_tech sip_tech_info;
 
 /* wrapper macro to tell whether t points to one of the sip_tech descriptors */
 #define IS_SIP_TECH(t)  ((t) == &sip_tech || (t) == &sip_tech_info)
@@ -18651,6 +18632,13 @@ static int load_module(void)
 	if(reload_config(sip_reloadreason))	/* Load the configuration from sip.conf */
 		return AST_MODULE_LOAD_DECLINE;
 
+	/* Prepare the version that does not require DTMF BEGIN frames.
+	 * We need to use tricks such as memcopy and casts because the variable
+	 * has const fields.
+	 */
+	memcpy(&sip_tech_info, &sip_tech, sizeof(sip_tech));
+	*((void **)&sip_tech_info.send_digit_begin) = NULL;
+
 	/* Make sure we can register our sip channel type */
 	if (ast_channel_register(&sip_tech)) {
 		ast_log(LOG_ERROR, "Unable to register channel type 'SIP'\n");
-- 
GitLab