From c01c50015365f231ca45a19a6ca67049393286b1 Mon Sep 17 00:00:00 2001
From: Stefan Knoblich <s.knoblich@axsentis.de>
Date: Thu, 30 Jun 2011 12:55:56 +0200
Subject: [PATCH] ftmod_libpri: Incoming overlap receiving digits have to be
 appended to the DNIS.

Libpri doesn't do that for us, so handle things on our end.
Other parts of the previous patch seem to work fine.

Signed-off-by: Stefan Knoblich <s.knoblich@axsentis.de>
---
 .../src/ftmod/ftmod_libpri/ftmod_libpri.c     | 20 +++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
index 7271d3be1a..8bebbbe242 100644
--- a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
+++ b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
@@ -34,6 +34,10 @@
 #include "private/ftdm_core.h"
 #include "ftmod_libpri.h"
 
+#ifndef MIN
+#define MIN(x,y)	(((x) < (y)) ? (x) : (y))
+#endif
+
 static void _ftdm_channel_set_state_force(ftdm_channel_t *chan, const ftdm_channel_state_t state)
 {
 	assert(chan);
@@ -882,10 +886,22 @@ static int on_info(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event
 		ftdm_log_chan(chan, FTDM_LOG_DEBUG, "-- Incoming INFORMATION indication, current called number: '%s', number complete: %s\n",
 			pevent->ring.callednum, pevent->ring.complete ? "yes" : "no");
 
+		/* append digits to dnis */
+		if (!ftdm_strlen_zero(pevent->ring.callednum)) {
+			int digits = strlen(pevent->ring.callednum);
+			int offset = strlen(caller_data->dnis.digits);
+			int len    = MIN(sizeof(caller_data->dnis.digits) - 1 - offset, digits);
+
+			if (len < digits) {
+				ftdm_log_chan(chan, FTDM_LOG_WARNING, "Length %d of digit string exceeds available space %d of DNIS, truncating!\n",
+					digits, len);
+			}
+
+			ftdm_copy_string(&caller_data->dnis.digits[offset], (char *)pevent->ring.callednum, len);
+			caller_data->dnis.digits[offset + len] = '\0';
+		}
 		if (pevent->ring.complete) {
 			ftdm_log_chan_msg(chan, FTDM_LOG_DEBUG, "Number complete indicated, moving channel to RING state\n");
-			/* copy final value */
-			ftdm_set_string(caller_data->dnis.digits, (char *)pevent->ring.callednum);
 			/* notify switch */
 			ftdm_set_state(chan, FTDM_CHANNEL_STATE_RING);
 		}