summaryrefslogtreecommitdiff
path: root/net/asterisk/files/patch-channels::chan_zap.c
diff options
context:
space:
mode:
authorMaxim Sobolev <sobomax@FreeBSD.org>2005-05-03 13:58:26 +0000
committerMaxim Sobolev <sobomax@FreeBSD.org>2005-05-03 13:58:26 +0000
commit7150c8301f0ff323d2d3fd487efab9f6805ecf7b (patch)
tree7ca292dfc161206043d279c879db63f2813670f7 /net/asterisk/files/patch-channels::chan_zap.c
parentUpdate to 20050503 (diff)
o chan_sip.c:
- Improve codec negotiation logic. - make sure to parse SDP on re-INVITE. o chan_zap.c: - If unanswered Zap channnel is hanged up wait until the calling party in turn hangs up (by detecting ring timeout). Otherwise next ring will trigger a "new" incoming call. This appears to be design limitation of the analogue telephone system - there is no way to reject the call without answering it first. Sponsored by: Porta Software Ltd, PBXpress Inc
Notes
Notes: svn path=/head/; revision=134555
Diffstat (limited to 'net/asterisk/files/patch-channels::chan_zap.c')
-rw-r--r--net/asterisk/files/patch-channels::chan_zap.c91
1 files changed, 88 insertions, 3 deletions
diff --git a/net/asterisk/files/patch-channels::chan_zap.c b/net/asterisk/files/patch-channels::chan_zap.c
index 965a643bb687..458a6147d215 100644
--- a/net/asterisk/files/patch-channels::chan_zap.c
+++ b/net/asterisk/files/patch-channels::chan_zap.c
@@ -1,9 +1,9 @@
$FreeBSD$
---- channels/chan_zap.c
-+++ channels/chan_zap.c
-@@ -42,7 +42,9 @@
+--- channels/chan_zap.c.orig Sun Feb 17 18:01:44 2002
++++ channels/chan_zap.c Sun Feb 17 18:03:26 2002
+@@ -46,7 +46,9 @@
#include <sys/signal.h>
#include <errno.h>
#include <stdlib.h>
@@ -13,3 +13,88 @@ $FreeBSD$
#include <unistd.h>
#include <sys/ioctl.h>
#ifdef __linux__
+@@ -320,7 +322,7 @@
+ #define CALLWAITING_REPEAT_SAMPLES ( (10000 * 8) / READ_SIZE) /* 300 ms */
+ #define CIDCW_EXPIRE_SAMPLES ( (500 * 8) / READ_SIZE) /* 500 ms */
+ #define MIN_MS_SINCE_FLASH ( (2000) ) /* 2000 ms */
+-#define RINGT ( (8000 * 8) / READ_SIZE)
++#define RINGT ( (8000 * 8) / READ_SIZE) /* 8000 ms */
+
+ struct zt_pvt;
+
+@@ -535,6 +537,7 @@
+ int cidpos;
+ int cidlen;
+ int ringt;
++ int waitnorings;
+ int stripmsd;
+ int callwaiting;
+ int callwaitcas;
+@@ -2134,12 +2137,20 @@
+
+ if (option_debug)
+ ast_log(LOG_DEBUG, "zt_hangup(%s)\n", ast->name);
++
+ if (!ast->pvt->pvt) {
+ ast_log(LOG_WARNING, "Asked to hangup channel not connected\n");
+ return 0;
+ }
+
+ ast_mutex_lock(&p->lock);
++
++
++ if((p->sig == SIG_FXSGS) || (p->sig == SIG_FXSKS) || (p->sig == SIG_FXSLS))
++ if((ast->_state == AST_STATE_RING) && (p->ringt > 1))
++ {
++ p->waitnorings = 1;
++ }
+
+ index = zt_get_index(ast, p, 1);
+
+@@ -5717,7 +5728,37 @@
+ ast_setstate(chan, AST_STATE_RING);
+ chan->rings = 1;
+ p->ringt = RINGT;
++ p->waitnorings = 0;
+ res = ast_pbx_run(chan);
++
++ if(p->waitnorings)
++ {
++ p->ringt = RINGT;
++ for(;;)
++ {
++ int i,j=0;
++ i = ZT_IOMUX_SIGEVENT | ZT_IOMUX_NOWAIT;
++ if (ioctl(p->subs[index].zfd, ZT_IOMUX, &i) == -1)
++ break;
++
++ if (ioctl(p->subs[index].zfd, ZT_GETEVENT, &j) == -1)
++ break;
++
++ if(j == ZT_EVENT_RINGOFFHOOK)
++ p->ringt = RINGT;
++
++ usleep(20000);
++
++ if (p->ringt <= 0)
++ break;
++
++ else if (p->ringt > 0)
++ p->ringt--;
++ }
++ p->ringt = 0;
++ p->waitnorings = 0;
++ }
++
+ if (res) {
+ ast_hangup(chan);
+ ast_log(LOG_WARNING, "PBX exited non-zero\n");
+@@ -6018,7 +6059,7 @@
+ i = iflist;
+ while(i) {
+ if ((i->subs[SUB_REAL].zfd > -1) && i->sig && (!i->radio)) {
+- if (!i->owner && !i->subs[SUB_REAL].owner) {
++ if (!i->owner && !i->subs[SUB_REAL].owner && !i->waitnorings) {
+ /* This needs to be watched, as it lacks an owner */
+ pfds[count].fd = i->subs[SUB_REAL].zfd;
+ pfds[count].events = POLLPRI;