mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-07-15 19:40:06 +00:00
Merge remote branch 'origin/master' into FS-3432
This commit is contained in:
commit
7e6018985c
15
.gitattributes
vendored
Normal file
15
.gitattributes
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
# gitattributes
|
||||
*.exe -diff binary executable windows dfsg-nonfree debian-ignore
|
||||
*.wav -diff binary sound
|
||||
*.gif -diff binary image
|
||||
*.jpg -diff binary image
|
||||
*.jpeg -diff binary image
|
||||
*.pbm -diff binary image
|
||||
/clients/flex* dfsg-nonfree
|
||||
/debian* debian-ignore
|
||||
/freeswitch.xcodeproj debian-ignore
|
||||
/libs/ilbc* dfsg-nonfree
|
||||
/libs/libg722_1* dfsg-nonfree
|
||||
/libs/win32* windows debian-ignore
|
||||
/htdocs* dfsg-nonfree debian-ignore
|
||||
/w32* windows debian-ignore
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -43,6 +43,7 @@ configure.lineno
|
||||
config.log
|
||||
config.status
|
||||
core.*
|
||||
TAGS
|
||||
*.2010.log
|
||||
*.Build.CppClean.log
|
||||
*.tlog
|
||||
@ -98,6 +99,7 @@ core.*
|
||||
/build/Makefile
|
||||
/build/Makefile.in
|
||||
/build/modmake.rules
|
||||
/build/print_git_revision
|
||||
|
||||
/libs/curl/lib/ca-bundle.h
|
||||
/libs/esl/fs_cli
|
||||
|
@ -1 +0,0 @@
|
||||
@SWITCH_VERSION_REVISION@
|
@ -527,6 +527,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_gsmopen", "src\mod\endp
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzrtp", "libs\libzrtp\projects\win\libzrtp.2010.vcxproj", "{C13CC324-0032-4492-9A30-310A6BD64FF5}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_redis", "src\mod\applications\mod_redis\mod_redis.2010.vcxproj", "{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
All|Win32 = All|Win32
|
||||
@ -3593,6 +3595,19 @@ Global
|
||||
{C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64.Build.0 = Release|x64
|
||||
{C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x64 Setup.ActiveCfg = Release|Win32
|
||||
{C13CC324-0032-4492-9A30-310A6BD64FF5}.Release|x86 Setup.ActiveCfg = Release|Win32
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|Win32.ActiveCfg = Release|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.ActiveCfg = Release|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64.Build.0 = Release|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x64 Setup.ActiveCfg = Release|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.All|x86 Setup.ActiveCfg = Release|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x64 Setup.ActiveCfg = Debug|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Debug|x86 Setup.ActiveCfg = Debug|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64.ActiveCfg = Release|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x64 Setup.ActiveCfg = Release|x64
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}.Release|x86 Setup.ActiveCfg = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@ -3648,6 +3663,7 @@ Global
|
||||
{4748FF56-CA85-4809-97D6-A94C0FAC1D77} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
|
||||
{60C542EE-6882-4EA2-8C21-5AB6DB1BA73F} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
|
||||
{2469B306-B027-4FF2-8815-C9C1EA2CAE79} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
|
||||
{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
|
||||
{07113B25-D3AF-4E04-BA77-4CD1171F022C} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
|
||||
{A27CCA23-1541-4337-81A4-F0A6413078A0} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
|
||||
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4}
|
||||
|
38
Makefile.am
38
Makefile.am
@ -157,8 +157,8 @@ if ENABLE_ZRTP
|
||||
CORE_CFLAGS += -I$(switch_srcdir)/libs/libzrtp/third_party/bgaes
|
||||
CORE_CFLAGS += -I$(switch_srcdir)/libs/libzrtp/third_party/bnlib
|
||||
CORE_CFLAGS += -isystem $(switch_srcdir)/libs/libzrtp/include
|
||||
ZRTP_LDFLAGS = -Llibs/libzrtp/third_party/bnlib
|
||||
ZRTP_LDFLAGS += -Llibs/libzrtp/projects/gnu/build
|
||||
ZRTP_LDFLAGS = -L$(switch_srcdir)/libs/libzrtp/third_party/bnlib
|
||||
ZRTP_LDFLAGS += -L$(switch_srcdir)/libs/libzrtp/projects/gnu/build
|
||||
ZRTP_LIBS = -lbn -lzrtp
|
||||
libfreeswitch_la_LDFLAGS += $(ZRTP_LDFLAGS)
|
||||
libfreeswitch_la_LIBADD += $(ZRTP_LIBS)
|
||||
@ -415,29 +415,16 @@ $(OUR_MODULES): $(switch_builddir)/modules.conf libfreeswitch.la
|
||||
$(switch_builddir)/quiet_libtool: $(switch_builddir)/libtool
|
||||
@cat libtool | sed -e 's|$$show "$$command"|if test -z "$$suppress_output" ; then $$show "Compiling $$srcfile ..." ; fi|' > $(switch_builddir)/quiet_libtool
|
||||
|
||||
src/include/switch_version.h: src/include/switch_version.h.in .version $(libfreeswitch_la_SOURCES) $(library_include_HEADERS)
|
||||
@have_version=1 ; \
|
||||
force=0 ; \
|
||||
grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h.in > /dev/null && have_version=0 ; \
|
||||
test ! -f src/include/switch_version.h || grep -- "@SWITCH_VERSION_REVISION@" src/include/switch_version.h > /dev/null && force=1 ; \
|
||||
if test $$have_version = 1 ; then \
|
||||
cat src/include/switch_version.h.in > src/include/switch_version.h ; \
|
||||
touch .version ; \
|
||||
else \
|
||||
if [ -d .git ] ; then \
|
||||
version=`git log --pretty=format:"%h %ci" -1 HEAD | head -1 | sed -e 's|:|-|g' || echo hacked` ; \
|
||||
if [ "x$$version" = "xhacked" ] ; then \
|
||||
version="hacked-`date -u +%Y%m%dT%H%M%SZ`" ; \
|
||||
else \
|
||||
version="git-$$version" ; \
|
||||
fi ;\
|
||||
fi ; \
|
||||
oldversion=`cat .version 2>/dev/null || echo "0"` ; \
|
||||
if test "$$oldversion" != "$$version" || test $$force = 1 ; then \
|
||||
cat src/include/switch_version.h.in | sed "s/@SWITCH_VERSION_REVISION@/$$version/g" > src/include/switch_version.h ; \
|
||||
echo $$version > .version ; \
|
||||
fi ; \
|
||||
fi ;
|
||||
build/print_git_revision: build/print_git_revision.c
|
||||
$(CC) -o $@ $<
|
||||
|
||||
src/include/switch_version.h: src/include/switch_version.h.in Makefile build/print_git_revision $(libfreeswitch_la_SOURCES) $(library_include_HEADERS)
|
||||
@cat $< > $@; \
|
||||
if [ -d .git ] && [ -n "$$(which git)" ]; then \
|
||||
xver="$$(./build/print_git_revision)"; \
|
||||
sed -e "/#define *SWITCH_VERSION_REVISION/{s/\"\([^\"]*\)\"/\"\1$$xver\"/;}" \
|
||||
$< > $@; \
|
||||
fi;
|
||||
|
||||
##
|
||||
## Dependency targets
|
||||
@ -544,7 +531,6 @@ is-scm:
|
||||
|
||||
update: is-scm
|
||||
@if test -d .git ; then \
|
||||
test ! -f .version || rm -f .version ; \
|
||||
echo "Pulling updates..." ; \
|
||||
git pull ; \
|
||||
else \
|
||||
|
@ -1,4 +1,5 @@
|
||||
#!/bin/sh
|
||||
##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*-
|
||||
|
||||
TAR=@TAR@
|
||||
ZCAT=@ZCAT@
|
||||
|
@ -58,12 +58,12 @@ codecs/mod_bv
|
||||
codecs/mod_g723_1
|
||||
codecs/mod_g729
|
||||
codecs/mod_h26x
|
||||
codecs/mod_ilbc
|
||||
#codecs/mod_ilbc
|
||||
#codecs/mod_isac
|
||||
#codecs/mod_opus
|
||||
#codecs/mod_sangoma_codec
|
||||
#codecs/mod_silk
|
||||
codecs/mod_siren
|
||||
#codecs/mod_siren
|
||||
codecs/mod_speex
|
||||
dialplans/mod_dialplan_asterisk
|
||||
#dialplans/mod_dialplan_directory
|
||||
|
63
build/print_git_revision.c
Normal file
63
build/print_git_revision.c
Normal file
@ -0,0 +1,63 @@
|
||||
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
||||
* Author: Travis Cross <tc@traviscross.com>
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <time.h>
|
||||
|
||||
static int sys(char *buf, int buflen, char *cmd) {
|
||||
int i, p[2];
|
||||
if (pipe(p)) return 255;
|
||||
if (!(i=fork())) {
|
||||
close(p[0]);
|
||||
dup2(p[1],1);
|
||||
close(p[1]);
|
||||
execlp("sh","sh","-c",cmd,NULL);
|
||||
} else {
|
||||
int s, x=0;
|
||||
close(p[1]);
|
||||
waitpid(i,&s,0);
|
||||
if (!(WIFEXITED(s))) return 255;
|
||||
if (WEXITSTATUS(s)) return WEXITSTATUS(s);
|
||||
if (buf) {
|
||||
while (buflen>1 && (x=read(p[0],buf,buflen-1))>0) buf+=x,buflen-=x;
|
||||
close(p[0]);
|
||||
if (x<0) return 255;
|
||||
*buf=0;
|
||||
} else close(p[0]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sys1(char *buf, int buflen, char *cmd) {
|
||||
int r; char *c;
|
||||
if ((r=sys(buf,buflen,cmd))) return r;
|
||||
if ((c=strstr(buf,"\n"))) *c=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
char xver[256], xdate[256], xfdate[256], xcommit[256];
|
||||
time_t xdate_t; struct tm *xdate_tm;
|
||||
if ((sys1(xdate,sizeof(xdate),"git log -n1 --format='%ct' HEAD"))) return 1;
|
||||
xdate_t=(time_t)atoi(xdate);
|
||||
if (!(xdate_tm=gmtime(&xdate_t))) return 1;
|
||||
strftime(xfdate,sizeof(xfdate),"%Y%m%dT%H%M%SZ",xdate_tm);
|
||||
if ((sys1(xcommit,sizeof(xcommit),"git rev-list -n1 --abbrev=10 --abbrev-commit HEAD")))
|
||||
return 1;
|
||||
snprintf(xver,sizeof(xver),"+git~%s~%s",xfdate,xcommit);
|
||||
if ((sys(NULL,0,"git diff-index --quiet HEAD"))) {
|
||||
char buf[256], now[256]; time_t now_t=time(NULL); struct tm *now_tm;
|
||||
if (!(now_tm=gmtime(&now_t))) return 1;
|
||||
strftime(now,sizeof(now),"%Y%m%dT%H%M%SZ",now_tm);
|
||||
snprintf(buf,sizeof(buf),"%s+unclean~%s",xver,now);
|
||||
strncpy(xver,buf,sizeof(xver));
|
||||
}
|
||||
printf("%s\n",xver);
|
||||
return 0;
|
||||
}
|
||||
|
@ -60,7 +60,7 @@
|
||||
<load module="mod_g723_1"/>
|
||||
<load module="mod_g729"/>
|
||||
<load module="mod_amr"/>
|
||||
<load module="mod_ilbc"/>
|
||||
<!--<load module="mod_ilbc"/>-->
|
||||
<load module="mod_speex"/>
|
||||
<load module="mod_h26x"/>
|
||||
<!--<load module="mod_siren"/>-->
|
||||
|
@ -47,6 +47,8 @@
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<param name="auth-calls" value="false"/>
|
||||
<param name="rtp-timeout-sec" value="1800"/>
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
<param name="inbound-zrtp-passthru" value="true"/> <!-- (also enables late negotiation) -->
|
||||
<!--
|
||||
DO NOT USE HOSTNAMES, ONLY IP ADDRESSES IN THESE SETTINGS!
|
||||
-->
|
||||
|
@ -66,8 +66,11 @@
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
<!-- Let calls hit the dialplan before selecting codec for the a-leg -->
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
|
||||
<!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
|
||||
<param name="inbound-zrtp-passthru" value="true"/>
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
@ -128,4 +131,3 @@
|
||||
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
|
@ -101,8 +101,11 @@
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
<!-- Let calls hit the dialplan before selecting codec for the a-leg -->
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
|
||||
<!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
|
||||
<param name="inbound-zrtp-passthru" value="true"/>
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
@ -186,4 +189,3 @@
|
||||
<!--<param name="outbound-use-uuid-as-callid" value="true"/>-->
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
||||
<load module="mod_g723_1"/>
|
||||
<load module="mod_g729"/>
|
||||
<load module="mod_amr"/>
|
||||
<load module="mod_ilbc"/>
|
||||
<!--<load module="mod_ilbc"/>-->
|
||||
<load module="mod_speex"/>
|
||||
<load module="mod_h26x"/>
|
||||
<!--<load module="mod_siren"/>-->
|
||||
|
@ -48,6 +48,8 @@
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<param name="auth-calls" value="false"/>
|
||||
<param name="rtp-timeout-sec" value="1800"/>
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
<param name="inbound-zrtp-passthru" value="true"/> <!-- (also enables late negotiation) -->
|
||||
<!--
|
||||
DO NOT USE HOSTNAMES, ONLY IP ADDRESSES IN THESE SETTINGS!
|
||||
-->
|
||||
|
@ -66,8 +66,11 @@
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
<!-- Let calls hit the dialplan before selecting codec for the a-leg -->
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
|
||||
<!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
|
||||
<param name="inbound-zrtp-passthru" value="true"/>
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
@ -128,4 +131,3 @@
|
||||
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
|
@ -107,8 +107,11 @@
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
<!-- Let calls hit the dialplan before selecting codec for the a-leg -->
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
|
||||
<!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
|
||||
<param name="inbound-zrtp-passthru" value="true"/>
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
@ -182,4 +185,3 @@
|
||||
<!--<param name="outbound-use-uuid-as-callid" value="true"/>-->
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
<X-PRE-PROCESS cmd="set" data="auto_answer=false"/>
|
||||
<X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}"/>
|
||||
<X-PRE-PROCESS cmd="set" data="hold_music=local_stream://moh"/>
|
||||
<X-PRE-PROCESS cmd="set" data="codec_prefs=CELT@48000h,G7221@32000h,G7221@16000h,G722,PCMU,PCMA,GSM"/>
|
||||
<X-PRE-PROCESS cmd="set" data="codec_prefs=CELT@48000h,G722,PCMU,PCMA,GSM"/>
|
||||
<X-PRE-PROCESS cmd="set" data="external_rtp_ip=stun:stun.freeswitch.org"/>
|
||||
<X-PRE-PROCESS cmd="set" data="external_sip_ip=stun:stun.freeswitch.org"/>
|
||||
<X-PRE-PROCESS cmd="set" data="outbound_caller_name=FreeSWITCH"/>
|
||||
@ -86,10 +86,8 @@
|
||||
<load module="mod_dptools"/>
|
||||
<load module="mod_dialplan_xml"/>
|
||||
<load module="mod_voipcodecs"/>
|
||||
<load module="mod_ilbc"/>
|
||||
<load module="mod_speex"/>
|
||||
<load module="mod_celt"/>
|
||||
<load module="mod_siren"/>
|
||||
<load module="mod_sndfile"/>
|
||||
<load module="mod_tone_stream"/>
|
||||
<load module="mod_local_stream"/>
|
||||
|
@ -82,10 +82,10 @@
|
||||
<load module="mod_g723_1"/>
|
||||
<load module="mod_g729"/>
|
||||
<load module="mod_amr"/>
|
||||
<load module="mod_ilbc"/>
|
||||
<!--<load module="mod_ilbc"/>-->
|
||||
<load module="mod_speex"/>
|
||||
<load module="mod_h26x"/>
|
||||
<load module="mod_siren"/>
|
||||
<!--<load module="mod_siren"/>-->
|
||||
<!--<load module="mod_isac"/>-->
|
||||
<!--<load module="mod_celt"/>-->
|
||||
<!--<load module="mod_opus"/>-->
|
||||
|
@ -56,6 +56,8 @@
|
||||
<param name="inbound-codec-negotiation" value="generous"/>
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<param name="auth-calls" value="false"/>
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
<param name="inbound-zrtp-passthru" value="true"/> <!-- (also enables late negotiation) -->
|
||||
<!--
|
||||
DO NOT USE HOSTNAMES, ONLY IP ADDRESSES IN THESE SETTINGS!
|
||||
-->
|
||||
@ -90,6 +92,5 @@
|
||||
<param name="tls-verify-in-subjects" value=""/>
|
||||
<!-- TLS version ("sslv23" (default), "tlsv1"). NOTE: Phones may not work with TLSv1 -->
|
||||
<param name="tls-version" value="$${sip_tls_version}"/>
|
||||
|
||||
</settings>
|
||||
</profile>
|
||||
|
@ -67,8 +67,11 @@
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
<!-- Let calls hit the dialplan before selecting codec for the a-leg -->
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
|
||||
<!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
|
||||
<param name="inbound-zrtp-passthru" value="true"/>
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
@ -127,4 +130,3 @@
|
||||
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
|
@ -219,8 +219,11 @@
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
<!-- Let calls hit the dialplan before selecting codec for the a-leg -->
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
|
||||
<!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
|
||||
<param name="inbound-zrtp-passthru" value="true"/>
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
@ -314,11 +317,10 @@
|
||||
|
||||
If you want URL dialing to work you'll want to set this to auto_from.
|
||||
|
||||
If you use any other value besides auto_to or auto_from you'll loose
|
||||
the ability to do multiple domains.
|
||||
If you use any other value besides auto_to or auto_from you'll
|
||||
loose the ability to do multiple domains.
|
||||
|
||||
Note: comment out to restore the behavior before 2008-09-29
|
||||
|
||||
-->
|
||||
<param name="challenge-realm" value="auto_from"/>
|
||||
<!--<param name="disable-rtp-auto-adjust" value="true"/>-->
|
||||
@ -332,8 +334,8 @@
|
||||
<!-- set this param to false if your gateway for some reason hates X- headers that it is supposed to ignore-->
|
||||
<!--<param name="pass-callee-id" value="false"/>-->
|
||||
|
||||
<!-- clear clears them all or supply the name to add or the name prefixed with ~ to remove
|
||||
valid values:
|
||||
<!-- clear clears them all or supply the name to add or the name
|
||||
prefixed with ~ to remove valid values:
|
||||
|
||||
clear
|
||||
CISCO_SKIP_MARK_BIT_2833
|
||||
@ -387,4 +389,3 @@
|
||||
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
|
@ -123,7 +123,7 @@
|
||||
127 - BV32
|
||||
|
||||
-->
|
||||
<X-PRE-PROCESS cmd="set" data="global_codec_prefs=G7221@32000h,G7221@16000h,G722,PCMU,PCMA,GSM"/>
|
||||
<X-PRE-PROCESS cmd="set" data="global_codec_prefs=G722,PCMU,PCMA,GSM"/>
|
||||
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=PCMU,PCMA,GSM"/>
|
||||
|
||||
<!--
|
||||
|
@ -10,7 +10,6 @@ AC_SUBST(SWITCH_VERSION_MICRO, [0])
|
||||
AC_SUBST(SWITCH_VERSION_REVISION, [-rc2])
|
||||
|
||||
AC_CONFIG_FILES([src/include/switch_version.h.in:src/include/switch_version.h.template])
|
||||
AC_CONFIG_FILES([.version:.version.in])
|
||||
|
||||
AC_CONFIG_AUX_DIR(build/config)
|
||||
AM_INIT_AUTOMAKE(libfreeswitch,0.1)
|
||||
@ -925,7 +924,7 @@ then
|
||||
#
|
||||
# python distutils found, get settings from python directly
|
||||
#
|
||||
PYTHON_CFLAGS="`$PYTHON -c 'from distutils import sysconfig; flags = [[\"-I\" + sysconfig.get_python_inc(0), \"-I\" + sysconfig.get_python_inc(1), \" \".join(sysconfig.get_config_var(\"CFLAGS\").split())]]; print(\" \".join(flags));'`"
|
||||
PYTHON_CFLAGS="`$PYTHON -c 'from distutils import sysconfig; flags = [[\"-I\" + sysconfig.get_python_inc(0), \"-I\" + sysconfig.get_python_inc(1), \" \".join(sysconfig.get_config_var(\"CFLAGS\").split())]]; print(\" \".join(flags));' | sed -e 's/-arch i386//g;s/-arch x86_64//g'`"
|
||||
PYTHON_LDFLAGS="`$PYTHON -c 'from distutils import sysconfig; libs = sysconfig.get_config_var(\"LIBS\").split() + sysconfig.get_config_var(\"SYSLIBS\").split(); libs.append(\"-lpython\"+sysconfig.get_config_var(\"VERSION\")); print(\" \".join(libs));'`"
|
||||
PYTHON_LIB="`$PYTHON -c 'from distutils import sysconfig; print(\"python\" + sysconfig.get_config_var(\"VERSION\"));'`"
|
||||
PYTHON_LIBDIR="`$PYTHON -c 'from distutils import sysconfig; print(sysconfig.get_config_var(\"LIBDIR\"));'`"
|
||||
@ -993,7 +992,6 @@ AC_CONFIG_FILES([Makefile
|
||||
src/Makefile
|
||||
src/mod/Makefile
|
||||
src/mod/applications/mod_expr/Makefile
|
||||
src/mod/applications/mod_fax/Makefile
|
||||
src/mod/applications/mod_spandsp/Makefile
|
||||
src/mod/applications/mod_osp/Makefile
|
||||
src/mod/applications/mod_stress/Makefile
|
||||
|
17
debian/README.source
vendored
17
debian/README.source
vendored
@ -48,10 +48,17 @@ The format of debian/modules.conf is:
|
||||
To build this package, I recommend running the following from the root
|
||||
directory of your FS git working tree:
|
||||
|
||||
mkdir ../sounds
|
||||
export FS_SOUNDS_DIR=$(pwd)/../sounds
|
||||
distro=sid
|
||||
ver="$(cat build/next-release.txt | sed -e 's/-/~/g')~n$(date +%Y%m%dT%H%M%SZ)-1~${distro}+1"
|
||||
git clean -fdx && git reset --hard HEAD
|
||||
(cd debian && ./bootstrap.sh)
|
||||
schedtool -B -e git-buildpackage --git-verbose -us -uc
|
||||
./build/set-fs-version.sh "$ver"
|
||||
git add configure.in && git commit -m "bump to custom v$ver"
|
||||
(cd debian && ./bootstrap.sh -c $distro)
|
||||
dch -b -m -v "$ver" --force-distribution -D "$suite" "Custom build."
|
||||
git-buildpackage -b -us -uc \
|
||||
--git-verbose \
|
||||
--git-pbuilder --git-dist=$distro \
|
||||
--git-compression-level=1v --git-compression=xz
|
||||
git reset --hard HEAD^
|
||||
|
||||
-- Travis Cross <tc@traviscross.com>, Sat, 5 May 2012 23:32:53 +0000
|
||||
-- Travis Cross <tc@traviscross.com>, Thu, 24 May 2012 16:35:57 +0000
|
||||
|
138
debian/bootstrap.sh
vendored
138
debian/bootstrap.sh
vendored
@ -15,9 +15,13 @@ avoid_mods=(
|
||||
applications/mod_osp
|
||||
applications/mod_rad_auth
|
||||
applications/mod_skel
|
||||
applications/mod_soundtouch
|
||||
asr_tts/mod_cepstral
|
||||
asr_tts/mod_flite
|
||||
codecs/mod_com_g729
|
||||
codecs/mod_ilbc
|
||||
codecs/mod_sangoma_codec
|
||||
codecs/mod_siren
|
||||
codecs/mod_skel_codec
|
||||
codecs/mod_voipcodecs
|
||||
endpoints/mod_gsmopen
|
||||
@ -27,10 +31,19 @@ avoid_mods=(
|
||||
endpoints/mod_reference
|
||||
endpoints/mod_unicall
|
||||
formats/mod_shout
|
||||
languages/mod_managed
|
||||
languages/mod_spidermonkey
|
||||
sdk/autotools
|
||||
xml_int/mod_xml_ldap
|
||||
)
|
||||
avoid_mods_sid=(
|
||||
endpoints/mod_portaudio
|
||||
formats/mod_portaudio_stream
|
||||
)
|
||||
avoid_mods_wheezy=(
|
||||
endpoints/mod_portaudio
|
||||
formats/mod_portaudio_stream
|
||||
)
|
||||
avoid_mods_squeeze=(
|
||||
formats/mod_vlc
|
||||
languages/mod_managed
|
||||
@ -288,10 +301,8 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}),
|
||||
freeswitch-mod-g723-1 (= \${binary:Version}),
|
||||
freeswitch-mod-g729 (= \${binary:Version}),
|
||||
freeswitch-mod-amr (= \${binary:Version}),
|
||||
freeswitch-mod-ilbc (= \${binary:Version}),
|
||||
freeswitch-mod-speex (= \${binary:Version}),
|
||||
freeswitch-mod-h26x (= \${binary:Version}),
|
||||
freeswitch-mod-siren (= \${binary:Version}),
|
||||
freeswitch-mod-sndfile (= \${binary:Version}),
|
||||
freeswitch-mod-native-file (= \${binary:Version}),
|
||||
freeswitch-mod-local-stream (= \${binary:Version}),
|
||||
@ -322,13 +333,15 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}),
|
||||
freeswitch-mod-g723-1 (= \${binary:Version}),
|
||||
freeswitch-mod-g729 (= \${binary:Version}),
|
||||
freeswitch-mod-h26x (= \${binary:Version}),
|
||||
freeswitch-mod-ilbc (= \${binary:Version}),
|
||||
freeswitch-mod-mp4v (= \${binary:Version}),
|
||||
freeswitch-mod-opus (= \${binary:Version}),
|
||||
freeswitch-mod-silk (= \${binary:Version}),
|
||||
freeswitch-mod-siren (= \${binary:Version}),
|
||||
freeswitch-mod-spandsp (= \${binary:Version}),
|
||||
freeswitch-mod-speex (= \${binary:Version}),
|
||||
freeswitch-mod-theora (= \${binary:Version})
|
||||
Suggests:
|
||||
freeswitch-mod-ilbc (= \${binary:Version}),
|
||||
freeswitch-mod-siren (= \${binary:Version})
|
||||
Description: Cross-Platform Scalable Multi-Protocol Soft Switch
|
||||
$(debian_wrap "${fs_description}")
|
||||
.
|
||||
@ -408,27 +421,13 @@ Description: FreeSWITCH systemd configuration
|
||||
Package: freeswitch-music
|
||||
Architecture: all
|
||||
Depends: \${misc:Depends},
|
||||
freeswitch-music-default (= \${binary:Version})
|
||||
freeswitch-music-default (>= 1.0.8)
|
||||
Description: Music on hold audio for FreeSWITCH
|
||||
$(debian_wrap "${fs_description}")
|
||||
.
|
||||
This is a metapackage which depends on the default music on hold
|
||||
packages for FreeSWITCH.
|
||||
|
||||
Package: freeswitch-music-default
|
||||
Architecture: all
|
||||
Depends: \${misc:Depends},
|
||||
freeswitch-music-default-8k (= \${binary:Version})
|
||||
Recommends:
|
||||
freeswitch-music-default-16k (= \${binary:Version}),
|
||||
freeswitch-music-default-32k (= \${binary:Version}),
|
||||
freeswitch-music-default-48k (= \${binary:Version})
|
||||
Description: Music on hold audio for FreeSWITCH
|
||||
$(debian_wrap "${fs_description}")
|
||||
.
|
||||
This is a metapackage which depends on the default music on hold
|
||||
packages for FreeSWITCH at various sampling rates.
|
||||
|
||||
Package: freeswitch-sounds
|
||||
Architecture: all
|
||||
Depends: \${misc:Depends},
|
||||
@ -452,27 +451,13 @@ Description: English sounds for FreeSWITCH
|
||||
Package: freeswitch-sounds-en-us
|
||||
Architecture: all
|
||||
Depends: \${misc:Depends},
|
||||
freeswitch-sounds-en-us-callie (= \${binary:Version})
|
||||
freeswitch-sounds-en-us-callie (>= 1.0.18)
|
||||
Description: US English sounds for FreeSWITCH
|
||||
$(debian_wrap "${fs_description}")
|
||||
.
|
||||
This is a metapackage which depends on the default US/English sound
|
||||
packages for FreeSWITCH.
|
||||
|
||||
Package: freeswitch-sounds-en-us-callie
|
||||
Architecture: all
|
||||
Depends: \${misc:Depends},
|
||||
freeswitch-sounds-en-us-callie-8k (= \${binary:Version})
|
||||
Recommends:
|
||||
freeswitch-sounds-en-us-callie-16k (= \${binary:Version}),
|
||||
freeswitch-sounds-en-us-callie-32k (= \${binary:Version}),
|
||||
freeswitch-sounds-en-us-callie-48k (= \${binary:Version})
|
||||
Description: US English sounds for FreeSWITCH
|
||||
$(debian_wrap "${fs_description}")
|
||||
.
|
||||
This is a metapackage which depends on the US/English Callie sound
|
||||
packages for FreeSWITCH at various sampling rates.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
@ -557,14 +542,6 @@ print_conf_overrides () {
|
||||
print_common_overrides "$1"
|
||||
}
|
||||
|
||||
print_sound_overrides () {
|
||||
print_common_overrides "$1"
|
||||
}
|
||||
|
||||
print_music_overrides () {
|
||||
print_common_overrides "$1"
|
||||
}
|
||||
|
||||
print_conf_control () {
|
||||
cat <<EOF
|
||||
Package: freeswitch-conf-${conf//_/-}
|
||||
@ -584,46 +561,6 @@ conf/${conf} /usr/share/freeswitch/conf
|
||||
EOF
|
||||
}
|
||||
|
||||
print_music_control () {
|
||||
cat <<EOF
|
||||
Package: freeswitch-music-default-${rate_k}
|
||||
Architecture: all
|
||||
Depends: \${misc:Depends}
|
||||
Description: Music on hold audio for FreeSWITCH
|
||||
$(debian_wrap "${fs_description}")
|
||||
.
|
||||
This package contains the default music on hold audio for FreeSWITCH
|
||||
at a sampling rate of ${rate}Hz.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
print_music_install () {
|
||||
cat <<EOF
|
||||
/usr/share/freeswitch/sounds/music/${rate}
|
||||
EOF
|
||||
}
|
||||
|
||||
print_sound_control () {
|
||||
cat <<EOF
|
||||
Package: freeswitch-sounds-${sound//\//-}-${rate_k}
|
||||
Architecture: all
|
||||
Depends: \${misc:Depends}
|
||||
Description: ${sound} sounds for FreeSWITCH
|
||||
$(debian_wrap "${fs_description}")
|
||||
.
|
||||
This package contains the ${sound} sounds for FreeSWITCH at a
|
||||
sampling rate of ${rate}Hz.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
print_sound_install () {
|
||||
cat <<EOF
|
||||
/usr/share/freeswitch/sounds/${sound_path}/*/${rate}
|
||||
EOF
|
||||
}
|
||||
|
||||
print_edit_warning () {
|
||||
echo "#### Do not edit! This file is auto-generated from debian/bootstrap.sh."; echo
|
||||
}
|
||||
@ -667,35 +604,6 @@ genconf () {
|
||||
test -f $f.tmpl && cat $f.tmpl >> $f
|
||||
}
|
||||
|
||||
genmusic () {
|
||||
rate="$1" rate_k="${rate%%000}k"
|
||||
print_music_control >> control
|
||||
local p=freeswitch-music-default-${rate_k}
|
||||
local f=$p.install
|
||||
(print_edit_warning; print_music_install) > $f
|
||||
test -f $f.tmpl && cat $f.tmpl >> $f
|
||||
local f=$p.lintian-overrides
|
||||
(print_edit_warning; print_music_overrides "$p") > $f
|
||||
test -f $f.tmpl && cat $f.tmpl >> $f
|
||||
unset rate rate_k
|
||||
}
|
||||
|
||||
gensound () {
|
||||
rate="$1" rate_k="${rate%%000}k" sound_path="$2" sound="${2,,}"
|
||||
language=$(echo $sound | cut -d/ -f1)
|
||||
country=$(echo $sound | cut -d/ -f2)
|
||||
speaker=$(echo $sound | cut -d/ -f3)
|
||||
print_sound_control >> control
|
||||
local p=freeswitch-sounds-${sound//\//-}-${rate_k}
|
||||
local f=$p.install
|
||||
(print_edit_warning; print_sound_install) > $f
|
||||
test -f $f.tmpl && cat $f.tmpl >> $f
|
||||
local f=$p.lintian-overrides
|
||||
(print_edit_warning; print_sound_overrides "$p") > $f
|
||||
test -f $f.tmpl && cat $f.tmpl >> $f
|
||||
unset rate rate_k sound sound_path language country speaker
|
||||
}
|
||||
|
||||
accumulate_build_depends () {
|
||||
local x=""
|
||||
if [ -n "$(eval echo \$build_depends_$codename)" ]; then
|
||||
@ -865,14 +773,6 @@ map_modules 'mod_filter' '' 'accumulate_build_depends'
|
||||
echo "Generating debian/..." >&2
|
||||
> control
|
||||
(print_edit_warning; print_source_control; print_core_control) >> control
|
||||
echo "Generating debian/ (music)..." >&2
|
||||
for r in 8000 16000 32000 48000; do genmusic $r; done
|
||||
echo "Generating debian/ (sounds)..." >&2
|
||||
for x in 'en/us/callie'; do
|
||||
for r in 8000 16000 32000 48000; do
|
||||
gensound $r $x
|
||||
done
|
||||
done
|
||||
echo "Generating debian/ (conf)..." >&2
|
||||
(echo "### conf"; echo) >> control
|
||||
map_confs 'genconf'
|
||||
|
7
debian/changelog
vendored
7
debian/changelog
vendored
@ -1,3 +1,10 @@
|
||||
freeswitch (1.2~rc2-1) unstable; urgency=low
|
||||
|
||||
* Bump version.
|
||||
* Sounds and music have been moved to their own source packaging.
|
||||
|
||||
-- Travis Cross <tc@traviscross.com> Thu, 24 May 2012 15:15:10 +0000
|
||||
|
||||
freeswitch (1.2~alpha1-1) unstable; urgency=low
|
||||
|
||||
* Initial release of FreeSWITCH in new debian packaging.
|
||||
|
980
debian/copyright
vendored
980
debian/copyright
vendored
@ -2,29 +2,482 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: freeswitch
|
||||
Source: http://freeswitch.org/
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2012, Travis Cross <tc@traviscross.com>
|
||||
License: MPL or GPL2+ (at your option)
|
||||
This packaging may be distributed under either (at your option) the
|
||||
terms of the MPLv1.1 as described in docs/COPYING in the FreeSWITCH
|
||||
source tree, or under the terms of the GNU GPL, version 2 or later,
|
||||
as found on Debian systems in /usr/share/common-licenses/GPL-2.
|
||||
|
||||
Files: *
|
||||
Copyright: 2012, Anthony Minessale II <anthm@freeswitch.org> and many other contributors
|
||||
License: MPL
|
||||
The contents of these files are subject to the Mozilla Public License
|
||||
Version 1.1 (the "License"); you may not use these files except in
|
||||
Copyright: 2012 Anthony Minessale II <anthm@freeswitch.org> and many other contributors
|
||||
License: MPL-1.1
|
||||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.1
|
||||
.
|
||||
---------------
|
||||
.
|
||||
1. Definitions.
|
||||
.
|
||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
||||
Covered Code available to a third party.
|
||||
.
|
||||
1.1. "Contributor" means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
.
|
||||
1.2. "Contributor Version" means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
.
|
||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
.
|
||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
.
|
||||
1.5. "Executable" means Covered Code in any form other than Source
|
||||
Code.
|
||||
.
|
||||
1.6. "Initial Developer" means the individual or entity identified
|
||||
as the Initial Developer in the Source Code notice required by Exhibit
|
||||
A.
|
||||
.
|
||||
1.7. "Larger Work" means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
.
|
||||
1.8. "License" means this document.
|
||||
.
|
||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
||||
extent possible, whether at the time of the initial grant or
|
||||
subsequently acquired, any and all of the rights conveyed herein.
|
||||
.
|
||||
1.9. "Modifications" means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
.
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
.
|
||||
1.10. "Original Code" means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this
|
||||
License is not already Covered Code governed by this License.
|
||||
.
|
||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
||||
hereafter acquired, including without limitation, method, process,
|
||||
and apparatus claims, in any patent Licensable by grantor.
|
||||
.
|
||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus
|
||||
any associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
.
|
||||
1.12. "You" (or "Your") means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this
|
||||
License or a future version of this License issued under Section 6.1.
|
||||
For legal entities, "You" includes any entity which controls, is
|
||||
controlled by, or is under common control with You. For purposes of
|
||||
this definition, "control" means (a) the power, direct or indirect,
|
||||
to cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (b) ownership of more than fifty percent
|
||||
(50%) of the outstanding shares or beneficial ownership of such
|
||||
entity.
|
||||
.
|
||||
2. Source Code License.
|
||||
.
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Initial Developer to use, reproduce,
|
||||
modify, display, perform, sublicense and distribute the Original
|
||||
Code (or portions thereof) with or without Modifications, and/or
|
||||
as part of a Larger Work; and
|
||||
.
|
||||
(b) under Patents Claims infringed by the making, using or
|
||||
selling of Original Code, to make, have made, use, practice,
|
||||
sell, and offer for sale, and/or otherwise dispose of the
|
||||
Original Code (or portions thereof).
|
||||
.
|
||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
||||
effective on the date Initial Developer first distributes
|
||||
Original Code under the terms of this License.
|
||||
.
|
||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
||||
granted: 1) for code that You delete from the Original Code; 2)
|
||||
separate from the Original Code; or 3) for infringements caused
|
||||
by: i) the modification of the Original Code or ii) the
|
||||
combination of the Original Code with other software or devices.
|
||||
.
|
||||
2.2. Contributor Grant.
|
||||
Subject to third party intellectual property claims, each Contributor
|
||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
||||
.
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
||||
display, perform, sublicense and distribute the Modifications
|
||||
created by such Contributor (or portions thereof) either on an
|
||||
unmodified basis, with other Modifications, as Covered Code
|
||||
and/or as part of a Larger Work; and
|
||||
.
|
||||
(b) under Patent Claims infringed by the making, using, or
|
||||
selling of Modifications made by that Contributor either alone
|
||||
and/or in combination with its Contributor Version (or portions
|
||||
of such combination), to make, use, sell, offer for sale, have
|
||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
||||
Contributor (or portions thereof); and 2) the combination of
|
||||
Modifications made by that Contributor with its Contributor
|
||||
Version (or portions of such combination).
|
||||
.
|
||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
||||
effective on the date Contributor first makes Commercial Use of
|
||||
the Covered Code.
|
||||
.
|
||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
||||
granted: 1) for any code that Contributor has deleted from the
|
||||
Contributor Version; 2) separate from the Contributor Version;
|
||||
3) for infringements caused by: i) third party modifications of
|
||||
Contributor Version or ii) the combination of Modifications made
|
||||
by that Contributor with other software (except as part of the
|
||||
Contributor Version) or other devices; or 4) under Patent Claims
|
||||
infringed by Covered Code in the absence of Modifications made by
|
||||
that Contributor.
|
||||
.
|
||||
3. Distribution Obligations.
|
||||
.
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be
|
||||
distributed only under the terms of this License or a future version
|
||||
of this License released under Section 6.1, and You must include a
|
||||
copy of this License with every copy of the Source Code You
|
||||
distribute. You may not offer or impose any terms on any Source Code
|
||||
version that alters or restricts the applicable version of this
|
||||
License or the recipients' rights hereunder. However, You may include
|
||||
an additional document offering the additional rights described in
|
||||
Section 3.5.
|
||||
.
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
.
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which You contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that
|
||||
the Modification is derived, directly or indirectly, from Original
|
||||
Code provided by the Initial Developer and including the name of the
|
||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
.
|
||||
3.4. Intellectual Property Matters
|
||||
(a) Third Party Claims.
|
||||
If Contributor has knowledge that a license under a third party's
|
||||
intellectual property rights is required to exercise the rights
|
||||
granted by such Contributor under Sections 2.1 or 2.2,
|
||||
Contributor must include a text file with the Source Code
|
||||
distribution titled "LEGAL" which describes the claim and the
|
||||
party making the claim in sufficient detail that a recipient will
|
||||
know whom to contact. If Contributor obtains such knowledge after
|
||||
the Modification is made available as described in Section 3.2,
|
||||
Contributor shall promptly modify the LEGAL file in all copies
|
||||
Contributor makes available thereafter and shall take other steps
|
||||
(such as notifying appropriate mailing lists or newsgroups)
|
||||
reasonably calculated to inform those who received the Covered
|
||||
Code that new knowledge has been obtained.
|
||||
.
|
||||
(b) Contributor APIs.
|
||||
If Contributor's Modifications include an application programming
|
||||
interface and Contributor has knowledge of patent licenses which
|
||||
are reasonably necessary to implement that API, Contributor must
|
||||
also include this information in the LEGAL file.
|
||||
.
|
||||
(c) Representations.
|
||||
Contributor represents that, except as disclosed pursuant to
|
||||
Section 3.4(a) above, Contributor believes that Contributor's
|
||||
Modifications are Contributor's original creation(s) and/or
|
||||
Contributor has sufficient rights to grant the rights conveyed by
|
||||
this License.
|
||||
.
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code. If it is not possible to put such notice in a particular Source
|
||||
Code file due to its structure, then You must include such notice in a
|
||||
location (such as a relevant directory) where a user would be likely
|
||||
to look for such a notice. If You created one or more Modification(s)
|
||||
You may add your name as a Contributor to the notice described in
|
||||
Exhibit A. You must also duplicate this License in any documentation
|
||||
for the Source Code where You describe recipients' rights or ownership
|
||||
rights relating to Covered Code. You may choose to offer, and to
|
||||
charge a fee for, warranty, support, indemnity or liability
|
||||
obligations to one or more recipients of Covered Code. However, You
|
||||
may do so only on Your own behalf, and not on behalf of the Initial
|
||||
Developer or any Contributor. You must make it absolutely clear than
|
||||
any such warranty, support, indemnity or liability obligation is
|
||||
offered by You alone, and You hereby agree to indemnify the Initial
|
||||
Developer and every Contributor for any liability incurred by the
|
||||
Initial Developer or such Contributor as a result of warranty,
|
||||
support, indemnity or liability terms You offer.
|
||||
.
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of
|
||||
the Covered Code is available under the terms of this License,
|
||||
including a description of how and where You have fulfilled the
|
||||
obligations of Section 3.2. The notice must be conspicuously included
|
||||
in any notice in an Executable version, related documentation or
|
||||
collateral in which You describe recipients' rights relating to the
|
||||
Covered Code. You may distribute the Executable version of Covered
|
||||
Code or ownership rights under a license of Your choice, which may
|
||||
contain terms different from this License, provided that You are in
|
||||
compliance with the terms of this License and that the license for the
|
||||
Executable version does not attempt to limit or alter the recipient's
|
||||
rights in the Source Code version from the rights set forth in this
|
||||
License. If You distribute the Executable version under a different
|
||||
license You must make it absolutely clear that any terms which differ
|
||||
from this License are offered by You alone, not by the Initial
|
||||
Developer or any Contributor. You hereby agree to indemnify the
|
||||
Initial Developer and every Contributor for any liability incurred by
|
||||
the Initial Developer or such Contributor as a result of any such
|
||||
terms You offer.
|
||||
.
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
.
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
.
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description
|
||||
must be included in the LEGAL file described in Section 3.4 and must
|
||||
be included with all distributions of the Source Code. Except to the
|
||||
extent prohibited by statute or regulation, such description must be
|
||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
||||
understand it.
|
||||
.
|
||||
5. Application of this License.
|
||||
.
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A and to related Covered Code.
|
||||
.
|
||||
6. Versions of the License.
|
||||
.
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation ("Netscape") may publish revised
|
||||
and/or new versions of the License from time to time. Each version
|
||||
will be given a distinguishing version number.
|
||||
.
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
.
|
||||
6.3. Derivative Works.
|
||||
If You create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), You must (a) rename Your license so that
|
||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
||||
license (except to note that your license differs from this License)
|
||||
and (b) otherwise make it clear that Your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial
|
||||
Developer, Original Code or Contributor in the notice described in
|
||||
Exhibit A shall not of themselves be deemed to be modifications of
|
||||
this License.)
|
||||
.
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
.
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
.
|
||||
8. TERMINATION.
|
||||
.
|
||||
8.1. This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
.
|
||||
8.2. If You initiate litigation by asserting a patent infringement
|
||||
claim (excluding declatory judgment actions) against Initial Developer
|
||||
or a Contributor (the Initial Developer or Contributor against whom
|
||||
You file such action is referred to as "Participant") alleging that:
|
||||
.
|
||||
(a) such Participant's Contributor Version directly or indirectly
|
||||
infringes any patent, then any and all rights granted by such
|
||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
||||
shall, upon 60 days notice from Participant terminate prospectively,
|
||||
unless if within 60 days after receipt of notice You either: (i)
|
||||
agree in writing to pay Participant a mutually agreeable reasonable
|
||||
royalty for Your past and future use of Modifications made by such
|
||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
||||
the Contributor Version against such Participant. If within 60 days
|
||||
of notice, a reasonable royalty and payment arrangement are not
|
||||
mutually agreed upon in writing by the parties or the litigation claim
|
||||
is not withdrawn, the rights granted by Participant to You under
|
||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
||||
the 60 day notice period specified above.
|
||||
.
|
||||
(b) any software, hardware, or device, other than such Participant's
|
||||
Contributor Version, directly or indirectly infringes any patent, then
|
||||
any rights granted to You by such Participant under Sections 2.1(b)
|
||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
||||
sold, distributed, or had made, Modifications made by that
|
||||
Participant.
|
||||
.
|
||||
8.3. If You assert a patent infringement claim against Participant
|
||||
alleging that such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent where such claim is resolved (such as
|
||||
by license or settlement) prior to the initiation of patent
|
||||
infringement litigation, then the reasonable value of the licenses
|
||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
||||
into account in determining the amount or value of any payment or
|
||||
license.
|
||||
.
|
||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
||||
all end user license agreements (excluding distributors and resellers)
|
||||
which have been validly granted by You or any distributor hereunder
|
||||
prior to termination shall survive termination.
|
||||
.
|
||||
9. LIMITATION OF LIABILITY.
|
||||
.
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
.
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
.
|
||||
The Covered Code is a "commercial item," as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
||||
software" and "commercial computer software documentation," as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
.
|
||||
11. MISCELLANEOUS.
|
||||
.
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if
|
||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
||||
With respect to disputes in which at least one party is a citizen of,
|
||||
or an entity chartered or registered to do business in the United
|
||||
States of America, any litigation relating to this License shall be
|
||||
subject to the jurisdiction of the Federal Courts of the Northern
|
||||
District of California, with venue lying in Santa Clara County,
|
||||
California, with the losing party responsible for costs, including
|
||||
without limitation, court costs and reasonable attorneys' fees and
|
||||
expenses. The application of the United Nations Convention on
|
||||
Contracts for the International Sale of Goods is expressly excluded.
|
||||
Any law or regulation which provides that the language of a contract
|
||||
shall be construed against the drafter shall not apply to this
|
||||
License.
|
||||
.
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
.
|
||||
As between Initial Developer and the Contributors, each party is
|
||||
responsible for claims and damages arising, directly or indirectly,
|
||||
out of its utilization of rights under this License and You agree to
|
||||
work with Initial Developer and Contributors to distribute such
|
||||
responsibility on an equitable basis. Nothing herein is intended or
|
||||
shall be deemed to constitute any admission of liability.
|
||||
.
|
||||
13. MULTIPLE-LICENSED CODE.
|
||||
.
|
||||
Initial Developer may designate portions of the Covered Code as
|
||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
||||
Developer permits you to utilize portions of the Covered Code under
|
||||
Your choice of the NPL or the alternative licenses, if any, specified
|
||||
by the Initial Developer in the file described in Exhibit A.
|
||||
.
|
||||
EXHIBIT A -Mozilla Public License.
|
||||
.
|
||||
``The contents of this file are subject to the Mozilla Public License
|
||||
Version 1.1 (the "License"); you may not use this file except in
|
||||
compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
.
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
for the specific language governing rights and limitations under the
|
||||
License.
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
.
|
||||
The Original Code is ______________________________________.
|
||||
.
|
||||
The Initial Developer of the Original Code is ________________________.
|
||||
Portions created by ______________________ are Copyright (C) ______
|
||||
_______________________. All Rights Reserved.
|
||||
.
|
||||
Contributor(s): ______________________________________.
|
||||
.
|
||||
Alternatively, the contents of this file may be used under the terms
|
||||
of the _____ license (the "[___] License"), in which case the
|
||||
provisions of [______] License are applicable instead of those
|
||||
above. If you wish to allow use of your version of this file only
|
||||
under the terms of the [____] License and not to allow others to use
|
||||
your version of this file under the MPL, indicate your decision by
|
||||
deleting the provisions above and replace them with the notice and
|
||||
other provisions required by the [___] License. If you do not delete
|
||||
the provisions above, a recipient may use your version of this file
|
||||
under either the MPL or the [___] License."
|
||||
.
|
||||
[NOTE: The text of this Exhibit A may differ slightly from the text of
|
||||
the notices in the Source Code files of the Original Code. You should
|
||||
use the text of this Exhibit A rather than the text found in the
|
||||
Original Code Source Code for Your Modifications.]
|
||||
|
||||
Files: libs/pocketsphinx*
|
||||
Copyright: 2010 Carnegie Mellon University
|
||||
License: BSD-2-clause
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2010 Carnegie Mellon University. All rights
|
||||
* reserved.
|
||||
@ -61,3 +514,498 @@ Copyright: 2010 Carnegie Mellon University
|
||||
*
|
||||
*/
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2012 Travis Cross <tc@traviscross.com>
|
||||
License: MPL-1.1 or GPL-2+
|
||||
This program is free software, and you may redistribute it and/or
|
||||
modify it under either (at your option) the terms of the Mozilla
|
||||
Public License Version 1.1 (MPLv1.1) or under the terms of the GNU
|
||||
General Public License as published by the Free Software Foundation
|
||||
(either version 2 of the License, or (at your option) any later
|
||||
version). Both licenses are described below.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this package; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
.
|
||||
On Debian systems, the full text of the GNU General Public License
|
||||
version 2 can be found in the file
|
||||
`/usr/share/common-licenses/GPL-2'.
|
||||
.
|
||||
----
|
||||
.
|
||||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.1
|
||||
.
|
||||
---------------
|
||||
.
|
||||
1. Definitions.
|
||||
.
|
||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
||||
Covered Code available to a third party.
|
||||
.
|
||||
1.1. "Contributor" means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
.
|
||||
1.2. "Contributor Version" means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
.
|
||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
.
|
||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
.
|
||||
1.5. "Executable" means Covered Code in any form other than Source
|
||||
Code.
|
||||
.
|
||||
1.6. "Initial Developer" means the individual or entity identified
|
||||
as the Initial Developer in the Source Code notice required by Exhibit
|
||||
A.
|
||||
.
|
||||
1.7. "Larger Work" means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
.
|
||||
1.8. "License" means this document.
|
||||
.
|
||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
||||
extent possible, whether at the time of the initial grant or
|
||||
subsequently acquired, any and all of the rights conveyed herein.
|
||||
.
|
||||
1.9. "Modifications" means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
.
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
.
|
||||
1.10. "Original Code" means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this
|
||||
License is not already Covered Code governed by this License.
|
||||
.
|
||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
||||
hereafter acquired, including without limitation, method, process,
|
||||
and apparatus claims, in any patent Licensable by grantor.
|
||||
.
|
||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus
|
||||
any associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
.
|
||||
1.12. "You" (or "Your") means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this
|
||||
License or a future version of this License issued under Section 6.1.
|
||||
For legal entities, "You" includes any entity which controls, is
|
||||
controlled by, or is under common control with You. For purposes of
|
||||
this definition, "control" means (a) the power, direct or indirect,
|
||||
to cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (b) ownership of more than fifty percent
|
||||
(50%) of the outstanding shares or beneficial ownership of such
|
||||
entity.
|
||||
.
|
||||
2. Source Code License.
|
||||
.
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Initial Developer to use, reproduce,
|
||||
modify, display, perform, sublicense and distribute the Original
|
||||
Code (or portions thereof) with or without Modifications, and/or
|
||||
as part of a Larger Work; and
|
||||
.
|
||||
(b) under Patents Claims infringed by the making, using or
|
||||
selling of Original Code, to make, have made, use, practice,
|
||||
sell, and offer for sale, and/or otherwise dispose of the
|
||||
Original Code (or portions thereof).
|
||||
.
|
||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
||||
effective on the date Initial Developer first distributes
|
||||
Original Code under the terms of this License.
|
||||
.
|
||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
||||
granted: 1) for code that You delete from the Original Code; 2)
|
||||
separate from the Original Code; or 3) for infringements caused
|
||||
by: i) the modification of the Original Code or ii) the
|
||||
combination of the Original Code with other software or devices.
|
||||
.
|
||||
2.2. Contributor Grant.
|
||||
Subject to third party intellectual property claims, each Contributor
|
||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
||||
.
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
||||
display, perform, sublicense and distribute the Modifications
|
||||
created by such Contributor (or portions thereof) either on an
|
||||
unmodified basis, with other Modifications, as Covered Code
|
||||
and/or as part of a Larger Work; and
|
||||
.
|
||||
(b) under Patent Claims infringed by the making, using, or
|
||||
selling of Modifications made by that Contributor either alone
|
||||
and/or in combination with its Contributor Version (or portions
|
||||
of such combination), to make, use, sell, offer for sale, have
|
||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
||||
Contributor (or portions thereof); and 2) the combination of
|
||||
Modifications made by that Contributor with its Contributor
|
||||
Version (or portions of such combination).
|
||||
.
|
||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
||||
effective on the date Contributor first makes Commercial Use of
|
||||
the Covered Code.
|
||||
.
|
||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
||||
granted: 1) for any code that Contributor has deleted from the
|
||||
Contributor Version; 2) separate from the Contributor Version;
|
||||
3) for infringements caused by: i) third party modifications of
|
||||
Contributor Version or ii) the combination of Modifications made
|
||||
by that Contributor with other software (except as part of the
|
||||
Contributor Version) or other devices; or 4) under Patent Claims
|
||||
infringed by Covered Code in the absence of Modifications made by
|
||||
that Contributor.
|
||||
.
|
||||
3. Distribution Obligations.
|
||||
.
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be
|
||||
distributed only under the terms of this License or a future version
|
||||
of this License released under Section 6.1, and You must include a
|
||||
copy of this License with every copy of the Source Code You
|
||||
distribute. You may not offer or impose any terms on any Source Code
|
||||
version that alters or restricts the applicable version of this
|
||||
License or the recipients' rights hereunder. However, You may include
|
||||
an additional document offering the additional rights described in
|
||||
Section 3.5.
|
||||
.
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
.
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which You contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that
|
||||
the Modification is derived, directly or indirectly, from Original
|
||||
Code provided by the Initial Developer and including the name of the
|
||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
.
|
||||
3.4. Intellectual Property Matters
|
||||
(a) Third Party Claims.
|
||||
If Contributor has knowledge that a license under a third party's
|
||||
intellectual property rights is required to exercise the rights
|
||||
granted by such Contributor under Sections 2.1 or 2.2,
|
||||
Contributor must include a text file with the Source Code
|
||||
distribution titled "LEGAL" which describes the claim and the
|
||||
party making the claim in sufficient detail that a recipient will
|
||||
know whom to contact. If Contributor obtains such knowledge after
|
||||
the Modification is made available as described in Section 3.2,
|
||||
Contributor shall promptly modify the LEGAL file in all copies
|
||||
Contributor makes available thereafter and shall take other steps
|
||||
(such as notifying appropriate mailing lists or newsgroups)
|
||||
reasonably calculated to inform those who received the Covered
|
||||
Code that new knowledge has been obtained.
|
||||
.
|
||||
(b) Contributor APIs.
|
||||
If Contributor's Modifications include an application programming
|
||||
interface and Contributor has knowledge of patent licenses which
|
||||
are reasonably necessary to implement that API, Contributor must
|
||||
also include this information in the LEGAL file.
|
||||
.
|
||||
(c) Representations.
|
||||
Contributor represents that, except as disclosed pursuant to
|
||||
Section 3.4(a) above, Contributor believes that Contributor's
|
||||
Modifications are Contributor's original creation(s) and/or
|
||||
Contributor has sufficient rights to grant the rights conveyed by
|
||||
this License.
|
||||
.
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code. If it is not possible to put such notice in a particular Source
|
||||
Code file due to its structure, then You must include such notice in a
|
||||
location (such as a relevant directory) where a user would be likely
|
||||
to look for such a notice. If You created one or more Modification(s)
|
||||
You may add your name as a Contributor to the notice described in
|
||||
Exhibit A. You must also duplicate this License in any documentation
|
||||
for the Source Code where You describe recipients' rights or ownership
|
||||
rights relating to Covered Code. You may choose to offer, and to
|
||||
charge a fee for, warranty, support, indemnity or liability
|
||||
obligations to one or more recipients of Covered Code. However, You
|
||||
may do so only on Your own behalf, and not on behalf of the Initial
|
||||
Developer or any Contributor. You must make it absolutely clear than
|
||||
any such warranty, support, indemnity or liability obligation is
|
||||
offered by You alone, and You hereby agree to indemnify the Initial
|
||||
Developer and every Contributor for any liability incurred by the
|
||||
Initial Developer or such Contributor as a result of warranty,
|
||||
support, indemnity or liability terms You offer.
|
||||
.
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of
|
||||
the Covered Code is available under the terms of this License,
|
||||
including a description of how and where You have fulfilled the
|
||||
obligations of Section 3.2. The notice must be conspicuously included
|
||||
in any notice in an Executable version, related documentation or
|
||||
collateral in which You describe recipients' rights relating to the
|
||||
Covered Code. You may distribute the Executable version of Covered
|
||||
Code or ownership rights under a license of Your choice, which may
|
||||
contain terms different from this License, provided that You are in
|
||||
compliance with the terms of this License and that the license for the
|
||||
Executable version does not attempt to limit or alter the recipient's
|
||||
rights in the Source Code version from the rights set forth in this
|
||||
License. If You distribute the Executable version under a different
|
||||
license You must make it absolutely clear that any terms which differ
|
||||
from this License are offered by You alone, not by the Initial
|
||||
Developer or any Contributor. You hereby agree to indemnify the
|
||||
Initial Developer and every Contributor for any liability incurred by
|
||||
the Initial Developer or such Contributor as a result of any such
|
||||
terms You offer.
|
||||
.
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
.
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
.
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description
|
||||
must be included in the LEGAL file described in Section 3.4 and must
|
||||
be included with all distributions of the Source Code. Except to the
|
||||
extent prohibited by statute or regulation, such description must be
|
||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
||||
understand it.
|
||||
.
|
||||
5. Application of this License.
|
||||
.
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A and to related Covered Code.
|
||||
.
|
||||
6. Versions of the License.
|
||||
.
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation ("Netscape") may publish revised
|
||||
and/or new versions of the License from time to time. Each version
|
||||
will be given a distinguishing version number.
|
||||
.
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
.
|
||||
6.3. Derivative Works.
|
||||
If You create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), You must (a) rename Your license so that
|
||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
||||
license (except to note that your license differs from this License)
|
||||
and (b) otherwise make it clear that Your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial
|
||||
Developer, Original Code or Contributor in the notice described in
|
||||
Exhibit A shall not of themselves be deemed to be modifications of
|
||||
this License.)
|
||||
.
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
.
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
.
|
||||
8. TERMINATION.
|
||||
.
|
||||
8.1. This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
.
|
||||
8.2. If You initiate litigation by asserting a patent infringement
|
||||
claim (excluding declatory judgment actions) against Initial Developer
|
||||
or a Contributor (the Initial Developer or Contributor against whom
|
||||
You file such action is referred to as "Participant") alleging that:
|
||||
.
|
||||
(a) such Participant's Contributor Version directly or indirectly
|
||||
infringes any patent, then any and all rights granted by such
|
||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
||||
shall, upon 60 days notice from Participant terminate prospectively,
|
||||
unless if within 60 days after receipt of notice You either: (i)
|
||||
agree in writing to pay Participant a mutually agreeable reasonable
|
||||
royalty for Your past and future use of Modifications made by such
|
||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
||||
the Contributor Version against such Participant. If within 60 days
|
||||
of notice, a reasonable royalty and payment arrangement are not
|
||||
mutually agreed upon in writing by the parties or the litigation claim
|
||||
is not withdrawn, the rights granted by Participant to You under
|
||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
||||
the 60 day notice period specified above.
|
||||
.
|
||||
(b) any software, hardware, or device, other than such Participant's
|
||||
Contributor Version, directly or indirectly infringes any patent, then
|
||||
any rights granted to You by such Participant under Sections 2.1(b)
|
||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
||||
sold, distributed, or had made, Modifications made by that
|
||||
Participant.
|
||||
.
|
||||
8.3. If You assert a patent infringement claim against Participant
|
||||
alleging that such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent where such claim is resolved (such as
|
||||
by license or settlement) prior to the initiation of patent
|
||||
infringement litigation, then the reasonable value of the licenses
|
||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
||||
into account in determining the amount or value of any payment or
|
||||
license.
|
||||
.
|
||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
||||
all end user license agreements (excluding distributors and resellers)
|
||||
which have been validly granted by You or any distributor hereunder
|
||||
prior to termination shall survive termination.
|
||||
.
|
||||
9. LIMITATION OF LIABILITY.
|
||||
.
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
.
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
.
|
||||
The Covered Code is a "commercial item," as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
||||
software" and "commercial computer software documentation," as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
.
|
||||
11. MISCELLANEOUS.
|
||||
.
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if
|
||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
||||
With respect to disputes in which at least one party is a citizen of,
|
||||
or an entity chartered or registered to do business in the United
|
||||
States of America, any litigation relating to this License shall be
|
||||
subject to the jurisdiction of the Federal Courts of the Northern
|
||||
District of California, with venue lying in Santa Clara County,
|
||||
California, with the losing party responsible for costs, including
|
||||
without limitation, court costs and reasonable attorneys' fees and
|
||||
expenses. The application of the United Nations Convention on
|
||||
Contracts for the International Sale of Goods is expressly excluded.
|
||||
Any law or regulation which provides that the language of a contract
|
||||
shall be construed against the drafter shall not apply to this
|
||||
License.
|
||||
.
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
.
|
||||
As between Initial Developer and the Contributors, each party is
|
||||
responsible for claims and damages arising, directly or indirectly,
|
||||
out of its utilization of rights under this License and You agree to
|
||||
work with Initial Developer and Contributors to distribute such
|
||||
responsibility on an equitable basis. Nothing herein is intended or
|
||||
shall be deemed to constitute any admission of liability.
|
||||
.
|
||||
13. MULTIPLE-LICENSED CODE.
|
||||
.
|
||||
Initial Developer may designate portions of the Covered Code as
|
||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
||||
Developer permits you to utilize portions of the Covered Code under
|
||||
Your choice of the NPL or the alternative licenses, if any, specified
|
||||
by the Initial Developer in the file described in Exhibit A.
|
||||
.
|
||||
EXHIBIT A -Mozilla Public License.
|
||||
.
|
||||
``The contents of this file are subject to the Mozilla Public License
|
||||
Version 1.1 (the "License"); you may not use this file except in
|
||||
compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
.
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
.
|
||||
The Original Code is ______________________________________.
|
||||
.
|
||||
The Initial Developer of the Original Code is ________________________.
|
||||
Portions created by ______________________ are Copyright (C) ______
|
||||
_______________________. All Rights Reserved.
|
||||
.
|
||||
Contributor(s): ______________________________________.
|
||||
.
|
||||
Alternatively, the contents of this file may be used under the terms
|
||||
of the _____ license (the "[___] License"), in which case the
|
||||
provisions of [______] License are applicable instead of those
|
||||
above. If you wish to allow use of your version of this file only
|
||||
under the terms of the [____] License and not to allow others to use
|
||||
your version of this file under the MPL, indicate your decision by
|
||||
deleting the provisions above and replace them with the notice and
|
||||
other provisions required by the [___] License. If you do not delete
|
||||
the provisions above, a recipient may use your version of this file
|
||||
under either the MPL or the [___] License."
|
||||
.
|
||||
[NOTE: The text of this Exhibit A may differ slightly from the text of
|
||||
the notices in the Source Code files of the Original Code. You should
|
||||
use the text of this Exhibit A rather than the text found in the
|
||||
Original Code Source Code for Your Modifications.]
|
||||
|
1
debian/gbp.conf
vendored
1
debian/gbp.conf
vendored
@ -7,7 +7,6 @@ upstream-branch=master
|
||||
debian-branch=master
|
||||
upstream-tree=branch
|
||||
tag=False
|
||||
force-create=True
|
||||
compression=xz
|
||||
compression-level=9ev
|
||||
builder=debuild --prepend-path=/usr/lib/ccache -eFS_* -eCCACHE_* -i\.git -I.git -Zxz -z9
|
||||
|
15
debian/rules
vendored
15
debian/rules
vendored
@ -7,7 +7,6 @@
|
||||
FS_CFLAGS?=-ggdb3 -O2
|
||||
FS_CPPFLAGS?=
|
||||
FS_CXXFLAGS?=$(FS_CFLAGS)
|
||||
FS_INSTALL_SOUNDS?=true
|
||||
export PATH?=/usr/lib/ccache:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
export CFLAGS=$(FS_CFLAGS)
|
||||
export CPPFLAGS=$(FS_CPPFLAGS)
|
||||
@ -20,7 +19,6 @@ show_vars= \
|
||||
echo "CFLAGS='$(CFLAGS)'"; \
|
||||
echo "CXXFLAGS='$(CXXFLAGS)'"; \
|
||||
echo "CCACHE_DIR='$(CCACHE_DIR)'"; \
|
||||
echo "FS_INSTALL_SOUNDS='$(FS_INSTALL_SOUNDS)'"; \
|
||||
echo;
|
||||
|
||||
binary:
|
||||
@ -49,7 +47,7 @@ override_dh_auto_clean:
|
||||
|
||||
.stamp-bootstrap:
|
||||
@$(call show_vars)
|
||||
./bootstrap.sh
|
||||
./bootstrap.sh -j
|
||||
touch $@
|
||||
|
||||
.stamp-configure: .stamp-bootstrap
|
||||
@ -90,7 +88,6 @@ override_dh_strip:
|
||||
|
||||
override_dh_auto_install:
|
||||
dh_auto_install
|
||||
-$(FS_INSTALL_SOUNDS) && DESTDIR=debian/tmp make cd-sounds-install cd-moh-install
|
||||
mkdir -p debian/tmp/lib/systemd/system
|
||||
install -m0644 debian/freeswitch-systemd.freeswitch.service debian/tmp/lib/systemd/system/freeswitch.service
|
||||
rm -f debian/tmp/usr/share/freeswitch/grammar/model/communicator/COPYING
|
||||
@ -118,13 +115,5 @@ binary-quicktest:
|
||||
@$(call show_vars)
|
||||
echo "applications/mod_commands" > debian/modules.conf
|
||||
(cd debian && ./bootstrap.sh)
|
||||
env FS_INSTALL_SOUNDS=false dh binary \
|
||||
-Nfreeswitch-sounds-music-8k \
|
||||
-Nfreeswitch-sounds-music-16k \
|
||||
-Nfreeswitch-sounds-music-32k \
|
||||
-Nfreeswitch-sounds-music-48k \
|
||||
-Nfreeswitch-sounds-en-us-callie-8k \
|
||||
-Nfreeswitch-sounds-en-us-callie-16k \
|
||||
-Nfreeswitch-sounds-en-us-callie-32k \
|
||||
-Nfreeswitch-sounds-en-us-callie-48k
|
||||
dh binary
|
||||
|
||||
|
460
debian/util.sh
vendored
460
debian/util.sh
vendored
@ -6,12 +6,25 @@ set -e
|
||||
|
||||
ddir="."
|
||||
[ -n "${0%/*}" ] && ddir="${0%/*}"
|
||||
cd $ddir/../
|
||||
|
||||
#### lib
|
||||
|
||||
err () {
|
||||
echo "$0 error: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
announce () {
|
||||
cat >&2 <<EOF
|
||||
|
||||
########################################################################
|
||||
## $1
|
||||
########################################################################
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
xread () {
|
||||
local xIFS="$IFS"
|
||||
IFS=''
|
||||
@ -21,6 +34,35 @@ xread () {
|
||||
return $ret
|
||||
}
|
||||
|
||||
mk_dver () { echo "$1" | sed -e 's/-/~/g'; }
|
||||
mk_uver () { echo "$1" | sed -e 's/-.*$//' -e 's/~/-/'; }
|
||||
dsc_source () { dpkg-parsechangelog | grep '^Source:' | awk '{print $2}'; }
|
||||
dsc_ver () { dpkg-parsechangelog | grep '^Version:' | awk '{print $2}'; }
|
||||
up_ver () { mk_uver "$(dsc_ver)"; }
|
||||
dsc_base () { echo "$(dsc_source)_$(dsc_ver)"; }
|
||||
up_base () { echo "$(dsc_source)-$(up_ver)"; }
|
||||
|
||||
find_distro () {
|
||||
case "$1" in
|
||||
experimental) echo "sid";;
|
||||
unstable) echo "sid";;
|
||||
testing) echo "wheezy";;
|
||||
stable) echo "squeeze";;
|
||||
*) echo "$1";;
|
||||
esac
|
||||
}
|
||||
|
||||
find_suite () {
|
||||
case "$1" in
|
||||
sid) echo "unstable";;
|
||||
wheezy) echo "testing";;
|
||||
squeeze) echo "stable";;
|
||||
*) echo "$1";;
|
||||
esac
|
||||
}
|
||||
|
||||
#### debian/rules helpers
|
||||
|
||||
create_dbg_pkgs () {
|
||||
for x in $ddir/*; do
|
||||
test ! -d $x && continue
|
||||
@ -32,46 +74,6 @@ create_dbg_pkgs () {
|
||||
done
|
||||
}
|
||||
|
||||
list_build_depends () {
|
||||
test -f $ddir/.stamp-bootstrap || (cd $ddir && ./bootstrap.sh)
|
||||
local deps="" found=false
|
||||
while xread l; do
|
||||
if [ "${l%%:*}" = "Build-Depends" ]; then
|
||||
deps="${l#*:}"
|
||||
found=true
|
||||
continue
|
||||
elif $found; then
|
||||
if [ -z "$l" ]; then
|
||||
# is newline
|
||||
break
|
||||
elif [ -z "${l##\#*}" ]; then
|
||||
# is comment
|
||||
continue
|
||||
elif [ -z "${l## *}" ]; then
|
||||
# is continuation line
|
||||
deps="$deps $(echo "$l" | sed -e 's/^ *//' -e 's/ *([^)]*)//g' -e 's/,//g')"
|
||||
else
|
||||
# is a new header
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done < $ddir/control
|
||||
echo "${deps# }"
|
||||
}
|
||||
|
||||
install_build_depends () {
|
||||
local apt=""
|
||||
if [ -n "$(which aptitude)" ]; then
|
||||
apt=$(which aptitude)
|
||||
elif [ -n "$(which apt-get)" ]; then
|
||||
apt=$(which apt-get)
|
||||
else
|
||||
err "Can't find apt-get or aptitude; are you running on debian?"
|
||||
fi
|
||||
$apt install -y $(list_build_depends)
|
||||
touch $ddir/.stamp-build-depends
|
||||
}
|
||||
|
||||
cwget () {
|
||||
local url="$1" f="${1##*/}"
|
||||
echo "fetching: $url to $f" >&2
|
||||
@ -86,129 +88,323 @@ cwget () {
|
||||
}
|
||||
|
||||
getlib () {
|
||||
local sd="$1" url="$2" f="${2##*/}"
|
||||
(cd $sd/libs \
|
||||
&& cwget "$url" \
|
||||
&& tar -xv --no-same-owner --no-same-permissions -f "$f" \
|
||||
&& rm -f "$f" \
|
||||
&& mkdir -p $f)
|
||||
}
|
||||
|
||||
getsound () {
|
||||
local sd="$1" url="$2" f="${2##*/}"
|
||||
(cd $sd \
|
||||
&& cwget "$url")
|
||||
local url="$1" f="${1##*/}"
|
||||
cwget "$url"
|
||||
tar -xv --no-same-owner --no-same-permissions -f "$f"
|
||||
rm -f "$f" && mkdir -p $f && touch $f/.download-stamp
|
||||
}
|
||||
|
||||
getlibs () {
|
||||
local sd="$1"
|
||||
# get pinned libraries
|
||||
getlib $sd http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/soundtouch-1.6.0.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/opus-0.9.0.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz
|
||||
getlib $sd http://download.zeromq.org/zeromq-2.1.9.tar.gz \
|
||||
|| getlib $sd http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz
|
||||
getlib $sd http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz
|
||||
# get sounds and music
|
||||
for x in 8000 16000 32000 48000; do
|
||||
getsound $sd http://files.freeswitch.org/freeswitch-sounds-en-us-callie-$x-1.0.18.tar.gz
|
||||
getsound $sd http://files.freeswitch.org/freeswitch-sounds-music-$x-1.0.8.tar.gz
|
||||
done
|
||||
getlib http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz
|
||||
getlib http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/soundtouch-1.6.0.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2
|
||||
getlib http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/opus-0.9.0.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz
|
||||
getlib http://download.zeromq.org/zeromq-2.1.9.tar.gz \
|
||||
|| getlib http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz
|
||||
getlib http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz
|
||||
# cleanup mongo
|
||||
(
|
||||
cd $sd/libs/mongo-cxx-driver-v1.8
|
||||
cd mongo-cxx-driver-v1.8
|
||||
rm -rf config.log .sconf_temp *Test *Example
|
||||
find . -name "*.o" -exec rm -f {} \;
|
||||
)
|
||||
}
|
||||
|
||||
get_current_version () {
|
||||
cat $ddir/changelog \
|
||||
| grep -e '^freeswitch ' \
|
||||
| awk '{print $2}' \
|
||||
| sed -e 's/[()]//g' -e 's/-.*//'
|
||||
}
|
||||
|
||||
_create_orig () {
|
||||
. $ddir/../scripts/ci/common.sh
|
||||
eval $(parse_version "$(get_current_version)")
|
||||
local destdir="$1" xz_level="$2" n=freeswitch
|
||||
local d=${n}-${dver} f=${n}_${dver}
|
||||
local sd=${ddir}/sdeb/$d
|
||||
[ -n "$destdir" ] || destdir=$ddir/../../
|
||||
mkdir -p $sd
|
||||
tar -c -C $ddir/../ \
|
||||
--exclude=.git \
|
||||
--exclude=debian \
|
||||
--exclude=freeswitch.xcodeproj \
|
||||
--exclude=fscomm \
|
||||
--exclude=htdocs \
|
||||
--exclude=w32 \
|
||||
--exclude=web \
|
||||
-vf - . | tar -x -C $sd -vf -
|
||||
(cd $sd && set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev")
|
||||
getlibs $sd
|
||||
tar -c -C $ddir/sdeb -vf $ddir/sdeb/$f.orig.tar $d
|
||||
xz -${xz_level}v $ddir/sdeb/$f.orig.tar
|
||||
mv $ddir/sdeb/$f.orig.tar.xz $destdir
|
||||
rm -rf $ddir/sdeb
|
||||
check_repo_clean () {
|
||||
git diff-index --quiet --cached HEAD \
|
||||
|| err "uncommitted changes present"
|
||||
git diff-files --quiet \
|
||||
|| err "unclean working tree"
|
||||
git diff-index --quiet HEAD \
|
||||
|| err "unclean repository"
|
||||
! git ls-files --other --error-unmatch . >/dev/null 2>&1 \
|
||||
|| err "untracked files or build products present"
|
||||
}
|
||||
|
||||
create_orig () {
|
||||
local xz_level="6"
|
||||
while getopts 'dz:' o; do
|
||||
{
|
||||
set -e
|
||||
local OPTIND OPTARG
|
||||
local uver="" bundle_deps=false zl=9e
|
||||
while getopts 'bnv:z:' o "$@"; do
|
||||
case "$o" in
|
||||
d) set -vx;;
|
||||
z) xz_level="$OPTARG";;
|
||||
b) bundle_deps=true;;
|
||||
n) uver="nightly";;
|
||||
v) uver="$OPTARG";;
|
||||
z) zl="$OPTARG";;
|
||||
esac
|
||||
done
|
||||
shift $(($OPTIND-1))
|
||||
_create_orig "$1" "$xz_level"
|
||||
[ -z "$uver" ] || [ "$uver" = "nightly" ] \
|
||||
&& uver="$(cat build/next-release.txt)-n$(date +%Y%m%dT%H%M%SZ)"
|
||||
local treeish="$1" dver="$(mk_dver "$uver")"
|
||||
local orig="../freeswitch_$dver.orig.tar.xz"
|
||||
[ -n "$treeish" ] || treeish="HEAD"
|
||||
check_repo_clean
|
||||
git reset --hard "$treeish"
|
||||
mv .gitattributes .gitattributes.orig
|
||||
grep .gitattributes.orig \
|
||||
-e '\bdebian-ignore\b' \
|
||||
-e '\bdfsg-nonfree\b' \
|
||||
| while xread l; do
|
||||
echo "$l export-ignore" >> .gitattributes
|
||||
done
|
||||
if $bundle_deps; then
|
||||
(cd libs && getlibs)
|
||||
git add -f libs
|
||||
fi
|
||||
./build/set-fs-version.sh "$uver" && git add configure.in
|
||||
git commit --allow-empty -m "nightly v$uver"
|
||||
git archive -v \
|
||||
--worktree-attributes \
|
||||
--format=tar \
|
||||
--prefix=freeswitch-$uver/ \
|
||||
HEAD \
|
||||
| xz -c -${zl}v > $orig
|
||||
mv .gitattributes.orig .gitattributes
|
||||
git reset --hard HEAD^ && git clean -fdx
|
||||
} 1>&2
|
||||
echo $orig
|
||||
}
|
||||
|
||||
set_modules_quicktest () {
|
||||
cat > debian/modules.conf <<EOF
|
||||
applications/mod_commands
|
||||
EOF
|
||||
}
|
||||
|
||||
create_dsc () {
|
||||
. $ddir/../scripts/ci/common.sh
|
||||
local xz_level="6"
|
||||
while getopts 'dz:' o; do
|
||||
{
|
||||
set -e
|
||||
local OPTIND OPTARG modules_list="" speed="normal"
|
||||
while getopts 'm:s:' o "$@"; do
|
||||
case "$o" in
|
||||
d) set -vx;;
|
||||
z) xz_level="$OPTARG";;
|
||||
m) modules_list="$OPTARG";;
|
||||
s) speed="$OPTARG";;
|
||||
esac
|
||||
done
|
||||
shift $(($OPTIND-1))
|
||||
eval $(parse_version "$(get_current_version)")
|
||||
local destdir="$1" n=freeswitch
|
||||
local d=${n}-${dver} f=${n}_${dver}
|
||||
[ -n "$destdir" ] || destdir=$ddir/../../
|
||||
[ -f $destdir/$f.orig.tar.xz ] \
|
||||
|| _create_orig "$1" "${xz_level}"
|
||||
(
|
||||
ddir=$(pwd)/$ddir
|
||||
cd $destdir
|
||||
mkdir -p $f
|
||||
cp -a $ddir $f
|
||||
dpkg-source -b -i.* -Zxz -z9 $f
|
||||
)
|
||||
local distro="$(find_distro $1)" orig="$2"
|
||||
local suite="$(find_suite $distro)"
|
||||
local orig_ver="$(echo "$orig" | sed -e 's/^.*_//' -e 's/\.orig\.tar.*$//')"
|
||||
local dver="${orig_ver}-1~${distro}+1"
|
||||
[ -x "$(which dch)" ] \
|
||||
|| err "package devscripts isn't installed"
|
||||
if [ -n "$modules_list" ]; then
|
||||
set_modules_${modules_list}
|
||||
fi
|
||||
(cd debian && ./bootstrap.sh -c $distro)
|
||||
case "$speed" in
|
||||
paranoid) sed -i ./debian/rules \
|
||||
-e '/\.stamp-bootstrap:/{:l2 n; /\.\/bootstrap.sh -j/{s/ -j//; :l3 n; b l3}; b l2};' ;;
|
||||
reckless) sed -i ./debian/rules \
|
||||
-e '/\.stamp-build:/{:l2 n; /make/{s/$/ -j/; :l3 n; b l3}; b l2};' ;;
|
||||
esac
|
||||
git add debian/rules
|
||||
dch -b -m -v "$dver" --force-distribution -D "$suite" "Nightly build."
|
||||
git add debian/changelog && git commit -m "nightly v$orig_ver"
|
||||
dpkg-source -i.* -Zxz -z9 -b .
|
||||
dpkg-genchanges -S > ../$(dsc_base)_source.changes
|
||||
local dsc="../$(dsc_base).dsc"
|
||||
git reset --hard HEAD^ && git clean -fdx
|
||||
} 1>&2
|
||||
echo $dsc
|
||||
}
|
||||
|
||||
cmd="$1"
|
||||
fmt_debug_hook () {
|
||||
cat <<'EOF'
|
||||
#!/bin/bash
|
||||
export debian_chroot="cow"
|
||||
cd /tmp/buildd/*/debian/..
|
||||
/bin/bash < /dev/tty > /dev/tty 2> /dev/tty
|
||||
EOF
|
||||
}
|
||||
|
||||
build_debs () {
|
||||
{
|
||||
set -e
|
||||
local OPTIND OPTARG debug_hook=false hookdir="" cow_build_opts=""
|
||||
while getopts 'Bbd' o "$@"; do
|
||||
case "$o" in
|
||||
B) cow_build_opts="--debbuildopts '-B'";;
|
||||
b) cow_build_opts="--debbuildopts '-b'";;
|
||||
d) debug_hook=true;;
|
||||
esac
|
||||
done
|
||||
shift $(($OPTIND-1))
|
||||
local distro="$(find_distro $1)" dsc="$2" arch="$3"
|
||||
if [ -z "$distro" ] || [ "$distro" = "auto" ]; then
|
||||
if ! (echo "$dsc" | grep -e '-[0-9]*~[a-z]*+[0-9]*'); then
|
||||
err "no distro specified or found"
|
||||
fi
|
||||
local x="$(echo $dsc | sed -e 's/^[^-]*-[0-9]*~//' -e 's/+[^+]*$//')"
|
||||
distro="$(find_distro $x)"
|
||||
fi
|
||||
[ -n "$arch" ] || arch="$(dpkg-architecture | grep '^DEB_BUILD_ARCH=' | cut -d'=' -f2)"
|
||||
[ -x "$(which cowbuilder)" ] \
|
||||
|| err "package cowbuilder isn't installed"
|
||||
local cow_img=/var/cache/pbuilder/base-$distro-$arch.cow
|
||||
cow () {
|
||||
cowbuilder "$@" \
|
||||
--distribution $distro \
|
||||
--architecture $arch \
|
||||
--basepath $cow_img
|
||||
}
|
||||
if ! [ -d $cow_img ]; then
|
||||
announce "Creating base $distro-$arch image..."
|
||||
cow --create
|
||||
fi
|
||||
announce "Updating base $distro-$arch image..."
|
||||
cow --update
|
||||
announce "Building $distro-$arch DEBs from $dsc..."
|
||||
if $debug_hook; then
|
||||
mkdir -p .hooks
|
||||
fmt_debug_hook > .hooks/C10shell
|
||||
chmod +x .hooks/C10shell
|
||||
hookdir=$(pwd)/.hooks
|
||||
fi
|
||||
cow --build $dsc \
|
||||
--hookdir "$hookdir" \
|
||||
--buildresult ../ \
|
||||
$cow_build_opts
|
||||
} 1>&2
|
||||
echo ${dsc%.dsc}_${arch}.changes
|
||||
}
|
||||
|
||||
build_all () {
|
||||
local OPTIND OPTARG
|
||||
local orig_opts="" dsc_opts="" deb_opts=""
|
||||
local archs="" distros="" par=false
|
||||
while getopts 'a:bc:djnm:s:v:z:' o "$@"; do
|
||||
case "$o" in
|
||||
a) archs="$archs $OPTARG";;
|
||||
b) orig_opts="$orig_opts -b";;
|
||||
c) distros="$distros $OPTARG";;
|
||||
d) deb_opts="$deb_opts -d";;
|
||||
j) par=true;;
|
||||
n) orig_opts="$orig_opts -n";;
|
||||
m) dsc_opts="$dsc_opts -m$OPTARG";;
|
||||
s) dsc_opts="$dsc_opts -s$OPTARG";;
|
||||
v) orig_opts="$orig_opts -v$OPTARG";;
|
||||
z) orig_opts="$orig_opts -z$OPTARG";;
|
||||
esac
|
||||
done
|
||||
shift $(($OPTIND-1))
|
||||
[ -n "$archs" ] || archs="amd64 i386"
|
||||
[ -n "$distros" ] || distros="sid wheezy squeeze"
|
||||
local orig="$(create_orig $orig_opts HEAD | tail -n1)"
|
||||
mkdir -p ../log
|
||||
> ../log/changes
|
||||
echo; echo; echo; echo
|
||||
trap 'echo "Killing children...">&2; for x in $(jobs -p); do kill $x; done' EXIT
|
||||
if [ "${orig:0:2}" = ".." ]; then
|
||||
for distro in $distros; do
|
||||
echo "Creating $distro dsc..." >&2
|
||||
local dsc="$(create_dsc $dsc_opts $distro $orig 2>../log/$distro | tail -n1)"
|
||||
echo "Done creating $distro dsc." >&2
|
||||
if [ "${dsc:0:2}" = ".." ]; then
|
||||
local lopts="-b"
|
||||
for arch in $archs; do
|
||||
{
|
||||
echo "Building $distro-$arch debs..." >&2
|
||||
local changes="$(build_debs $lopts $deb_opts $distro $dsc $arch 2>../log/$distro-$arch | tail -n1)"
|
||||
echo "Done building $distro-$arch debs." >&2
|
||||
if [ "${changes:0:2}" = ".." ]; then
|
||||
echo "$changes" >> ../log/changes
|
||||
fi
|
||||
} &
|
||||
$par || wait
|
||||
lopts="-B"
|
||||
done
|
||||
fi
|
||||
done
|
||||
! $par || wait
|
||||
fi
|
||||
trap - EXIT
|
||||
cat ../log/changes
|
||||
}
|
||||
|
||||
usage () {
|
||||
cat >&2 <<EOF
|
||||
$0 [opts] [cmd] [cmd-opts]
|
||||
|
||||
options:
|
||||
|
||||
-d Enable debugging mode.
|
||||
|
||||
commands:
|
||||
|
||||
archive-orig
|
||||
|
||||
build-all
|
||||
|
||||
-a Specify architectures
|
||||
-b Bundle downloaded libraries in source package
|
||||
-c Specify distributions
|
||||
-d Enable cowbuilder debug hook
|
||||
-j Build debs in parallel
|
||||
-n Nightly build
|
||||
-m [ quicktest ]
|
||||
Choose custom list of modules to build
|
||||
-s [ paranoid | reckless ]
|
||||
Set FS bootstrap/build -j flags
|
||||
-v Set version
|
||||
-z Set compression level
|
||||
|
||||
build-debs <distro> <dsc-file> <architecture>
|
||||
|
||||
-B Binary architecture-dependent build
|
||||
-b Binary-only build
|
||||
-d Enable cowbuilder debug hook
|
||||
|
||||
create-dbg-pkgs
|
||||
|
||||
create-dsc <distro> <orig-file>
|
||||
|
||||
-m [ quicktest ]
|
||||
Choose custom list of modules to build
|
||||
-s [ paranoid | reckless ]
|
||||
Set FS bootstrap/build -j flags
|
||||
|
||||
create-orig <treeish>
|
||||
|
||||
-b Bundle downloaded libraries in source package
|
||||
-n Nightly build
|
||||
-v Set version
|
||||
-z Set compression level
|
||||
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
while getopts 'dh' o "$@"; do
|
||||
case "$o" in
|
||||
d) set -vx;;
|
||||
h) usage;;
|
||||
esac
|
||||
done
|
||||
shift $(($OPTIND-1))
|
||||
|
||||
cmd="$1"; [ -n "$cmd" ] || usage
|
||||
shift
|
||||
case "$cmd" in
|
||||
archive-orig) archive_orig "$@" ;;
|
||||
build-all) build_all "$@" ;;
|
||||
build-debs) build_debs "$@" ;;
|
||||
create-dbg-pkgs) create_dbg_pkgs ;;
|
||||
create-dsc) create_dsc "$@" ;;
|
||||
create-orig) create_orig "$@" ;;
|
||||
list-build-depends) list_build_depends ;;
|
||||
install-build-depends) install_build_depends ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
|
||||
|
1
libs/.gitignore
vendored
1
libs/.gitignore
vendored
@ -225,6 +225,7 @@ missing
|
||||
/ldns/doc/ldns_manpages
|
||||
/ldns/include/
|
||||
/ldns/ldns/config.h
|
||||
/ldns/ldns/ldns
|
||||
/ldns/ldns/net.h
|
||||
/ldns/ldns/util.h
|
||||
/ldns/lib
|
||||
|
@ -288,7 +288,7 @@ static void cycle_foreground(ftdm_channel_t *ftdmchan, int flash, const char *bc
|
||||
const char *buuid;
|
||||
tech_pvt = switch_core_session_get_private(session);
|
||||
channel = switch_core_session_get_channel(session);
|
||||
buuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
buuid = switch_channel_get_partner_uuid(channel);
|
||||
|
||||
|
||||
if (tokencnt == 1 && flash) {
|
||||
@ -2142,19 +2142,19 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
|
||||
|
||||
if ((session_a = switch_core_session_locate(ftdm_channel_get_token(sigmsg->channel, 0)))) {
|
||||
channel_a = switch_core_session_get_channel(session_a);
|
||||
br_a_uuid = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
br_a_uuid = switch_channel_get_partner_uuid(channel_a);
|
||||
|
||||
tech_pvt = switch_core_session_get_private(session_a);
|
||||
stop_hold(session_a, switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
stop_hold(session_a, switch_channel_get_partner_uuid(channel_a));
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
|
||||
}
|
||||
|
||||
if ((session_b = switch_core_session_locate(ftdm_channel_get_token(sigmsg->channel, 1)))) {
|
||||
channel_b = switch_core_session_get_channel(session_b);
|
||||
br_b_uuid = switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
br_b_uuid = switch_channel_get_partner_uuid(channel_b);
|
||||
|
||||
tech_pvt = switch_core_session_get_private(session_b);
|
||||
stop_hold(session_a, switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
stop_hold(session_a, switch_channel_get_partner_uuid(channel_b));
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
|
||||
}
|
||||
|
||||
@ -2222,7 +2222,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
|
||||
|
||||
tech_pvt = switch_core_session_get_private(session);
|
||||
channel = switch_core_session_get_channel(session);
|
||||
buuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
buuid = switch_channel_get_partner_uuid(channel);
|
||||
ftdm_channel_call_unhold(sigmsg->channel);
|
||||
stop_hold(session, buuid);
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
|
||||
|
@ -527,7 +527,12 @@ typedef struct zrtp_stream_mescache_t
|
||||
zrtp_retry_task_t errorack_task;
|
||||
zrtp_retry_task_t sasrelay_task;
|
||||
|
||||
zrtp_string16_t signaling_hash;
|
||||
/*!
|
||||
* Hash pre-image of the remote party Hello retrieved from Signaling. When
|
||||
* user calls zrtp_signaling_hash_set() libzrtp stores hash value in this
|
||||
* variable and checks all incoming Hello-s to prevent DOS attacks.
|
||||
*/
|
||||
zrtp_string64_t signaling_hash;
|
||||
} zrtp_stream_mescache_t;
|
||||
|
||||
|
||||
@ -723,13 +728,6 @@ struct zrtp_stream_t
|
||||
*/
|
||||
zrtp_protocol_t *protocol;
|
||||
|
||||
/*!
|
||||
* Hash pre-image of the remote party Hello retrieved from Signaling. When
|
||||
* user calls zrtp_signaling_hash_set() libzrtp stores hash value in this
|
||||
* variable and checks all incoming Hellos to prevent DOS attacks.
|
||||
*/
|
||||
zrtp_string128_t signaling_hash;
|
||||
|
||||
/*!< Holder for RTP/ZRTP media stream options. */
|
||||
zrtp_media_context_t media_ctx;
|
||||
|
||||
|
@ -12,8 +12,8 @@
|
||||
|
||||
#define LIBZRTP_VERSION_MAJOR 1
|
||||
|
||||
#define LIBZRTP_VERSION_MINOR 13
|
||||
#define LIBZRTP_VERSION_BUILD 604
|
||||
#define LIBZRTP_VERSION_STR "v1.13 604"
|
||||
#define LIBZRTP_VERSION_MINOR 15
|
||||
#define LIBZRTP_VERSION_BUILD 607
|
||||
#define LIBZRTP_VERSION_STR "v1.15 607"
|
||||
|
||||
#endif /*__ZRTP_VERSION_H__*/
|
||||
|
@ -32,7 +32,7 @@ case $target_os in
|
||||
esac
|
||||
|
||||
|
||||
AM_INIT_AUTOMAKE([libzrtp], [1.14])
|
||||
AM_INIT_AUTOMAKE([libzrtp], [1.15])
|
||||
AX_PREFIX_CONFIG_H(../../include/zrtp_config_unix.h,ZRTP,config/config.h)
|
||||
|
||||
CFLAGS="$CFLAGS -Wno-unused-parameter -fno-strict-aliasing -fPIC -DZRTP_AUTOMAKE=1"
|
||||
|
@ -418,8 +418,6 @@ zrtp_status_t zrtp_stream_attach(zrtp_session_t *session, zrtp_stream_t** stream
|
||||
return zrtp_status_alloc_fail;
|
||||
}
|
||||
|
||||
ZSTR_SET_EMPTY(new_stream->signaling_hash);
|
||||
|
||||
/*
|
||||
* Initialize the private data stream with default initial values
|
||||
*/
|
||||
@ -437,6 +435,8 @@ zrtp_status_t zrtp_stream_attach(zrtp_session_t *session, zrtp_stream_t** stream
|
||||
ZSTR_SET_EMPTY(new_stream->cc.zrtp_key);
|
||||
ZSTR_SET_EMPTY(new_stream->cc.peer_zrtp_key);
|
||||
|
||||
ZSTR_SET_EMPTY(new_stream->messages.signaling_hash);
|
||||
|
||||
new_stream->dh_cc.initialized_with = ZRTP_COMP_UNKN;
|
||||
bnBegin(&new_stream->dh_cc.peer_pv);
|
||||
ZSTR_SET_EMPTY(new_stream->dh_cc.dhss);
|
||||
@ -638,8 +638,8 @@ zrtp_status_t zrtp_signaling_hash_set( zrtp_stream_t* ctx,
|
||||
ctx->messages.signaling_hash.length = ZRTP_MESSAGE_HASH_SIZE;
|
||||
|
||||
{
|
||||
char buff[66];
|
||||
ZRTP_LOG(3, (_ZTU_,"SIGNALLING HAS was ADDED for the comparing. ID=%u\n", ctx->id));
|
||||
char buff[64];
|
||||
ZRTP_LOG(3, (_ZTU_,"SIGNALLING HAS was ADDED for the comparision. ID=%u\n", ctx->id));
|
||||
ZRTP_LOG(3, (_ZTU_,"Hash=%s.\n", hex2str(hash_buff, hash_buff_length, buff, sizeof(buff))));
|
||||
}
|
||||
|
||||
|
@ -128,13 +128,15 @@ zrtp_status_t _zrtp_machine_process_sasrelay(zrtp_stream_t *stream, zrtp_rtp_inf
|
||||
zrtp_status_t s = zrtp_status_fail;
|
||||
zrtp_string128_t hmac = ZSTR_INIT_EMPTY(hmac);
|
||||
char zerosashash[32];
|
||||
unsigned sas_scheme_did_change = 0;
|
||||
unsigned sas_hash_did_change = 0;
|
||||
|
||||
/* (padding + sig_len + flags) + SAS scheme and SAS hash */
|
||||
const uint8_t encrypted_body_size = (2 + 1 + 1) + 4 + 32;
|
||||
|
||||
zrtp_memset(zerosashash, 0, sizeof(zerosashash));
|
||||
|
||||
/* Check if the remote endpoint is assiggneed to relay the SAS values */
|
||||
/* Check if the remote endpoint is assigned to relay the SAS values */
|
||||
if (!stream->peer_mitm_flag) {
|
||||
ZRTP_LOG(2,(_ZTU_, ZRTP_RELAYED_SAS_FROM_NONMITM_STR));
|
||||
return zrtp_status_fail;
|
||||
@ -157,7 +159,7 @@ zrtp_status_t _zrtp_machine_process_sasrelay(zrtp_stream_t *stream, zrtp_rtp_inf
|
||||
return zrtp_status_fail;
|
||||
}
|
||||
|
||||
ZRTP_LOG(3,(_ZTU_, "\tHMAC value for the SASRELAY is correct - decryptiong...\n"));
|
||||
ZRTP_LOG(3,(_ZTU_, "\tHMAC value for the SASRELAY is correct - decrypting...\n"));
|
||||
|
||||
/* Then we need to decrypt Confirm body */
|
||||
do
|
||||
@ -217,9 +219,14 @@ zrtp_status_t _zrtp_machine_process_sasrelay(zrtp_stream_t *stream, zrtp_rtp_inf
|
||||
_zrtp_machine_enter_initiatingerror(stream, zrtp_error_invalid_packet, 1);
|
||||
return zrtp_status_fail;
|
||||
}
|
||||
|
||||
/* Check is SAS rendering did change */
|
||||
if (rendering_id != session->sasscheme->base.id) {
|
||||
session->sasscheme = zrtp_comp_find(ZRTP_CC_SAS, rendering_id, session->zrtp );
|
||||
|
||||
ZRTP_LOG(3,(_ZTU_,"\tSasrelay: New Rendering scheme %.4s.\n", session->sasscheme->base.type));
|
||||
sas_scheme_did_change = 1;
|
||||
ZRTP_LOG(3,(_ZTU_,"\tSasrelay: Rendering scheme was updated to %.4s.\n", session->sasscheme->base.type));
|
||||
}
|
||||
|
||||
if (session->secrets.matches & ZRTP_BIT_PBX) {
|
||||
if ( ( ((uint32_t) *sasrelay->sas_scheme) != (uint32_t)0x0L ) &&
|
||||
@ -231,7 +238,8 @@ zrtp_status_t _zrtp_machine_process_sasrelay(zrtp_stream_t *stream, zrtp_rtp_inf
|
||||
zrtp_memcpy(session->sasbin.buffer, sasrelay->sashash, session->sasbin.length);
|
||||
stream->mitm_mode = ZRTP_MITM_MODE_RECONFIRM_CLIENT;
|
||||
|
||||
ZRTP_LOG(3,(_ZTU_,"\tSasRelay: SAS value was updated bin=%s.\n",
|
||||
sas_hash_did_change = 1;
|
||||
ZRTP_LOG(3,(_ZTU_,"\tSasRelay: SAS value was updated to bin=%s.\n",
|
||||
hex2str(buff, sizeof(buff), session->sasbin.buffer, session->sasbin.length)));
|
||||
}
|
||||
} else if (0 != zrtp_memcmp(sasrelay->sashash, zerosashash, sizeof(sasrelay->sashash))) {
|
||||
@ -242,6 +250,13 @@ zrtp_status_t _zrtp_machine_process_sasrelay(zrtp_stream_t *stream, zrtp_rtp_inf
|
||||
ZRTP_LOG(1,(_ZTU_, "\rERROR! For SasRelay Other secret doesn't match. ID=%u\n", stream->id));
|
||||
}
|
||||
|
||||
|
||||
/* Generate new SAS if hash or rendering scheme did change.
|
||||
* Note: latest libzrtp may send "empty" SasRelay with the same SAS rendering
|
||||
* scheme and empty Hello hash for consistency reasons, we should ignore
|
||||
* such packets.
|
||||
*/
|
||||
if (sas_scheme_did_change || sas_hash_did_change) {
|
||||
s = session->sasscheme->compute(session->sasscheme, stream, session->hash, 1);
|
||||
if (zrtp_status_ok != s) {
|
||||
_zrtp_machine_enter_initiatingerror(stream, zrtp_error_software, 1);
|
||||
@ -253,6 +268,7 @@ zrtp_status_t _zrtp_machine_process_sasrelay(zrtp_stream_t *stream, zrtp_rtp_inf
|
||||
if (session->zrtp->cb.event_cb.on_zrtp_protocol_event) {
|
||||
session->zrtp->cb.event_cb.on_zrtp_protocol_event(stream, ZRTP_EVENT_LOCAL_SAS_UPDATED);
|
||||
}
|
||||
}
|
||||
|
||||
return zrtp_status_ok;
|
||||
}
|
||||
@ -492,7 +508,7 @@ zrtp_status_t zrtp_update_remote_options( zrtp_stream_t* stream,
|
||||
return zrtp_status_bad_param;
|
||||
}
|
||||
|
||||
/* Don't allow to transfer the SAS if the library wasn't initalized as MiTM endpoint */
|
||||
/* Don't allow to transfer the SAS if the library wasn't initialized as MiTM endpoint */
|
||||
if (!stream->zrtp->is_mitm) {
|
||||
ZRTP_LOG(3,(_ZTU_,"\tERROR! The endpoint can't transfer SAS values to other endpoints"
|
||||
" without introducing itself by M-flag in Hello. see zrtp_init().\n"));
|
||||
|
@ -488,7 +488,7 @@ zrtp_status_t _zrtp_packet_preparse( zrtp_stream_t* stream,
|
||||
(const char*) info->message,
|
||||
zrtp_ntoh16(((zrtp_packet_Hello_t*) info->message)->hdr.length)*4,
|
||||
ZSTR_GV(hash_str) );
|
||||
if (!zrtp_memcmp(stream->messages.signaling_hash.buffer, hash_str.buffer, ZRTP_MESSAGE_HASH_SIZE)) {
|
||||
if (zrtp_memcmp(stream->messages.signaling_hash.buffer, hash_str.buffer, ZRTP_MESSAGE_HASH_SIZE)) {
|
||||
if (stream->zrtp->cb.event_cb.on_zrtp_security_event) {
|
||||
stream->zrtp->cb.event_cb.on_zrtp_security_event(stream, ZRTP_EVENT_WRONG_SIGNALING_HASH);
|
||||
}
|
||||
|
@ -297,7 +297,7 @@ static void cycle_foreground(zap_channel_t *zchan, int flash, const char *bcast)
|
||||
const char *buuid;
|
||||
tech_pvt = switch_core_session_get_private(session);
|
||||
channel = switch_core_session_get_channel(session);
|
||||
buuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
buuid = switch_channel_get_partner_uuid(channel);
|
||||
|
||||
|
||||
if (zchan->token_count == 1 && flash) {
|
||||
@ -1663,19 +1663,19 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
|
||||
|
||||
if ((session_a = switch_core_session_locate(sigmsg->channel->tokens[0]))) {
|
||||
channel_a = switch_core_session_get_channel(session_a);
|
||||
br_a_uuid = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
br_a_uuid = switch_channel_get_partner_uuid(channel_a);
|
||||
|
||||
tech_pvt = switch_core_session_get_private(session_a);
|
||||
stop_hold(session_a, switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
stop_hold(session_a, switch_channel_get_partner_uuid(channel_a));
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
|
||||
}
|
||||
|
||||
if ((session_b = switch_core_session_locate(sigmsg->channel->tokens[1]))) {
|
||||
channel_b = switch_core_session_get_channel(session_b);
|
||||
br_b_uuid = switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
br_b_uuid = switch_channel_get_partner_uuid(channel_b);
|
||||
|
||||
tech_pvt = switch_core_session_get_private(session_b);
|
||||
stop_hold(session_a, switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
stop_hold(session_a, switch_channel_get_partner_uuid(channel_b));
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
|
||||
}
|
||||
|
||||
@ -1738,7 +1738,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
|
||||
|
||||
tech_pvt = switch_core_session_get_private(session);
|
||||
channel = switch_core_session_get_channel(session);
|
||||
buuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
buuid = switch_channel_get_partner_uuid(channel);
|
||||
zap_set_state_locked(sigmsg->channel, ZAP_CHANNEL_STATE_UP);
|
||||
stop_hold(session, buuid);
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
|
||||
|
@ -1 +1 @@
|
||||
Thu May 3 16:30:20 CDT 2012
|
||||
Sat Jun 9 03:24:47 UTC 2012
|
||||
|
@ -198,6 +198,12 @@ enum tport_tls_verify_policy {
|
||||
TPTLS_VERIFY_SUBJECTS_ALL = 0xF,
|
||||
};
|
||||
|
||||
TPORT_DLL extern tag_typedef_t tptag_tls_timeout;
|
||||
#define TPTAG_TLS_TIMEOUT(x) tptag_tls_timeout, tag_uint_v((x))
|
||||
|
||||
TPORT_DLL extern tag_typedef_t tptag_tls_timeout_ref;
|
||||
#define TPTAG_TLS_TIMEOUT_REF(x) tptag_tls_timeout_ref, tag_uint_vr(&(x))
|
||||
|
||||
TPORT_DLL extern tag_typedef_t tptag_tls_passphrase;
|
||||
#define TPTAG_TLS_PASSPHRASE(x) tptag_tls_passphrase, tag_str_v(x)
|
||||
|
||||
|
@ -280,6 +280,19 @@ tag_typedef_t tptag_compartment = PTRTAG_TYPEDEF(compartment);
|
||||
*/
|
||||
tag_typedef_t tptag_tls_version = UINTTAG_TYPEDEF(tls_version);
|
||||
|
||||
/**@def TPTAG_TLS_TIMEOUT(x)
|
||||
*
|
||||
* Sets the maximum TLS session lifetime in seconds.
|
||||
*
|
||||
* The default value is 300 seconds.
|
||||
*
|
||||
* Use with tport_tbind(), nua_create(), nta_agent_create(),
|
||||
* nta_agent_add_tport(), nth_engine_create(), or initial nth_site_create().
|
||||
*
|
||||
* @NEW_UNRELEASED.
|
||||
*/
|
||||
tag_typedef_t tptag_tls_timeout = UINTTAG_TYPEDEF(tls_timeout);
|
||||
|
||||
/**@def TPTAG_TLS_VERIFY_PEER(x)
|
||||
* @par Depreciated:
|
||||
* Alias for TPTAG_TLS_VERIFY_POLICY(TPTLS_VERIFY_IN|TPTLS_VERIFY_OUT)
|
||||
|
@ -311,6 +311,8 @@ int tls_init_context(tls_t *tls, tls_issues_t const *ti)
|
||||
return -1;
|
||||
}
|
||||
|
||||
SSL_CTX_set_timeout(tls->ctx, ti->timeout);
|
||||
|
||||
/* Set callback if we have a passphrase */
|
||||
if (ti->passphrase != NULL) {
|
||||
SSL_CTX_set_default_passwd_cb(tls->ctx, passwd_cb);
|
||||
|
@ -65,6 +65,7 @@ typedef struct tls_issues_s {
|
||||
*/
|
||||
int version; /* For tls1, version is 1. When ssl3/ssl2 is
|
||||
* used, it is 0. */
|
||||
unsigned timeout; /* Maximum session lifetime in seconds */
|
||||
} tls_issues_t;
|
||||
|
||||
typedef struct tport_tls_s {
|
||||
|
@ -181,6 +181,7 @@ static int tport_tls_init_master(tport_primary_t *pri,
|
||||
char *tbf = NULL;
|
||||
char const *path = NULL;
|
||||
unsigned tls_version = 1;
|
||||
unsigned tls_timeout = 300;
|
||||
unsigned tls_verify = 0;
|
||||
char const *passphrase = NULL;
|
||||
unsigned tls_policy = TPTLS_VERIFY_NONE;
|
||||
@ -198,6 +199,7 @@ static int tport_tls_init_master(tport_primary_t *pri,
|
||||
tl_gets(tags,
|
||||
TPTAG_CERTIFICATE_REF(path),
|
||||
TPTAG_TLS_VERSION_REF(tls_version),
|
||||
TPTAG_TLS_TIMEOUT_REF(tls_timeout),
|
||||
TPTAG_TLS_VERIFY_PEER_REF(tls_verify),
|
||||
TPTAG_TLS_PASSPHRASE_REF(passphrase),
|
||||
TPTAG_TLS_VERIFY_POLICY_REF(tls_policy),
|
||||
@ -224,6 +226,7 @@ static int tport_tls_init_master(tport_primary_t *pri,
|
||||
ti.cert = ti.key;
|
||||
ti.CAfile = su_sprintf(autohome, "%s/%s", path, "cafile.pem");
|
||||
ti.version = tls_version;
|
||||
ti.timeout = tls_timeout;
|
||||
ti.CApath = su_strdup(autohome, path);
|
||||
|
||||
SU_DEBUG_9(("%s(%p): tls key = %s\n", __func__, (void *)pri, ti.key));
|
||||
|
@ -461,7 +461,7 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint32_t pt, void
|
||||
i->sync_in = 0;
|
||||
} else {
|
||||
|
||||
if ((ts && ts == i->last_rd_ts + i->samples_per_packet) || (i->last_rd_ts > 4294900000 && ts < 5000)) {
|
||||
if ((ts && ts == i->last_rd_ts + i->samples_per_packet) || (i->last_rd_ts > 4294900000u && ts < 5000)) {
|
||||
good_ts = 1;
|
||||
}
|
||||
|
||||
|
@ -271,14 +271,15 @@ Sub CreateVersion(tmpFolder, VersionDir, includebase, includedest)
|
||||
strVerRev = FindVersionStringInConfigure(VersionDir & "configure.in", "SWITCH_VERSION_REVISION")
|
||||
|
||||
'Set version to the one reported by configure.in
|
||||
if strVerRev <> "" Then
|
||||
If strVerRev <> "" Then
|
||||
VERSION = strVerRev
|
||||
End If
|
||||
|
||||
Dim sLastFile
|
||||
Const ForReading = 1
|
||||
|
||||
'Try To read revision from git, if it's found, use this instead of strVerRev found above
|
||||
'Try To read revision from git, if it was not found in "configure.in" already
|
||||
If strVerRev = "" Then
|
||||
If FSO.FolderExists(VersionDir & ".git") Then
|
||||
VersionCmd="git log --format=" & quote & "%%h %%ci" & quote & " -1 HEAD"
|
||||
Set MyFile = FSO.CreateTextFile(tmpFolder & "tmpVersion.Bat", True)
|
||||
@ -298,9 +299,10 @@ Sub CreateVersion(tmpFolder, VersionDir, includebase, includedest)
|
||||
sLastFile.Close
|
||||
VERSION = Replace(VERSION, ":", "-")
|
||||
End If
|
||||
End If
|
||||
|
||||
If VERSION = "" Then
|
||||
VERSION = "UNKNOWN"
|
||||
VERSION = "-UNKNOWN"
|
||||
End If
|
||||
|
||||
If VERSION <> sLastVersion Then
|
||||
|
@ -28,6 +28,7 @@ mkdir -p $ddir
|
||||
git clone . $bdir
|
||||
cd $bdir
|
||||
set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev"
|
||||
echo "$gver" > .version
|
||||
cd libs
|
||||
getlib () {
|
||||
f="${1##*/}"
|
||||
|
@ -22,6 +22,7 @@ cp -r . $dst_dir
|
||||
|
||||
cd $dst_dir
|
||||
set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev"
|
||||
echo "$gver" > .version
|
||||
gnuize
|
||||
cd ..
|
||||
ls
|
||||
|
63
scripts/perl/cnam.cgi
Executable file
63
scripts/perl/cnam.cgi
Executable file
@ -0,0 +1,63 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# OpenCNAM front end because they only take 10 digits and can't filter 11 on their side.
|
||||
#
|
||||
|
||||
use Data::Dumper;
|
||||
use CGI qw/:standard/;
|
||||
use LWP::UserAgent;
|
||||
use SDBM_File;
|
||||
use Fcntl;
|
||||
|
||||
my %params = map { $_ => get_data( $_ ) } param;
|
||||
|
||||
$ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
|
||||
|
||||
sub get_data {
|
||||
my $name = shift;
|
||||
my @values = param( $name );
|
||||
return @values > 1
|
||||
? \@values
|
||||
: $values[0];
|
||||
}
|
||||
|
||||
print "Content-Type: text/plain\n\n";
|
||||
|
||||
tie (my %cache, 'SDBM_File', 'cnam.dbm', O_RDWR|O_CREAT, 0640) || die $!;
|
||||
|
||||
my $number = $params{number};
|
||||
|
||||
|
||||
if($number =~ m/1?\d{10}/) {
|
||||
|
||||
|
||||
if($number =~ m/^1(\d{10})$/) {
|
||||
$number = $1;
|
||||
}
|
||||
|
||||
if($cache{"$number"}) {
|
||||
print $cache{"$number"};
|
||||
untie %cache;
|
||||
exit;
|
||||
}
|
||||
|
||||
my $url = "https://api.opencnam.com/v1/phone/$number?format=text";
|
||||
|
||||
|
||||
my $res = $ua->get( $url );
|
||||
|
||||
if ($res->is_success) {
|
||||
my $content = $res->decoded_content;
|
||||
if ($content =~ m/^Invalid/) {
|
||||
# API shouldn't return this crap.
|
||||
print "UNKNOWN";
|
||||
} else {
|
||||
# Cache the entry.
|
||||
$cache{"$number"} = $content;
|
||||
# print the entry.
|
||||
print $content;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
untie %cache;
|
@ -34,13 +34,14 @@ if ! git config user.email >/dev/null 2>&1; then
|
||||
git config --global user.email "$email"
|
||||
fi
|
||||
|
||||
git config pull.rebase true
|
||||
git config branch.master.rebase true
|
||||
|
||||
cat 1>&2 <<EOF
|
||||
----------------------------------------------------------------------
|
||||
Git has been configured for FS successfully.
|
||||
|
||||
branch.master.rebase has been set to true
|
||||
pull.rebase and branch.master.rebase have been set to true
|
||||
|
||||
This means that when you do a 'git pull' to fetch remote changes,
|
||||
your local changes will be rebased on top of the remote changes.
|
||||
|
@ -641,6 +641,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_api_on(switch_channel_t *channel,
|
||||
|
||||
SWITCH_DECLARE(switch_caller_extension_t *) switch_channel_get_queued_extension(switch_channel_t *channel);
|
||||
SWITCH_DECLARE(void) switch_channel_transfer_to_extension(switch_channel_t *channel, switch_caller_extension_t *caller_extension);
|
||||
SWITCH_DECLARE(const char *) switch_channel_get_partner_uuid(switch_channel_t *channel);
|
||||
|
||||
SWITCH_END_EXTERN_C
|
||||
#endif
|
||||
|
@ -2320,10 +2320,12 @@ SWITCH_DECLARE(uint32_t) switch_default_ptime(const char *name, uint32_t number)
|
||||
\param [in] network_ip
|
||||
\param [in] network_port
|
||||
\param [in] network_proto - one of tls, tcp, udp
|
||||
\param [in] metadata - generic metadata supplied by module
|
||||
\param [out] err - Error if it exists
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_add_registration(const char *user, const char *realm, const char *token, const char *url, uint32_t expires,
|
||||
const char *network_ip, const char *network_port, const char *network_proto);
|
||||
const char *network_ip, const char *network_port, const char *network_proto,
|
||||
const char *metadata);
|
||||
/*!
|
||||
\brief Delete user registration
|
||||
\param [in] user
|
||||
|
@ -186,7 +186,7 @@ SWITCH_DECLARE(bool) email(char *to, char *from, char *headers = NULL, char *bod
|
||||
switch_event_node_t *enodes[SWITCH_EVENT_ALL + 1];
|
||||
uint32_t node_index;
|
||||
|
||||
SWITCH_DECLARE_CONSTRUCTOR EventConsumer(const char *event_name = NULL, const char *subclass_name = "");
|
||||
SWITCH_DECLARE_CONSTRUCTOR EventConsumer(const char *event_name = NULL, const char *subclass_name = "", int len = 5000);
|
||||
SWITCH_DECLARE_CONSTRUCTOR ~ EventConsumer();
|
||||
SWITCH_DECLARE(int) bind(const char *event_name, const char *subclass_name = "");
|
||||
SWITCH_DECLARE(Event *) pop(int block = 0, int timeout = 0);
|
||||
|
@ -170,6 +170,7 @@ SWITCH_BEGIN_EXTERN_C
|
||||
#define SWITCH_CACHE_SPEECH_HANDLES_OBJ_NAME "__cache_speech_handles_obj__"
|
||||
#define SWITCH_BYPASS_MEDIA_VARIABLE "bypass_media"
|
||||
#define SWITCH_PROXY_MEDIA_VARIABLE "proxy_media"
|
||||
#define SWITCH_ZRTP_PASSTHRU_VARIABLE "zrtp_passthru"
|
||||
#define SWITCH_ENDPOINT_DISPOSITION_VARIABLE "endpoint_disposition"
|
||||
#define SWITCH_HOLD_MUSIC_VARIABLE "hold_music"
|
||||
#define SWITCH_TEMP_HOLD_MUSIC_VARIABLE "temp_hold_music"
|
||||
@ -182,6 +183,7 @@ SWITCH_BEGIN_EXTERN_C
|
||||
#define SWITCH_LAST_BRIDGE_VARIABLE "last_bridge_to"
|
||||
#define SWITCH_SIGNAL_BRIDGE_VARIABLE "signal_bridge_to"
|
||||
#define SWITCH_SIGNAL_BOND_VARIABLE "signal_bond"
|
||||
#define SWITCH_ORIGINATE_SIGNAL_BOND_VARIABLE "originate_signal_bond"
|
||||
#define SWITCH_ORIGINATOR_VARIABLE "originator"
|
||||
#define SWITCH_ORIGINATOR_CODEC_VARIABLE "originator_codec"
|
||||
#define SWITCH_ORIGINATOR_VIDEO_CODEC_VARIABLE "originator_video_codec"
|
||||
@ -1213,8 +1215,9 @@ typedef enum {
|
||||
CF_VIDEO_REFRESH_REQ,
|
||||
CF_SERVICE_AUDIO,
|
||||
CF_SERVICE_VIDEO,
|
||||
CF_ZRTP_PASSTHRU_REQ,
|
||||
CF_ZRTP_PASSTHRU,
|
||||
CF_ZRTP_HASH,
|
||||
CF_ZRTP_PASS,
|
||||
CF_CHANNEL_SWAP,
|
||||
CF_PICKUP,
|
||||
CF_CONFIRM_BLIND_TRANSFER,
|
||||
|
@ -41,7 +41,7 @@ extern "C" {
|
||||
#define SWITCH_VERSION_MINOR "@freeswitch_MINOR_VERSION@"
|
||||
#define SWITCH_VERSION_MICRO "@freeswitch_PATCH_LEVEL@"
|
||||
#define SWITCH_VERSION_REVISION "@Project_WC_REVISION@"
|
||||
#define SWITCH_VERSION_FULL SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO " (" SWITCH_VERSION_REVISION ")"
|
||||
#define SWITCH_VERSION_FULL SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO SWITCH_VERSION_REVISION
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ extern "C" {
|
||||
#define SWITCH_VERSION_MINOR "@SWITCH_VERSION_MINOR@"
|
||||
#define SWITCH_VERSION_MICRO "@SWITCH_VERSION_MICRO@"
|
||||
#define SWITCH_VERSION_REVISION "@SWITCH_VERSION_REVISION@"
|
||||
#define SWITCH_VERSION_FULL SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO " (" SWITCH_VERSION_REVISION ")"
|
||||
#define SWITCH_VERSION_FULL SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO SWITCH_VERSION_REVISION
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -1466,6 +1466,8 @@ static void *SWITCH_THREAD_FUNC outbound_agent_thread_run(switch_thread_t *threa
|
||||
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "ignore_early_media", "true");
|
||||
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "origination_uuid", "%s", agent_uuid_str);
|
||||
|
||||
switch_channel_process_export(member_channel, NULL, ovars, "cc_export_vars");
|
||||
|
||||
t_agent_called = local_epoch_time_now(NULL);
|
||||
dialstr = switch_mprintf("%s", h->originate_string);
|
||||
status = switch_ivr_originate(NULL, &agent_session, &cause, dialstr, 60, NULL, cid_name ? cid_name : h->member_cid_name, h->member_cid_number, NULL, ovars, SOF_NONE, NULL);
|
||||
@ -1534,7 +1536,7 @@ static void *SWITCH_THREAD_FUNC outbound_agent_thread_run(switch_thread_t *threa
|
||||
/* Wait for the real channel to be fully bridged */
|
||||
switch_channel_wait_for_flag(other_loopback_channel, CF_BRIDGED, SWITCH_TRUE, 5000, member_channel);
|
||||
|
||||
real_uuid = switch_channel_get_variable(other_loopback_channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
real_uuid = switch_channel_get_partner_uuid(other_loopback_channel);
|
||||
switch_channel_set_variable(other_loopback_channel, "cc_member_pre_answer_uuid", NULL);
|
||||
|
||||
/* Switch the agent session */
|
||||
|
@ -3439,7 +3439,7 @@ SWITCH_STANDARD_API(break_function)
|
||||
channel = switch_core_session_get_channel(psession);
|
||||
|
||||
if (both) {
|
||||
const char *quuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *quuid = switch_channel_get_partner_uuid(channel);
|
||||
if (quuid && (qsession = switch_core_session_locate(quuid))) {
|
||||
qchannel = switch_core_session_get_channel(qsession);
|
||||
}
|
||||
|
@ -48,9 +48,23 @@ typedef struct conference_cdr_node_s {
|
||||
char *record_path;
|
||||
switch_time_t join_time;
|
||||
switch_time_t leave_time;
|
||||
uint32_t flags;
|
||||
struct conference_cdr_node_s *next;
|
||||
} conference_cdr_node_t;
|
||||
|
||||
typedef enum {
|
||||
CDRR_LOCKED = 1,
|
||||
CDRR_PIN,
|
||||
CDRR_MAXMEMBERS
|
||||
} cdr_reject_reason_t;
|
||||
|
||||
typedef struct conference_cdr_reject_s {
|
||||
switch_caller_profile_t *cp;
|
||||
switch_time_t reject_time;
|
||||
cdr_reject_reason_t reason;
|
||||
struct conference_cdr_reject_s *next;
|
||||
} conference_cdr_reject_t;
|
||||
|
||||
|
||||
|
||||
typedef enum {
|
||||
@ -175,7 +189,8 @@ typedef enum {
|
||||
CFLAG_EXIT_SOUND = (1 << 12),
|
||||
CFLAG_ENTER_SOUND = (1 << 13),
|
||||
CFLAG_VIDEO_BRIDGE = (1 << 14),
|
||||
CFLAG_AUDIO_ALWAYS = (1 << 15)
|
||||
CFLAG_AUDIO_ALWAYS = (1 << 15),
|
||||
CFLAG_ENDCONF_FORCED = (1 << 16)
|
||||
} conf_flag_t;
|
||||
|
||||
typedef enum {
|
||||
@ -332,6 +347,7 @@ typedef struct conference_obj {
|
||||
uint32_t originating;
|
||||
switch_call_cause_t cancel_cause;
|
||||
conference_cdr_node_t *cdr_nodes;
|
||||
conference_cdr_reject_t *cdr_rejected;
|
||||
switch_time_t start_time;
|
||||
switch_time_t end_time;
|
||||
char *log_dir;
|
||||
@ -505,6 +521,7 @@ static switch_status_t conference_add_event_member_data(conference_member_t *mem
|
||||
static void conference_cdr_del(conference_member_t *member)
|
||||
{
|
||||
member->cdr_node->leave_time = switch_epoch_time_now(NULL);
|
||||
member->cdr_node->flags = member->flags;
|
||||
}
|
||||
|
||||
static void conference_cdr_add(conference_member_t *member)
|
||||
@ -533,10 +550,30 @@ static void conference_cdr_add(conference_member_t *member)
|
||||
member->cdr_node->cp = switch_caller_profile_dup(member->conference->pool, cp);
|
||||
}
|
||||
|
||||
static void conference_cdr_rejected(conference_obj_t *conference, switch_channel_t *channel, cdr_reject_reason_t reason)
|
||||
{
|
||||
conference_cdr_reject_t *rp;
|
||||
switch_caller_profile_t *cp;
|
||||
|
||||
rp = switch_core_alloc(conference->pool, sizeof(*rp));
|
||||
|
||||
rp->next = conference->cdr_rejected;
|
||||
conference->cdr_rejected = rp;
|
||||
rp->reason = reason;
|
||||
rp->reject_time = switch_epoch_time_now(NULL);
|
||||
|
||||
if (!(cp = switch_channel_get_caller_profile(channel))) {
|
||||
return;
|
||||
}
|
||||
|
||||
rp->cp = switch_caller_profile_dup(conference->pool, cp);
|
||||
}
|
||||
|
||||
static void conference_cdr_render(conference_obj_t *conference)
|
||||
{
|
||||
switch_xml_t cdr, x_ptr, x_member, x_members, x_conference, x_cp;
|
||||
switch_xml_t cdr, x_ptr, x_member, x_members, x_conference, x_cp, x_flags, x_tag, x_rejected, x_attempt;
|
||||
conference_cdr_node_t *np;
|
||||
conference_cdr_reject_t *rp;
|
||||
int cdr_off = 0, conf_off = 0;
|
||||
char str[512];
|
||||
char *path, *xml_text;
|
||||
@ -544,7 +581,7 @@ static void conference_cdr_render(conference_obj_t *conference)
|
||||
|
||||
if (zstr(conference->log_dir)) return;
|
||||
|
||||
if (!conference->cdr_nodes) return;
|
||||
if (!conference->cdr_nodes && !conference->cdr_rejected) return;
|
||||
|
||||
if (!(cdr = switch_xml_new("cdr"))) {
|
||||
abort();
|
||||
@ -583,18 +620,20 @@ static void conference_cdr_render(conference_obj_t *conference)
|
||||
if (!(x_ptr = switch_xml_add_child_d(x_conference, "end_time", conf_off++))) {
|
||||
abort();
|
||||
}
|
||||
switch_xml_set_attr_d(x_ptr, "endconf_forced", switch_test_flag(conference, CFLAG_ENDCONF_FORCED) ? "true" : "false");
|
||||
switch_xml_set_attr_d(x_ptr, "type", "UNIX-epoch");
|
||||
switch_snprintf(str, sizeof(str), "%ld", (long)conference->end_time);
|
||||
switch_xml_set_txt_d(x_ptr, str);
|
||||
|
||||
|
||||
|
||||
if (!(x_members = switch_xml_add_child_d(x_conference, "members", conf_off++))) {
|
||||
abort();
|
||||
}
|
||||
|
||||
|
||||
for (np = conference->cdr_nodes; np; np = np->next) {
|
||||
int member_off = 0;
|
||||
int flag_off = 0;
|
||||
|
||||
|
||||
if (!(x_member = switch_xml_add_child_d(x_members, "member", conf_off++))) {
|
||||
@ -619,6 +658,18 @@ static void conference_cdr_render(conference_obj_t *conference)
|
||||
switch_xml_set_txt_d(x_ptr, str);
|
||||
|
||||
if (np->cp) {
|
||||
x_flags = switch_xml_add_child_d(x_member, "flags", member_off++);
|
||||
switch_assert(x_flags);
|
||||
|
||||
x_tag = switch_xml_add_child_d(x_flags, "is_moderator", flag_off++);
|
||||
switch_xml_set_txt_d(x_tag, switch_test_flag(np, MFLAG_MOD) ? "true" : "false");
|
||||
|
||||
x_tag = switch_xml_add_child_d(x_flags, "end_conference", flag_off++);
|
||||
switch_xml_set_txt_d(x_tag, switch_test_flag(np, MFLAG_ENDCONF) ? "true" : "false");
|
||||
|
||||
x_tag = switch_xml_add_child_d(x_flags, "was_kicked", flag_off++);
|
||||
switch_xml_set_txt_d(x_tag, switch_test_flag(np, MFLAG_KICKED) ? "true" : "false");
|
||||
|
||||
if (!(x_cp = switch_xml_add_child_d(x_member, "caller_profile", member_off++))) {
|
||||
abort();
|
||||
}
|
||||
@ -631,8 +682,47 @@ static void conference_cdr_render(conference_obj_t *conference)
|
||||
}
|
||||
switch_xml_set_txt_d(x_ptr, np->record_path);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (!(x_rejected = switch_xml_add_child_d(x_conference, "rejected", conf_off++))) {
|
||||
abort();
|
||||
}
|
||||
|
||||
for (rp = conference->cdr_rejected; rp; rp = rp->next) {
|
||||
int attempt_off = 0;
|
||||
int tag_off = 0;
|
||||
|
||||
if (!(x_attempt = switch_xml_add_child_d(x_rejected, "attempt", attempt_off++))) {
|
||||
abort();
|
||||
}
|
||||
|
||||
if (!(x_ptr = switch_xml_add_child_d(x_attempt, "reason", tag_off++))) {
|
||||
abort();
|
||||
}
|
||||
if (rp->reason == CDRR_LOCKED) {
|
||||
switch_xml_set_txt_d(x_ptr, "conference_locked");
|
||||
} else if (rp->reason == CDRR_MAXMEMBERS) {
|
||||
switch_xml_set_txt_d(x_ptr, "max_members_reached");
|
||||
} else if (rp->reason == CDRR_PIN) {
|
||||
switch_xml_set_txt_d(x_ptr, "invalid_pin");
|
||||
}
|
||||
|
||||
if (!(x_ptr = switch_xml_add_child_d(x_attempt, "reject_time", tag_off++))) {
|
||||
abort();
|
||||
}
|
||||
switch_xml_set_attr_d(x_ptr, "type", "UNIX-epoch");
|
||||
switch_snprintf(str, sizeof(str), "%ld", (long) rp->reject_time);
|
||||
switch_xml_set_txt_d(x_ptr, str);
|
||||
|
||||
if (rp->cp) {
|
||||
if (!(x_cp = switch_xml_add_child_d(x_attempt, "caller_profile", attempt_off++))) {
|
||||
abort();
|
||||
}
|
||||
switch_ivr_set_xml_profile_data(x_cp, rp->cp, 0);
|
||||
}
|
||||
}
|
||||
|
||||
xml_text = switch_xml_toxml(cdr, SWITCH_TRUE);
|
||||
|
||||
@ -1343,7 +1433,14 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr
|
||||
want_refresh = 0;
|
||||
|
||||
for (imember = conference->members; imember; imember = imember->next) {
|
||||
switch_channel_t *ichannel = switch_core_session_get_channel(imember->session);
|
||||
switch_core_session_t *isession = imember->session;
|
||||
switch_channel_t *ichannel;
|
||||
|
||||
if (!isession || !switch_core_session_read_lock(isession)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ichannel = switch_core_session_get_channel(imember->session);
|
||||
|
||||
if (switch_channel_test_flag(ichannel, CF_VIDEO_REFRESH_REQ)) {
|
||||
want_refresh++;
|
||||
@ -1354,6 +1451,8 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr
|
||||
has_vid++;
|
||||
switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0);
|
||||
}
|
||||
|
||||
switch_core_session_rwunlock(isession);
|
||||
}
|
||||
|
||||
if (want_refresh) {
|
||||
@ -1835,7 +1934,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
|
||||
switch_epoch_time_now(NULL) - conference->endconf_time > conference->endconf_grace_time) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Conference %s: endconf grace time exceeded (%u)\n",
|
||||
conference->name, conference->endconf_grace_time);
|
||||
switch_set_flag(conference, CFLAG_DESTRUCT);
|
||||
switch_set_flag(conference, CFLAG_DESTRUCT | CFLAG_ENDCONF_FORCED);
|
||||
}
|
||||
|
||||
switch_mutex_unlock(conference->mutex);
|
||||
@ -4595,6 +4694,7 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer
|
||||
|
||||
x_member = switch_xml_add_child_d(x_members, "member", moff++);
|
||||
switch_assert(x_member);
|
||||
switch_xml_set_attr_d(x_member, "type", "caller");
|
||||
|
||||
switch_snprintf(i, sizeof(i), "%d", member->id);
|
||||
|
||||
@ -6616,6 +6716,7 @@ SWITCH_STANDARD_APP(conference_function)
|
||||
}
|
||||
|
||||
if (!pin_valid) {
|
||||
conference_cdr_rejected(conference, channel, CDRR_PIN);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
@ -6627,6 +6728,7 @@ SWITCH_STANDARD_APP(conference_function)
|
||||
/* don't allow more callers if the conference is locked, unless we invited them */
|
||||
if (switch_test_flag(conference, CFLAG_LOCKED) && enforce_security) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Conference %s is locked.\n", conf_name);
|
||||
conference_cdr_rejected(conference, channel, CDRR_LOCKED);
|
||||
if (conference->locked_sound) {
|
||||
/* Answer the channel */
|
||||
switch_channel_answer(channel);
|
||||
@ -6641,6 +6743,7 @@ SWITCH_STANDARD_APP(conference_function)
|
||||
*/
|
||||
if ((conference->max_members > 0) && (conference->count >= conference->max_members)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Conference %s is full.\n", conf_name);
|
||||
conference_cdr_rejected(conference, channel, CDRR_MAXMEMBERS);
|
||||
if (conference->maxmember_sound) {
|
||||
/* Answer the channel */
|
||||
switch_channel_answer(channel);
|
||||
|
@ -30,7 +30,7 @@
|
||||
* Bret McDanel <trixter AT 0xdecafbad dot com>
|
||||
* Luke Dashjr <luke@openmethods.com> (OpenMethods, LLC)
|
||||
* Cesar Cepeda <cesar@auronix.com>
|
||||
* Chris Rienzo <chris@rienzo.net>
|
||||
* Christopher M. Rienzo <chris@rienzo.com>
|
||||
*
|
||||
* mod_dptools.c -- Raw Audio File Streaming Application Module
|
||||
*
|
||||
@ -974,7 +974,7 @@ SWITCH_STANDARD_APP(transfer_function)
|
||||
if (bleg || both) {
|
||||
const char *uuid;
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel))) {
|
||||
switch_core_session_t *b_session;
|
||||
if ((b_session = switch_core_session_locate(uuid))) {
|
||||
switch_ivr_session_transfer(b_session, argv[1], argv[2], argv[3]);
|
||||
@ -2149,7 +2149,7 @@ SWITCH_STANDARD_APP(att_xfer_function)
|
||||
|
||||
channel = switch_core_session_get_channel(session);
|
||||
|
||||
if ((bond = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if ((bond = switch_channel_get_partner_uuid(channel))) {
|
||||
bond = switch_core_session_strdup(session, bond);
|
||||
}
|
||||
|
||||
@ -3570,14 +3570,9 @@ SWITCH_STANDARD_APP(pickup_function)
|
||||
caller_profile->callee_id_number = num;
|
||||
|
||||
if (switch_event_create(&event, SWITCH_EVENT_CALL_UPDATE) == SWITCH_STATUS_SUCCESS) {
|
||||
const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *uuid = switch_channel_get_partner_uuid(channel);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Direction", "RECV");
|
||||
|
||||
if (!uuid) {
|
||||
uuid = switch_channel_get_variable(channel, "originate_signal_bond");
|
||||
}
|
||||
|
||||
|
||||
if (uuid) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridged-To", uuid);
|
||||
}
|
||||
|
@ -1,24 +0,0 @@
|
||||
include $(top_srcdir)/build/modmake.rulesam
|
||||
MODNAME=mod_fax
|
||||
|
||||
TIFF_DIR=$(switch_srcdir)/libs/tiff-3.8.2
|
||||
TIFF_BUILDDIR=$(switch_builddir)/libs/tiff-3.8.2
|
||||
TIFF_LA=$(TIFF_BUILDDIR)/libtiff/libtiff.la
|
||||
|
||||
SPANDSP_DIR=$(switch_srcdir)/libs/spandsp
|
||||
SPANDSP_BUILDDIR=$(switch_builddir)/libs/spandsp
|
||||
SPANDSP_LA=$(SPANDSP_BUILDDIR)/src/libspandsp.la
|
||||
|
||||
mod_LTLIBRARIES = mod_fax.la
|
||||
mod_fax_la_SOURCES = mod_fax.c udptl.c
|
||||
mod_fax_la_CFLAGS = $(AM_CFLAGS) -I$(SPANDSP_DIR)/src -I$(TIFF_DIR)/libtiff -I$(SPANDSP_BUILDDIR)/src -I$(TIFF_BUILDDIR)/libtiff -I.
|
||||
mod_fax_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SPANDSP_LA) $(TIFF_LA)
|
||||
mod_fax_la_LDFLAGS = -avoid-version -module -no-undefined -shared -ljpeg
|
||||
|
||||
$(SPANDSP_LA): $(TIFF_LA) $(SPANDSP_DIR) $(SPANDSP_DIR)/.update
|
||||
cd $(SPANDSP_BUILDDIR) && $(MAKE) -j1
|
||||
$(TOUCH_TARGET)
|
||||
|
||||
$(TIFF_LA): $(TIFF_DIR) $(TIFF_DIR)/.update
|
||||
cd $(TIFF_BUILDDIR) && $(MAKE) -j1
|
||||
$(TOUCH_TARGET)
|
File diff suppressed because it is too large
Load Diff
@ -1,563 +0,0 @@
|
||||
//#define UDPTL_DEBUG
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2009, Steve Underwood <steveu@coppice.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Steve Underwood <steveu@coppice.org>
|
||||
*
|
||||
* udptl.c -- UDPTL handling for T.38
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
#include <memory.h>
|
||||
|
||||
#include "udptl.h"
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE (!FALSE)
|
||||
|
||||
static int decode_length(const uint8_t *buf, int limit, int *len, int *pvalue)
|
||||
{
|
||||
if (*len >= limit)
|
||||
return -1;
|
||||
if ((buf[*len] & 0x80) == 0) {
|
||||
*pvalue = buf[(*len)++];
|
||||
return 0;
|
||||
}
|
||||
if ((buf[*len] & 0x40) == 0) {
|
||||
if (*len >= limit - 1)
|
||||
return -1;
|
||||
*pvalue = (buf[(*len)++] & 0x3F) << 8;
|
||||
*pvalue |= buf[(*len)++];
|
||||
return 0;
|
||||
}
|
||||
*pvalue = (buf[(*len)++] & 0x3F) << 14;
|
||||
/* Indicate we have a fragment */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
static int decode_open_type(const uint8_t *buf, int limit, int *len, const uint8_t ** p_object, int *p_num_octets)
|
||||
{
|
||||
int octet_cnt;
|
||||
int octet_idx;
|
||||
int stat;
|
||||
int i;
|
||||
const uint8_t **pbuf;
|
||||
|
||||
for (octet_idx = 0, *p_num_octets = 0;; octet_idx += octet_cnt) {
|
||||
if ((stat = decode_length(buf, limit, len, &octet_cnt)) < 0)
|
||||
return -1;
|
||||
if (octet_cnt > 0) {
|
||||
*p_num_octets += octet_cnt;
|
||||
|
||||
pbuf = &p_object[octet_idx];
|
||||
i = 0;
|
||||
/* Make sure the buffer contains at least the number of bits requested */
|
||||
if ((*len + octet_cnt) > limit)
|
||||
return -1;
|
||||
|
||||
*pbuf = &buf[*len];
|
||||
*len += octet_cnt;
|
||||
}
|
||||
if (stat == 0)
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
static int encode_length(uint8_t *buf, int *len, int value)
|
||||
{
|
||||
int multiplier;
|
||||
|
||||
if (value < 0x80) {
|
||||
/* 1 octet */
|
||||
buf[(*len)++] = value;
|
||||
return value;
|
||||
}
|
||||
if (value < 0x4000) {
|
||||
/* 2 octets */
|
||||
/* Set the first bit of the first octet */
|
||||
buf[(*len)++] = ((0x8000 | value) >> 8) & 0xFF;
|
||||
buf[(*len)++] = value & 0xFF;
|
||||
return value;
|
||||
}
|
||||
/* Fragmentation */
|
||||
multiplier = (value < 0x10000) ? (value >> 14) : 4;
|
||||
/* Set the first 2 bits of the octet */
|
||||
buf[(*len)++] = 0xC0 | multiplier;
|
||||
return multiplier << 14;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
static int encode_open_type(uint8_t *buf, int *len, const uint8_t *data, int num_octets)
|
||||
{
|
||||
int enclen;
|
||||
int octet_idx;
|
||||
uint8_t zero_byte;
|
||||
|
||||
/* If open type is of zero length, add a single zero byte (10.1) */
|
||||
if (num_octets == 0) {
|
||||
zero_byte = 0;
|
||||
data = &zero_byte;
|
||||
num_octets = 1;
|
||||
}
|
||||
/* Encode the open type */
|
||||
for (octet_idx = 0;; num_octets -= enclen, octet_idx += enclen) {
|
||||
if ((enclen = encode_length(buf, len, num_octets)) < 0)
|
||||
return -1;
|
||||
if (enclen > 0) {
|
||||
memcpy(&buf[*len], &data[octet_idx], enclen);
|
||||
*len += enclen;
|
||||
}
|
||||
if (enclen >= num_octets)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len)
|
||||
{
|
||||
int stat;
|
||||
int stat2;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
int l;
|
||||
int m;
|
||||
int x;
|
||||
int limit;
|
||||
int which;
|
||||
int ptr;
|
||||
int count;
|
||||
int total_count;
|
||||
int seq_no;
|
||||
const uint8_t *msg;
|
||||
const uint8_t *data;
|
||||
int msg_len;
|
||||
int repaired[16];
|
||||
const uint8_t *bufs[16];
|
||||
int lengths[16];
|
||||
int span;
|
||||
int entries;
|
||||
|
||||
ptr = 0;
|
||||
/* Decode seq_number */
|
||||
if (ptr + 2 > len)
|
||||
return -1;
|
||||
seq_no = (buf[0] << 8) | buf[1];
|
||||
ptr += 2;
|
||||
/* Break out the primary packet */
|
||||
if ((stat = decode_open_type(buf, len, &ptr, &msg, &msg_len)) != 0)
|
||||
return -1;
|
||||
/* Decode error_recovery */
|
||||
if (ptr + 1 > len)
|
||||
return -1;
|
||||
/* Our buffers cannot tolerate overlength packets */
|
||||
if (msg_len > LOCAL_FAX_MAX_DATAGRAM)
|
||||
return -1;
|
||||
/* Update any missed slots in the buffer */
|
||||
for (i = s->rx_seq_no; seq_no > i; i++) {
|
||||
x = i & UDPTL_BUF_MASK;
|
||||
s->rx[x].buf_len = -1;
|
||||
s->rx[x].fec_len[0] = 0;
|
||||
s->rx[x].fec_span = 0;
|
||||
s->rx[x].fec_entries = 0;
|
||||
}
|
||||
/* Save the new packet. Pure redundancy mode won't use this, but some systems will switch
|
||||
into FEC mode after sending some redundant packets. */
|
||||
x = seq_no & UDPTL_BUF_MASK;
|
||||
memcpy(s->rx[x].buf, msg, msg_len);
|
||||
s->rx[x].buf_len = msg_len;
|
||||
s->rx[x].fec_len[0] = 0;
|
||||
s->rx[x].fec_span = 0;
|
||||
s->rx[x].fec_entries = 0;
|
||||
if ((buf[ptr++] & 0x80) == 0) {
|
||||
/* Secondary packet mode for error recovery */
|
||||
/* We might have the packet we want, but we need to check through
|
||||
the redundant stuff, and verify the integrity of the UDPTL.
|
||||
This greatly reduces our chances of accepting garbage. */
|
||||
total_count = 0;
|
||||
do {
|
||||
if ((stat2 = decode_length(buf, len, &ptr, &count)) < 0)
|
||||
return -1;
|
||||
for (i = 0; i < count; i++) {
|
||||
if ((stat = decode_open_type(buf, len, &ptr, &bufs[total_count + i], &lengths[total_count + i])) != 0)
|
||||
return -1;
|
||||
}
|
||||
total_count += count;
|
||||
}
|
||||
while (stat2 > 0);
|
||||
/* We should now be exactly at the end of the packet. If not, this is a fault. */
|
||||
if (ptr != len)
|
||||
return -1;
|
||||
if (seq_no > s->rx_seq_no) {
|
||||
/* We received a later packet than we expected, so we need to check if we can fill in the gap from the
|
||||
secondary packets. */
|
||||
/* Step through in reverse order, so we go oldest to newest */
|
||||
for (i = total_count; i > 0; i--) {
|
||||
if (seq_no - i >= s->rx_seq_no) {
|
||||
/* This one wasn't seen before */
|
||||
/* Decode the secondary packet */
|
||||
#if defined(UDPTL_DEBUG)
|
||||
fprintf(stderr, "Secondary %d, len %d\n", seq_no - i, lengths[i - 1]);
|
||||
#endif
|
||||
/* Save the new packet. Redundancy mode won't use this, but some systems will switch into
|
||||
FEC mode after sending some redundant packets, and this may then be important. */
|
||||
x = (seq_no - i) & UDPTL_BUF_MASK;
|
||||
memcpy(s->rx[x].buf, bufs[i - 1], lengths[i - 1]);
|
||||
s->rx[x].buf_len = lengths[i - 1];
|
||||
s->rx[x].fec_len[0] = 0;
|
||||
s->rx[x].fec_span = 0;
|
||||
s->rx[x].fec_entries = 0;
|
||||
if (s->rx_packet_handler(s->user_data, bufs[i - 1], lengths[i - 1], seq_no - i) < 0)
|
||||
fprintf(stderr, "Bad IFP\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* FEC mode for error recovery */
|
||||
|
||||
/* Decode the FEC packets */
|
||||
/* The span is defined as an unconstrained integer, but will never be more
|
||||
than a small value. */
|
||||
if (ptr + 2 > len)
|
||||
return -1;
|
||||
if (buf[ptr++] != 1)
|
||||
return -1;
|
||||
span = buf[ptr++];
|
||||
|
||||
x = seq_no & UDPTL_BUF_MASK;
|
||||
|
||||
s->rx[x].fec_span = span;
|
||||
|
||||
memset(repaired, 0, sizeof(repaired));
|
||||
repaired[x] = TRUE;
|
||||
|
||||
/* The number of entries is defined as a length, but will only ever be a small
|
||||
value. Treat it as such. */
|
||||
if (ptr + 1 > len)
|
||||
return -1;
|
||||
entries = buf[ptr++];
|
||||
s->rx[x].fec_entries = entries;
|
||||
|
||||
/* Decode the elements */
|
||||
for (i = 0; i < entries; i++) {
|
||||
if ((stat = decode_open_type(buf, len, &ptr, &data, &s->rx[x].fec_len[i])) != 0)
|
||||
return -1;
|
||||
if (s->rx[x].fec_len[i] > LOCAL_FAX_MAX_DATAGRAM)
|
||||
return -1;
|
||||
|
||||
/* Save the new FEC data */
|
||||
memcpy(s->rx[x].fec[i], data, s->rx[x].fec_len[i]);
|
||||
#if 0
|
||||
fprintf(stderr, "FEC: ");
|
||||
for (j = 0; j < s->rx[x].fec_len[i]; j++)
|
||||
fprintf(stderr, "%02X ", data[j]);
|
||||
fprintf(stderr, "\n");
|
||||
#endif
|
||||
}
|
||||
/* We should now be exactly at the end of the packet. If not, this is a fault. */
|
||||
if (ptr != len)
|
||||
return -1;
|
||||
/* See if we can reconstruct anything which is missing */
|
||||
/* TODO: this does not comprehensively hunt back and repair everything that is possible */
|
||||
for (l = x; l != ((x - (16 - span * entries)) & UDPTL_BUF_MASK); l = (l - 1) & UDPTL_BUF_MASK) {
|
||||
if (s->rx[l].fec_len[0] <= 0)
|
||||
continue;
|
||||
for (m = 0; m < s->rx[l].fec_entries; m++) {
|
||||
limit = (l + m) & UDPTL_BUF_MASK;
|
||||
for (which = -1, k = (limit - s->rx[l].fec_span * s->rx[l].fec_entries) & UDPTL_BUF_MASK; k != limit;
|
||||
k = (k + s->rx[l].fec_entries) & UDPTL_BUF_MASK) {
|
||||
if (s->rx[k].buf_len <= 0)
|
||||
which = (which == -1) ? k : -2;
|
||||
}
|
||||
if (which >= 0) {
|
||||
/* Repairable */
|
||||
for (j = 0; j < s->rx[l].fec_len[m]; j++) {
|
||||
s->rx[which].buf[j] = s->rx[l].fec[m][j];
|
||||
for (k = (limit - s->rx[l].fec_span * s->rx[l].fec_entries) & UDPTL_BUF_MASK; k != limit;
|
||||
k = (k + s->rx[l].fec_entries) & UDPTL_BUF_MASK)
|
||||
s->rx[which].buf[j] ^= (s->rx[k].buf_len > j) ? s->rx[k].buf[j] : 0;
|
||||
}
|
||||
s->rx[which].buf_len = s->rx[l].fec_len[m];
|
||||
repaired[which] = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Now play any new packets forwards in time */
|
||||
for (l = (x + 1) & UDPTL_BUF_MASK, j = seq_no - UDPTL_BUF_MASK; l != x; l = (l + 1) & UDPTL_BUF_MASK, j++) {
|
||||
if (repaired[l]) {
|
||||
#if defined(UDPTL_DEBUG)
|
||||
fprintf(stderr, "Fixed packet %d, len %d\n", j, l);
|
||||
#endif
|
||||
if (s->rx_packet_handler(s->user_data, s->rx[l].buf, s->rx[l].buf_len, j) < 0)
|
||||
fprintf(stderr, "Bad IFP\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
/* If packets are received out of sequence, we may have already processed this packet from the error
|
||||
recovery information in a packet already received. */
|
||||
if (seq_no >= s->rx_seq_no) {
|
||||
/* Decode the primary packet */
|
||||
#if defined(UDPTL_DEBUG)
|
||||
fprintf(stderr, "Primary packet %d, len %d\n", seq_no, msg_len);
|
||||
#endif
|
||||
if (s->rx_packet_handler(s->user_data, msg, msg_len, seq_no) < 0)
|
||||
fprintf(stderr, "Bad IFP\n");
|
||||
}
|
||||
|
||||
s->rx_seq_no = (seq_no + 1) & 0xFFFF;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_build_packet(udptl_state_t *s, uint8_t buf[], const uint8_t msg[], int msg_len)
|
||||
{
|
||||
uint8_t fec[LOCAL_FAX_MAX_DATAGRAM];
|
||||
int i;
|
||||
int j;
|
||||
int seq;
|
||||
int entry;
|
||||
int entries;
|
||||
int span;
|
||||
int m;
|
||||
int len;
|
||||
int limit;
|
||||
int high_tide;
|
||||
|
||||
/* UDPTL cannot cope with zero length messages, and our buffering for redundancy limits their
|
||||
maximum length. */
|
||||
if (msg_len < 1 || msg_len > LOCAL_FAX_MAX_DATAGRAM)
|
||||
return -1;
|
||||
seq = s->tx_seq_no & 0xFFFF;
|
||||
|
||||
/* Map the sequence number to an entry in the circular buffer */
|
||||
entry = seq & UDPTL_BUF_MASK;
|
||||
|
||||
/* We save the message in a circular buffer, for generating FEC or
|
||||
redundancy sets later on. */
|
||||
s->tx[entry].buf_len = msg_len;
|
||||
memcpy(s->tx[entry].buf, msg, msg_len);
|
||||
|
||||
/* Build the UDPTL packet */
|
||||
|
||||
len = 0;
|
||||
/* Encode the sequence number */
|
||||
buf[len++] = (seq >> 8) & 0xFF;
|
||||
buf[len++] = seq & 0xFF;
|
||||
|
||||
/* Encode the primary packet */
|
||||
if (encode_open_type(buf, &len, msg, msg_len) < 0)
|
||||
return -1;
|
||||
|
||||
/* Encode the appropriate type of error recovery information */
|
||||
switch (s->error_correction_scheme) {
|
||||
case UDPTL_ERROR_CORRECTION_NONE:
|
||||
/* Encode the error recovery type */
|
||||
buf[len++] = 0x00;
|
||||
/* The number of entries will always be zero, so it is pointless allowing
|
||||
for the fragmented case here. */
|
||||
if (encode_length(buf, &len, 0) < 0)
|
||||
return -1;
|
||||
break;
|
||||
case UDPTL_ERROR_CORRECTION_REDUNDANCY:
|
||||
/* Encode the error recovery type */
|
||||
buf[len++] = 0x00;
|
||||
if (s->tx_seq_no > s->error_correction_entries)
|
||||
entries = s->error_correction_entries;
|
||||
else
|
||||
entries = s->tx_seq_no;
|
||||
/* The number of entries will always be small, so it is pointless allowing
|
||||
for the fragmented case here. */
|
||||
if (encode_length(buf, &len, entries) < 0)
|
||||
return -1;
|
||||
/* Encode the elements */
|
||||
for (i = 0; i < entries; i++) {
|
||||
j = (entry - i - 1) & UDPTL_BUF_MASK;
|
||||
if (encode_open_type(buf, &len, s->tx[j].buf, s->tx[j].buf_len) < 0)
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case UDPTL_ERROR_CORRECTION_FEC:
|
||||
span = s->error_correction_span;
|
||||
entries = s->error_correction_entries;
|
||||
if (seq < s->error_correction_span * s->error_correction_entries) {
|
||||
/* In the initial stages, wind up the FEC smoothly */
|
||||
entries = seq / s->error_correction_span;
|
||||
if (seq < s->error_correction_span)
|
||||
span = 0;
|
||||
}
|
||||
/* Encode the error recovery type */
|
||||
buf[len++] = 0x80;
|
||||
/* Span is defined as an inconstrained integer, which it dumb. It will only
|
||||
ever be a small value. Treat it as such. */
|
||||
buf[len++] = 1;
|
||||
buf[len++] = span;
|
||||
/* The number of entries is defined as a length, but will only ever be a small
|
||||
value. Treat it as such. */
|
||||
buf[len++] = entries;
|
||||
for (m = 0; m < entries; m++) {
|
||||
/* Make an XOR'ed entry the maximum length */
|
||||
limit = (entry + m) & UDPTL_BUF_MASK;
|
||||
high_tide = 0;
|
||||
for (i = (limit - span * entries) & UDPTL_BUF_MASK; i != limit; i = (i + entries) & UDPTL_BUF_MASK) {
|
||||
if (high_tide < s->tx[i].buf_len) {
|
||||
for (j = 0; j < high_tide; j++)
|
||||
fec[j] ^= s->tx[i].buf[j];
|
||||
for (; j < s->tx[i].buf_len; j++)
|
||||
fec[j] = s->tx[i].buf[j];
|
||||
high_tide = s->tx[i].buf_len;
|
||||
} else {
|
||||
for (j = 0; j < s->tx[i].buf_len; j++)
|
||||
fec[j] ^= s->tx[i].buf[j];
|
||||
}
|
||||
}
|
||||
if (encode_open_type(buf, &len, fec, high_tide) < 0)
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (s->verbose)
|
||||
fprintf(stderr, "\n");
|
||||
s->tx_seq_no++;
|
||||
return len;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_set_error_correction(udptl_state_t *s, int ec_scheme, int span, int entries)
|
||||
{
|
||||
switch (ec_scheme) {
|
||||
case UDPTL_ERROR_CORRECTION_FEC:
|
||||
case UDPTL_ERROR_CORRECTION_REDUNDANCY:
|
||||
case UDPTL_ERROR_CORRECTION_NONE:
|
||||
s->error_correction_scheme = ec_scheme;
|
||||
break;
|
||||
case -1:
|
||||
/* Just don't change the scheme */
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
if (span >= 0)
|
||||
s->error_correction_span = span;
|
||||
if (entries >= 0)
|
||||
s->error_correction_entries = entries;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_get_error_correction(udptl_state_t *s, int *ec_scheme, int *span, int *entries)
|
||||
{
|
||||
if (ec_scheme)
|
||||
*ec_scheme = s->error_correction_scheme;
|
||||
if (span)
|
||||
*span = s->error_correction_span;
|
||||
if (entries)
|
||||
*entries = s->error_correction_entries;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_set_local_max_datagram(udptl_state_t *s, int max_datagram)
|
||||
{
|
||||
s->local_max_datagram_size = max_datagram;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_get_local_max_datagram(udptl_state_t *s)
|
||||
{
|
||||
return s->local_max_datagram_size;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_set_far_max_datagram(udptl_state_t *s, int max_datagram)
|
||||
{
|
||||
s->far_max_datagram_size = max_datagram;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_get_far_max_datagram(udptl_state_t *s)
|
||||
{
|
||||
return s->far_max_datagram_size;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
udptl_state_t *udptl_init(udptl_state_t *s, int ec_scheme, int span, int entries, udptl_rx_packet_handler_t rx_packet_handler, void *user_data)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (rx_packet_handler == NULL)
|
||||
return NULL;
|
||||
|
||||
if (s == NULL) {
|
||||
if ((s = (udptl_state_t *) malloc(sizeof(*s))) == NULL)
|
||||
return NULL;
|
||||
}
|
||||
memset(s, 0, sizeof(*s));
|
||||
|
||||
s->error_correction_scheme = ec_scheme;
|
||||
s->error_correction_span = span;
|
||||
s->error_correction_entries = entries;
|
||||
|
||||
s->far_max_datagram_size = LOCAL_FAX_MAX_DATAGRAM;
|
||||
s->local_max_datagram_size = LOCAL_FAX_MAX_DATAGRAM;
|
||||
|
||||
memset(&s->rx, 0, sizeof(s->rx));
|
||||
memset(&s->tx, 0, sizeof(s->tx));
|
||||
for (i = 0; i <= UDPTL_BUF_MASK; i++) {
|
||||
s->rx[i].buf_len = -1;
|
||||
s->tx[i].buf_len = -1;
|
||||
}
|
||||
|
||||
s->rx_packet_handler = rx_packet_handler;
|
||||
s->user_data = user_data;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
|
||||
int udptl_release(udptl_state_t *s)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- End of function --------------------------------------------------------*/
|
||||
/*- End of file ------------------------------------------------------------*/
|
@ -1,153 +0,0 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2009, Steve Underwood <steveu@coppice.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Steve Underwood <steveu@coppice.org>
|
||||
*
|
||||
* udptl.h -- UDPTL handling for T.38
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(FREESWITCH_UDPTL_H)
|
||||
#define FREESWITCH_UDPTL_H
|
||||
|
||||
#define LOCAL_FAX_MAX_DATAGRAM 400
|
||||
#define LOCAL_FAX_MAX_FEC_PACKETS 5
|
||||
|
||||
#define UDPTL_BUF_MASK 15
|
||||
|
||||
typedef int (udptl_rx_packet_handler_t) (void *user_data, const uint8_t msg[], int len, int seq_no);
|
||||
|
||||
typedef struct {
|
||||
int buf_len;
|
||||
uint8_t buf[LOCAL_FAX_MAX_DATAGRAM];
|
||||
} udptl_fec_tx_buffer_t;
|
||||
|
||||
typedef struct {
|
||||
int buf_len;
|
||||
uint8_t buf[LOCAL_FAX_MAX_DATAGRAM];
|
||||
int fec_len[LOCAL_FAX_MAX_FEC_PACKETS];
|
||||
uint8_t fec[LOCAL_FAX_MAX_FEC_PACKETS][LOCAL_FAX_MAX_DATAGRAM];
|
||||
int fec_span;
|
||||
int fec_entries;
|
||||
} udptl_fec_rx_buffer_t;
|
||||
|
||||
struct udptl_state_s {
|
||||
udptl_rx_packet_handler_t *rx_packet_handler;
|
||||
void *user_data;
|
||||
|
||||
/*! This option indicates the error correction scheme used in transmitted UDPTL
|
||||
packets. */
|
||||
int error_correction_scheme;
|
||||
|
||||
/*! This option indicates the number of error correction entries transmitted in
|
||||
UDPTL packets. */
|
||||
int error_correction_entries;
|
||||
|
||||
/*! This option indicates the span of the error correction entries in transmitted
|
||||
UDPTL packets (FEC only). */
|
||||
int error_correction_span;
|
||||
|
||||
/*! This option indicates the maximum size of a datagram that can be accepted by
|
||||
the remote device. */
|
||||
int far_max_datagram_size;
|
||||
|
||||
/*! This option indicates the maximum size of a datagram that we are prepared to
|
||||
accept. */
|
||||
int local_max_datagram_size;
|
||||
|
||||
int verbose;
|
||||
|
||||
int tx_seq_no;
|
||||
int rx_seq_no;
|
||||
int rx_expected_seq_no;
|
||||
|
||||
udptl_fec_tx_buffer_t tx[UDPTL_BUF_MASK + 1];
|
||||
udptl_fec_rx_buffer_t rx[UDPTL_BUF_MASK + 1];
|
||||
};
|
||||
|
||||
enum {
|
||||
UDPTL_ERROR_CORRECTION_NONE,
|
||||
UDPTL_ERROR_CORRECTION_FEC,
|
||||
UDPTL_ERROR_CORRECTION_REDUNDANCY
|
||||
};
|
||||
|
||||
typedef struct udptl_state_s udptl_state_t;
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \brief Process an arriving UDPTL packet.
|
||||
\param s The UDPTL context.
|
||||
\param buf The UDPTL packet buffer.
|
||||
\param len The length of the packet.
|
||||
\return 0 for OK. */
|
||||
int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len);
|
||||
|
||||
/*! \brief Construct a UDPTL packet, ready for transmission.
|
||||
\param s The UDPTL context.
|
||||
\param buf The UDPTL packet buffer.
|
||||
\param msg The primary packet.
|
||||
\param len The length of the primary packet.
|
||||
\return The length of the constructed UDPTL packet. */
|
||||
int udptl_build_packet(udptl_state_t *s, uint8_t buf[], const uint8_t msg[], int msg_len);
|
||||
|
||||
/*! \brief Change the error correction settings of a UDPTL context.
|
||||
\param s The UDPTL context.
|
||||
\param ec_scheme One of the optional error correction schemes.
|
||||
\param span The packet span over which error correction should be applied.
|
||||
\param entries The number of error correction entries to include in packets.
|
||||
\return 0 for OK. */
|
||||
int udptl_set_error_correction(udptl_state_t *s, int ec_scheme, int span, int entries);
|
||||
|
||||
/*! \brief Check the error correction settings of a UDPTL context.
|
||||
\param s The UDPTL context.
|
||||
\param ec_scheme One of the optional error correction schemes.
|
||||
\param span The packet span over which error correction is being applied.
|
||||
\param entries The number of error correction being included in packets.
|
||||
\return 0 for OK. */
|
||||
int udptl_get_error_correction(udptl_state_t *s, int *ec_scheme, int *span, int *entries);
|
||||
|
||||
int udptl_set_local_max_datagram(udptl_state_t *s, int max_datagram);
|
||||
|
||||
int udptl_get_local_max_datagram(udptl_state_t *s);
|
||||
|
||||
int udptl_set_far_max_datagram(udptl_state_t *s, int max_datagram);
|
||||
|
||||
int udptl_get_far_max_datagram(udptl_state_t *s);
|
||||
|
||||
/*! \brief Initialise a UDPTL context.
|
||||
\param s The UDPTL context.
|
||||
\param ec_scheme One of the optional error correction schemes.
|
||||
\param span The packet span over which error correction should be applied.
|
||||
\param entries The number of error correction entries to include in packets.
|
||||
\param rx_packet_handler The callback function, used to report arriving IFP packets.
|
||||
\param user_data An opaque pointer supplied to rx_packet_handler.
|
||||
\return A pointer to the UDPTL context, or NULL if there was a problem. */
|
||||
udptl_state_t *udptl_init(udptl_state_t *s, int ec_scheme, int span, int entries, udptl_rx_packet_handler_t rx_packet_handler, void *user_data);
|
||||
|
||||
/*! \brief Release a UDPTL context.
|
||||
\param s The UDPTL context.
|
||||
\return 0 for OK. */
|
||||
int udptl_release(udptl_state_t *s);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/*- End of file ------------------------------------------------------------*/
|
@ -23,7 +23,9 @@
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Chris Rienzo <chris@rienzo.net>
|
||||
* Christopher M. Rienzo <chris@rienzo.com>
|
||||
*
|
||||
* Maintainer: Christopher M. Rienzo <chris@rienzo.com>
|
||||
*
|
||||
* mod_http_cache.c -- HTTP GET with caching
|
||||
* -- designed for downloading audio files from a webserver for playback
|
||||
|
@ -287,7 +287,7 @@ static void transfer_call(switch_core_session_t *session, char *destination)
|
||||
switch_separate_string(mydup, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
|
||||
|
||||
/* Find the uuid of our B leg. If it exists, transfer it first */
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel))) {
|
||||
switch_core_session_t *b_session;
|
||||
|
||||
/* Get info on the B leg */
|
||||
|
@ -32,6 +32,11 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#ifdef _MSC_VER
|
||||
#include <io.h>
|
||||
#include <WinSock2.h>
|
||||
#define snprintf _snprintf
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
@ -39,6 +44,7 @@
|
||||
#include <netdb.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
@ -550,6 +556,7 @@ REDIS credis_connect(const char *host, int port, int timeout)
|
||||
int fd, yes = 1;
|
||||
struct sockaddr_in sa;
|
||||
REDIS rhnd;
|
||||
int valid = 0;
|
||||
|
||||
if ((rhnd = cr_new()) == NULL)
|
||||
return NULL;
|
||||
@ -566,7 +573,16 @@ REDIS credis_connect(const char *host, int port, int timeout)
|
||||
|
||||
sa.sin_family = AF_INET;
|
||||
sa.sin_port = htons(port);
|
||||
if (inet_aton(host, &sa.sin_addr) == 0) {
|
||||
#ifdef WIN32
|
||||
sa.sin_addr.S_un.S_addr = inet_addr(host);
|
||||
if (sa.sin_addr.S_un.S_addr != 0) {
|
||||
valid = 1;
|
||||
}
|
||||
#else
|
||||
valid = inet_aton(host, &sa.sin_addr);
|
||||
#endif
|
||||
|
||||
if (valid == 0) {
|
||||
struct hostent *he = gethostbyname(host);
|
||||
if (he == NULL)
|
||||
goto error;
|
||||
|
@ -2,9 +2,9 @@
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9.00"
|
||||
Name="mod_fax"
|
||||
ProjectGUID="{7877EFC8-4807-484B-B573-D7B7FD058FAA}"
|
||||
RootNamespace="mod_fax"
|
||||
Name="mod_redis"
|
||||
ProjectGUID="{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}"
|
||||
RootNamespace="mod_redis"
|
||||
Keyword="Win32Proj"
|
||||
TargetFrameworkVersion="131072"
|
||||
>
|
||||
@ -23,7 +23,7 @@
|
||||
Name="Debug|Win32"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="..\..\..\..\w32\module_debug.vsprops"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@ -42,7 +42,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
|
||||
UsePrecompiledHeader="0"
|
||||
/>
|
||||
<Tool
|
||||
@ -56,7 +55,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="ws2_32.lib"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
/>
|
||||
@ -84,9 +82,11 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|x64"
|
||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="..\..\..\..\w32\module_debug.vsprops"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@ -106,7 +106,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
|
||||
UsePrecompiledHeader="0"
|
||||
/>
|
||||
<Tool
|
||||
@ -120,7 +119,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="ws2_32.lib"
|
||||
OutputFile="$(SolutionDir)$(PlatformName)\$(ConfigurationName)/mod/$(ProjectName).dll"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
@ -152,7 +150,7 @@
|
||||
Name="Release|Win32"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="..\..\..\..\w32\module_release.vsprops"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@ -171,7 +169,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
|
||||
UsePrecompiledHeader="0"
|
||||
/>
|
||||
<Tool
|
||||
@ -185,7 +182,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="ws2_32.lib"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
/>
|
||||
@ -213,9 +209,11 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|x64"
|
||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="..\..\..\..\w32\module_release.vsprops"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@ -235,7 +233,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
|
||||
UsePrecompiledHeader="0"
|
||||
/>
|
||||
<Tool
|
||||
@ -249,7 +246,6 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="ws2_32.lib"
|
||||
OutputFile="$(SolutionDir)$(PlatformName)\$(ConfigurationName)/mod/$(ProjectName).dll"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
@ -282,15 +278,15 @@
|
||||
</References>
|
||||
<Files>
|
||||
<File
|
||||
RelativePath=".\mod_fax.c"
|
||||
RelativePath=".\mod_redis.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\udptl.c"
|
||||
RelativePath=".\credis.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\udptl.h"
|
||||
RelativePath=".\credis.h"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
123
src/mod/applications/mod_redis/mod_redis.2010.vcxproj
Normal file
123
src/mod/applications/mod_redis/mod_redis.2010.vcxproj
Normal file
@ -0,0 +1,123 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>mod_redis</ProjectName>
|
||||
<ProjectGuid>{886B5E9D-F2C2-4AF2-98C8-EF98C4C770E6}</ProjectGuid>
|
||||
<RootNamespace>mod_redis</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\..\..\w32\module_release.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\..\..\w32\module_debug.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\..\..\w32\module_release.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\..\..\w32\module_debug.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile />
|
||||
<Link>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile />
|
||||
<Link>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile />
|
||||
<Link>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile />
|
||||
<Link>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="mod_redis.c" />
|
||||
<ClCompile Include="credis.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\..\w32\Library\FreeSwitchCore.2010.vcxproj">
|
||||
<Project>{202d7a4e-760d-4d0e-afa1-d7459ced30ff}</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="credis.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@ -29,7 +29,7 @@
|
||||
* Brian West <brian@freeswitch.org>
|
||||
* Steve Underwood <steveu@coppice.org>
|
||||
* Antonio Gallo <agx@linux.it>
|
||||
* Christopher M. Rienzo <chris@rienzo.net>
|
||||
* Christopher M. Rienzo <chris@rienzo.com>
|
||||
* mod_spandsp.c -- Module implementing spandsp fax, dsp, and codec functionality
|
||||
*
|
||||
*/
|
||||
|
@ -28,7 +28,7 @@
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Steve Underwood <steveu@coppice.org>
|
||||
* Antonio Gallo <agx@linux.it>
|
||||
* Christopher M. Rienzo <chris@rienzo.net>
|
||||
* Christopher M. Rienzo <chris@rienzo.com>
|
||||
* mod_spandsp_dsp.c -- dsp applications provided by SpanDSP
|
||||
*
|
||||
*/
|
||||
|
@ -618,7 +618,7 @@ SWITCH_STANDARD_APP(valet_parking_function)
|
||||
char tmp[512] = "";
|
||||
switch_snprintf(tmp, sizeof(tmp), "%s:%s", lot_name, ext);
|
||||
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel))) {
|
||||
switch_core_session_t *b_session;
|
||||
|
||||
if ((b_session = switch_core_session_locate(uuid))) {
|
||||
|
@ -3489,7 +3489,7 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, vm_p
|
||||
|
||||
switch_safe_free(file_path);
|
||||
|
||||
if (switch_channel_ready(channel)) {
|
||||
if (switch_channel_ready(channel) && vm_enabled) {
|
||||
status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
@ -4895,6 +4895,8 @@ SWITCH_STANDARD_API(vm_fsdb_pref_greeting_set_function)
|
||||
profile->name, SWITCH_PATH_SEPARATOR, domain, SWITCH_PATH_SEPARATOR, id);
|
||||
char *final_file_path = switch_core_sprintf(pool, "%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, slot, profile->file_ext);
|
||||
|
||||
switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, pool);
|
||||
|
||||
if (file_path) {
|
||||
if (switch_file_exists(file_path, pool) != SWITCH_STATUS_SUCCESS) {
|
||||
stream->write_function(stream, "-ERR Filename doesn't exist\n");
|
||||
@ -4989,6 +4991,8 @@ SWITCH_STANDARD_API(vm_fsdb_pref_recname_set_function)
|
||||
profile->name, SWITCH_PATH_SEPARATOR, domain, SWITCH_PATH_SEPARATOR, id);
|
||||
char *final_file_path = switch_core_sprintf(pool, "%s%srecorded_name.%s", dir_path, SWITCH_PATH_SEPARATOR, profile->file_ext);
|
||||
|
||||
switch_dir_make_recursive(dir_path, SWITCH_DEFAULT_DIR_PERMS, pool);
|
||||
|
||||
if (switch_file_exists(file_path, pool) != SWITCH_STATUS_SUCCESS) {
|
||||
stream->write_function(stream, "-ERR Filename doesn't exist\n");
|
||||
profile_rwunlock(profile);
|
||||
@ -4996,6 +5000,7 @@ SWITCH_STANDARD_API(vm_fsdb_pref_recname_set_function)
|
||||
}
|
||||
|
||||
switch_file_rename(file_path, final_file_path, pool);
|
||||
|
||||
if (atoi(res) == 0) {
|
||||
sql = switch_mprintf("INSERT INTO voicemail_prefs (username, domain, name_path) VALUES('%q', '%q', '%q')", id, domain, final_file_path);
|
||||
} else {
|
||||
|
@ -17,7 +17,7 @@
|
||||
* The Original Code is FreeSWITCH mod_unimrcp
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Christopher M. Rienzo <chris@rienzo.net>
|
||||
* Christopher M. Rienzo <chris@rienzo.com>
|
||||
*
|
||||
* Portions created by the Initial Developer are Copyright (C)
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
@ -25,9 +25,11 @@
|
||||
* Contributor(s):
|
||||
*
|
||||
* Brian West <brian@freeswitch.org>
|
||||
* Christopher M. Rienzo <chris@rienzo.net>
|
||||
* Christopher M. Rienzo <chris@rienzo.com>
|
||||
* Luke Dashjr <luke@openmethods.com> (OpenMethods, LLC)
|
||||
*
|
||||
* Maintainer: Christopher M. Rienzo <chris@rienzo.com>
|
||||
*
|
||||
* mod_unimrcp.c -- UniMRCP module (MRCP client)
|
||||
*
|
||||
*/
|
||||
|
@ -24,7 +24,7 @@
|
||||
* Contributor(s):
|
||||
*
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Chris Rienzo <chris@rienzo.net>
|
||||
* Christopher M. Rienzo <chris@rienzo.com>
|
||||
*
|
||||
*
|
||||
* mod_speex.c -- Speex Codec Module
|
||||
|
@ -132,7 +132,7 @@
|
||||
//#define SAMPLES_PER_FRAME SAMPLERATE_GSMOPEN/50
|
||||
|
||||
#ifndef GSMOPEN_SVN_VERSION
|
||||
#define GSMOPEN_SVN_VERSION SWITCH_VERSION_REVISION
|
||||
#define GSMOPEN_SVN_VERSION SWITCH_VERSION_FULL
|
||||
#endif /* GSMOPEN_SVN_VERSION */
|
||||
|
||||
typedef enum {
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2005/2012, Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
@ -23,17 +23,15 @@
|
||||
*
|
||||
* This module (mod_gsmopen) has been contributed by:
|
||||
*
|
||||
* Giovanni Maruzzelli (gmaruzz@gmail.com)
|
||||
* Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Maintainer: Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Further Contributors:
|
||||
*
|
||||
*
|
||||
*
|
||||
* mod_gsmopen.c -- GSM compatible Endpoint Module
|
||||
* mod_gsmopen.cpp -- GSM Modem compatible Endpoint Module
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#define __STDC_LIMIT_MACROS
|
||||
|
||||
#ifdef WIN32
|
||||
@ -115,7 +113,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef GSMOPEN_SVN_VERSION
|
||||
#define GSMOPEN_SVN_VERSION SWITCH_VERSION_REVISION
|
||||
#define GSMOPEN_SVN_VERSION SWITCH_VERSION_FULL
|
||||
#endif /* GSMOPEN_SVN_VERSION */
|
||||
|
||||
#include "ctb-0.16/ctb.h"
|
||||
|
@ -1,3 +1,39 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Portions created by the Initial Developer are Copyright (C)
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This module (mod_gsmopen) has been contributed by:
|
||||
*
|
||||
* Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Maintainer: Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* gsmopen_protocol.cpp -- Low Level Interface for mod_gamopen
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#include "gsmopen.h"
|
||||
#ifdef WIN32
|
||||
#include "win_iconv.c"
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2005/2012, Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
@ -23,14 +23,11 @@
|
||||
*
|
||||
* This module (mod_gsmopen) has been contributed by:
|
||||
*
|
||||
* Giovanni Maruzzelli (gmaruzz@gmail.com)
|
||||
* Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Maintainer: Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Further Contributors:
|
||||
*
|
||||
*
|
||||
*
|
||||
* mod_gsmopen.c -- GSM compatible Endpoint Module
|
||||
* mod_gsmopen.cpp -- GSM Modem compatible Endpoint Module
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -1334,11 +1334,11 @@ void FSH323Connection::OnModeChanged(const H245_ModeDescription & newMode)
|
||||
else
|
||||
t38_options->T38FaxUdpEC = "t38UDPRedundancy";
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"T38FaxUdpEC:%s\n",t38_options->T38FaxUdpEC);
|
||||
const char *uuid = switch_channel_get_variable(m_fsChannel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *uuid = switch_channel_get_partner_uuid(m_fsChannel);
|
||||
if (uuid != NULL) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"uuid:%s\n",uuid);
|
||||
|
||||
switch_core_session_t *session = switch_core_session_locate(switch_channel_get_variable(m_fsChannel, SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
switch_core_session_t *session = switch_core_session_locate(switch_channel_get_partner_uuid(m_fsChannel));
|
||||
if (session) {
|
||||
switch_channel_t * channel = switch_core_session_get_channel(session);
|
||||
if (channel) {
|
||||
@ -2229,7 +2229,7 @@ PBoolean FSH323_ExternalRTPChannel::Start()
|
||||
switch_channel_mark_pre_answered(m_fsChannel);
|
||||
|
||||
if (m_capability->GetMainType() == H323Capability::e_Data && m_conn->m_rxChannel && m_conn->m_txChannel) {
|
||||
const char *uuid = switch_channel_get_variable(m_fsChannel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *uuid = switch_channel_get_partner_uuid(m_fsChannel);
|
||||
if (uuid != NULL){
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,"------------------------->switch_rtp_udptl_mode\n");
|
||||
switch_rtp_udptl_mode(tech_pvt->rtp_session);
|
||||
|
@ -599,7 +599,7 @@ struct Transfer<T, false>
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
switch_core_session_t *peer_session = switch_core_session_locate(switch_channel_get_variable(chan,SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
switch_core_session_t *peer_session = switch_core_session_locate(switch_channel_get_partner_uuid(chan));
|
||||
|
||||
if(!peer_session)
|
||||
{
|
||||
@ -662,7 +662,7 @@ struct Transfer<T, false>
|
||||
switch_channel_t * peer = switch_core_session_get_channel(peer_session);
|
||||
|
||||
/* put the channel in hold */
|
||||
//switch_core_session_t *session = switch_core_session_locate(switch_channel_get_variable(chan,SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
//switch_core_session_t *session = switch_core_session_locate(switch_channel_get_partner_uuid(chan));
|
||||
//switch_channel_t *chan_core = switch_core_session_get_channel(session);
|
||||
|
||||
const char *stream;
|
||||
@ -709,7 +709,7 @@ struct Transfer<T, false>
|
||||
switch_core_session_rwunlock(pvt->session());
|
||||
switch_core_session_rwunlock(peer_session);
|
||||
|
||||
//switch_ivr_unhold_uuid(switch_channel_get_variable(chan,SWITCH_SIGNAL_BOND_VARIABLE));
|
||||
//switch_ivr_unhold_uuid(switch_channel_get_partner_uuid(chan));
|
||||
}
|
||||
catch (ScopedLockFailed & err)
|
||||
{
|
||||
|
@ -659,13 +659,13 @@ static switch_status_t find_non_loopback_bridge(switch_core_session_t *session,
|
||||
*br_session = NULL;
|
||||
*br_uuid = NULL;
|
||||
|
||||
a_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
a_uuid = switch_channel_get_partner_uuid(channel);
|
||||
|
||||
while (a_uuid && (sp = switch_core_session_locate(a_uuid))) {
|
||||
if (switch_core_session_check_interface(sp, loopback_endpoint_interface)) {
|
||||
private_t *tech_pvt = switch_core_session_get_private(sp);
|
||||
|
||||
a_uuid = switch_channel_get_variable(tech_pvt->other_channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
a_uuid = switch_channel_get_partner_uuid(tech_pvt->other_channel);
|
||||
switch_core_session_rwunlock(sp);
|
||||
sp = NULL;
|
||||
} else {
|
||||
@ -919,7 +919,7 @@ static switch_status_t loopback_bowout_on_execute_state_handler(switch_core_sess
|
||||
/* Wait for b_channel to be fully bridged */
|
||||
switch_channel_wait_for_flag(b_channel, CF_BRIDGED, SWITCH_TRUE, 5000, NULL);
|
||||
|
||||
uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
uuid = switch_channel_get_partner_uuid(b_channel);
|
||||
|
||||
if (uuid && (other_session = switch_core_session_locate(uuid))) {
|
||||
switch_channel_t *other_channel = switch_core_session_get_channel(other_session);
|
||||
|
@ -539,7 +539,7 @@ RTMP_INVOKE_FUNCTION(rtmp_i_transfer)
|
||||
}
|
||||
|
||||
if ((tech_pvt = rtmp_locate_private(rsession, uuid))) {
|
||||
const char *other_uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *other_uuid = switch_channel_get_partner_uuid(tech_pvt->channel);
|
||||
switch_core_session_t *session;
|
||||
|
||||
if (!zstr(other_uuid) && (session = switch_core_session_locate(other_uuid))) {
|
||||
@ -570,8 +570,8 @@ RTMP_INVOKE_FUNCTION(rtmp_i_join)
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
if ((other_uuid[0] = switch_channel_get_variable(tech_pvt[0]->channel, SWITCH_SIGNAL_BOND_VARIABLE)) &&
|
||||
(other_uuid[1] = switch_channel_get_variable(tech_pvt[1]->channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if ((other_uuid[0] = switch_channel_get_partner_uuid(tech_pvt[0]->channel)) &&
|
||||
(other_uuid[1] = switch_channel_get_partner_uuid(tech_pvt[1]->channel))) {
|
||||
|
||||
#ifndef RTMP_DONT_HOLD
|
||||
if (switch_test_flag(tech_pvt[0], TFLAG_DETACHED)) {
|
||||
@ -725,8 +725,8 @@ RTMP_INVOKE_FUNCTION(rtmp_i_three_way)
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
if (!(other_uuid[0] = switch_channel_get_variable(tech_pvt[0]->channel, SWITCH_SIGNAL_BOND_VARIABLE)) ||
|
||||
!(other_uuid[1] = switch_channel_get_variable(tech_pvt[1]->channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if (!(other_uuid[0] = switch_channel_get_partner_uuid(tech_pvt[0]->channel)) ||
|
||||
!(other_uuid[1] = switch_channel_get_partner_uuid(tech_pvt[1]->channel))) {
|
||||
return SWITCH_STATUS_FALSE; /* Both calls aren't bridged */
|
||||
}
|
||||
|
||||
|
@ -1926,10 +1926,10 @@ static switch_status_t load_skinny_config(void)
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected ODBC DSN: %s\n", profile->odbc_dsn);
|
||||
switch_odbc_handle_exec(profile->master_odbc, devices_sql, NULL, NULL);
|
||||
switch_odbc_handle_exec(profile->master_odbc, lines_sql, NULL, NULL);
|
||||
switch_odbc_handle_exec(profile->master_odbc, buttons_sql, NULL, NULL);
|
||||
switch_odbc_handle_exec(profile->master_odbc, active_lines_sql, NULL, NULL);
|
||||
switch_cache_db_test_reactive(skinny_get_db_handle(profile), "SELECT headset FROM skinny_devices", "DROP TABLE skinny_devices", devices_sql);
|
||||
switch_cache_db_test_reactive(skinny_get_db_handle(profile), "SELECT * FROM skinny_lines", "DROP TABLE skinny_lines", lines_sql);
|
||||
switch_cache_db_test_reactive(skinny_get_db_handle(profile), "SELECT * FROM skinny_buttons", "DROP TABLE skinny_buttons", buttons_sql);
|
||||
switch_cache_db_test_reactive(skinny_get_db_handle(profile), "SELECT * FROM skinny_active_lines", "DROP TABLE skinny_active_lines", active_lines_sql);
|
||||
} else {
|
||||
if ((db = switch_core_db_open_file(profile->dbname))) {
|
||||
switch_core_db_test_reactive(db, "SELECT headset FROM skinny_devices", "DROP TABLE skinny_devices", devices_sql);
|
||||
@ -1943,11 +1943,6 @@ static switch_status_t load_skinny_config(void)
|
||||
switch_core_db_close(db);
|
||||
}
|
||||
|
||||
skinny_execute_sql_callback(profile, profile->sql_mutex, "DELETE FROM skinny_devices", NULL, NULL);
|
||||
skinny_execute_sql_callback(profile, profile->sql_mutex, "DELETE FROM skinny_lines", NULL, NULL);
|
||||
skinny_execute_sql_callback(profile, profile->sql_mutex, "DELETE FROM skinny_buttons", NULL, NULL);
|
||||
skinny_execute_sql_callback(profile, profile->sql_mutex, "DELETE FROM skinny_active_lines", NULL, NULL);
|
||||
|
||||
skinny_profile_respawn(profile, 0);
|
||||
|
||||
/* Register profile */
|
||||
|
@ -784,12 +784,12 @@ switch_status_t skinny_session_transfer(switch_core_session_t *session, listener
|
||||
|
||||
tech_pvt = switch_core_session_get_private(session);
|
||||
channel = switch_core_session_get_channel(session);
|
||||
remote_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
remote_uuid = switch_channel_get_partner_uuid(channel);
|
||||
|
||||
if (tech_pvt->transfer_from_call_id) {
|
||||
if((session2 = skinny_profile_find_session(listener->profile, listener, &line_instance, tech_pvt->transfer_from_call_id))) {
|
||||
switch_channel_t *channel2 = switch_core_session_get_channel(session2);
|
||||
const char *remote_uuid2 = switch_channel_get_variable(channel2, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *remote_uuid2 = switch_channel_get_partner_uuid(channel2);
|
||||
if (switch_ivr_uuid_bridge(remote_uuid, remote_uuid2) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
|
||||
switch_channel_hangup(channel2, SWITCH_CAUSE_NORMAL_CLEARING);
|
||||
@ -1007,6 +1007,7 @@ switch_status_t skinny_handle_register(listener_t *listener, skinny_message_t *r
|
||||
const char *value = switch_xml_attr_soft(xbutton, "value");
|
||||
if(type == SKINNY_BUTTON_LINE) {
|
||||
const char *caller_name = switch_xml_attr_soft(xbutton, "caller-name");
|
||||
const char *reg_metadata = switch_xml_attr_soft(xbutton, "registration-metadata");
|
||||
uint32_t ring_on_idle = atoi(switch_xml_attr_soft(xbutton, "ring-on-idle"));
|
||||
uint32_t ring_on_active = atoi(switch_xml_attr_soft(xbutton, "ring-on-active"));
|
||||
uint32_t busy_trigger = atoi(switch_xml_attr_soft(xbutton, "busy-trigger"));
|
||||
@ -1030,7 +1031,7 @@ switch_status_t skinny_handle_register(listener_t *listener, skinny_message_t *r
|
||||
switch_safe_free(sql);
|
||||
token = switch_mprintf("skinny/%q/%q/%q:%d", profile->name, value, request->data.reg.device_name, request->data.reg.instance);
|
||||
url = switch_mprintf("skinny/%q/%q", profile->name, value);
|
||||
switch_core_add_registration(value, profile->domain, token, url, 0, network_ip, network_port_c, "tcp");
|
||||
switch_core_add_registration(value, profile->domain, token, url, 0, network_ip, network_port_c, "tcp", reg_metadata);
|
||||
switch_safe_free(token);
|
||||
switch_safe_free(url);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2005-2012, Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
@ -21,19 +21,17 @@
|
||||
* Portions created by the Initial Developer are Copyright (C)
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This module (mod_skypopen) has been contributed by:
|
||||
*
|
||||
* Giovanni Maruzzelli (gmaruzz@gmail.com)
|
||||
*
|
||||
*
|
||||
* Further Contributors:
|
||||
* This module (mod_gsmopen) has been contributed by:
|
||||
*
|
||||
* Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Maintainer: Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* mod_skypopen.c -- Skype compatible Endpoint Module
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "skypopen.h"
|
||||
#define SKYPE_CHAT_PROTO "skype"
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2005/2012, Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
@ -21,18 +21,17 @@
|
||||
* Portions created by the Initial Developer are Copyright (C)
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This module (mod_skypopen) has been contributed by:
|
||||
* This module (mod_gsmopen) has been contributed by:
|
||||
*
|
||||
* Giovanni Maruzzelli (gmaruzz@gmail.com)
|
||||
*
|
||||
*
|
||||
* Further Contributors:
|
||||
* Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Maintainer: Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* mod_skypopen.c -- Skype compatible Endpoint Module
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <switch.h>
|
||||
#include <switch_version.h>
|
||||
|
||||
@ -86,7 +85,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef SKYPOPEN_SVN_VERSION
|
||||
#define SKYPOPEN_SVN_VERSION SWITCH_VERSION_REVISION
|
||||
#define SKYPOPEN_SVN_VERSION SWITCH_VERSION_FULL
|
||||
#endif /* SKYPOPEN_SVN_VERSION */
|
||||
|
||||
typedef enum {
|
||||
|
@ -1,3 +1,37 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Portions created by the Initial Developer are Copyright (C)
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* This module (mod_gsmopen) has been contributed by:
|
||||
*
|
||||
* Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* Maintainer: Giovanni Maruzzelli <gmaruzz@gmail.com>
|
||||
*
|
||||
* skypopen_protocol.c -- Low Level Interface for mod_skypopen
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "skypopen.h"
|
||||
|
||||
#ifdef ASTERISK
|
||||
|
@ -1,95 +0,0 @@
|
||||
<profile name="external">
|
||||
<!-- http://wiki.freeswitch.org/wiki/Sofia_Configuration_Files -->
|
||||
<!-- This profile is only for outbound registrations to providers -->
|
||||
<gateways>
|
||||
<X-PRE-PROCESS cmd="include" data="external/*.xml"/>
|
||||
</gateways>
|
||||
|
||||
<aliases>
|
||||
<!--
|
||||
<alias name="outbound"/>
|
||||
<alias name="nat"/>
|
||||
-->
|
||||
</aliases>
|
||||
|
||||
<domains>
|
||||
<domain name="all" alias="false" parse="true"/>
|
||||
</domains>
|
||||
|
||||
<settings>
|
||||
<param name="debug" value="0"/>
|
||||
<!-- If you want FreeSWITCH to shutdown if this profile fails to load, uncomment the next line. -->
|
||||
<!-- <param name="shutdown-on-fail" value="true"/> -->
|
||||
<param name="sip-trace" value="no"/>
|
||||
<param name="sip-capture" value="no"/>
|
||||
<param name="rfc2833-pt" value="101"/>
|
||||
<!-- RFC 5626 : Send reg-id and sip.instance -->
|
||||
<!--<param name="enable-rfc-5626" value="true"/> -->
|
||||
<param name="sip-port" value="$${external_sip_port}"/>
|
||||
<param name="dialplan" value="XML"/>
|
||||
<param name="context" value="public"/>
|
||||
<param name="dtmf-duration" value="2000"/>
|
||||
<param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>
|
||||
<param name="outbound-codec-prefs" value="$${outbound_codec_prefs}"/>
|
||||
<param name="hold-music" value="$${hold_music}"/>
|
||||
<param name="rtp-timer-name" value="soft"/>
|
||||
<!--<param name="enable-100rel" value="true"/>-->
|
||||
<!--<param name="disable-srv503" value="true"/>-->
|
||||
<!-- This could be set to "passive" -->
|
||||
<param name="local-network-acl" value="localnet.auto"/>
|
||||
<param name="manage-presence" value="false"/>
|
||||
|
||||
<!-- used to share presence info across sofia profiles
|
||||
manage-presence needs to be set to passive on this profile
|
||||
if you want it to behave as if it were the internal profile
|
||||
for presence.
|
||||
-->
|
||||
<!-- Name of the db to use for this profile -->
|
||||
<!--<param name="dbname" value="share_presence"/>-->
|
||||
<!--<param name="presence-hosts" value="$${domain}"/>-->
|
||||
<!--<param name="force-register-domain" value="$${domain}"/>-->
|
||||
<!--all inbound reg will stored in the db using this domain -->
|
||||
<!--<param name="force-register-db-domain" value="$${domain}"/>-->
|
||||
<!-- ************************************************* -->
|
||||
|
||||
<!--<param name="aggressive-nat-detection" value="true"/>-->
|
||||
<param name="inbound-codec-negotiation" value="generous"/>
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<param name="auth-calls" value="false"/>
|
||||
<!--
|
||||
DO NOT USE HOSTNAMES, ONLY IP ADDRESSES IN THESE SETTINGS!
|
||||
-->
|
||||
<param name="rtp-ip" value="$${local_ip_v4}"/>
|
||||
<param name="sip-ip" value="$${local_ip_v4}"/>
|
||||
<param name="ext-rtp-ip" value="auto-nat"/>
|
||||
<param name="ext-sip-ip" value="auto-nat"/>
|
||||
<param name="rtp-timeout-sec" value="300"/>
|
||||
<param name="rtp-hold-timeout-sec" value="1800"/>
|
||||
<!--<param name="enable-3pcc" value="true"/>-->
|
||||
|
||||
<!-- TLS: disabled by default, set to "true" to enable -->
|
||||
<param name="tls" value="$${external_ssl_enable}"/>
|
||||
<!-- Set to true to not bind on the normal sip-port but only on the TLS port -->
|
||||
<param name="tls-only" value="false"/>
|
||||
<!-- additional bind parameters for TLS -->
|
||||
<param name="tls-bind-params" value="transport=tls"/>
|
||||
<!-- Port to listen on for TLS requests. (5081 will be used if unspecified) -->
|
||||
<param name="tls-sip-port" value="$${external_tls_port}"/>
|
||||
<!-- Location of the agent.pem and cafile.pem ssl certificates (needed for TLS server) -->
|
||||
<param name="tls-cert-dir" value="$${external_ssl_dir}"/>
|
||||
<!-- Optionally set the passphrase password used by openSSL to encrypt/decrypt TLS private key files -->
|
||||
<param name="tls-passphrase" value=""/>
|
||||
<!-- Verify the date on TLS certificates -->
|
||||
<param name="tls-verify-date" value="true"/>
|
||||
<!-- TLS verify policy, when registering/inviting gateways with other servers (outbound) or handling inbound registration/invite requests how should we verify their certificate -->
|
||||
<!-- set to 'in' to only verify incoming connections, 'out' to only verify outgoing connections, 'all' to verify all connections, also 'in_subjects', 'out_subjects' and 'all_subjects' for subject validation. Multiple policies can be split with a '|' pipe -->
|
||||
<param name="tls-verify-policy" value="none"/>
|
||||
<!-- Certificate max verify depth to use for validating peer TLS certificates when the verify policy is not none -->
|
||||
<param name="tls-verify-depth" value="2"/>
|
||||
<!-- If the tls-verify-policy is set to subjects_all or subjects_in this sets which subjects are allowed, multiple subjects can be split with a '|' pipe -->
|
||||
<param name="tls-verify-in-subjects" value=""/>
|
||||
<!-- TLS version ("sslv23" (default), "tlsv1"). NOTE: Phones may not work with TLSv1 -->
|
||||
<param name="tls-version" value="$${sip_tls_version}"/>
|
||||
|
||||
</settings>
|
||||
</profile>
|
@ -1,38 +0,0 @@
|
||||
<include>
|
||||
<!--<gateway name="asterlink.com">-->
|
||||
<!--/// account username *required* ///-->
|
||||
<!--<param name="username" value="cluecon"/>-->
|
||||
<!--/// auth realm: *optional* same as gateway name, if blank ///-->
|
||||
<!--<param name="realm" value="asterlink.com"/>-->
|
||||
<!--/// username to use in from: *optional* same as username, if blank ///-->
|
||||
<!--<param name="from-user" value="cluecon"/>-->
|
||||
<!--/// domain to use in from: *optional* same as realm, if blank ///-->
|
||||
<!--<param name="from-domain" value="asterlink.com"/>-->
|
||||
<!--/// account password *required* ///-->
|
||||
<!--<param name="password" value="2007"/>-->
|
||||
<!--/// extension for inbound calls: *optional* same as username, if blank ///-->
|
||||
<!--<param name="extension" value="cluecon"/>-->
|
||||
<!--/// proxy host: *optional* same as realm, if blank ///-->
|
||||
<!--<param name="proxy" value="asterlink.com"/>-->
|
||||
<!--/// send register to this proxy: *optional* same as proxy, if blank ///-->
|
||||
<!--<param name="register-proxy" value="mysbc.com"/>-->
|
||||
<!--/// expire in seconds: *optional* 3600, if blank ///-->
|
||||
<!--<param name="expire-seconds" value="60"/>-->
|
||||
<!--/// do not register ///-->
|
||||
<!--<param name="register" value="false"/>-->
|
||||
<!-- which transport to use for register -->
|
||||
<!--<param name="register-transport" value="udp"/>-->
|
||||
<!--How many seconds before a retry when a failure or timeout occurs -->
|
||||
<!--<param name="retry-seconds" value="30"/>-->
|
||||
<!--Use the callerid of an inbound call in the from field on outbound calls via this gateway -->
|
||||
<!--<param name="caller-id-in-from" value="false"/>-->
|
||||
<!--extra sip params to send in the contact-->
|
||||
<!--<param name="contact-params" value="tport=tcp"/>-->
|
||||
<!--send an options ping every x seconds, failure will unregister and/or mark it down-->
|
||||
<!--<param name="ping" value="25"/>-->
|
||||
<!--</gateway>-->
|
||||
<!--rfc5626 : Abilitazione rfc5626 ///-->
|
||||
<!--<param name="rfc-5626" value="true"/>-->
|
||||
<!--rfc5626 : extra sip params to send in the contact-->
|
||||
<!--<param name="reg-id" value="1"/>-->
|
||||
</include>
|
@ -1,130 +0,0 @@
|
||||
<profile name="internal-ipv6">
|
||||
<!--
|
||||
This is an example of a sofia profile setup to listen on IPv6.
|
||||
-->
|
||||
<!-- http://wiki.freeswitch.org/wiki/Sofia_Configuration_Files -->
|
||||
<!--aliases are other names that will work as a valid profile name for this profile-->
|
||||
<settings>
|
||||
<!-- <param name="user-agent-string" value="FreeSWITCH Rocks!"/> -->
|
||||
<param name="debug" value="0"/>
|
||||
<param name="sip-trace" value="no"/>
|
||||
<param name="context" value="public"/>
|
||||
<param name="rfc2833-pt" value="101"/>
|
||||
<!-- port to bind to for sip traffic -->
|
||||
<param name="sip-port" value="$${internal_sip_port}"/>
|
||||
<param name="dialplan" value="XML"/>
|
||||
<param name="dtmf-duration" value="2000"/>
|
||||
<param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>
|
||||
<param name="outbound-codec-prefs" value="$${global_codec_prefs}"/>
|
||||
<param name="use-rtp-timer" value="true"/>
|
||||
<param name="rtp-timer-name" value="soft"/>
|
||||
<!-- ip address to use for rtp -->
|
||||
<param name="rtp-ip" value="$${local_ip_v6}"/>
|
||||
<!-- ip address to bind to -->
|
||||
<param name="sip-ip" value="$${local_ip_v6}"/>
|
||||
<param name="hold-music" value="$${hold_music}"/>
|
||||
<!--<param name="enable-100rel" value="false"/>-->
|
||||
<!--<param name="disable-srv503" value="true"/>-->
|
||||
<param name="apply-inbound-acl" value="domains"/>
|
||||
<!--<param name="apply-register-acl" value="domains"/>-->
|
||||
<!--<param name="dtmf-type" value="info"/>-->
|
||||
<param name="record-template" value="$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
|
||||
<!--enable to use presence and mwi -->
|
||||
<param name="manage-presence" value="true"/>
|
||||
<!-- This setting is for AAL2 bitpacking on G726 -->
|
||||
<!-- <param name="bitpacking" value="aal2"/> -->
|
||||
<!--max number of open dialogs in proceeding -->
|
||||
<!--<param name="max-proceeding" value="1000"/>-->
|
||||
<!--session timers for all call to expire after the specified seconds -->
|
||||
<!--<param name="session-timeout" value="1800"/>-->
|
||||
<!--<param name="multiple-registrations" value="true"/>-->
|
||||
<!--set to 'greedy' if you want your codec list to take precedence -->
|
||||
<param name="inbound-codec-negotiation" value="generous"/>
|
||||
<!-- if you want to send any special bind params of your own -->
|
||||
<!--<param name="bind-params" value="transport=udp"/>-->
|
||||
<!--<param name="unregister-on-options-fail" value="true"/>-->
|
||||
|
||||
<!-- TLS: disabled by default, set to "true" to enable -->
|
||||
<param name="tls" value="$${internal_ssl_enable}"/>
|
||||
<!-- additional bind parameters for TLS -->
|
||||
<param name="tls-bind-params" value="transport=tls"/>
|
||||
<!-- Port to listen on for TLS requests. (5061 will be used if unspecified) -->
|
||||
<param name="tls-sip-port" value="$${internal_tls_port}"/>
|
||||
<!-- Location of the agent.pem and cafile.pem ssl certificates (needed for TLS server) -->
|
||||
<param name="tls-cert-dir" value="$${internal_ssl_dir}"/>
|
||||
<!-- TLS version ("sslv23" (default), "tlsv1"). NOTE: Phones may not work with TLSv1 -->
|
||||
<param name="tls-version" value="$${sip_tls_version}"/>
|
||||
|
||||
<!--If you don't want to pass through timestampes from 1 RTP call to another (on a per call basis with rtp_rewrite_timestamps chanvar)-->
|
||||
<!--<param name="rtp-rewrite-timestamps" value="true"/>-->
|
||||
<!--<param name="pass-rfc2833" value="true"/>-->
|
||||
<!--If you have ODBC support and a working dsn you can use it instead of SQLite-->
|
||||
<!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
|
||||
|
||||
<!--Uncomment to set all inbound calls to no media mode-->
|
||||
<!--<param name="inbound-bypass-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
<!-- <param name="accept-blind-reg" value="true"/> -->
|
||||
|
||||
<!-- accept any authentication without actually checking (not a good feature for most people) -->
|
||||
<!-- <param name="accept-blind-auth" value="true"/> -->
|
||||
|
||||
<!-- suppress CNG on this profile or per call with the 'suppress_cng' variable -->
|
||||
<!-- <param name="suppress-cng" value="true"/> -->
|
||||
|
||||
<!--TTL for nonce in sip auth-->
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<!--Uncomment if you want to force the outbound leg of a bridge to only offer the codec
|
||||
that the originator is using-->
|
||||
<!--<param name="disable-transcoding" value="true"/>-->
|
||||
<!-- Used for when phones respond to a challenged ACK with method INVITE in the hash -->
|
||||
<!--<param name="NDLB-broken-auth-hash" value="true"/>-->
|
||||
<!-- add a ;received="<ip>:<port>" to the contact when replying to register for nat handling -->
|
||||
<!--<param name="NDLB-received-in-nat-reg-contact" value="true"/>-->
|
||||
<param name="auth-calls" value="$${internal_auth_calls}"/>
|
||||
<!-- on authed calls, authenticate *all* the packets not just invite -->
|
||||
<param name="auth-all-packets" value="false"/>
|
||||
<!-- <param name="ext-rtp-ip" value="$${external_rtp_ip}"/> -->
|
||||
<!-- <param name="ext-sip-ip" value="$${external_sip_ip}"/> -->
|
||||
<!-- rtp inactivity timeout -->
|
||||
<param name="rtp-timeout-sec" value="300"/>
|
||||
<param name="rtp-hold-timeout-sec" value="1800"/>
|
||||
<!-- VAD choose one (out is a good choice); -->
|
||||
<!-- <param name="vad" value="in"/> -->
|
||||
<!-- <param name="vad" value="out"/> -->
|
||||
<!-- <param name="vad" value="both"/> -->
|
||||
<!--<param name="alias" value="sip:10.0.1.251:5555"/>-->
|
||||
<!--
|
||||
These are enabled to make the default config work better out of the box.
|
||||
If you need more than ONE domain you'll need to not use these options.
|
||||
|
||||
-->
|
||||
<!--all inbound reg will look in this domain for the users -->
|
||||
<param name="force-register-domain" value="$${domain}"/>
|
||||
<!--all inbound reg will stored in the db using this domain -->
|
||||
<param name="force-register-db-domain" value="$${domain}"/>
|
||||
<!-- disable register and transfer which may be undesirable in a public switch -->
|
||||
<!--<param name="disable-transfer" value="true"/>-->
|
||||
<!--<param name="disable-register" value="true"/>-->
|
||||
<!--<param name="enable-3pcc" value="true"/>-->
|
||||
<!-- use stun when specified (default is true) -->
|
||||
<!--<param name="stun-enabled" value="true"/>-->
|
||||
<!-- use stun when specified (default is true) -->
|
||||
<!-- set to true to have the profile determine stun is not useful and turn it off globally-->
|
||||
<!--<param name="stun-auto-disable" value="true"/>-->
|
||||
|
||||
<!-- the following can be used as workaround with bogus SRV/NAPTR records -->
|
||||
<!--<param name="disable-srv" value="false" />-->
|
||||
<!--<param name="disable-naptr" value="false" />-->
|
||||
|
||||
</settings>
|
||||
</profile>
|
||||
|
@ -1,385 +0,0 @@
|
||||
<profile name="internal">
|
||||
<!--
|
||||
This is a sofia sip profile/user agent. This will service exactly one ip and port.
|
||||
In FreeSWITCH you can run multiple sip user agents on their own ip and port.
|
||||
|
||||
When you hear someone say "sofia profile" this is what they are talking about.
|
||||
-->
|
||||
|
||||
<!-- http://wiki.freeswitch.org/wiki/Sofia_Configuration_Files -->
|
||||
<!--aliases are other names that will work as a valid profile name for this profile-->
|
||||
<aliases>
|
||||
<!--
|
||||
<alias name="default"/>
|
||||
-->
|
||||
</aliases>
|
||||
<!-- Outbound Registrations -->
|
||||
<gateways>
|
||||
<X-PRE-PROCESS cmd="include" data="internal/*.xml"/>
|
||||
</gateways>
|
||||
|
||||
<domains>
|
||||
<!-- indicator to parse the directory for domains with parse="true" to get gateways-->
|
||||
<!--<domain name="$${domain}" parse="true"/>-->
|
||||
<!-- indicator to parse the directory for domains with parse="true" to get gateways and alias every domain to this profile -->
|
||||
<!--<domain name="all" alias="true" parse="true"/>-->
|
||||
<domain name="all" alias="true" parse="false"/>
|
||||
</domains>
|
||||
|
||||
<settings>
|
||||
<!--
|
||||
When calls are in no media this will bring them back to media
|
||||
when you press the hold button.
|
||||
-->
|
||||
<!--<param name="media-option" value="resume-media-on-hold"/> -->
|
||||
<!--
|
||||
This will allow a call after an attended transfer go back to
|
||||
bypass media after an attended transfer.
|
||||
-->
|
||||
<!--<param name="media-option" value="bypass-media-after-att-xfer"/>-->
|
||||
<!-- <param name="user-agent-string" value="FreeSWITCH Rocks!"/> -->
|
||||
<param name="debug" value="0"/>
|
||||
<!-- If you want FreeSWITCH to shutdown if this profile fails to load, uncomment the next line. -->
|
||||
<!-- <param name="shutdown-on-fail" value="true"/> -->
|
||||
<param name="sip-trace" value="no"/>
|
||||
<param name="sip-capture" value="no"/>
|
||||
|
||||
<!-- Use presence_map.conf.xml to convert extension regex to presence protos for routing -->
|
||||
<!-- <param name="presence-proto-lookup" value="true"/> -->
|
||||
|
||||
|
||||
<!-- Don't be picky about negotiated DTMF just always offer 2833 and accept both 2833 and INFO -->
|
||||
<!--<param name="liberal-dtmf" value="true"/>-->
|
||||
|
||||
|
||||
<!--
|
||||
Sometimes, in extremely rare edge cases, the Sofia SIP stack may stop
|
||||
responding. These options allow you to enable and control a watchdog
|
||||
on the Sofia SIP stack so that if it stops responding for the
|
||||
specified number of milliseconds, it will cause FreeSWITCH to crash
|
||||
immediately. This is useful if you run in an HA environment and
|
||||
need to ensure automated recovery from such a condition. Note that if
|
||||
your server is idle a lot, the watchdog may fire due to not receiving
|
||||
any SIP messages. Thus, if you expect your system to be idle, you
|
||||
should leave the watchdog disabled. It can be toggled on and off
|
||||
through the FreeSWITCH CLI either on an individual profile basis or
|
||||
globally for all profiles. So, if you run in an HA environment with a
|
||||
master and slave, you should use the CLI to make sure the watchdog is
|
||||
only enabled on the master.
|
||||
If such crash occurs, FreeSWITCH will dump core if allowed. The
|
||||
stacktrace will include function watchdog_triggered_abort().
|
||||
-->
|
||||
<param name="watchdog-enabled" value="no"/>
|
||||
<param name="watchdog-step-timeout" value="30000"/>
|
||||
<param name="watchdog-event-timeout" value="30000"/>
|
||||
|
||||
<param name="log-auth-failures" value="false"/>
|
||||
<param name="forward-unsolicited-mwi-notify" value="false"/>
|
||||
|
||||
<param name="context" value="public"/>
|
||||
<param name="rfc2833-pt" value="101"/>
|
||||
<!-- port to bind to for sip traffic -->
|
||||
<param name="sip-port" value="$${internal_sip_port}"/>
|
||||
<param name="dialplan" value="XML"/>
|
||||
<param name="dtmf-duration" value="2000"/>
|
||||
<param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>
|
||||
<param name="outbound-codec-prefs" value="$${global_codec_prefs}"/>
|
||||
<param name="rtp-timer-name" value="soft"/>
|
||||
<!-- ip address to use for rtp, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
|
||||
<param name="rtp-ip" value="$${local_ip_v4}"/>
|
||||
<!-- ip address to bind to, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
|
||||
<param name="sip-ip" value="$${local_ip_v4}"/>
|
||||
<param name="hold-music" value="$${hold_music}"/>
|
||||
<param name="apply-nat-acl" value="nat.auto"/>
|
||||
|
||||
|
||||
<!-- (default true) set to false if you do not wish to have called party info in 1XX responses -->
|
||||
<!-- <param name="cid-in-1xx" value="false"/> -->
|
||||
|
||||
<!-- extended info parsing -->
|
||||
<!-- <param name="extended-info-parsing" value="true"/> -->
|
||||
|
||||
<!--<param name="aggressive-nat-detection" value="true"/>-->
|
||||
<!--
|
||||
There are known issues (asserts and segfaults) when 100rel is enabled.
|
||||
It is not recommended to enable 100rel at this time.
|
||||
-->
|
||||
<!--<param name="enable-100rel" value="true"/>-->
|
||||
|
||||
<!-- uncomment if you don't wish to try a next SRV destination on 503 response -->
|
||||
<!-- RFC3263 Section 4.3 -->
|
||||
<!--<param name="disable-srv503" value="true"/>-->
|
||||
|
||||
<!-- Enable Compact SIP headers. -->
|
||||
<!--<param name="enable-compact-headers" value="true"/>-->
|
||||
<!--
|
||||
enable/disable session timers
|
||||
-->
|
||||
<!--<param name="enable-timer" value="false"/>-->
|
||||
<!--<param name="minimum-session-expires" value="120"/>-->
|
||||
<param name="apply-inbound-acl" value="domains"/>
|
||||
<!--
|
||||
This defines your local network, by default we detect your local network
|
||||
and create this localnet.auto ACL for this.
|
||||
-->
|
||||
<param name="local-network-acl" value="localnet.auto"/>
|
||||
<!--<param name="apply-register-acl" value="domains"/>-->
|
||||
<!--<param name="dtmf-type" value="info"/>-->
|
||||
|
||||
|
||||
<!-- 'true' means every time 'first-only' means on the first register -->
|
||||
<!--<param name="send-message-query-on-register" value="true"/>-->
|
||||
|
||||
<!-- 'true' means every time 'first-only' means on the first register -->
|
||||
<!--<param name="send-presence-on-register" value="first-only"/> -->
|
||||
|
||||
|
||||
<!-- Caller-ID type (choose one, can be overridden by inbound call type and/or sip_cid_type channel variable -->
|
||||
<!-- Remote-Party-ID header -->
|
||||
<!--<param name="caller-id-type" value="rpid"/>-->
|
||||
|
||||
<!-- P-*-Identity family of headers -->
|
||||
<!--<param name="caller-id-type" value="pid"/>-->
|
||||
|
||||
<!-- neither one -->
|
||||
<!--<param name="caller-id-type" value="none"/>-->
|
||||
|
||||
|
||||
|
||||
<param name="record-path" value="$${recordings_dir}"/>
|
||||
<param name="record-template" value="${caller_id_number}.${target_domain}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
|
||||
<!--enable to use presence -->
|
||||
<param name="manage-presence" value="true"/>
|
||||
<!-- send a presence probe on each register to query devices to send presence instead of sending presence with less info -->
|
||||
<!--<param name="presence-probe-on-register" value="true"/>-->
|
||||
<!--<param name="manage-shared-appearance" value="true"/>-->
|
||||
<!-- used to share presence info across sofia profiles -->
|
||||
<!-- Name of the db to use for this profile -->
|
||||
<!--<param name="dbname" value="share_presence"/>-->
|
||||
<param name="presence-hosts" value="$${domain},$${local_ip_v4}"/>
|
||||
<param name="presence-privacy" value="$${presence_privacy}"/>
|
||||
<!-- ************************************************* -->
|
||||
|
||||
<!-- This setting is for AAL2 bitpacking on G726 -->
|
||||
<!-- <param name="bitpacking" value="aal2"/> -->
|
||||
<!--max number of open dialogs in proceeding -->
|
||||
<!--<param name="max-proceeding" value="1000"/>-->
|
||||
<!--session timers for all call to expire after the specified seconds -->
|
||||
<!--<param name="session-timeout" value="1800"/>-->
|
||||
<!-- Can be 'true' or 'contact' -->
|
||||
<!--<param name="multiple-registrations" value="contact"/>-->
|
||||
<!--set to 'greedy' if you want your codec list to take precedence -->
|
||||
<param name="inbound-codec-negotiation" value="generous"/>
|
||||
<!-- if you want to send any special bind params of your own -->
|
||||
<!--<param name="bind-params" value="transport=udp"/>-->
|
||||
<!--<param name="unregister-on-options-fail" value="true"/>-->
|
||||
|
||||
<!-- TLS: disabled by default, set to "true" to enable -->
|
||||
<param name="tls" value="$${internal_ssl_enable}"/>
|
||||
<!-- Set to true to not bind on the normal sip-port but only on the TLS port -->
|
||||
<param name="tls-only" value="false"/>
|
||||
<!-- additional bind parameters for TLS -->
|
||||
<param name="tls-bind-params" value="transport=tls"/>
|
||||
<!-- Port to listen on for TLS requests. (5061 will be used if unspecified) -->
|
||||
<param name="tls-sip-port" value="$${internal_tls_port}"/>
|
||||
<!-- Location of the agent.pem and cafile.pem ssl certificates (needed for TLS server) -->
|
||||
<param name="tls-cert-dir" value="$${internal_ssl_dir}"/>
|
||||
<!-- Optionally set the passphrase password used by openSSL to encrypt/decrypt TLS private key files -->
|
||||
<param name="tls-passphrase" value=""/>
|
||||
<!-- Verify the date on TLS certificates -->
|
||||
<param name="tls-verify-date" value="true"/>
|
||||
<!-- TLS verify policy, when registering/inviting gateways with other servers (outbound) or handling inbound registration/invite requests how should we verify their certificate -->
|
||||
<!-- set to 'in' to only verify incoming connections, 'out' to only verify outgoing connections, 'all' to verify all connections, also 'in_subjects', 'out_subjects' and 'all_subjects' for subject validation. Multiple policies can be split with a '|' pipe -->
|
||||
<param name="tls-verify-policy" value="none"/>
|
||||
<!-- Certificate max verify depth to use for validating peer TLS certificates when the verify policy is not none -->
|
||||
<param name="tls-verify-depth" value="2"/>
|
||||
<!-- If the tls-verify-policy is set to subjects_all or subjects_in this sets which subjects are allowed, multiple subjects can be split with a '|' pipe -->
|
||||
<param name="tls-verify-in-subjects" value=""/>
|
||||
<!-- TLS version ("sslv23" (default), "tlsv1"). NOTE: Phones may not work with TLSv1 -->
|
||||
<param name="tls-version" value="$${sip_tls_version}"/>
|
||||
|
||||
<!-- turn on auto-flush during bridge (skip timer sleep when the socket already has data)
|
||||
(reduces delay on latent connections default true, must be disabled explicitly)-->
|
||||
<!--<param name="rtp-autoflush-during-bridge" value="false"/>-->
|
||||
|
||||
<!--If you don't want to pass through timestamps from 1 RTP call to another (on a per call basis with rtp_rewrite_timestamps chanvar)-->
|
||||
<!--<param name="rtp-rewrite-timestamps" value="true"/>-->
|
||||
<!--<param name="pass-rfc2833" value="true"/>-->
|
||||
<!--If you have ODBC support and a working dsn you can use it instead of SQLite-->
|
||||
<!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
|
||||
|
||||
<!--Uncomment to set all inbound calls to no media mode-->
|
||||
<!--<param name="inbound-bypass-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to set all inbound calls to proxy media mode-->
|
||||
<!--<param name="inbound-proxy-media" value="true"/>-->
|
||||
|
||||
<!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
|
||||
<!--<param name="inbound-late-negotiation" value="true"/>-->
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
|
||||
<!-- <param name="accept-blind-reg" value="true"/> -->
|
||||
|
||||
<!-- accept any authentication without actually checking (not a good feature for most people) -->
|
||||
<!-- <param name="accept-blind-auth" value="true"/> -->
|
||||
|
||||
<!-- suppress CNG on this profile or per call with the 'suppress_cng' variable -->
|
||||
<!-- <param name="suppress-cng" value="true"/> -->
|
||||
|
||||
<!--TTL for nonce in sip auth-->
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<!--Uncomment if you want to force the outbound leg of a bridge to only offer the codec
|
||||
that the originator is using-->
|
||||
<!--<param name="disable-transcoding" value="true"/>-->
|
||||
<!-- Handle 302 Redirect in the dialplan -->
|
||||
<!--<param name="manual-redirect" value="true"/> -->
|
||||
<!-- Disable Transfer -->
|
||||
<!--<param name="disable-transfer" value="true"/> -->
|
||||
<!-- Disable Register -->
|
||||
<!--<param name="disable-register" value="true"/> -->
|
||||
<!-- Used for when phones respond to a challenged ACK with method INVITE in the hash -->
|
||||
<!--<param name="NDLB-broken-auth-hash" value="true"/>-->
|
||||
<!-- add a ;received="<ip>:<port>" to the contact when replying to register for nat handling -->
|
||||
<!--<param name="NDLB-received-in-nat-reg-contact" value="true"/>-->
|
||||
<param name="auth-calls" value="$${internal_auth_calls}"/>
|
||||
<!-- Force the user and auth-user to match. -->
|
||||
<param name="inbound-reg-force-matching-username" value="true"/>
|
||||
<!-- on authed calls, authenticate *all* the packets not just invite -->
|
||||
<param name="auth-all-packets" value="false"/>
|
||||
|
||||
<!-- external_sip_ip
|
||||
Used as the public IP address for SDP.
|
||||
Can be an one of:
|
||||
ip address - "12.34.56.78"
|
||||
a stun server lookup - "stun:stun.server.com"
|
||||
a DNS name - "host:host.server.com"
|
||||
auto - Use guessed ip.
|
||||
auto-nat - Use ip learned from NAT-PMP or UPNP
|
||||
-->
|
||||
<param name="ext-rtp-ip" value="auto-nat"/>
|
||||
<param name="ext-sip-ip" value="auto-nat"/>
|
||||
|
||||
<!-- rtp inactivity timeout -->
|
||||
<param name="rtp-timeout-sec" value="300"/>
|
||||
<param name="rtp-hold-timeout-sec" value="1800"/>
|
||||
<!-- VAD choose one (out is a good choice); -->
|
||||
<!-- <param name="vad" value="in"/> -->
|
||||
<!-- <param name="vad" value="out"/> -->
|
||||
<!-- <param name="vad" value="both"/> -->
|
||||
<!--<param name="alias" value="sip:10.0.1.251:5555"/>-->
|
||||
<!--
|
||||
These are enabled to make the default config work better out of the box.
|
||||
If you need more than ONE domain you'll need to not use these options.
|
||||
|
||||
-->
|
||||
<!--all inbound reg will look in this domain for the users -->
|
||||
<param name="force-register-domain" value="$${domain}"/>
|
||||
<!--force the domain in subscriptions to this value -->
|
||||
<param name="force-subscription-domain" value="$${domain}"/>
|
||||
<!--all inbound reg will stored in the db using this domain -->
|
||||
<param name="force-register-db-domain" value="$${domain}"/>
|
||||
|
||||
<!--<param name="delete-subs-on-register" value="false"/>-->
|
||||
|
||||
<!-- enable rtcp on every channel also can be done per leg basis with rtcp_audio_interval_msec variable set to passthru to pass it across a call-->
|
||||
<!--<param name="rtcp-audio-interval-msec" value="5000"/>-->
|
||||
<!--<param name="rtcp-video-interval-msec" value="5000"/>-->
|
||||
|
||||
<!--force suscription expires to a lower value than requested-->
|
||||
<!--<param name="force-subscription-expires" value="60"/>-->
|
||||
<!-- disable register and transfer which may be undesirable in a public switch -->
|
||||
<!--<param name="disable-transfer" value="true"/>-->
|
||||
<!--<param name="disable-register" value="true"/>-->
|
||||
|
||||
<!--
|
||||
enable-3pcc can be set to either 'true' or 'proxy', true accepts the call
|
||||
right away, proxy waits until the call has been answered then sends accepts
|
||||
-->
|
||||
<!--<param name="enable-3pcc" value="true"/>-->
|
||||
|
||||
<!-- use at your own risk or if you know what this does.-->
|
||||
<!--<param name="NDLB-force-rport" value="true"/>-->
|
||||
<!--
|
||||
Choose the realm challenge key. Default is auto_to if not set.
|
||||
|
||||
auto_from - uses the from field as the value for the sip realm.
|
||||
auto_to - uses the to field as the value for the sip realm.
|
||||
<anyvalue> - you can input any value to use for the sip realm.
|
||||
|
||||
If you want URL dialing to work you'll want to set this to auto_from.
|
||||
|
||||
If you use any other value besides auto_to or auto_from you'll loose
|
||||
the ability to do multiple domains.
|
||||
|
||||
Note: comment out to restore the behavior before 2008-09-29
|
||||
|
||||
-->
|
||||
<param name="challenge-realm" value="auto_from"/>
|
||||
<!--<param name="disable-rtp-auto-adjust" value="true"/>-->
|
||||
<!-- on inbound calls make the uuid of the session equal to the sip call id of that call -->
|
||||
<!--<param name="inbound-use-callid-as-uuid" value="true"/>-->
|
||||
<!-- on outbound calls set the callid to match the uuid of the session -->
|
||||
<!--<param name="outbound-use-uuid-as-callid" value="true"/>-->
|
||||
<!-- set to false disable this feature -->
|
||||
<!--<param name="rtp-autofix-timing" value="false"/>-->
|
||||
|
||||
<!-- set this param to false if your gateway for some reason hates X- headers that it is supposed to ignore-->
|
||||
<!--<param name="pass-callee-id" value="false"/>-->
|
||||
|
||||
<!-- clear clears them all or supply the name to add or the name prefixed with ~ to remove
|
||||
valid values:
|
||||
|
||||
clear
|
||||
CISCO_SKIP_MARK_BIT_2833
|
||||
SONUS_SEND_INVALID_TIMESTAMP_2833
|
||||
|
||||
-->
|
||||
<!--<param name="auto-rtp-bugs" data="clear"/>-->
|
||||
|
||||
<!-- the following can be used as workaround with bogus SRV/NAPTR records -->
|
||||
<!--<param name="disable-srv" value="false" />-->
|
||||
<!--<param name="disable-naptr" value="false" />-->
|
||||
|
||||
<!-- The following can be used to fine-tune timers within sofia's transport layer
|
||||
Those settings are for advanced users and can safely be left as-is -->
|
||||
|
||||
<!-- Initial retransmission interval (in milliseconds).
|
||||
Set the T1 retransmission interval used by the SIP transaction engine.
|
||||
The T1 is the initial duration used by request retransmission timers A and E (UDP) as well as response retransmission timer G. -->
|
||||
<!-- <param name="timer-T1" value="500" /> -->
|
||||
|
||||
<!-- Transaction timeout (defaults to T1 * 64).
|
||||
Set the T1x64 timeout value used by the SIP transaction engine.
|
||||
The T1x64 is duration used for timers B, F, H, and J (UDP) by the SIP transaction engine.
|
||||
The timeout value T1x64 can be adjusted separately from the initial retransmission interval T1. -->
|
||||
<!-- <param name="timer-T1X64" value="32000" /> -->
|
||||
|
||||
|
||||
<!-- Maximum retransmission interval (in milliseconds).
|
||||
Set the maximum retransmission interval used by the SIP transaction engine.
|
||||
The T2 is the maximum duration used for the timers E (UDP) and G by the SIP transaction engine.
|
||||
Note that the timer A is not capped by T2. Retransmission interval of INVITE requests grows exponentially
|
||||
until the timer B fires. -->
|
||||
<!-- <param name="timer-T2" value="4000" /> -->
|
||||
|
||||
<!--
|
||||
Transaction lifetime (in milliseconds).
|
||||
Set the lifetime for completed transactions used by the SIP transaction engine.
|
||||
A completed transaction is kept around for the duration of T4 in order to catch late responses.
|
||||
The T4 is the maximum duration for the messages to stay in the network and the duration of SIP timer K. -->
|
||||
<!-- <param name="timer-T4" value="4000" /> -->
|
||||
|
||||
<!-- Turn on a jitterbuffer for every call -->
|
||||
<!-- <param name="auto-jitterbuffer-msec" value="60"/> -->
|
||||
|
||||
|
||||
<!-- By default mod_sofia will ignore the codecs in the sdp for hold/unhold operations
|
||||
Set this to true if you want to actually parse the sdp and re-negotiate the codec during hold/unhold.
|
||||
It's probably not what you want so stick with the default unless you really need to change this.
|
||||
-->
|
||||
<!--<param name="renegotiate-codec-on-hold" value="true"/>-->
|
||||
|
||||
</settings>
|
||||
</profile>
|
||||
|
@ -1,37 +0,0 @@
|
||||
<include>
|
||||
<!--<gateway name="asterlink.com">-->
|
||||
<!--/// account username *required* ///-->
|
||||
<!--<param name="username" value="cluecon"/>-->
|
||||
<!--/// auth realm: *optional* same as gateway name, if blank ///-->
|
||||
<!--<param name="realm" value="asterlink.com"/>-->
|
||||
<!--/// username to use in from: *optional* same as username, if blank ///-->
|
||||
<!--<param name="from-user" value="cluecon"/>-->
|
||||
<!--/// domain to use in from: *optional* same as realm, if blank ///-->
|
||||
<!--<param name="from-domain" value="asterlink.com"/>-->
|
||||
<!--/// account password *required* ///-->
|
||||
<!--<param name="password" value="2007"/>-->
|
||||
<!--/// extension for inbound calls: *optional* same as username, if blank ///-->
|
||||
<!--<param name="extension" value="cluecon"/>-->
|
||||
<!--/// proxy host: *optional* same as realm, if blank ///-->
|
||||
<!--<param name="proxy" value="asterlink.com"/>-->
|
||||
<!--/// send register to this proxy: *optional* same as proxy, if blank ///-->
|
||||
<!--<param name="register-proxy" value="mysbc.com"/>-->
|
||||
<!--/// expire in seconds: *optional* 3600, if blank ///-->
|
||||
<!--<param name="expire-seconds" value="60"/>-->
|
||||
<!--/// do not register ///-->
|
||||
<!--<param name="register" value="false"/>-->
|
||||
<!-- which transport to use for register -->
|
||||
<!--<param name="register-transport" value="udp"/>-->
|
||||
<!--How many seconds before a retry when a failure or timeout occurs -->
|
||||
<!--<param name="retry-seconds" value="30"/>-->
|
||||
<!--Use the callerid of an inbound call in the from field on outbound calls via this gateway -->
|
||||
<!--<param name="caller-id-in-from" value="false"/>-->
|
||||
<!--extra sip params to send in the contact-->
|
||||
<!--<param name="contact-params" value="tport=tcp"/>-->
|
||||
<!-- Put the extension in the contact -->
|
||||
<!--<param name="extension-in-contact" value="true"/>-->
|
||||
<!--send an options ping every x seconds, failure will unregister and/or mark it down-->
|
||||
<!--<param name="ping" value="25"/>-->
|
||||
<!--<param name="cid-type" value="rpid"/>-->
|
||||
<!--</gateway>-->
|
||||
</include>
|
477
src/mod/endpoints/mod_sofia/conf/sofia.conf.xml
Normal file
477
src/mod/endpoints/mod_sofia/conf/sofia.conf.xml
Normal file
@ -0,0 +1,477 @@
|
||||
<configuration name="sofia.conf" description="sofia endpoint">
|
||||
<global_settings>
|
||||
<param name="log-level" value="0"/>
|
||||
<param name="auto-restart" value="false"/>
|
||||
<param name="debug-presence" value="0"/>
|
||||
<!-- <param name="capture-server" value="udp:homer.example.com:5060"/> -->
|
||||
</global_settings>
|
||||
<profiles>
|
||||
<!--
|
||||
This is a sofia sip profile/user agent. This will service exactly one
|
||||
ip and port. In FreeSWITCH you can run multiple sip user agents on
|
||||
their own ip and port.
|
||||
-->
|
||||
<profile name="example">
|
||||
<gateways>
|
||||
<gateway name="example-gateway">
|
||||
<!-- account username (required) -->
|
||||
<param name="username" value="cluecon"/>
|
||||
<!-- auth realm (same as gateway name, if blank) -->
|
||||
<param name="realm" value="example.com"/>
|
||||
<!-- username to use in from (same as username, if blank) -->
|
||||
<param name="from-user" value="cluecon"/>
|
||||
<!-- domain to use in from (same as realm, if blank) /// -->
|
||||
<param name="from-domain" value="example.com"/>
|
||||
<!-- account password (required) -->
|
||||
<param name="password" value="xxxx"/>
|
||||
<!-- extension for inbound calls (same as username, if blank) -->
|
||||
<param name="extension" value="cluecon"/>
|
||||
<!-- proxy host (same as realm, if blank) -->
|
||||
<param name="proxy" value="example.com"/>
|
||||
<!-- send register to this proxy (same as proxy, if blank) -->
|
||||
<param name="register-proxy" value="example.com"/>
|
||||
<!-- expire in seconds (3600, if blank) -->
|
||||
<param name="expire-seconds" value="600"/>
|
||||
<!-- do not register -->
|
||||
<param name="register" value="false"/>
|
||||
<!-- which transport to use for register -->
|
||||
<param name="register-transport" value="tcp"/>
|
||||
<!-- how many seconds before a retry when a failure or timeout occurs
|
||||
-->
|
||||
<param name="retry-seconds" value="30"/>
|
||||
<!-- use the callerid of an inbound call in the from field on outbound
|
||||
calls via this gateway -->
|
||||
<param name="caller-id-in-from" value="false"/>
|
||||
<!-- extra sip params to send in the contact -->
|
||||
<param name="contact-params" value="tport=tcp"/>
|
||||
<!-- put the extension in the contact -->
|
||||
<param name="extension-in-contact" value="true"/>
|
||||
<!-- send an options ping every x seconds, failure will unregister
|
||||
and/or mark it down -->
|
||||
<param name="ping" value="25"/>
|
||||
<!-- callerid header mechanism -->
|
||||
<param name="cid-type" value="rpid"/>
|
||||
</gateway>
|
||||
</gateways>
|
||||
<aliases>
|
||||
<!-- aliases are other names that will work as a valid profile name for
|
||||
this profile -->
|
||||
<alias name="default"/>
|
||||
</aliases>
|
||||
<domains>
|
||||
<!-- indicator to parse the directory for domains with parse="true" to
|
||||
get gateways -->
|
||||
<!-- <domain name="$${domain}" parse="true"/> -->
|
||||
<!-- indicator to parse the directory for domains with parse="true" to
|
||||
get gateways and alias every domain to this profile -->
|
||||
<!-- <domain name="all" alias="true" parse="true"/> -->
|
||||
<domain name="all" alias="true" parse="false"/>
|
||||
</domains>
|
||||
<settings>
|
||||
<!-- When calls are in no media this will bring them back to media when
|
||||
you press the hold button. -->
|
||||
<!-- <param name="media-option" value="resume-media-on-hold"/> -->
|
||||
<!-- This will allow a call after an attended transfer go back to bypass
|
||||
media after an attended transfer. -->
|
||||
<!-- <param name="media-option" value="bypass-media-after-att-xfer"/> -->
|
||||
<!-- <param name="user-agent-string" value="FreeSWITCH Rocks!"/> -->
|
||||
<param name="debug" value="0"/>
|
||||
<!-- If you want FreeSWITCH to shutdown if this profile fails to load,
|
||||
uncomment the next line. -->
|
||||
<!-- <param name="shutdown-on-fail" value="true"/> -->
|
||||
<param name="sip-trace" value="no"/>
|
||||
<param name="sip-capture" value="no"/>
|
||||
|
||||
<!-- Use presence_map.conf.xml to convert extension regex to presence
|
||||
protos for routing -->
|
||||
<!-- <param name="presence-proto-lookup" value="true"/> -->
|
||||
|
||||
|
||||
<!-- Don't be picky about negotiated DTMF just always offer 2833 and
|
||||
accept both 2833 and INFO -->
|
||||
<!-- <param name="liberal-dtmf" value="true"/> -->
|
||||
|
||||
<!--
|
||||
Sometimes, in extremely rare edge cases, the Sofia SIP stack may
|
||||
stop responding. These options allow you to enable and control a
|
||||
watchdog on the Sofia SIP stack so that if it stops responding for
|
||||
the specified number of milliseconds, it will cause FreeSWITCH to
|
||||
crash immediately. This is useful if you run in an HA environment
|
||||
and need to ensure automated recovery from such a condition. Note
|
||||
that if your server is idle a lot, the watchdog may fire due to not
|
||||
receiving any SIP messages. Thus, if you expect your system to be
|
||||
idle, you should leave the watchdog disabled. It can be toggled on
|
||||
and off through the FreeSWITCH CLI either on an individual profile
|
||||
basis or globally for all profiles. So, if you run in an HA
|
||||
environment with a master and slave, you should use the CLI to make
|
||||
sure the watchdog is only enabled on the master.
|
||||
|
||||
If such crash occurs, FreeSWITCH will dump core if allowed. The
|
||||
stacktrace will include function watchdog_triggered_abort().
|
||||
-->
|
||||
<param name="watchdog-enabled" value="no"/>
|
||||
<param name="watchdog-step-timeout" value="30000"/>
|
||||
<param name="watchdog-event-timeout" value="30000"/>
|
||||
|
||||
<param name="log-auth-failures" value="false"/>
|
||||
<param name="forward-unsolicited-mwi-notify" value="false"/>
|
||||
|
||||
<param name="context" value="public"/>
|
||||
<param name="rfc2833-pt" value="101"/>
|
||||
<!-- port to bind to for sip traffic -->
|
||||
<param name="sip-port" value="$${internal_sip_port}"/>
|
||||
<param name="dialplan" value="XML"/>
|
||||
<param name="dtmf-duration" value="2000"/>
|
||||
<param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>
|
||||
<param name="outbound-codec-prefs" value="$${global_codec_prefs}"/>
|
||||
<param name="rtp-timer-name" value="soft"/>
|
||||
<!-- ip address to use for rtp, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
|
||||
<param name="rtp-ip" value="$${local_ip_v4}"/>
|
||||
<!-- ip address to bind to, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
|
||||
<param name="sip-ip" value="$${local_ip_v4}"/>
|
||||
<param name="hold-music" value="$${hold_music}"/>
|
||||
<param name="apply-nat-acl" value="nat.auto"/>
|
||||
|
||||
<!-- (default true) set to false if you do not wish to have called party
|
||||
info in 1XX responses -->
|
||||
<!-- <param name="cid-in-1xx" value="false"/> -->
|
||||
|
||||
<!-- extended info parsing -->
|
||||
<!-- <param name="extended-info-parsing" value="true"/> -->
|
||||
|
||||
<!-- <param name="aggressive-nat-detection" value="true"/> -->
|
||||
<!-- There are known issues (asserts and segfaults) when 100rel is
|
||||
enabled. It is not recommended to enable 100rel at this time. -->
|
||||
<!-- <param name="enable-100rel" value="true"/> -->
|
||||
|
||||
<!-- uncomment if you don't wish to try a next SRV destination on 503
|
||||
response -->
|
||||
<!-- RFC3263 Section 4.3 -->
|
||||
<!-- <param name="disable-srv503" value="true"/> -->
|
||||
|
||||
<!-- Enable Compact SIP headers. -->
|
||||
<!-- <param name="enable-compact-headers" value="true"/> -->
|
||||
<!-- enable/disable session timers -->
|
||||
<!-- <param name="enable-timer" value="false"/> -->
|
||||
<!-- <param name="minimum-session-expires" value="120"/> -->
|
||||
<param name="apply-inbound-acl" value="domains"/>
|
||||
<!-- This defines your local network, by default we detect your local
|
||||
network and create this localnet.auto ACL for this. -->
|
||||
<param name="local-network-acl" value="localnet.auto"/>
|
||||
<!-- <param name="apply-register-acl" value="domains"/> -->
|
||||
<!-- <param name="dtmf-type" value="info"/> -->
|
||||
|
||||
<!-- 'true' means every time 'first-only' means on the first register -->
|
||||
<!-- <param name="send-message-query-on-register" value="true"/> -->
|
||||
|
||||
<!-- 'true' means every time 'first-only' means on the first register -->
|
||||
<!-- <param name="send-presence-on-register" value="first-only"/> -->
|
||||
|
||||
<!-- Caller-ID type (choose one, can be overridden by inbound call type
|
||||
and/or sip_cid_type channel variable -->
|
||||
<!-- Remote-Party-ID header -->
|
||||
<!-- <param name="caller-id-type" value="rpid"/> -->
|
||||
|
||||
<!-- P-*-Identity family of headers -->
|
||||
<!-- <param name="caller-id-type" value="pid"/> -->
|
||||
|
||||
<!-- neither one -->
|
||||
<!-- <param name="caller-id-type" value="none"/> -->
|
||||
|
||||
<param name="record-path" value="$${recordings_dir}"/>
|
||||
<param name="record-template" value="${caller_id_number}.${target_domain}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
|
||||
<!-- enable to use presence -->
|
||||
<param name="manage-presence" value="true"/>
|
||||
<!-- send a presence probe on each register to query devices to send
|
||||
presence instead of sending presence with less info -->
|
||||
<!-- <param name="presence-probe-on-register" value="true"/> -->
|
||||
<!-- <param name="manage-shared-appearance" value="true"/> -->
|
||||
<!-- used to share presence info across sofia profiles -->
|
||||
<!-- Name of the db to use for this profile -->
|
||||
<!-- <param name="dbname" value="share_presence"/> -->
|
||||
<param name="presence-hosts" value="$${domain},$${local_ip_v4}"/>
|
||||
<param name="presence-privacy" value="$${presence_privacy}"/>
|
||||
|
||||
<!-- This setting is for AAL2 bitpacking on G726 -->
|
||||
<!-- <param name="bitpacking" value="aal2"/> -->
|
||||
<!-- max number of open dialogs in proceeding -->
|
||||
<!-- <param name="max-proceeding" value="1000"/> -->
|
||||
<!-- session timers for all call to expire after the specified seconds -->
|
||||
<!-- <param name="session-timeout" value="1800"/> -->
|
||||
<!-- Can be 'true' or 'contact' -->
|
||||
<!-- <param name="multiple-registrations" value="contact"/> -->
|
||||
<!-- set to 'greedy' if you want your codec list to take precedence -->
|
||||
<param name="inbound-codec-negotiation" value="generous"/>
|
||||
<!-- if you want to send any special bind params of your own -->
|
||||
<!-- <param name="bind-params" value="transport=udp"/> -->
|
||||
<!-- <param name="unregister-on-options-fail" value="true"/> -->
|
||||
|
||||
<!-- TLS: disabled by default, set to "true" to enable -->
|
||||
<param name="tls" value="$${internal_ssl_enable}"/>
|
||||
<!-- Set to true to not bind on the normal sip-port but only on the TLS
|
||||
port -->
|
||||
<param name="tls-only" value="false"/>
|
||||
<!-- additional bind parameters for TLS -->
|
||||
<param name="tls-bind-params" value="transport=tls"/>
|
||||
<!-- Port to listen on for TLS requests. (5061 will be used if
|
||||
unspecified) -->
|
||||
<param name="tls-sip-port" value="$${internal_tls_port}"/>
|
||||
<!-- Location of the agent.pem and cafile.pem ssl certificates (needed
|
||||
for TLS server) -->
|
||||
<param name="tls-cert-dir" value="$${internal_ssl_dir}"/>
|
||||
<!-- Optionally set the passphrase password used by openSSL to
|
||||
encrypt/decrypt TLS private key files -->
|
||||
<param name="tls-passphrase" value=""/>
|
||||
<!-- Verify the date on TLS certificates -->
|
||||
<param name="tls-verify-date" value="true"/>
|
||||
<!-- TLS verify policy, when registering/inviting gateways with other
|
||||
servers (outbound) or handling inbound registration/invite requests
|
||||
how should we verify their certificate -->
|
||||
<!-- set to 'in' to only verify incoming connections, 'out' to only
|
||||
verify outgoing connections, 'all' to verify all connections, also
|
||||
'in_subjects', 'out_subjects' and 'all_subjects' for subject
|
||||
validation. Multiple policies can be split with a '|' pipe -->
|
||||
<param name="tls-verify-policy" value="none"/>
|
||||
<!-- Certificate max verify depth to use for validating peer TLS
|
||||
certificates when the verify policy is not none -->
|
||||
<param name="tls-verify-depth" value="2"/>
|
||||
<!-- If the tls-verify-policy is set to subjects_all or subjects_in this
|
||||
sets which subjects are allowed, multiple subjects can be split
|
||||
with a '|' pipe -->
|
||||
<param name="tls-verify-in-subjects" value=""/>
|
||||
<!-- TLS version ("sslv23" (default), "tlsv1"). NOTE: Phones may not
|
||||
work with TLSv1 -->
|
||||
<param name="tls-version" value="$${sip_tls_version}"/>
|
||||
<!-- TLS maximum session lifetime -->
|
||||
<!-- <param name="tls-timeout" value="300"/> -->
|
||||
|
||||
<!-- turn on auto-flush during bridge (skip timer sleep when the socket
|
||||
already has data) (reduces delay on latent connections default
|
||||
true, must be disabled explicitly) -->
|
||||
<!-- <param name="rtp-autoflush-during-bridge" value="false"/> -->
|
||||
|
||||
<!-- If you don't want to pass through timestamps from 1 RTP call to
|
||||
another (on a per call basis with rtp_rewrite_timestamps chanvar)
|
||||
-->
|
||||
<!-- <param name="rtp-rewrite-timestamps" value="true"/> -->
|
||||
<!-- <param name="pass-rfc2833" value="true"/> -->
|
||||
<!-- If you have ODBC support and a working dsn you can use it instead
|
||||
of SQLite -->
|
||||
<!-- <param name="odbc-dsn" value="dsn:user:pass"/> -->
|
||||
|
||||
<!-- Uncomment to set all inbound calls to no media mode -->
|
||||
<!-- <param name="inbound-bypass-media" value="true"/> -->
|
||||
|
||||
<!-- Uncomment to set all inbound calls to proxy media mode -->
|
||||
<!-- <param name="inbound-proxy-media" value="true"/> -->
|
||||
|
||||
<!-- Let calls hit the dialplan before selecting codec for the a-leg -->
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
|
||||
<!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
|
||||
<param name="inbound-zrtp-passthru" value="true"/>
|
||||
|
||||
<!-- this lets anything register -->
|
||||
<!-- comment the next line and uncomment one or both of the other 2
|
||||
lines for call authentication -->
|
||||
<!-- <param name="accept-blind-reg" value="true"/> -->
|
||||
|
||||
<!-- accept any authentication without actually checking (not a good
|
||||
feature for most people) -->
|
||||
<!-- <param name="accept-blind-auth" value="true"/> -->
|
||||
|
||||
<!-- suppress CNG on this profile or per call with the 'suppress_cng'
|
||||
variable -->
|
||||
<!-- <param name="suppress-cng" value="true"/> -->
|
||||
|
||||
<!-- TTL for nonce in sip auth -->
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<!-- Uncomment if you want to force the outbound leg of a bridge to only
|
||||
offer the codec that the originator is using -->
|
||||
<!-- <param name="disable-transcoding" value="true"/> -->
|
||||
<!-- Handle 302 Redirect in the dialplan -->
|
||||
<!-- <param name="manual-redirect" value="true"/> -->
|
||||
<!-- Disable Transfer -->
|
||||
<!-- <param name="disable-transfer" value="true"/> -->
|
||||
<!-- Disable Register -->
|
||||
<!-- <param name="disable-register" value="true"/> -->
|
||||
<!-- Used for when phones respond to a challenged ACK with method INVITE
|
||||
in the hash -->
|
||||
<!-- <param name="NDLB-broken-auth-hash" value="true"/> -->
|
||||
<!-- add a ;received="<ip>:<port>" to the contact when replying to
|
||||
register for nat handling -->
|
||||
<!-- <param name="NDLB-received-in-nat-reg-contact" value="true"/> -->
|
||||
<param name="auth-calls" value="$${internal_auth_calls}"/>
|
||||
<!-- Force the user and auth-user to match. -->
|
||||
<param name="inbound-reg-force-matching-username" value="true"/>
|
||||
<!-- on authed calls, authenticate *all* the packets not just invite -->
|
||||
<param name="auth-all-packets" value="false"/>
|
||||
|
||||
<!-- external_sip_ip
|
||||
Used as the public IP address for SDP.
|
||||
Can be an one of:
|
||||
ip address - "12.34.56.78"
|
||||
a stun server lookup - "stun:stun.server.com"
|
||||
a DNS name - "host:host.server.com"
|
||||
auto - Use guessed ip.
|
||||
auto-nat - Use ip learned from NAT-PMP or UPNP
|
||||
-->
|
||||
<param name="ext-rtp-ip" value="auto-nat"/>
|
||||
<param name="ext-sip-ip" value="auto-nat"/>
|
||||
|
||||
<!-- rtp inactivity timeout -->
|
||||
<param name="rtp-timeout-sec" value="300"/>
|
||||
<param name="rtp-hold-timeout-sec" value="1800"/>
|
||||
<!-- VAD choose one (out is a good choice); -->
|
||||
<!-- <param name="vad" value="in"/> -->
|
||||
<!-- <param name="vad" value="out"/> -->
|
||||
<!-- <param name="vad" value="both"/> -->
|
||||
<!-- <param name="alias" value="sip:10.0.1.251:5555"/> -->
|
||||
<!--
|
||||
These are enabled to make the default config work better out of the
|
||||
box. If you need more than ONE domain you'll need to not use these
|
||||
options.
|
||||
-->
|
||||
<!-- all inbound reg will look in this domain for the users -->
|
||||
<param name="force-register-domain" value="$${domain}"/>
|
||||
<!-- force the domain in subscriptions to this value -->
|
||||
<param name="force-subscription-domain" value="$${domain}"/>
|
||||
<!-- all inbound reg will stored in the db using this domain -->
|
||||
<param name="force-register-db-domain" value="$${domain}"/>
|
||||
|
||||
<!-- <param name="delete-subs-on-register" value="false"/> -->
|
||||
|
||||
<!-- enable rtcp on every channel also can be done per leg basis with
|
||||
rtcp_audio_interval_msec variable set to passthru to pass it across
|
||||
a call -->
|
||||
<!-- <param name="rtcp-audio-interval-msec" value="5000"/> -->
|
||||
<!-- <param name="rtcp-video-interval-msec" value="5000"/> -->
|
||||
|
||||
<!-- force suscription expires to a lower value than requested -->
|
||||
<!-- <param name="force-subscription-expires" value="60"/> -->
|
||||
<!-- disable register and transfer which may be undesirable in a public
|
||||
switch -->
|
||||
<!-- <param name="disable-transfer" value="true"/> -->
|
||||
<!-- <param name="disable-register" value="true"/> -->
|
||||
|
||||
<!--
|
||||
enable-3pcc can be set to either 'true' or 'proxy', true accepts
|
||||
the call right away, proxy waits until the call has been answered
|
||||
then sends accepts
|
||||
-->
|
||||
<!-- <param name="enable-3pcc" value="true"/> -->
|
||||
|
||||
<!-- use at your own risk or if you know what this does. -->
|
||||
<!-- <param name="NDLB-force-rport" value="true"/> -->
|
||||
<!--
|
||||
Choose the realm challenge key. Default is auto_to if not set.
|
||||
|
||||
auto_from - uses the from field as the value for the sip realm.
|
||||
auto_to - uses the to field as the value for the sip realm.
|
||||
<anyvalue> - you can input any value to use for the sip realm.
|
||||
|
||||
If you want URL dialing to work you'll want to set this to auto_from.
|
||||
|
||||
If you use any other value besides auto_to or auto_from you'll loose
|
||||
the ability to do multiple domains.
|
||||
|
||||
Note: comment out to restore the behavior before 2008-09-29
|
||||
|
||||
-->
|
||||
<param name="challenge-realm" value="auto_from"/>
|
||||
<!-- <param name="disable-rtp-auto-adjust" value="true"/> -->
|
||||
<!-- on inbound calls make the uuid of the session equal to the sip call
|
||||
id of that call -->
|
||||
<!-- <param name="inbound-use-callid-as-uuid" value="true"/> -->
|
||||
<!-- on outbound calls set the callid to match the uuid of the session
|
||||
-->
|
||||
<!-- <param name="outbound-use-uuid-as-callid" value="true"/> -->
|
||||
<!-- set to false disable this feature -->
|
||||
<!-- <param name="rtp-autofix-timing" value="false"/> -->
|
||||
|
||||
<!-- set this param to false if your gateway for some reason hates X-
|
||||
headers that it is supposed to ignore -->
|
||||
<!-- <param name="pass-callee-id" value="false"/> -->
|
||||
|
||||
<!-- clear clears them all or supply the name to add or the name
|
||||
prefixed with ~ to remove valid values:
|
||||
|
||||
clear
|
||||
CISCO_SKIP_MARK_BIT_2833
|
||||
SONUS_SEND_INVALID_TIMESTAMP_2833
|
||||
|
||||
-->
|
||||
<!-- <param name="auto-rtp-bugs" data="clear"/> -->
|
||||
|
||||
<!-- the following can be used as workaround with bogus SRV/NAPTR
|
||||
records -->
|
||||
<!-- <param name="disable-srv" value="false" /> -->
|
||||
<!-- <param name="disable-naptr" value="false" /> -->
|
||||
|
||||
<!-- The following can be used to fine-tune timers within sofia's
|
||||
transport layer Those settings are for advanced users and can
|
||||
safely be left as-is -->
|
||||
|
||||
<!-- Initial retransmission interval (in milliseconds).
|
||||
|
||||
Set the T1 retransmission interval used by the SIP transaction
|
||||
engine.
|
||||
|
||||
The T1 is the initial duration used by request retransmission
|
||||
timers A and E (UDP) as well as response retransmission timer G.
|
||||
-->
|
||||
<!-- <param name="timer-T1" value="500" /> -->
|
||||
|
||||
<!-- Transaction timeout (defaults to T1 * 64).
|
||||
|
||||
Set the T1x64 timeout value used by the SIP transaction engine.
|
||||
|
||||
The T1x64 is duration used for timers B, F, H, and J (UDP) by the
|
||||
SIP transaction engine.
|
||||
|
||||
The timeout value T1x64 can be adjusted separately from the initial
|
||||
retransmission interval T1. -->
|
||||
<!-- <param name="timer-T1X64" value="32000" /> -->
|
||||
|
||||
|
||||
<!-- Maximum retransmission interval (in milliseconds).
|
||||
|
||||
Set the maximum retransmission interval used by the SIP transaction
|
||||
engine.
|
||||
|
||||
The T2 is the maximum duration used for the timers E (UDP) and G by
|
||||
the SIP transaction engine.
|
||||
|
||||
Note that the timer A is not capped by T2. Retransmission interval
|
||||
of INVITE requests grows exponentially until the timer B fires.
|
||||
-->
|
||||
<!-- <param name="timer-T2" value="4000" /> -->
|
||||
|
||||
<!--
|
||||
Transaction lifetime (in milliseconds).
|
||||
|
||||
Set the lifetime for completed transactions used by the SIP
|
||||
transaction engine.
|
||||
|
||||
A completed transaction is kept around for the duration of T4 in
|
||||
order to catch late responses.
|
||||
|
||||
The T4 is the maximum duration for the messages to stay in the
|
||||
network and the duration of SIP timer K. -->
|
||||
<!-- <param name="timer-T4" value="4000" /> -->
|
||||
|
||||
<!-- Turn on a jitterbuffer for every call -->
|
||||
<!-- <param name="auto-jitterbuffer-msec" value="60"/> -->
|
||||
|
||||
|
||||
<!-- By default mod_sofia will ignore the codecs in the sdp for
|
||||
hold/unhold operations Set this to true if you want to actually
|
||||
parse the sdp and re-negotiate the codec during hold/unhold. It's
|
||||
probably not what you want so stick with the default unless you
|
||||
really need to change this.
|
||||
-->
|
||||
<!-- <param name="renegotiate-codec-on-hold" value="true"/> -->
|
||||
</settings>
|
||||
</profile>
|
||||
</profiles>
|
||||
</configuration>
|
@ -172,7 +172,7 @@ static switch_status_t sofia_on_reset(switch_core_session_t *session)
|
||||
const char *uuid = switch_core_session_get_uuid(session);
|
||||
|
||||
if (switch_channel_test_flag(channel, CF_BRIDGE_ORIGINATOR)) {
|
||||
const char *other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *other_uuid = switch_channel_get_partner_uuid(channel);
|
||||
int x = 0;
|
||||
|
||||
if (other_uuid) {
|
||||
@ -1587,6 +1587,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
|
||||
case SWITCH_MESSAGE_INDICATE_BRIDGE:
|
||||
{
|
||||
|
||||
switch_channel_set_variable(channel, SOFIA_REPLACES_HEADER, NULL);
|
||||
sofia_glue_tech_track(tech_pvt->profile, session);
|
||||
|
||||
sofia_set_flag(tech_pvt, TFLAG_SIMPLIFY);
|
||||
@ -1824,7 +1826,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
}
|
||||
sofia_glue_tech_set_local_sdp(tech_pvt, NULL, SWITCH_FALSE);
|
||||
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel))
|
||||
&& (other_session = switch_core_session_locate(uuid))) {
|
||||
other_channel = switch_core_session_get_channel(other_session);
|
||||
ip = switch_channel_get_variable(other_channel, SWITCH_REMOTE_MEDIA_IP_VARIABLE);
|
||||
@ -2061,7 +2063,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
const char *uuid;
|
||||
const char *call_id = NULL, *to_user = NULL, *to_host = NULL, *to_tag = NULL, *from_tag = NULL, *from_user = NULL, *from_host = NULL;
|
||||
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) || (uuid = switch_channel_get_variable(channel, "originate_signal_bond"))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel))) {
|
||||
switch_core_session_t *rsession;
|
||||
if ((rsession = switch_core_session_locate(uuid))) {
|
||||
switch_channel_t *rchannel = switch_core_session_get_channel(rsession);
|
||||
@ -2191,7 +2193,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
|
||||
|
||||
if (switch_event_create(&event, SWITCH_EVENT_CALL_UPDATE) == SWITCH_STATUS_SUCCESS) {
|
||||
const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *uuid = switch_channel_get_partner_uuid(channel);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Direction", "SEND");
|
||||
|
||||
|
||||
@ -2337,6 +2339,19 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
break;
|
||||
|
||||
case SWITCH_MESSAGE_INDICATE_RESPOND:
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if (tech_pvt->nh && tech_pvt->nh->nh_ds && tech_pvt->nh->nh_ds->ds_sr && nua_server_request_is_pending(tech_pvt->nh->nh_ds->ds_sr)) {
|
||||
status = tech_pvt->nh->nh_ds->ds_sr->sr_status;
|
||||
}
|
||||
|
||||
if (status == 0 || status > 199 || tech_pvt->nh->nh_destroyed) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s Cannot call respond on handle at status %d\n",
|
||||
switch_channel_get_name(channel), status);
|
||||
goto end_lock;
|
||||
}
|
||||
|
||||
if (msg->numeric_arg || msg->string_arg) {
|
||||
int code = msg->numeric_arg;
|
||||
const char *reason = NULL;
|
||||
@ -2483,6 +2498,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SWITCH_MESSAGE_INDICATE_RINGING:
|
||||
{
|
||||
@ -2997,6 +3013,7 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t
|
||||
stream->write_function(stream, "NOMEDIA \t%s\n", sofia_test_flag(profile, TFLAG_INB_NOMEDIA) ? "true" : "false");
|
||||
stream->write_function(stream, "LATE-NEG \t%s\n", sofia_test_flag(profile, TFLAG_LATE_NEGOTIATION) ? "true" : "false");
|
||||
stream->write_function(stream, "PROXY-MEDIA \t%s\n", sofia_test_flag(profile, TFLAG_PROXY_MEDIA) ? "true" : "false");
|
||||
stream->write_function(stream, "ZRTP-PASSTHRU \t%s\n", sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU) ? "true" : "false");
|
||||
stream->write_function(stream, "AGGRESSIVENAT \t%s\n",
|
||||
sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION) ? "true" : "false");
|
||||
stream->write_function(stream, "STUN-ENABLED \t%s\n", sofia_test_pflag(profile, PFLAG_STUN_ENABLED) ? "true" : "false");
|
||||
@ -3275,6 +3292,7 @@ static switch_status_t cmd_xml_status(char **argv, int argc, switch_stream_handl
|
||||
stream->write_function(stream, " <nomedia>%s</nomedia>\n", sofia_test_flag(profile, TFLAG_INB_NOMEDIA) ? "true" : "false");
|
||||
stream->write_function(stream, " <late-neg>%s</late-neg>\n", sofia_test_flag(profile, TFLAG_LATE_NEGOTIATION) ? "true" : "false");
|
||||
stream->write_function(stream, " <proxy-media>%s</proxy-media>\n", sofia_test_flag(profile, TFLAG_PROXY_MEDIA) ? "true" : "false");
|
||||
stream->write_function(stream, " <zrtp-passthru>%s</zrtp-passthru>\n", sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU) ? "true" : "false");
|
||||
stream->write_function(stream, " <aggressive-nat>%s</aggressive-nat>\n",
|
||||
sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION) ? "true" : "false");
|
||||
stream->write_function(stream, " <stun-enabled>%s</stun-enabled>\n",
|
||||
@ -4785,6 +4803,17 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session
|
||||
sofia_clear_flag(ctech_pvt, TFLAG_ENABLE_SOA);
|
||||
}
|
||||
|
||||
if (switch_channel_test_flag(o_channel, CF_ZRTP_PASSTHRU_REQ)) {
|
||||
const char *x = NULL;
|
||||
sofia_glue_pass_zrtp_hash2(session, nsession);
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[zrtp_passthru] Setting a-leg inherit_codec=true\n");
|
||||
switch_channel_set_variable(o_channel, "inherit_codec", "true");
|
||||
if ((x = switch_channel_get_variable(o_channel, "ep_codec_string"))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[zrtp_passthru] Setting b-leg absolute_codec_string='%s'\n", x);
|
||||
switch_channel_set_variable(nchannel, "absolute_codec_string", x);
|
||||
}
|
||||
}
|
||||
|
||||
/* SNARK: lets copy this across so we can see if we're the other leg of 3PCC + bypass_media... */
|
||||
if (sofia_test_flag(ctech_pvt, TFLAG_3PCC) && (switch_channel_test_flag(o_channel, CF_PROXY_MODE) || switch_channel_test_flag(o_channel, CF_PROXY_MEDIA))) {
|
||||
sofia_set_flag(tech_pvt, TFLAG_3PCC_INVITE);
|
||||
|
@ -28,6 +28,7 @@
|
||||
* Paul D. Tinsley <pdt at jackhammer.org>
|
||||
* Bret McDanel <trixter AT 0xdecafbad.com>
|
||||
* Marcel Barbulescu <marcelbarbulescu@gmail.com>
|
||||
* Raymond Chandler <intralanman@gmail.com>
|
||||
*
|
||||
*
|
||||
* mod_sofia.h -- SOFIA SIP Endpoint
|
||||
@ -92,7 +93,7 @@ typedef struct private_object private_object_t;
|
||||
|
||||
#define MULTICAST_EVENT "multicast::event"
|
||||
#define SOFIA_REPLACES_HEADER "_sofia_replaces_"
|
||||
#define SOFIA_USER_AGENT "FreeSWITCH-mod_sofia/" SWITCH_VERSION_MAJOR "." SWITCH_VERSION_MINOR "." SWITCH_VERSION_MICRO "-" SWITCH_VERSION_REVISION
|
||||
#define SOFIA_USER_AGENT "FreeSWITCH-mod_sofia/" SWITCH_VERSION_FULL
|
||||
#define SOFIA_CHAT_PROTO "sip"
|
||||
#define SOFIA_MULTIPART_PREFIX "sip_mp_"
|
||||
#define SOFIA_MULTIPART_PREFIX_T "~sip_mp_"
|
||||
@ -317,6 +318,7 @@ typedef enum {
|
||||
TFLAG_TPORT_LOG,
|
||||
TFLAG_SENT_UPDATE,
|
||||
TFLAG_PROXY_MEDIA,
|
||||
TFLAG_ZRTP_PASSTHRU,
|
||||
TFLAG_HOLD_LOCK,
|
||||
TFLAG_3PCC_HAS_ACK,
|
||||
TFLAG_PASS_RFC2833,
|
||||
@ -516,7 +518,8 @@ struct sofia_gateway {
|
||||
typedef enum {
|
||||
PRES_TYPE_NONE = 0,
|
||||
PRES_TYPE_FULL = 1,
|
||||
PRES_TYPE_PASSIVE = 2
|
||||
PRES_TYPE_PASSIVE = 2,
|
||||
PRES_TYPE_PNP = 3
|
||||
} sofia_presence_type_t;
|
||||
|
||||
typedef enum {
|
||||
@ -585,12 +588,15 @@ struct sofia_profile {
|
||||
char *rtcp_audio_interval_msec;
|
||||
char *rtcp_video_interval_msec;
|
||||
char *jb_msec;
|
||||
char *pnp_prov_url;
|
||||
char *pnp_notify_profile;
|
||||
sofia_cid_type_t cid_type;
|
||||
sofia_dtmf_t dtmf_type;
|
||||
int auto_restart;
|
||||
switch_port_t sip_port;
|
||||
switch_port_t tls_sip_port;
|
||||
int tls_version;
|
||||
unsigned int tls_timeout;
|
||||
char *inbound_codec_string;
|
||||
char *outbound_codec_string;
|
||||
int running;
|
||||
@ -825,6 +831,11 @@ struct private_object {
|
||||
switch_payload_t ianacodes[SWITCH_MAX_CODECS];
|
||||
uint32_t session_timeout;
|
||||
enum nua_session_refresher session_refresher;
|
||||
/** ZRTP **/
|
||||
char *local_sdp_audio_zrtp_hash;
|
||||
char *local_sdp_video_zrtp_hash;
|
||||
char *remote_sdp_audio_zrtp_hash;
|
||||
char *remote_sdp_video_zrtp_hash;
|
||||
};
|
||||
|
||||
struct callback_t {
|
||||
@ -932,6 +943,8 @@ void launch_sofia_profile_thread(sofia_profile_t *profile);
|
||||
switch_status_t sofia_presence_chat_send(switch_event_t *message_event);
|
||||
|
||||
void sofia_glue_tech_absorb_sdp(private_object_t *tech_pvt);
|
||||
void sofia_glue_pass_zrtp_hash2(switch_core_session_t *aleg_session, switch_core_session_t *bleg_session);
|
||||
void sofia_glue_pass_zrtp_hash(switch_core_session_t *session);
|
||||
|
||||
/*
|
||||
* \brief Sets the "ep_codec_string" channel variable, parsing r_sdp and taing codec_string in consideration
|
||||
|
@ -618,7 +618,7 @@ void sofia_handle_sip_i_bye(switch_core_session_t *session, int status,
|
||||
|
||||
if (sofia_test_flag(tech_pvt, TFLAG_SLA_BARGE)) {
|
||||
switch_core_session_t *new_session, *other_session;
|
||||
const char *other_uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *other_uuid = switch_channel_get_partner_uuid(tech_pvt->channel);
|
||||
char *cmd = NULL;
|
||||
|
||||
if (!zstr(other_uuid) && (other_session = switch_core_session_locate(other_uuid))) {
|
||||
@ -783,7 +783,7 @@ void sofia_send_callee_id(switch_core_session_t *session, const char *name, cons
|
||||
number = caller_profile->destination_number;
|
||||
}
|
||||
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (session_b = switch_core_session_locate(uuid))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel)) && (session_b = switch_core_session_locate(uuid))) {
|
||||
switch_core_session_message_t *msg;
|
||||
//switch_channel_t *channel_b = switch_core_session_get_channel(session_b);
|
||||
|
||||
@ -906,7 +906,7 @@ void sofia_update_callee_id(switch_core_session_t *session, sofia_profile_t *pro
|
||||
caller_profile->callee_id_number = switch_sanitize_number(switch_core_strdup(caller_profile->pool, number));
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s Update Callee ID to \"%s\" <%s>\n", switch_channel_get_name(channel), name, number);
|
||||
|
||||
if (lazy || (att && !switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if (lazy || (att && !switch_channel_get_partner_uuid(channel))) {
|
||||
switch_channel_flip_cid(channel);
|
||||
}
|
||||
}
|
||||
@ -914,7 +914,7 @@ void sofia_update_callee_id(switch_core_session_t *session, sofia_profile_t *pro
|
||||
if (send) {
|
||||
|
||||
if (switch_event_create(&event, SWITCH_EVENT_CALL_UPDATE) == SWITCH_STATUS_SUCCESS) {
|
||||
const char *uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *uuid = switch_channel_get_partner_uuid(channel);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Direction", "RECV");
|
||||
if (uuid) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Bridged-To", uuid);
|
||||
@ -2071,6 +2071,8 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
||||
TPTAG_TLS_VERIFY_SUBJECTS(profile->tls_verify_in_subjects)),
|
||||
TAG_IF(sofia_test_pflag(profile, PFLAG_TLS),
|
||||
TPTAG_TLS_VERSION(profile->tls_version)),
|
||||
TAG_IF(sofia_test_pflag(profile, PFLAG_TLS) && profile->tls_timeout,
|
||||
TPTAG_TLS_TIMEOUT(profile->tls_timeout)),
|
||||
TAG_IF(!strchr(profile->sipip, ':'),
|
||||
NTATAG_UDP_MTU(65535)),
|
||||
TAG_IF(sofia_test_pflag(profile, PFLAG_DISABLE_SRV),
|
||||
@ -2138,6 +2140,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
||||
TAG_IF(profile->pres_type, NUTAG_ALLOW_EVENTS("include-session-description")),
|
||||
TAG_IF(profile->pres_type, NUTAG_ALLOW_EVENTS("presence.winfo")),
|
||||
TAG_IF(profile->pres_type, NUTAG_ALLOW_EVENTS("message-summary")),
|
||||
TAG_IF(profile->pres_type == PRES_TYPE_PNP, NUTAG_ALLOW_EVENTS("ua-profile")),
|
||||
NUTAG_ALLOW_EVENTS("refer"), SIPTAG_SUPPORTED_STR(supported), SIPTAG_USER_AGENT_STR(profile->user_agent), TAG_END());
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set params for %s\n", profile->name);
|
||||
@ -2251,7 +2254,11 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
||||
sofia_clear_pflag_locked(profile, PFLAG_SHUTDOWN);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Waiting for worker thread\n");
|
||||
|
||||
if ( worker_thread ) {
|
||||
switch_thread_join(&st, worker_thread);
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: Sofia worker thead failed to start\n");
|
||||
}
|
||||
|
||||
sanity = 4;
|
||||
while (profile->inuse) {
|
||||
@ -3321,6 +3328,12 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
|
||||
} else {
|
||||
sofia_clear_flag(profile, TFLAG_PROXY_MEDIA);
|
||||
}
|
||||
} else if (!strcasecmp(var, "inbound-zrtp-passthru")) {
|
||||
if (switch_true(val)) {
|
||||
sofia_set_flag(profile, TFLAG_ZRTP_PASSTHRU);
|
||||
} else {
|
||||
sofia_clear_flag(profile, TFLAG_ZRTP_PASSTHRU);
|
||||
}
|
||||
} else if (!strcasecmp(var, "inbound-use-callid-as-uuid")) {
|
||||
if (switch_true(val)) {
|
||||
sofia_set_pflag(profile, PFLAG_CALLID_AS_UUID);
|
||||
@ -3695,6 +3708,10 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
|
||||
}
|
||||
}
|
||||
|
||||
if (sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU)) {
|
||||
sofia_set_flag(profile, TFLAG_LATE_NEGOTIATION);
|
||||
}
|
||||
|
||||
if ((gateways_tag = switch_xml_child(xprofile, "gateways"))) {
|
||||
parse_gateways(profile, gateways_tag);
|
||||
}
|
||||
@ -3919,6 +3936,7 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
profile->sip_force_expires = 0;
|
||||
profile->sip_expires_max_deviation = 0;
|
||||
profile->tls_version = 0;
|
||||
profile->tls_timeout = 300;
|
||||
profile->mflags = MFLAG_REFER | MFLAG_REGISTER;
|
||||
profile->server_rport_level = 1;
|
||||
profile->client_rport_level = 1;
|
||||
@ -4171,6 +4189,8 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
}
|
||||
} else if (!strcasecmp(var, "inbound-proxy-media") && switch_true(val)) {
|
||||
sofia_set_flag(profile, TFLAG_PROXY_MEDIA);
|
||||
} else if (!strcasecmp(var, "inbound-zrtp-passthru") && switch_true(val)) {
|
||||
sofia_set_flag(profile, TFLAG_ZRTP_PASSTHRU);
|
||||
} else if (!strcasecmp(var, "force-subscription-expires")) {
|
||||
int tmp = atoi(val);
|
||||
if (tmp > 0) {
|
||||
@ -4405,10 +4425,16 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
} else if (!strcasecmp(val, "bypass-media-after-att-xfer")) {
|
||||
profile->media_options |= MEDIA_OPT_BYPASS_AFTER_ATT_XFER;
|
||||
}
|
||||
} else if (!strcasecmp(var, "pnp-provision-url")) {
|
||||
profile->pnp_prov_url = switch_core_strdup(profile->pool, val);
|
||||
} else if (!strcasecmp(var, "pnp-notify-profile")) {
|
||||
profile->pnp_notify_profile = switch_core_strdup(profile->pool, val);
|
||||
} else if (!strcasecmp(var, "manage-presence")) {
|
||||
if (!strcasecmp(val, "passive")) {
|
||||
profile->pres_type = PRES_TYPE_PASSIVE;
|
||||
|
||||
} else if (!strcasecmp(val, "pnp")) {
|
||||
profile->pres_type = PRES_TYPE_PNP;
|
||||
} else if (switch_true(val)) {
|
||||
profile->pres_type = PRES_TYPE_FULL;
|
||||
}
|
||||
@ -4731,6 +4757,9 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
} else {
|
||||
profile->tls_version = 0;
|
||||
}
|
||||
} else if (!strcasecmp(var, "tls-timeout")) {
|
||||
int v = atoi(val);
|
||||
profile->tls_timeout = v > 0 ? (unsigned int)v : 300;
|
||||
} else if (!strcasecmp(var, "timer-T1")) {
|
||||
int v = atoi(val);
|
||||
if (v > 0) {
|
||||
@ -4801,6 +4830,11 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
}
|
||||
}
|
||||
|
||||
if (sofia_test_flag(profile, TFLAG_ZRTP_PASSTHRU) && !sofia_test_flag(profile, TFLAG_LATE_NEGOTIATION)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "ZRTP passthrough implictly enables inbound-late-negotiation\n");
|
||||
sofia_set_flag(profile, TFLAG_LATE_NEGOTIATION);
|
||||
}
|
||||
|
||||
if ((!profile->cng_pt) && (!sofia_test_pflag(profile, PFLAG_SUPPRESS_CNG))) {
|
||||
profile->cng_pt = SWITCH_RTP_CNG_PAYLOAD;
|
||||
}
|
||||
@ -4858,6 +4892,23 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
profile->sipdomain = switch_core_strdup(profile->pool, profile->sipip);
|
||||
}
|
||||
|
||||
if (profile->pres_type == PRES_TYPE_PNP) {
|
||||
if (!profile->pnp_prov_url) {
|
||||
profile->pnp_prov_url = switch_core_sprintf(profile->pool, "http://%s/provision/", mod_sofia_globals.guess_ip);
|
||||
}
|
||||
|
||||
if (!profile->pnp_notify_profile) {
|
||||
profile->pnp_notify_profile = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
|
||||
}
|
||||
|
||||
if (!profile->extsipip) {
|
||||
profile->extsipip = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "we're configured to provision to [%s] on profile [%s]\n",
|
||||
profile->pnp_prov_url, profile->pnp_notify_profile);
|
||||
}
|
||||
|
||||
config_sofia_profile_urls(profile);
|
||||
|
||||
if (sofia_test_pflag(profile, PFLAG_TLS) && !profile->tls_cert_dir) {
|
||||
@ -5195,7 +5246,7 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status
|
||||
goto end;
|
||||
}
|
||||
|
||||
if ((br = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if ((br = switch_channel_get_partner_uuid(channel))) {
|
||||
switch_xml_t root = NULL, domain = NULL;
|
||||
switch_core_session_t *a_session;
|
||||
switch_channel_t *a_channel;
|
||||
@ -5354,7 +5405,7 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status
|
||||
if (sofia_test_flag(tech_pvt, TFLAG_SENT_UPDATE)) {
|
||||
sofia_clear_flag_locked(tech_pvt, TFLAG_SENT_UPDATE);
|
||||
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (other_session = switch_core_session_locate(uuid))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel)) && (other_session = switch_core_session_locate(uuid))) {
|
||||
const char *r_sdp = NULL;
|
||||
switch_core_session_message_t *msg;
|
||||
private_object_t *other_tech_pvt = switch_core_session_get_private(other_session);
|
||||
@ -5586,7 +5637,7 @@ void *SWITCH_THREAD_FUNC media_on_hold_thread_run(switch_thread_t *thread, void
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
private_object_t *tech_pvt = switch_core_session_get_private(session);
|
||||
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (other_session = switch_core_session_locate(uuid))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel)) && (other_session = switch_core_session_locate(uuid))) {
|
||||
if (switch_core_session_compare(session, other_session)) {
|
||||
sofia_set_flag_locked(tech_pvt, TFLAG_HOLD_LOCK);
|
||||
switch_ivr_media(switch_core_session_get_uuid(other_session), SMF_REBRIDGE);
|
||||
@ -5799,7 +5850,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
|
||||
tech_pvt->remote_sdp_str = switch_core_session_strdup(session, r_sdp);
|
||||
switch_channel_set_variable(channel, SWITCH_R_SDP_VARIABLE, r_sdp);
|
||||
|
||||
if (sofia_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) && (parser = sdp_parse(NULL, r_sdp, (int) strlen(r_sdp), 0))) {
|
||||
if ((sofia_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) || switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) && (parser = sdp_parse(NULL, r_sdp, (int) strlen(r_sdp), 0))) {
|
||||
if ((sdp = sdp_session(parser))) {
|
||||
sofia_glue_set_r_sdp_codec_string(session, sofia_glue_get_codec_string(tech_pvt), sdp);
|
||||
}
|
||||
@ -6041,7 +6092,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
|
||||
}
|
||||
|
||||
if ((b_private = nua_handle_magic(bnh))) {
|
||||
const char *br_b = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
const char *br_b = switch_channel_get_partner_uuid(channel);
|
||||
char *br_a = b_private->uuid;
|
||||
|
||||
|
||||
@ -6781,6 +6832,9 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
|
||||
|
||||
nua_respond(nh, SIP_202_ACCEPTED, NUTAG_WITH_THIS_MSG(de->data->e_msg), SIPTAG_EXPIRES_STR("60"), TAG_END());
|
||||
|
||||
|
||||
switch_channel_set_variable(tech_pvt->channel, SOFIA_REPLACES_HEADER, NULL);
|
||||
|
||||
if (sip->sip_referred_by) {
|
||||
full_ref_by = sip_header_as_string(home, (void *) sip->sip_referred_by);
|
||||
}
|
||||
@ -6843,8 +6897,8 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
|
||||
b_tech_pvt = (private_object_t *) switch_core_session_get_private(b_session);
|
||||
channel_b = switch_core_session_get_channel(b_session);
|
||||
|
||||
br_a = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
br_b = switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
br_a = switch_channel_get_partner_uuid(channel_a);
|
||||
br_b = switch_channel_get_partner_uuid(channel_b);
|
||||
|
||||
if (!switch_ivr_uuid_exists(br_a)) {
|
||||
br_a = NULL;
|
||||
@ -7093,7 +7147,7 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
|
||||
}
|
||||
nua_handle_unref(bnh);
|
||||
} else { /* the other channel is on a different box, we have to go find them */
|
||||
if (exten && (br_a = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE))) {
|
||||
if (exten && (br_a = switch_channel_get_partner_uuid(channel_a))) {
|
||||
switch_core_session_t *a_session;
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
|
||||
@ -7216,7 +7270,7 @@ void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t
|
||||
const char *br;
|
||||
switch_core_session_t *b_session;
|
||||
|
||||
if ((br = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(br))) {
|
||||
if ((br = switch_channel_get_partner_uuid(channel)) && (b_session = switch_core_session_locate(br))) {
|
||||
|
||||
const char *var;
|
||||
switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
|
||||
@ -7538,7 +7592,7 @@ void sofia_handle_sip_i_info(nua_t *nua, sofia_profile_t *profile, nua_handle_t
|
||||
const char *uuid;
|
||||
switch_core_session_t *session_b;
|
||||
|
||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (session_b = switch_core_session_locate(uuid))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(channel)) && (session_b = switch_core_session_locate(uuid))) {
|
||||
while (switch_channel_has_dtmf(channel)) {
|
||||
switch_dtmf_t idtmf = { 0, 0 };
|
||||
if (switch_channel_dequeue_dtmf(channel, &idtmf) == SWITCH_STATUS_SUCCESS) {
|
||||
@ -7625,6 +7679,11 @@ void sofia_handle_sip_i_reinvite(switch_core_session_t *session,
|
||||
tagi_t tags[])
|
||||
{
|
||||
char *call_info = NULL;
|
||||
switch_channel_t *channel = NULL;
|
||||
|
||||
if (session) {
|
||||
channel = switch_core_session_get_channel(session);
|
||||
}
|
||||
|
||||
if (session && profile && sip && sofia_test_pflag(profile, PFLAG_TRACK_CALLS)) {
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
@ -7649,7 +7708,6 @@ void sofia_handle_sip_i_reinvite(switch_core_session_t *session,
|
||||
}
|
||||
|
||||
if (sofia_test_pflag(profile, PFLAG_MANAGE_SHARED_APPEARANCE)) {
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
if (channel && sip->sip_call_info) {
|
||||
char *p;
|
||||
if ((call_info = sip_header_as_string(nua_handle_home(nh), (void *) sip->sip_call_info))) {
|
||||
@ -7663,6 +7721,14 @@ void sofia_handle_sip_i_reinvite(switch_core_session_t *session,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (channel) {
|
||||
if (sip->sip_payload && sip->sip_payload->pl_data) {
|
||||
switch_channel_set_variable(channel, "sip_reinvite_sdp", sip->sip_payload->pl_data);
|
||||
}
|
||||
switch_channel_execute_on(channel, "execute_on_sip_reinvite");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip,
|
||||
@ -8264,6 +8330,10 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
|
||||
switch_channel_set_flag(channel, CF_PROXY_MEDIA);
|
||||
}
|
||||
|
||||
if (sofia_test_flag(tech_pvt, TFLAG_ZRTP_PASSTHRU)) {
|
||||
switch_channel_set_flag(channel, CF_ZRTP_PASSTHRU_REQ);
|
||||
}
|
||||
|
||||
if (!tech_pvt->call_id && sip->sip_call_id && sip->sip_call_id->i_id) {
|
||||
tech_pvt->call_id = switch_core_session_strdup(session, sip->sip_call_id->i_id);
|
||||
switch_channel_set_variable(channel, "sip_call_id", tech_pvt->call_id);
|
||||
@ -8555,7 +8625,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
|
||||
|
||||
tech_pvt->caller_profile->dialplan = "inline";
|
||||
|
||||
bridge_uuid = switch_channel_get_variable(b_channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||
bridge_uuid = switch_channel_get_partner_uuid(b_channel);
|
||||
|
||||
if (call_info) {
|
||||
const char *olu;
|
||||
|
@ -184,7 +184,6 @@ static void generate_m(private_object_t *tech_pvt, char *buf, size_t buflen,
|
||||
int rate;
|
||||
int already_did[128] = { 0 };
|
||||
int ptime = 0, noptime = 0;
|
||||
const char *zrtp;
|
||||
|
||||
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "m=audio %d RTP/%sAVP",
|
||||
port, secure ? "S" : "");
|
||||
@ -344,11 +343,14 @@ static void generate_m(private_object_t *tech_pvt, char *buf, size_t buflen,
|
||||
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=ptime:%d\n", cur_ptime);
|
||||
}
|
||||
|
||||
if ((zrtp = switch_channel_get_variable(tech_pvt->channel, "sdp_zrtp_hash_string"))) {
|
||||
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=zrtp-hash:%s\n", zrtp);
|
||||
if (tech_pvt->local_sdp_audio_zrtp_hash) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Adding audio a=zrtp-hash:%s\n",
|
||||
tech_pvt->local_sdp_audio_zrtp_hash);
|
||||
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=zrtp-hash:%s\n",
|
||||
tech_pvt->local_sdp_audio_zrtp_hash);
|
||||
}
|
||||
|
||||
if (sr) {
|
||||
if (!zstr(sr)) {
|
||||
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=%s\n", sr);
|
||||
}
|
||||
}
|
||||
@ -373,7 +375,7 @@ void sofia_glue_check_dtmf_type(private_object_t *tech_pvt)
|
||||
|
||||
void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch_port_t port, const char *sr, int force)
|
||||
{
|
||||
char buf[2048];
|
||||
char buf[65536];
|
||||
int ptime = 0;
|
||||
uint32_t rate = 0;
|
||||
uint32_t v_port;
|
||||
@ -391,7 +393,6 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
switch_event_t *map = NULL, *ptmap = NULL;
|
||||
const char *b_sdp = NULL;
|
||||
int verbose_sdp = 0;
|
||||
const char *zrtp;
|
||||
|
||||
sofia_glue_check_dtmf_type(tech_pvt);
|
||||
|
||||
@ -433,7 +434,7 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
verbose_sdp = 1;
|
||||
}
|
||||
|
||||
if (!force && !ip && !sr
|
||||
if (!force && !ip && zstr(sr)
|
||||
&& (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE) || switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MEDIA))) {
|
||||
return;
|
||||
}
|
||||
@ -464,7 +465,7 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
sofia_glue_sdp_map(b_sdp, &map, &ptmap);
|
||||
}
|
||||
|
||||
if (!sr) {
|
||||
if (zstr(sr)) {
|
||||
if ((var_val = switch_channel_get_variable(tech_pvt->channel, "media_audio_mode"))) {
|
||||
sr = var_val;
|
||||
} else {
|
||||
@ -484,7 +485,9 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
|
||||
if ((tech_pvt->profile->ndlb & PFLAG_NDLB_SENDRECV_IN_SESSION) ||
|
||||
((var_val = switch_channel_get_variable(tech_pvt->channel, "ndlb_sendrecv_in_session")) && switch_true(var_val))) {
|
||||
if (!zstr(sr)) {
|
||||
switch_snprintf(srbuf, sizeof(srbuf), "a=%s\n", sr);
|
||||
}
|
||||
sr = NULL;
|
||||
}
|
||||
|
||||
@ -545,11 +548,15 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=ptime:%d\n", ptime);
|
||||
}
|
||||
|
||||
if ((zrtp = switch_channel_get_variable(tech_pvt->channel, "sdp_zrtp_hash_string"))) {
|
||||
switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=zrtp-hash:%s\n", zrtp);
|
||||
|
||||
if (tech_pvt->local_sdp_audio_zrtp_hash) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Adding audio a=zrtp-hash:%s\n",
|
||||
tech_pvt->local_sdp_audio_zrtp_hash);
|
||||
switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=zrtp-hash:%s\n",
|
||||
tech_pvt->local_sdp_audio_zrtp_hash);
|
||||
}
|
||||
|
||||
if (sr) {
|
||||
if (!zstr(sr)) {
|
||||
switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=%s\n", sr);
|
||||
}
|
||||
|
||||
@ -614,7 +621,7 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
cur_ptime = this_ptime;
|
||||
|
||||
if ((!zstr(tech_pvt->local_crypto_key) && sofia_test_flag(tech_pvt, TFLAG_SECURE))) {
|
||||
generate_m(tech_pvt, buf, sizeof(buf), port, cur_ptime, append_audio, sr, use_cng, cng_type, map, verbose_sdp, 1);
|
||||
generate_m(tech_pvt, bp, sizeof(buf) - strlen(buf), port, cur_ptime, append_audio, sr, use_cng, cng_type, map, verbose_sdp, 1);
|
||||
bp = (buf + strlen(buf));
|
||||
|
||||
/* asterisk can't handle AVP and SAVP in sep streams, way to blow off the spec....*/
|
||||
@ -683,7 +690,7 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
|
||||
pass_fmtp = NULL;
|
||||
|
||||
if (switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) {
|
||||
if (switch_channel_get_partner_uuid(tech_pvt->channel)) {
|
||||
if ((of = switch_channel_get_variable_partner(tech_pvt->channel, "sip_video_fmtp"))) {
|
||||
pass_fmtp = of;
|
||||
}
|
||||
@ -747,6 +754,13 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (tech_pvt->local_sdp_video_zrtp_hash) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Adding video a=zrtp-hash:%s\n",
|
||||
tech_pvt->local_sdp_video_zrtp_hash);
|
||||
switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=zrtp-hash:%s\n",
|
||||
tech_pvt->local_sdp_video_zrtp_hash);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -764,8 +778,13 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||
|
||||
const char *sofia_glue_get_codec_string(private_object_t *tech_pvt)
|
||||
{
|
||||
const char *codec_string = NULL, *preferred = NULL, *fallback = NULL;
|
||||
const char *preferred = NULL, *fallback = NULL;
|
||||
|
||||
if (!(preferred = switch_channel_get_variable(tech_pvt->channel, "absolute_codec_string"))) {
|
||||
preferred = switch_channel_get_variable(tech_pvt->channel, "codec_string");
|
||||
}
|
||||
|
||||
if (!preferred) {
|
||||
if (switch_channel_direction(tech_pvt->channel) == SWITCH_CALL_DIRECTION_OUTBOUND) {
|
||||
preferred = tech_pvt->profile->outbound_codec_string;
|
||||
fallback = tech_pvt->profile->inbound_codec_string;
|
||||
@ -773,10 +792,9 @@ const char *sofia_glue_get_codec_string(private_object_t *tech_pvt)
|
||||
preferred = tech_pvt->profile->inbound_codec_string;
|
||||
fallback = tech_pvt->profile->outbound_codec_string;
|
||||
}
|
||||
}
|
||||
|
||||
codec_string = !zstr(preferred) ? preferred : fallback;
|
||||
|
||||
return codec_string;
|
||||
return !zstr(preferred) ? preferred : fallback;
|
||||
}
|
||||
|
||||
void sofia_glue_tech_prepare_codecs(private_object_t *tech_pvt)
|
||||
@ -1739,7 +1757,7 @@ void sofia_glue_tech_patch_sdp(private_object_t *tech_pvt)
|
||||
|
||||
}
|
||||
|
||||
} else if ((!strncmp("m=audio ", p, 8) && *(p + 9) != '0') || (!strncmp("m=image ", p, 8) && *(p + 9) != '0')) {
|
||||
} else if ((!strncmp("m=audio ", p, 8) && *(p + 8) != '0') || (!strncmp("m=image ", p, 8) && *(p + 8) != '0')) {
|
||||
strncpy(q, p, 8);
|
||||
p += 8;
|
||||
|
||||
@ -1775,7 +1793,7 @@ void sofia_glue_tech_patch_sdp(private_object_t *tech_pvt)
|
||||
|
||||
has_audio++;
|
||||
|
||||
} else if (!strncmp("m=video ", p, 8) && *(p + 9) != '0') {
|
||||
} else if (!strncmp("m=video ", p, 8) && *(p + 8) != '0') {
|
||||
if (!has_video) {
|
||||
sofia_glue_tech_choose_video_port(tech_pvt, 1);
|
||||
tech_pvt->video_rm_encoding = "PROXY-VID";
|
||||
@ -2075,7 +2093,9 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
|
||||
}
|
||||
|
||||
|
||||
rep = switch_channel_get_variable(channel, SOFIA_REPLACES_HEADER);
|
||||
if ((rep = switch_channel_get_variable(channel, SOFIA_REPLACES_HEADER))) {
|
||||
switch_channel_set_variable(channel, SOFIA_REPLACES_HEADER, NULL);
|
||||
}
|
||||
|
||||
switch_assert(tech_pvt != NULL);
|
||||
|
||||
@ -2578,6 +2598,11 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
|
||||
tech_pvt->session_refresher = nua_no_refresher;
|
||||
}
|
||||
|
||||
if (tech_pvt->local_sdp_str) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG,
|
||||
"Local SDP:\n%s\n", tech_pvt->local_sdp_str);
|
||||
}
|
||||
|
||||
if (sofia_use_soa(tech_pvt)) {
|
||||
nua_invite(tech_pvt->nh,
|
||||
NUTAG_AUTOANSWER(0),
|
||||
@ -3563,9 +3588,11 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
|
||||
switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_MEDIA_PORT_VARIABLE, tmp);
|
||||
|
||||
|
||||
if (switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASS)) {
|
||||
if (switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASSTHRU)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_INFO, "Activating ZRTP PROXY MODE\n");
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Disable NOTIMER_DURING_BRIDGE\n");
|
||||
sofia_clear_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE);
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Activating audio UDPTL mode\n");
|
||||
switch_rtp_udptl_mode(tech_pvt->rtp_session);
|
||||
}
|
||||
|
||||
@ -3752,7 +3779,10 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASSTHRU)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Activating video UDPTL mode\n");
|
||||
switch_rtp_udptl_mode(tech_pvt->video_rtp_session);
|
||||
}
|
||||
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR, "VIDEO RTP REPORTS ERROR: [%s]\n", switch_str_nil(err));
|
||||
@ -3837,7 +3867,104 @@ static void add_audio_codec(sdp_rtpmap_t *map, int ptime, char *buf, switch_size
|
||||
|
||||
}
|
||||
|
||||
void sofia_glue_pass_zrtp_hash2(switch_core_session_t *aleg_session, switch_core_session_t *bleg_session)
|
||||
{
|
||||
switch_channel_t *aleg_channel;
|
||||
private_object_t *aleg_tech_pvt;
|
||||
switch_channel_t *bleg_channel;
|
||||
private_object_t *bleg_tech_pvt;
|
||||
|
||||
if (!switch_core_session_compare(aleg_session, bleg_session)) {
|
||||
/* since this digs into channel internals its only compatible with sofia sessions*/
|
||||
return;
|
||||
}
|
||||
|
||||
aleg_channel = switch_core_session_get_channel(aleg_session);
|
||||
aleg_tech_pvt = switch_core_session_get_private(aleg_session);
|
||||
bleg_channel = switch_core_session_get_channel(bleg_session);
|
||||
bleg_tech_pvt = switch_core_session_get_private(bleg_session);
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Deciding whether to pass zrtp-hash between a-leg and b-leg\n");
|
||||
if (!(switch_channel_test_flag(aleg_tech_pvt->channel, CF_ZRTP_PASSTHRU_REQ))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "CF_ZRTP_PASSTHRU_REQ not set on a-leg, so not propagating zrtp-hash\n");
|
||||
return;
|
||||
}
|
||||
if (aleg_tech_pvt->remote_sdp_audio_zrtp_hash) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing a-leg remote zrtp-hash (audio) to b-leg\n");
|
||||
bleg_tech_pvt->local_sdp_audio_zrtp_hash = switch_core_session_strdup(bleg_tech_pvt->session, aleg_tech_pvt->remote_sdp_audio_zrtp_hash);
|
||||
switch_channel_set_variable(bleg_channel, "l_sdp_audio_zrtp_hash", bleg_tech_pvt->local_sdp_audio_zrtp_hash);
|
||||
}
|
||||
if (aleg_tech_pvt->remote_sdp_video_zrtp_hash) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing a-leg remote zrtp-hash (video) to b-leg\n");
|
||||
bleg_tech_pvt->local_sdp_video_zrtp_hash = switch_core_session_strdup(bleg_tech_pvt->session, aleg_tech_pvt->remote_sdp_video_zrtp_hash);
|
||||
switch_channel_set_variable(bleg_channel, "l_sdp_video_zrtp_hash", bleg_tech_pvt->local_sdp_video_zrtp_hash);
|
||||
}
|
||||
if (bleg_tech_pvt->remote_sdp_audio_zrtp_hash) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing b-leg remote zrtp-hash (audio) to a-leg\n");
|
||||
aleg_tech_pvt->local_sdp_audio_zrtp_hash = switch_core_session_strdup(aleg_tech_pvt->session, bleg_tech_pvt->remote_sdp_audio_zrtp_hash);
|
||||
switch_channel_set_variable(aleg_channel, "l_sdp_audio_zrtp_hash", aleg_tech_pvt->local_sdp_audio_zrtp_hash);
|
||||
}
|
||||
if (bleg_tech_pvt->remote_sdp_video_zrtp_hash) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(aleg_channel), SWITCH_LOG_DEBUG, "Passing b-leg remote zrtp-hash (video) to a-leg\n");
|
||||
aleg_tech_pvt->local_sdp_video_zrtp_hash = switch_core_session_strdup(aleg_tech_pvt->session, bleg_tech_pvt->remote_sdp_video_zrtp_hash);
|
||||
switch_channel_set_variable(aleg_channel, "l_sdp_video_zrtp_hash", aleg_tech_pvt->local_sdp_video_zrtp_hash);
|
||||
}
|
||||
}
|
||||
|
||||
void sofia_glue_pass_zrtp_hash(switch_core_session_t *session)
|
||||
{
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
private_object_t *tech_pvt = switch_core_session_get_private(session);
|
||||
switch_core_session_t *other_session;
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Deciding whether to pass zrtp-hash between legs\n");
|
||||
if (!(switch_channel_test_flag(tech_pvt->channel, CF_ZRTP_PASSTHRU_REQ))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "CF_ZRTP_PASSTHRU_REQ not set, so not propagating zrtp-hash\n");
|
||||
return;
|
||||
} else if (!(switch_core_session_get_partner(session, &other_session) == SWITCH_STATUS_SUCCESS)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "No partner channel found, so not propagating zrtp-hash\n");
|
||||
return;
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Found peer channel; propagating zrtp-hash if set\n");
|
||||
sofia_glue_pass_zrtp_hash2(session, other_session);
|
||||
switch_core_session_rwunlock(other_session);
|
||||
}
|
||||
}
|
||||
|
||||
static void find_zrtp_hash(switch_core_session_t *session, sdp_session_t *sdp)
|
||||
{
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
private_object_t *tech_pvt = switch_core_session_get_private(session);
|
||||
sdp_media_t *m;
|
||||
sdp_attribute_t *attr;
|
||||
int got_audio = 0, got_video = 0;
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Looking for zrtp-hash\n");
|
||||
for (m = sdp->sdp_media; m; m = m->m_next) {
|
||||
if (got_audio && got_video) break;
|
||||
if (m->m_port && ((m->m_type == sdp_media_audio && !got_audio)
|
||||
|| (m->m_type == sdp_media_video && !got_video))) {
|
||||
for (attr = m->m_attributes; attr; attr = attr->a_next) {
|
||||
if (zstr(attr->a_name)) continue;
|
||||
if (strcasecmp(attr->a_name, "zrtp-hash") || !(attr->a_value)) continue;
|
||||
if (m->m_type == sdp_media_audio) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG,
|
||||
"Found audio zrtp-hash; setting r_sdp_audio_zrtp_hash=%s\n", attr->a_value);
|
||||
switch_channel_set_variable(channel, "r_sdp_audio_zrtp_hash", attr->a_value);
|
||||
tech_pvt->remote_sdp_audio_zrtp_hash = switch_core_session_strdup(tech_pvt->session, attr->a_value);
|
||||
got_audio++;
|
||||
} else if (m->m_type == sdp_media_video) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG,
|
||||
"Found video zrtp-hash; setting r_sdp_video_zrtp_hash=%s\n", attr->a_value);
|
||||
switch_channel_set_variable(channel, "r_sdp_video_zrtp_hash", attr->a_value);
|
||||
tech_pvt->remote_sdp_video_zrtp_hash = switch_core_session_strdup(tech_pvt->session, attr->a_value);
|
||||
got_video++;
|
||||
}
|
||||
switch_channel_set_flag(channel, CF_ZRTP_HASH);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sofia_glue_set_r_sdp_codec_string(switch_core_session_t *session, const char *codec_string, sdp_session_t *sdp)
|
||||
{
|
||||
@ -3887,18 +4014,8 @@ void sofia_glue_set_r_sdp_codec_string(switch_core_session_t *session, const cha
|
||||
}
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Looking for zrtp-hash to set sdp_zrtp_hash_string\n");
|
||||
for (m = sdp->sdp_media; m; m = m->m_next) {
|
||||
for (attr = m->m_attributes; attr; attr = attr->a_next) {
|
||||
if (zstr(attr->a_name)) continue;
|
||||
if (!strcasecmp(attr->a_name, "zrtp-hash") && attr->a_value) {
|
||||
switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "Found zrtp-hash, setting sdp_zrtp_hash_string=%s\n", attr->a_value);
|
||||
switch_channel_set_variable(channel, "sdp_zrtp_hash_string", attr->a_value);
|
||||
switch_channel_set_flag(channel, CF_ZRTP_HASH);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
find_zrtp_hash(session, sdp);
|
||||
sofia_glue_pass_zrtp_hash(session);
|
||||
|
||||
for (m = sdp->sdp_media; m; m = m->m_next) {
|
||||
ptime = dptime;
|
||||
@ -4062,6 +4179,7 @@ int sofia_glue_toggle_hold(private_object_t *tech_pvt, int sendonly)
|
||||
int changed = 0;
|
||||
|
||||
if (sofia_test_flag(tech_pvt, TFLAG_SLA_BARGE) || sofia_test_flag(tech_pvt, TFLAG_SLA_BARGING)) {
|
||||
switch_channel_mark_hold(tech_pvt->channel, sendonly);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4096,9 +4214,9 @@ int sofia_glue_toggle_hold(private_object_t *tech_pvt, int sendonly)
|
||||
if (!strcasecmp(stream, "indicate_hold")) {
|
||||
switch_channel_set_flag(tech_pvt->channel, CF_SUSPEND);
|
||||
switch_channel_set_flag(tech_pvt->channel, CF_HOLD);
|
||||
switch_ivr_hold_uuid(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), NULL, 0);
|
||||
switch_ivr_hold_uuid(switch_channel_get_partner_uuid(tech_pvt->channel), NULL, 0);
|
||||
} else {
|
||||
switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream,
|
||||
switch_ivr_broadcast(switch_channel_get_partner_uuid(tech_pvt->channel), stream,
|
||||
SMF_ECHO_ALEG | SMF_LOOP | SMF_PRIORITY);
|
||||
switch_yield(250000);
|
||||
}
|
||||
@ -4124,7 +4242,7 @@ int sofia_glue_toggle_hold(private_object_t *tech_pvt, int sendonly)
|
||||
switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets);
|
||||
}
|
||||
|
||||
if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(uuid))) {
|
||||
if ((uuid = switch_channel_get_partner_uuid(tech_pvt->channel)) && (b_session = switch_core_session_locate(uuid))) {
|
||||
switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
|
||||
|
||||
if (switch_channel_test_flag(tech_pvt->channel, CF_HOLD)) {
|
||||
@ -4578,6 +4696,9 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
||||
switch_channel_set_variable(tech_pvt->channel, "t38_broken_boolean", "true");
|
||||
}
|
||||
|
||||
find_zrtp_hash(session, sdp);
|
||||
sofia_glue_pass_zrtp_hash(session);
|
||||
|
||||
for (m = sdp->sdp_media; m; m = m->m_next) {
|
||||
sdp_connection_t *connection;
|
||||
switch_core_session_t *other_session;
|
||||
@ -4601,10 +4722,6 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (switch_channel_test_app_flag_key("T38", tech_pvt->channel, CF_APP_T38)) {
|
||||
sofia_set_flag(tech_pvt, TFLAG_NOREPLY);
|
||||
}
|
||||
|
||||
if (switch_true(switch_channel_get_variable(channel, "refuse_t38"))) {
|
||||
switch_channel_clear_app_flag_key("T38", tech_pvt->channel, CF_APP_T38);
|
||||
match = 0;
|
||||
@ -4613,6 +4730,11 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
||||
const char *var = switch_channel_get_variable(channel, "t38_passthru");
|
||||
int pass = sofia_test_pflag(tech_pvt->profile, PFLAG_T38_PASSTHRU);
|
||||
|
||||
|
||||
if (switch_channel_test_app_flag_key("T38", tech_pvt->channel, CF_APP_T38)) {
|
||||
sofia_set_flag(tech_pvt, TFLAG_NOREPLY);
|
||||
}
|
||||
|
||||
if (var) {
|
||||
if (!(pass = switch_true(var))) {
|
||||
if (!strcasecmp(var, "once")) {
|
||||
@ -4699,9 +4821,6 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
||||
ptime = atoi(attr->a_value);
|
||||
} else if (!strcasecmp(attr->a_name, "maxptime") && attr->a_value) {
|
||||
maxptime = atoi(attr->a_value);
|
||||
} else if (!strcasecmp(attr->a_name, "zrtp-hash") && attr->a_value) {
|
||||
switch_channel_set_variable(tech_pvt->channel, "sdp_zrtp_hash_string", attr->a_value);
|
||||
switch_channel_set_flag(tech_pvt->channel, CF_ZRTP_HASH);
|
||||
} else if (!got_crypto && !strcasecmp(attr->a_name, "crypto") && !zstr(attr->a_value)) {
|
||||
int crypto_tag;
|
||||
|
||||
@ -5237,7 +5356,7 @@ void sofia_glue_pass_sdp(private_object_t *tech_pvt, char *sdp)
|
||||
switch_core_session_t *other_session;
|
||||
switch_channel_t *other_channel;
|
||||
|
||||
if ((val = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE))
|
||||
if ((val = switch_channel_get_partner_uuid(tech_pvt->channel))
|
||||
&& (other_session = switch_core_session_locate(val))) {
|
||||
other_channel = switch_core_session_get_channel(other_session);
|
||||
switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, sdp);
|
||||
@ -5811,7 +5930,7 @@ static int recover_callback(void *pArg, int argc, char **argv, char **columnName
|
||||
|
||||
}
|
||||
|
||||
if (switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) {
|
||||
if (switch_channel_get_partner_uuid(channel)) {
|
||||
sofia_set_flag(tech_pvt, TFLAG_RECOVERING_BRIDGE);
|
||||
} else {
|
||||
switch_xml_t callflow, param, x_extension;
|
||||
@ -6733,7 +6852,7 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt)
|
||||
|
||||
|
||||
|
||||
if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE))
|
||||
if ((uuid = switch_channel_get_partner_uuid(tech_pvt->channel))
|
||||
&& (other_session = switch_core_session_locate(uuid))) {
|
||||
|
||||
other_channel = switch_core_session_get_channel(other_session);
|
||||
|
@ -27,6 +27,7 @@
|
||||
* Ken Rice <krice@freeswitch.org>
|
||||
* Paul D. Tinsley <pdt at jackhammer.org>
|
||||
* Bret McDanel <trixter AT 0xdecafbad.com>
|
||||
* Raymond Chandler <intralanman@gmail.com>
|
||||
*
|
||||
*
|
||||
* sofia_presence.c -- SOFIA SIP Endpoint (presence code)
|
||||
@ -537,16 +538,16 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event)
|
||||
sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from,"
|
||||
"full_via,expires,user_agent,accept,profile_name,network_ip"
|
||||
",'%q',full_to,network_ip,network_port from sip_subscriptions "
|
||||
"where hostname='%q' and profile_name='%q' and event='message-summary' "
|
||||
"where hostname='%q' and event='message-summary' "
|
||||
"and sub_to_user='%q' and (sub_to_host='%q' or presence_hosts like '%%%q%%')",
|
||||
stream.data, mod_sofia_globals.hostname, profile->name, user, host, host);
|
||||
stream.data, mod_sofia_globals.hostname, user, host, host);
|
||||
} else if (sub_call_id) {
|
||||
sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from,"
|
||||
"full_via,expires,user_agent,accept,profile_name,network_ip"
|
||||
",'%q',full_to,network_ip,network_port from sip_subscriptions where "
|
||||
"hostname='%q' and profile_name='%q' and event='message-summary' "
|
||||
"hostname='%q' and event='message-summary' "
|
||||
"and sub_to_user='%q' and (sub_to_host='%q' or presence_hosts like '%%%q%%') and call_id='%q'",
|
||||
stream.data, mod_sofia_globals.hostname, profile->name, user, host, host, sub_call_id);
|
||||
stream.data, mod_sofia_globals.hostname, user, host, host, sub_call_id);
|
||||
}
|
||||
|
||||
|
||||
@ -559,12 +560,12 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event)
|
||||
|
||||
if (for_everyone) {
|
||||
sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,network_ip,'%q',call_id "
|
||||
"from sip_registrations where hostname='%q' and profile_name='%q' and mwi_user='%q' and mwi_host='%q'",
|
||||
stream.data, mod_sofia_globals.hostname, profile->name, user, host);
|
||||
"from sip_registrations where hostname='%q' and mwi_user='%q' and mwi_host='%q'",
|
||||
stream.data, mod_sofia_globals.hostname, user, host);
|
||||
} else if (call_id) {
|
||||
sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,network_ip,'%q',call_id "
|
||||
"from sip_registrations where hostname='%q' and profile_name='%q' and call_id='%q'",
|
||||
stream.data, mod_sofia_globals.hostname, profile->name, call_id);
|
||||
"from sip_registrations where hostname='%q' and call_id='%q'",
|
||||
stream.data, mod_sofia_globals.hostname, call_id);
|
||||
}
|
||||
|
||||
if (sql) {
|
||||
@ -3273,7 +3274,9 @@ void sofia_presence_handle_sip_i_subscribe(int status,
|
||||
int sent_reply = 0;
|
||||
sip_contact_t const *contact;
|
||||
const char *ipv6;
|
||||
const char *contact_user;
|
||||
const char *contact_user = NULL;
|
||||
const char *contact_host = NULL;
|
||||
const char *contact_port = NULL;
|
||||
sofia_nat_parse_t np = { { 0 } };
|
||||
int found_proto = 0;
|
||||
char to_tag[13] = "";
|
||||
@ -3295,8 +3298,11 @@ void sofia_presence_handle_sip_i_subscribe(int status,
|
||||
|
||||
switch_stun_random_string(to_tag, 12, NULL);
|
||||
|
||||
//contact_host = sip->sip_contact->m_url->url_host;
|
||||
if ( sip->sip_contact && sip->sip_contact->m_url ) {
|
||||
contact_host = sip->sip_contact->m_url->url_host;
|
||||
contact_port = sip->sip_contact->m_url->url_port;
|
||||
contact_user = sip->sip_contact->m_url->url_user;
|
||||
}
|
||||
|
||||
//tl_gets(tags, NUTAG_SUBSTATE_REF(sub_state), TAG_END());
|
||||
|
||||
@ -3645,6 +3651,32 @@ void sofia_presence_handle_sip_i_subscribe(int status,
|
||||
}
|
||||
}
|
||||
|
||||
if ( sip->sip_event && sip->sip_event->o_type && !strcasecmp(sip->sip_event->o_type, "ua-profile") && contact_host ) {
|
||||
switch_event_t *params;
|
||||
char *uri = NULL;
|
||||
|
||||
if ( contact_port ) {
|
||||
uri = switch_mprintf("sip:%s:%s", contact_host, contact_port);
|
||||
} else {
|
||||
uri = switch_mprintf("sip:%s", contact_host);
|
||||
}
|
||||
|
||||
if ( uri ) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "sending pnp NOTIFY to %s\n", uri);
|
||||
|
||||
switch_event_create(¶ms, SWITCH_EVENT_NOTIFY);
|
||||
switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "profile", profile->pnp_notify_profile);
|
||||
switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "event-string", sip->sip_event->o_type);
|
||||
switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "to-uri", uri);
|
||||
switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "from-uri", uri);
|
||||
switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "content-type", "application/url");
|
||||
switch_event_add_body(params, "%s", profile->pnp_prov_url);
|
||||
switch_event_fire(¶ms);
|
||||
|
||||
switch_safe_free(uri);
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
|
||||
if (strcasecmp(event, "call-info") && strcasecmp(event, "line-seize")) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user