Sophie

Sophie

distrib > Mandriva > current > i586 > media > contrib-release-src > by-pkgid > 0f3218061b7e575ec353e1e741a86e2c > files > 4

visdn-0.18.3-1mdv2009.1.src.rpm

diff -Naur visdn-0.18.2/chan_visdn/chan_visdn.c visdn-0.18.2.oden/chan_visdn/chan_visdn.c
--- visdn-0.18.2/chan_visdn/chan_visdn.c	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/chan_visdn/chan_visdn.c	2006-12-13 11:48:30.000000000 +0100
@@ -95,6 +95,9 @@
 #include "disconnect.h"
 #include "numbers_list.h"
 
+/* was hardcoded to 100, but that's definitely not enough! */
+#define MAX_SYS_PATH 256
+
 static pthread_t visdn_q931_thread = AST_PTHREADT_NULL;
 
 struct visdn_state visdn = {
@@ -398,7 +401,10 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
-		return FALSE;
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return 0;
+		}
 
 	ast_queue_control(ast_chan, AST_CONTROL_ANSWER);
 
@@ -1204,7 +1210,7 @@
 	struct visdn_chan *visdn_chan1 = to_visdn_chan(c0);
 	struct visdn_chan *visdn_chan2 = to_visdn_chan(c1);
 
-	char pipeline[100], dest1[100], dest2[100];
+	char pipeline[MAX_SYS_PATH], dest1[MAX_SYS_PATH], dest2[MAX_SYS_PATH];
 
 	snprintf(pipeline, sizeof(pipeline),
 		"/sys/class/net/%s/visdn_channel/connected/../B%d",
@@ -1904,35 +1910,37 @@
 	return 0;
 }
 
+
+static struct ast_frame f_null = {
+	.src = VISDN_CHAN_TYPE,
+	.mallocd = 0,
+	.delivery.tv_sec = 0,
+	.delivery.tv_usec = 0,
+	.frametype = AST_FRAME_NULL,
+	.subclass = 0,
+	.samples = 0,
+	.datalen = 0,
+	.data = NULL,
+	.offset = 0,
+};
+
+
 static struct ast_frame *visdn_read(struct ast_channel *ast_chan)
 {
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
-	static struct ast_frame f;
+	struct ast_frame f;
 
 	/* Acknowledge timer */
 	read(ast_chan->fds[0], visdn_chan->buf, 1);
 
-	f.src = VISDN_CHAN_TYPE;
-	f.mallocd = 0;
-	f.delivery.tv_sec = 0;
-	f.delivery.tv_usec = 0;
-
-	if (visdn_chan->sp_fd < 0) {
-		f.frametype = AST_FRAME_NULL;
-		f.subclass = 0;
-		f.samples = 0;
-		f.datalen = 0;
-		f.data = NULL;
-		f.offset = 0;
-
-		return &f;
-	}
+	if (visdn_chan->sp_fd < 0)
+		return &f_null;
 
 	int nread = read(visdn_chan->sp_fd, visdn_chan->buf,
 					sizeof(visdn_chan->buf));
 	if (nread < 0) {
 		ast_log(LOG_WARNING, "read error: %s\n", strerror(errno));
-		return &f;
+		return &f_null;
 	}
 
 #if 0
@@ -1959,8 +1967,20 @@
 	f.datalen = nread;
 	f.data = visdn_chan->buf;
 	f.offset = 0;
+	f.mallocd = 0;
+	f.delivery.tv_sec = 0;
+	f.delivery.tv_usec = 0;
 
 	struct ast_frame *f2 = ast_dsp_process(ast_chan, visdn_chan->dsp, &f);
+	if(&f == f2) {
+		f2 = malloc(sizeof(f));
+		if(!f2) {
+			ast_log(LOG_ERROR, "Out of memory\n");
+			return NULL;
+		}
+		*f2 = f;
+		f2->mallocd = AST_MALLOCD_HDR;
+	}
 
 	return f2;
 }
@@ -2531,9 +2551,19 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_mutex_lock(&ast_chan->lock);
+
+	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+		}
+
 	visdn_handle_eventual_progind(ast_chan, ies);
 	ast_mutex_unlock(&ast_chan->lock);
 
@@ -2552,7 +2582,10 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_queue_control(ast_chan, AST_CONTROL_ANSWER);
 
@@ -2604,15 +2637,37 @@
 	FUNC_DEBUG();
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_mutex_lock(&ast_chan->lock);
+
+	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+		}
+
 	visdn_handle_eventual_progind(ast_chan, ies);
 	visdn_set_hangupcause_by_ies(ast_chan, ies);
 	ast_mutex_unlock(&ast_chan->lock);
 
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
 
+	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+		}
+
+	if (!visdn_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n");
+		return;
+		}
+
 	if (visdn_chan->inband_info &&
 	    visdn_chan->channel_has_been_connected) {
 		ast_queue_control(ast_chan, AST_CONTROL_INBAND_INFO);
@@ -2639,10 +2694,19 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
 
+	if (!visdn_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n");
+		return;
+		}
+
 	if (q931_call->state != U2_OVERLAP_SENDING &&
 	    q931_call->state != N2_OVERLAP_SENDING &&
 	    q931_call->state != U25_OVERLAP_RECEIVING &&
@@ -2686,10 +2750,19 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
 
+	if (!visdn_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n");
+		return;
+		}
+
 	if (visdn_chan->sent_digits < strlen(visdn_chan->number)) {
 		/* There are still digits to be sent in INFO */
 
@@ -2734,12 +2807,28 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_mutex_lock(&ast_chan->lock);
+
+	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+		}
+
 	visdn_handle_eventual_progind(ast_chan, ies);
 	ast_mutex_unlock(&ast_chan->lock);
 
+	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+		}
+
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
 
 	visdn_undefer_dtmf_in(visdn_chan);
@@ -2756,12 +2845,28 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_mutex_lock(&ast_chan->lock);
+
+	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+		}
+
 	visdn_handle_eventual_progind(ast_chan, ies);
 	ast_mutex_unlock(&ast_chan->lock);
 
+	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+		}
+
 	ast_queue_control(ast_chan, AST_CONTROL_PROGRESS);
 }
 
@@ -2770,6 +2875,13 @@
 	const struct q931_ies *ies)
 {
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
+
+	if (!visdn_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n");
+		return;
+		}
+
 	struct q931_ie_cause *cause = NULL;
 
 	int i;
@@ -2827,7 +2939,10 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	visdn_hunt_next_or_hangup(ast_chan, ies);
 }
@@ -2842,7 +2957,10 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(q931_call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_mutex_lock(&ast_chan->lock);
 	visdn_set_hangupcause_by_ies(ast_chan, ies);
@@ -3026,7 +3144,10 @@
 				Q931_CCB_SETUP_COMPLETE_REQUEST, NULL);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_queue_control(ast_chan, AST_CONTROL_ANSWER);
 
@@ -4011,19 +4132,36 @@
 	FUNC_DEBUG();
 
 	assert(channel->call);
+	if(!channel->call) {
+		ast_log(LOG_WARNING, "Unexpexted call NULL\n");
+		return;
+	}
 	struct ast_channel *ast_chan = callpvt_to_astchan(channel->call);
 
-	if (!ast_chan)
+	if (!ast_chan) {
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+	}
 
 	ast_mutex_lock(&ast_chan->lock);
 
+	if (!ast_chan) {
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
+		return;
+	}
+
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
+
+	if (!visdn_chan) {
+		ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n");
+		return;
+	}
+
 	struct visdn_ic *ic = visdn_chan->ic;
 
 	visdn_chan->channel_has_been_connected = TRUE;
 
-	char pipeline[100], dest[100];
+	char pipeline[MAX_SYS_PATH], dest[MAX_SYS_PATH];
 	snprintf(pipeline, sizeof(pipeline),
 		"%s/%s%d",
 		ic->intf->remote_port,
@@ -4094,10 +4232,19 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(channel->call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
 
+	if (!visdn_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n");
+		return;
+		}
+
 	ast_mutex_lock(&ast_chan->lock);
 
 	visdn_disconnect_chan_from_visdn(visdn_chan);
@@ -4115,7 +4262,10 @@
 	// Unfortunately, after ast_hangup the channel is not valid
 	// anymore and we cannot generate further tones thought we should
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	switch (tone) {
 	case Q931_TONE_DIAL:
@@ -4147,7 +4297,10 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(channel->call);
 
 	if (!ast_chan)
+		{
+		ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n");
 		return;
+		}
 
 	ast_indicate(ast_chan, -1);
 }
@@ -4562,7 +4715,6 @@
 		(call->direction ==
 			Q931_CALL_DIRECTION_INBOUND)
 				? 'I' : 'O');
-
 	ast_cli(fd, "%-17s %-25s",
 		idstr,
 		q931_call_state_to_text(call->state));
@@ -4571,9 +4723,10 @@
 	if (ast_chan) {
 		struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
 
-		ast_cli(fd, "%s%s",
-			visdn_chan->number,
-			visdn_chan->sending_complete ? "(SC)" : "");
+		if(visdn_chan && visdn_chan->number)
+			ast_cli(fd, "%s%s",
+				visdn_chan->number,
+				visdn_chan->sending_complete ? "(SC)" : "");
 	}
 
 	ast_cli(fd, "\n");
@@ -4690,6 +4843,10 @@
 	struct ast_channel *ast_chan = callpvt_to_astchan(call);
 	if (ast_chan) {
 		struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan);
+		if(!visdn_chan) {
+			ast_cli(fd, "... visdn channel has been freed ...\n");
+			return;
+		}
 
 		ast_cli(fd, "------ Asterisk Channel\n");
 
diff -Naur visdn-0.18.2/chan_visdn/overlap.c visdn-0.18.2.oden/chan_visdn/overlap.c
--- visdn-0.18.2/chan_visdn/overlap.c	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/chan_visdn/overlap.c	2006-12-13 11:48:30.000000000 +0100
@@ -256,10 +256,11 @@
 			break;
 
 		if (f->frametype == AST_FRAME_DTMF)
-			 do_exit = new_digit(chan, called_number,
-					 sizeof(called_number),
-					 f->subclass, &retval);
-
+			{
+			do_exit = new_digit(chan, called_number,
+				sizeof(called_number),
+				f->subclass, &retval);
+			}
 		ast_frfree(f);
 	}
 
diff -Naur visdn-0.18.2/libq931/call.c visdn-0.18.2.oden/libq931/call.c
--- visdn-0.18.2/libq931/call.c	2006-10-30 11:56:04.000000000 +0100
+++ visdn-0.18.2.oden/libq931/call.c	2006-12-13 11:48:30.000000000 +0100
@@ -359,6 +359,11 @@
 			q931_dlc_release(call->dlc);
 			q931_dlc_put(call->dlc);
 		}
+		q931_ies_flush(&call->setup_ies);
+
+		q931_ies_flush(&call->disconnect_cause);
+		q931_ies_flush(&call->saved_cause);
+		q931_ies_flush(&call->release_cause);
 
 		q931_intf_del_call(call);
 
@@ -5635,7 +5640,7 @@
 				cs = container_of(msg->ies.ies[i],
 					struct q931_ie_call_state, ie);
 			} else if (msg->ies.ies[i]->cls->id == Q931_IE_CAUSE) {
-				q931_ies_add_put(&ies, msg->ies.ies[i]);
+				q931_ies_add(&ies, msg->ies.ies[i]);
 			}
 		}
 
diff -Naur visdn-0.18.2/libq931/channel.c visdn-0.18.2.oden/libq931/channel.c
--- visdn-0.18.2/libq931/channel.c	2006-10-30 11:56:04.000000000 +0100
+++ visdn-0.18.2.oden/libq931/channel.c	2006-12-13 11:48:30.000000000 +0100
@@ -90,6 +90,9 @@
 	struct q931_channel *channel,
 	enum q931_channel_state state)
 {
+	if (!channel)
+		return;
+
 	report_chan(channel, LOG_DEBUG,
 		"changed state from %s to %s\n",
 		q931_channel_state_to_text(channel->state),
@@ -101,6 +104,9 @@
 void q931_channel_connect(
 	struct q931_channel *channel)
 {
+	if (!channel)
+		return;
+
 	assert(channel);
 	assert(channel->call);
 
@@ -114,6 +120,9 @@
 void q931_channel_control(
 	struct q931_channel *channel)
 {
+	if (!channel)
+		return;
+
 	assert(channel);
 	assert(channel->call);
 
@@ -166,6 +175,8 @@
 	struct q931_channel *channel,
 	enum q931_tone_type tone)
 {
+	if (!channel)
+		return;
 	assert(channel);
 
 	q931_channel_primitive1(channel, Q931_CCB_START_TONE, tone);
@@ -174,6 +185,8 @@
 void q931_channel_stop_tone(
 	struct q931_channel *channel)
 {
+	if (!channel)
+		return;
 	assert(channel);
 
 	q931_channel_primitive(channel, Q931_CCB_STOP_TONE);
@@ -184,6 +197,9 @@
 	int id,
 	struct q931_interface *intf)
 {
+	if (!channel)
+		return;
+
 	channel->id = id;
 	channel->intf = intf;
 	channel->state = Q931_CHANSTATE_AVAILABLE;
diff -Naur visdn-0.18.2/libq931/message.c visdn-0.18.2.oden/libq931/message.c
--- visdn-0.18.2/libq931/message.c	2006-10-30 11:56:04.000000000 +0100
+++ visdn-0.18.2.oden/libq931/message.c	2006-12-13 11:48:30.000000000 +0100
@@ -40,8 +40,11 @@
 	if (msg->refcnt == 0) {
 		report_msg(msg, LOG_DEBUG, "Releasing message\n");
 
-		if (msg->dlc)
+		if (msg->dlc) {
 			q931_dlc_put(msg->dlc);
+			msg->dlc=NULL;
+		}
+		q931_ies_flush(&msg->ies);
 
 		free(msg);
 	}
diff -Naur visdn-0.18.2/modules/core/core_main.c visdn-0.18.2.oden/modules/core/core_main.c
--- visdn-0.18.2/modules/core/core_main.c	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/modules/core/core_main.c	2006-12-13 11:48:30.000000000 +0100
@@ -17,6 +17,7 @@
 #include <linux/cdev.h>
 #include <linux/kdev_t.h>
 #include <linux/device.h>
+#include <linux/notifier.h>
 
 #include <kernel_config.h>
 
@@ -74,22 +75,26 @@
 EXPORT_SYMBOL(visdn_system_device);
 
 static struct notifier_block *visdn_notify_chain;
+static struct raw_notifier_head visdn_notify_chain_head;
 
 int visdn_register_notifier(struct notifier_block *nb)
 {
-	return notifier_chain_register(&visdn_notify_chain, nb);
+	visdn_notify_chain_head.head = visdn_notify_chain;
+	return raw_notifier_chain_register(&visdn_notify_chain_head, nb);
 }
 EXPORT_SYMBOL(visdn_register_notifier);
 
 int visdn_unregister_notifier(struct notifier_block *nb)
 {
-	return notifier_chain_unregister(&visdn_notify_chain, nb);
+	visdn_notify_chain_head.head = visdn_notify_chain;
+	return raw_notifier_chain_unregister(&visdn_notify_chain_head, nb);
 }
 EXPORT_SYMBOL(visdn_unregister_notifier);
 
 int visdn_call_notifiers(unsigned long val, void *v)
 {
-	return notifier_call_chain(&visdn_notify_chain, val, v);
+	visdn_notify_chain_head.head = visdn_notify_chain;
+	return raw_notifier_call_chain(&visdn_notify_chain_head, val, v);
 }
 EXPORT_SYMBOL(visdn_call_notifiers);
 
diff -Naur visdn-0.18.2/modules/ec/ec_main.c visdn-0.18.2.oden/modules/ec/ec_main.c
--- visdn-0.18.2/modules/ec/ec_main.c	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/modules/ec/ec_main.c	2006-12-13 11:48:30.000000000 +0100
@@ -509,7 +509,7 @@
 		NULL);
 
 //----------------------------------------------------------------------------
-
+/*
 static struct vec_ec *_vec_ec_search_by_id(int id)
 {
 	struct vec_ec *ec;
@@ -521,7 +521,7 @@
 
 	return NULL;
 }
-
+*/
 static int _vec_ec_alloc_id(void)
 {
 	struct vec_ec *ec;
diff -Naur visdn-0.18.2/modules/hfc-4s/sys_chan.c visdn-0.18.2.oden/modules/hfc-4s/sys_chan.c
--- visdn-0.18.2/modules/hfc-4s/sys_chan.c	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/modules/hfc-4s/sys_chan.c	2006-12-13 11:48:30.000000000 +0100
@@ -699,7 +699,7 @@
 
 	if (used_octets > HFC_FIFO_JITTBUFF_HIGH) {
 //		printk(KERN_DEBUG "Trimming output fifo\n");
-		goto not_copying;
+//		goto not_copying;
 	}
 
 	if (used_octets < chan->tx_fifo.stats_min)
@@ -710,7 +710,7 @@
 
 	hfc_fifo_mem_write(&chan->tx_fifo, buf, copied_octets);
 
-not_copying:
+//not_copying:
 	hfc_card_unlock(card);
 
 	return copied_octets;
diff -Naur visdn-0.18.2/modules/hfc-pci/st_chan.c visdn-0.18.2.oden/modules/hfc-pci/st_chan.c
--- visdn-0.18.2/modules/hfc-pci/st_chan.c	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/modules/hfc-pci/st_chan.c	2006-12-13 11:48:30.000000000 +0100
@@ -967,7 +967,7 @@
 
 	if (used_octets > HFC_FIFO_JITTBUFF * 2) {
 //		printk(KERN_DEBUG "Trimming output fifo\n");
-		goto not_copying;
+//		goto not_copying;
 	}
 
 	if (used_octets < chan->tx_fifo->stats_min)
@@ -982,7 +982,7 @@
 					Z1_F1(chan->tx_fifo),
 					count));
 
-not_copying:
+//not_copying:
 	hfc_card_unlock(card);
 
 	return copied_octets;
diff -Naur visdn-0.18.2/modules/vgsm/card.c visdn-0.18.2.oden/modules/vgsm/card.c
--- visdn-0.18.2/modules/vgsm/card.c	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/modules/vgsm/card.c	2006-12-13 11:49:46.000000000 +0100
@@ -164,7 +164,7 @@
 	vgsm_send_msg(&card->micros[0], &msg);
 	vgsm_card_unlock(card);
 }
-	
+/*	
 static void vgsm_send_codec_getreg(
 	struct vgsm_card *card,
 	u8 reg_address)
@@ -179,7 +179,7 @@
 
 	vgsm_send_msg(&card->micros[0], &msg);
 }
-
+*/
 void vgsm_send_get_fw_ver(struct vgsm_micro *micro)
 {
 	struct vgsm_micro_message msg = { };
@@ -474,7 +474,7 @@
 	if (test_bit(VGSM_MODULE_STATUS_RUNNING, &module->status)) {
 
 		for(i=0; i<msg->numbytes; i++) {
-			if (module->tty->flip.count >= TTY_FLIPBUF_SIZE)
+			if (module->tty->max_flip_cnt >= TTY_FLIPBUF_SIZE)
 				tty_flip_buffer_push(module->tty);
 
 			tty_insert_flip_char(module->tty, msg->payload[i],
diff -Naur visdn-0.18.2/samples/extensions.conf.sample visdn-0.18.2.oden/samples/extensions.conf.sample
--- visdn-0.18.2/samples/extensions.conf.sample	2006-10-30 11:56:05.000000000 +0100
+++ visdn-0.18.2.oden/samples/extensions.conf.sample	2006-12-13 11:48:30.000000000 +0100
@@ -20,6 +20,10 @@
 exten => s,1,SetCallerID(12345000)	; Set the MSN to be used
 exten => s,2,Dial(VISDN/visdn1.0/${ARG1})
 
+[macro-telcobri_out_hunt]
+exten => s,1,SetCallerID(12345000)	; Set the MSN to be used
+exten => s,2,Dial(VISDN/huntgroup:telco/${ARG1})
+
 ;------------------------
 ; Dialin PPP extension