mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-16 19:24:55 +00:00
Compare commits
286 Commits
e50d0cf741
...
1.2.6-nets
Author | SHA1 | Date | |
---|---|---|---|
|
282ba468bc | ||
|
3b54f21428 | ||
|
aebf07c14a | ||
|
b705a62dc5 | ||
|
98ba3160e7 | ||
|
0345a25e6a | ||
|
ce930f8e2d | ||
|
0314e5efc6 | ||
|
c1d5aad112 | ||
|
7cae785261 | ||
|
de670a217d | ||
|
78104df395 | ||
|
ba4b234d34 | ||
|
97b3a1c5a4 | ||
|
2a14dad0f0 | ||
|
c614f4d869 | ||
|
e2ad8bd804 | ||
|
f06bd477c0 | ||
|
a0e595febf | ||
|
2395b09fef | ||
|
e3bc797a82 | ||
|
00461229c2 | ||
|
c9d7d267cd | ||
|
380d8cfcc4 | ||
|
fe83f9421b | ||
|
2b3941fcbf | ||
|
aad583ff1d | ||
|
9b1e1fe199 | ||
|
ca6ae319c7 | ||
|
5e338e72ba | ||
|
10fe0e9c67 | ||
|
f1fade4fa6 | ||
|
00e45fc396 | ||
|
0e3f10b86f | ||
|
d008cda808 | ||
|
ba70bebc38 | ||
|
eb6fc20dc8 | ||
|
db6920d628 | ||
|
0fcae43d36 | ||
|
8d808bd9d3 | ||
|
c0763951ba | ||
|
e483c1945d | ||
|
0397dba5a4 | ||
|
c19212f8d0 | ||
|
d848cb43b3 | ||
|
50464af8c2 | ||
|
7f9c385052 | ||
|
0840844421 | ||
|
924be1c3b9 | ||
|
b2b717e61f | ||
|
2f6c81bbc5 | ||
|
490cd4ada5 | ||
|
ee69978cdc | ||
|
0a4506d0dd | ||
|
b7ad6d8c2d | ||
|
6f665a50e0 | ||
|
0bc176e6b8 | ||
|
b9b4ae4c34 | ||
|
2719e0aa02 | ||
|
2dc3679b6e | ||
|
74879cff5b | ||
|
d58f08a1a9 | ||
|
2d948fe31e | ||
|
5efaf11018 | ||
|
b055431b5c | ||
|
e3bf4c14dc | ||
|
d291491eb6 | ||
|
e098adeaf7 | ||
|
304e39b8ec | ||
|
d075508cf0 | ||
|
bf7f1e75da | ||
|
72e192fc42 | ||
|
86a106023b | ||
|
3a0ec4568d | ||
|
13d5513465 | ||
|
b670fe8554 | ||
|
beff9bb972 | ||
|
19c52a797b | ||
|
edbaad38fc | ||
|
266010c7f2 | ||
|
9bfab982fd | ||
|
18dbcd321d | ||
|
744ec2c02e | ||
|
c0dce52a12 | ||
|
cfe7565123 | ||
|
a6d8e03be5 | ||
|
5fc4e0d280 | ||
|
1c4e84f888 | ||
|
f6d4da1706 | ||
|
f5bbba29fb | ||
|
4f44b40d33 | ||
|
08e0a56f32 | ||
|
a0b6fe01f4 | ||
|
a03cf25014 | ||
|
9acbdbcc6d | ||
|
06765cc9d1 | ||
|
2cfee72f8e | ||
|
8ff712f50f | ||
|
6a02d8a8d9 | ||
|
02e4d63d7e | ||
|
6f4c9d5739 | ||
|
0bd1631812 | ||
|
edfe61308b | ||
|
9d4b0ced46 | ||
|
9a8533488e | ||
|
d7812f6634 | ||
|
2e10d5244e | ||
|
e295ae92f3 | ||
|
0ca5e4125e | ||
|
86f0c7bfcc | ||
|
30c9cea332 | ||
|
ea091271c8 | ||
|
bea37cf37b | ||
|
b2d320b259 | ||
|
749b766a8c | ||
|
6fae615794 | ||
|
abcbea02c1 | ||
|
65850c0467 | ||
|
413b215b6c | ||
|
30185fdff4 | ||
|
8cedcec2bc | ||
|
1cc6f6d3bb | ||
|
ca0a371996 | ||
|
b0fd9f9b74 | ||
|
396f6561a4 | ||
|
f16619507a | ||
|
69ac155838 | ||
|
a6bae85952 | ||
|
494b9c486e | ||
|
d8c5d338cb | ||
|
417438fea0 | ||
|
5488ffb6d4 | ||
|
e8725ce940 | ||
|
0e734920e8 | ||
|
ad598a2060 | ||
|
bb47f95262 | ||
|
a7a2115b9c | ||
|
18429f2a69 | ||
|
7e6430787c | ||
|
dc3ba8c223 | ||
|
2fd6520a7e | ||
|
7a61b36104 | ||
|
2f4783a770 | ||
|
6056391a78 | ||
|
213b3575ce | ||
|
3821e18d08 | ||
|
224c6e3f7c | ||
|
18ab6f429c | ||
|
07f8542ce7 | ||
|
cf293c224d | ||
|
e234ad0011 | ||
|
229b778b0b | ||
|
66f484defe | ||
|
ed523e248a | ||
|
3c49f27bf4 | ||
|
226d146b25 | ||
|
1892289329 | ||
|
5529fc0355 | ||
|
73ef559240 | ||
|
b59a63c8cd | ||
|
c36927137f | ||
|
649aaad100 | ||
|
ea4c262482 | ||
|
89de6c9df6 | ||
|
4578bc3b0c | ||
|
8df1e4866a | ||
|
9f92220a9c | ||
|
09a9e7bcb7 | ||
|
a434f8877a | ||
|
ef891dc0a7 | ||
|
3ebe29c983 | ||
|
1028e43464 | ||
|
4979f66f28 | ||
|
a5e9fe97c8 | ||
|
2293cfaf84 | ||
|
d252dde933 | ||
|
37a49a5992 | ||
|
2783801610 | ||
|
82f19c9a91 | ||
|
71d9531e45 | ||
|
3bbeaefa57 | ||
|
4611be805a | ||
|
587493fdfc | ||
|
50079144e3 | ||
|
2ca80e76a0 | ||
|
68e6502484 | ||
|
1e91dfa5df | ||
|
e4e5f7c65b | ||
|
8ef66261f1 | ||
|
90812b536c | ||
|
2b880d3ef8 | ||
|
6ab729aeb3 | ||
|
c9f97f49c5 | ||
|
8b352fcb94 | ||
|
5a06af4d57 | ||
|
2ede900bfd | ||
|
fb0ffc7784 | ||
|
e69171dc06 | ||
|
8452f6b494 | ||
|
f9bc6f8afc | ||
|
f9f44d7d9b | ||
|
86bb1472cc | ||
|
ef09c506c8 | ||
|
af7b3b420e | ||
|
3b80a35a66 | ||
|
f59b27258c | ||
|
d38fff38f9 | ||
|
91c5b12f25 | ||
|
894bdd5cda | ||
|
d8c58ca6c8 | ||
|
43f7956422 | ||
|
96fcc02900 | ||
|
2e8b6e7f20 | ||
|
3ed93398e9 | ||
|
d84e0caea8 | ||
|
5c1da58b90 | ||
|
018c617199 | ||
|
a49f954f6a | ||
|
03a8791440 | ||
|
78ad17381e | ||
|
5b03803e2f | ||
|
ee1e461a57 | ||
|
a543725311 | ||
|
8c701a0861 | ||
|
5fbe566524 | ||
|
e14cf31bc9 | ||
|
0042c03c7e | ||
|
41023ecb9c | ||
|
fb8d0a544d | ||
|
acaf8c9cc9 | ||
|
0d3fc8d103 | ||
|
9bbfbacacc | ||
|
8e301c629f | ||
|
9576d8a081 | ||
|
7db96672bf | ||
|
0d8f099ca2 | ||
|
0a4d7e5068 | ||
|
a32f75b800 | ||
|
78f37c51ef | ||
|
d6e5eb75ee | ||
|
6f433a7e7b | ||
|
ce2ecb5582 | ||
|
45c15e8561 | ||
|
5e3f4186da | ||
|
d03694df19 | ||
|
d52e8fa7d2 | ||
|
77c6cd0bff | ||
|
463ebe8b4b | ||
|
a563eab49a | ||
|
bf9d4b103d | ||
|
7dc2449f3a | ||
|
27cc20db11 | ||
|
4e04f5f731 | ||
|
5ec3844077 | ||
|
f641c7cd0d | ||
|
49aa54cafc | ||
|
e3b81e66a1 | ||
|
7bb6b928b5 | ||
|
ad4dc7c4a9 | ||
|
feb9764721 | ||
|
8c74501001 | ||
|
5861d3fd64 | ||
|
08acdc6a86 | ||
|
3b50570c9b | ||
|
00d7e962a7 | ||
|
192f7413c2 | ||
|
5bdb8074aa | ||
|
6abe5e1b23 | ||
|
4612b4ccca | ||
|
3245bf61a1 | ||
|
9ee13167bb | ||
|
ca9633ca9b | ||
|
e04884545c | ||
|
aa2239a050 | ||
|
40a1b60cbd | ||
|
cccb11916f | ||
|
49641825eb | ||
|
c14c078405 | ||
|
f2af073588 | ||
|
b9a5eddb6d | ||
|
bffc815375 | ||
|
5c3f322364 | ||
|
3a6fae817c | ||
|
d8f74ecb94 | ||
|
f7f2b1b033 | ||
|
601ab7ff82 |
0
.cleancount
Executable file → Normal file
0
.cleancount
Executable file → Normal file
16
.cvsignore
16
.cvsignore
@@ -1,16 +0,0 @@
|
||||
asterisk
|
||||
defaults.h
|
||||
ast_expr2.output
|
||||
.version
|
||||
.depend
|
||||
.applied
|
||||
mpg123-0.59r
|
||||
mpg123-0.59r.tar.gz
|
||||
update.out
|
||||
.lastclean
|
||||
.cleancount
|
||||
.tags-depend
|
||||
.tags-sources
|
||||
tags
|
||||
TAGS
|
||||
testexpr2
|
1
.lastclean
Normal file
1
.lastclean
Normal file
@@ -0,0 +1 @@
|
||||
8
|
2
CREDITS
Executable file → Normal file
2
CREDITS
Executable file → Normal file
@@ -85,7 +85,7 @@ Leif Madsen, Jared Smith and Jim van Meggelen - the Asterisk book
|
||||
available under a Creative Commons License at http://www.asteriskdocs.org
|
||||
|
||||
=== HOLD MUSIC ===
|
||||
Music provided by www.freeplaymusic.com
|
||||
Music provided by www.opsound.org
|
||||
|
||||
=== OTHER SOURCE CODE IN ASTERISK ===
|
||||
|
||||
|
120
Makefile
Executable file → Normal file
120
Makefile
Executable file → Normal file
@@ -36,6 +36,8 @@ endif
|
||||
# Remember the MAKELEVEL at the top
|
||||
MAKETOPLEVEL?=$(MAKELEVEL)
|
||||
|
||||
PWD=$(shell pwd)
|
||||
|
||||
ifneq ($(findstring dont-optimize,$(MAKECMDGOALS)),dont-optimize)
|
||||
######### More GSM codec optimization
|
||||
######### Uncomment to enable MMXTM optimizations for x86 architecture CPU's
|
||||
@@ -105,6 +107,9 @@ BUSYDETECT+= #-DBUSYDETECT_TONEONLY
|
||||
# Don't use together with -DBUSYDETECT_TONEONLY
|
||||
BUSYDETECT+= #-DBUSYDETECT_COMPARE_TONE_AND_SILENCE
|
||||
|
||||
# Comment this if you want to disable MIDCOM
|
||||
MIDCOM = -DMIDCOM
|
||||
|
||||
ifneq ($(OSARCH),SunOS)
|
||||
ASTLIBDIR=$(INSTALL_PREFIX)/usr/lib/asterisk
|
||||
ASTVARLIBDIR=$(INSTALL_PREFIX)/var/lib/asterisk
|
||||
@@ -209,12 +214,13 @@ ifeq ($(OSARCH),Linux)
|
||||
MPG123TARG=linux
|
||||
endif
|
||||
|
||||
PWD=$(shell pwd)
|
||||
GREP=grep
|
||||
ID=id
|
||||
|
||||
ifeq ($(OSARCH),SunOS)
|
||||
GREP=/usr/xpg4/bin/grep
|
||||
M4=/usr/local/bin/m4
|
||||
ID=/usr/xpg4/bin/id
|
||||
endif
|
||||
|
||||
INCLUDE+=-Iinclude -I../include
|
||||
@@ -305,30 +311,35 @@ endif # WITHOUT_ZAPTEL
|
||||
LIBEDIT=editline/libedit.a
|
||||
|
||||
ifneq ($(wildcard .version),)
|
||||
ASTERISKVERSION=$(shell cat .version)
|
||||
ASTERISKVERSIONNUM=$(shell awk -F. '{printf "%02d%02d%02d", $$1, $$2, $$3}' .version)
|
||||
RPMVERSION=$(shell sed 's/[-\/:]/_/g' .version)
|
||||
ASTERISKVERSION:=$(shell cat .version)
|
||||
ASTERISKVERSIONNUM:=$(shell awk -F. '{printf "%02d%02d%02d", $$1, $$2, $$3}' .version)
|
||||
RPMVERSION:=$(shell sed 's/[-\/:]/_/g' .version)
|
||||
else
|
||||
RPMVERSION=unknown
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard CVS),)
|
||||
# CVS mirrors of SVN have .svnrevision files showing
|
||||
# which SVN revision they are based on, and .svnbranch
|
||||
# showing the branch they are made from
|
||||
ifneq ($(wildcard .svnrevision),)
|
||||
ASTERISKVERSIONNUM=999999
|
||||
ifneq ($(wildcard CVS/Tag),)
|
||||
ASTERISKVERSION=$(shell echo "CVS-`sed 's/^T//g' CVS/Tag`-`date +"%D-%T"`")
|
||||
else
|
||||
ASTERISKVERSION=CVS HEAD
|
||||
endif
|
||||
ASTERISKVERSION:=SVN-$(shell cat .svnbranch)-r$(shell cat .svnrevision)
|
||||
else
|
||||
ASTERISKVERSIONNUM=000000
|
||||
ifneq ($(wildcard .svn),)
|
||||
ASTERISKVERSIONNUM=999999
|
||||
ASTERISKVERSION=SVN-$(shell build_tools/make_svn_branch_name)
|
||||
endif
|
||||
endif
|
||||
|
||||
ASTCFLAGS+= $(DEBUG_THREADS)
|
||||
ASTCFLAGS+= $(TRACE_FRAMES)
|
||||
ASTCFLAGS+= $(MALLOC_DEBUG)
|
||||
ASTCFLAGS+= $(BUSYDETECT)
|
||||
ASTCFLAGS+= $(MIDCOM)
|
||||
ASTCFLAGS+= $(OPTIONS)
|
||||
ifneq ($(findstring dont-optimize,$(MAKECMDGOALS)),dont-optimize)
|
||||
ASTCFLAGS+= -fomit-frame-pointer
|
||||
endif
|
||||
SUBDIRS=res channels pbx apps codecs formats agi cdr funcs utils stdtime
|
||||
|
||||
OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \
|
||||
@@ -363,7 +374,7 @@ ifeq ($(OSARCH),Darwin)
|
||||
AUDIO_LIBS=-framework CoreAudio
|
||||
ASTLINK=-Wl,-dynamic
|
||||
SOLINK=-dynamic -bundle -undefined suppress -force_flat_namespace
|
||||
OBJS+=poll.o
|
||||
OBJS+= poll.o
|
||||
ASTCFLAGS+=-DPOLLCOMPAT
|
||||
else
|
||||
#These are used for all but Darwin
|
||||
@@ -534,7 +545,7 @@ clean:
|
||||
$(MAKE) -C stdtime clean
|
||||
|
||||
datafiles: all
|
||||
if test $$(id -u) = 0; then sh mkpkgconfig $(DESTDIR)/usr/lib/pkgconfig; fi
|
||||
if [ x`$(ID) -un` = xroot ]; then sh mkpkgconfig $(DESTDIR)/usr/lib/pkgconfig; fi
|
||||
mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/digits
|
||||
mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/priv-callerintros
|
||||
for x in sounds/digits/*.gsm; do \
|
||||
@@ -588,17 +599,16 @@ datafiles: all
|
||||
mkdir -p $(DESTDIR)$(AGI_DIR)
|
||||
|
||||
update:
|
||||
@if [ -d CVS ]; then \
|
||||
if [ -f patches/.applied ]; then \
|
||||
patches=`cat patches/.applied`; \
|
||||
fi; \
|
||||
if [ ! -z "$$patches" ]; then \
|
||||
for x in $$patches; do \
|
||||
echo "Unapplying $$x..."; \
|
||||
patch -R -p0 < patches/$$x; \
|
||||
done; \
|
||||
rm -f patches/.applied; \
|
||||
@if [ -d .svn ]; then \
|
||||
echo "Updating from Subversion..." ; \
|
||||
svn update | tee update.out; \
|
||||
rm -f .version; \
|
||||
if [ `grep -c ^C update.out` -gt 0 ]; then \
|
||||
echo ; echo "The following files have conflicts:" ; \
|
||||
grep ^C update.out | cut -b4- ; \
|
||||
fi ; \
|
||||
rm -f update.out; \
|
||||
elif [ -d CVS ]; then \
|
||||
echo "Updating from CVS..." ; \
|
||||
cvs -q -z3 update -Pd | tee update.out; \
|
||||
rm -f .version; \
|
||||
@@ -607,19 +617,8 @@ update:
|
||||
grep ^C update.out | cut -d' ' -f2- ; \
|
||||
fi ; \
|
||||
rm -f update.out; \
|
||||
if [ ! -z "$$patches" ]; then \
|
||||
for x in $$patches; do \
|
||||
if [ -f patches/$$x ]; then \
|
||||
echo "Applying patch $$x..."; \
|
||||
patch -p0 < patches/$$x; \
|
||||
echo $$x >> patches/.applied; \
|
||||
else \
|
||||
echo "Patch $$x no longer relevant"; \
|
||||
fi; \
|
||||
done; \
|
||||
fi; \
|
||||
else \
|
||||
echo "Not CVS"; \
|
||||
echo "Not under version control"; \
|
||||
fi
|
||||
|
||||
NEWHEADERS=$(notdir $(wildcard include/asterisk/*.h))
|
||||
@@ -636,6 +635,7 @@ bininstall: all
|
||||
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/system
|
||||
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp
|
||||
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/meetme
|
||||
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/monitor
|
||||
if [ -f asterisk ]; then $(INSTALL) -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/; fi
|
||||
if [ -f cygwin/asterisk.exe ]; then $(INSTALL) -m 755 cygwin/asterisk.exe $(DESTDIR)$(ASTSBINDIR)/; fi
|
||||
if [ -f asterisk.dll ]; then $(INSTALL) -m 755 asterisk.dll $(DESTDIR)$(ASTSBINDIR)/; fi
|
||||
@@ -831,12 +831,12 @@ __rpm: include/asterisk/version.h spec
|
||||
$(MAKE) DESTDIR=/tmp/asterisk install ; \
|
||||
$(MAKE) DESTDIR=/tmp/asterisk samples ; \
|
||||
mkdir -p /tmp/asterisk/etc/rc.d/init.d ; \
|
||||
cp -f redhat/asterisk /tmp/asterisk/etc/rc.d/init.d/ ; \
|
||||
cp -f contrib/init.d/rc.redhat.asterisk /tmp/asterisk/etc/rc.d/init.d/asterisk ; \
|
||||
rpmbuild --rcfile /usr/lib/rpm/rpmrc:redhat/rpmrc -bb asterisk.spec
|
||||
|
||||
progdocs:
|
||||
(cat contrib/asterisk-ng-doxygen; echo "HAVE_DOT=$(HAVEDOT) \
|
||||
PROJECT_NUMBER=$(ASTERISKVERSION) - $(ASTERISKVERSIONNUM)") | doxygen -
|
||||
(cat contrib/asterisk-ng-doxygen; echo "HAVE_DOT=$(HAVEDOT)"; \
|
||||
echo "PROJECT_NUMBER=$(ASTERISKVERSION)") | doxygen -
|
||||
|
||||
mpg123:
|
||||
@wget -V >/dev/null || (echo "You need wget" ; false )
|
||||
@@ -906,47 +906,3 @@ cleantest:
|
||||
if cmp -s .cleancount .lastclean ; then echo ; else \
|
||||
$(MAKE) clean; cp -f .cleancount .lastclean;\
|
||||
fi
|
||||
|
||||
patchlist:
|
||||
@echo "Experimental Patches:"
|
||||
@for x in patches/*; do \
|
||||
patch=`basename $$x`; \
|
||||
if [ "$$patch" = "CVS" ]; then \
|
||||
continue; \
|
||||
fi; \
|
||||
if grep -q ^$$patch$$ patches/.applied; then \
|
||||
echo "$$patch (applied)"; \
|
||||
else \
|
||||
echo "$$patch (available)"; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
apply:
|
||||
@if [ -z "$(PATCH)" ]; then \
|
||||
echo "Usage: make PATCH=<patchname> apply"; \
|
||||
elif grep -q ^$(PATCH)$$ patches/.applied 2>/dev/null; then \
|
||||
echo "Patch $(PATCH) is already applied"; \
|
||||
elif [ -f "patches/$(PATCH)" ]; then \
|
||||
echo "Applying patch $(PATCH)"; \
|
||||
patch -p0 < patches/$(PATCH); \
|
||||
echo "$(PATCH)" >> patches/.applied; \
|
||||
else \
|
||||
echo "No such patch $(PATCH) in patches directory"; \
|
||||
fi
|
||||
|
||||
unapply:
|
||||
@if [ -z "$(PATCH)" ]; then \
|
||||
echo "Usage: make PATCH=<patchname> unapply"; \
|
||||
elif grep -v -q ^$(PATCH)$$ patches/.applied 2>/dev/null; then \
|
||||
echo "Patch $(PATCH) is not applied"; \
|
||||
elif [ -f "patches/$(PATCH)" ]; then \
|
||||
echo "Un-applying patch $(PATCH)"; \
|
||||
patch -p0 -R < patches/$(PATCH); \
|
||||
rm -f patches/.tmpapplied || :; \
|
||||
mv patches/.applied patches/.tmpapplied; \
|
||||
cat patches/.tmpapplied | grep -v ^$(PATCH)$$ > patches/.applied; \
|
||||
rm -f patches/.tmpapplied; \
|
||||
else \
|
||||
echo "No such patch $(PATCH) in patches directory"; \
|
||||
fi
|
||||
|
||||
|
10
README
Executable file → Normal file
10
README
Executable file → Normal file
@@ -67,7 +67,7 @@ made every effort possible to maintain backwards compatibility.
|
||||
In order to discover new features to use, please check the configuration
|
||||
examples in the /configs directory of the source code distribution.
|
||||
To discover the major new features of Asterisk 1.2, please visit
|
||||
http://www.astricon.net/asterisk1-2/
|
||||
http://edvina.net/asterisk1-2/
|
||||
|
||||
* NEW INSTALLATIONS
|
||||
|
||||
@@ -164,6 +164,14 @@ parameters. For example, the line "channel => 25-47" creates objects for
|
||||
the channels 25 through 47 of the card, obtaining the settings
|
||||
from the variables specified above.
|
||||
|
||||
* NETWORK SECURITY DEVICES
|
||||
|
||||
This release of Asterisk contains support for network security devices
|
||||
manufactured by Ranch Networks, Inc., using their MIDCOM interface
|
||||
library. You will need the companion libmidcom-0.1.0.tar.gz file to
|
||||
build the library. Contact Ranch Networks' support department for assistance
|
||||
in building and configuring MIDCOM support.
|
||||
|
||||
* SPECIAL NOTE ON TIME
|
||||
|
||||
Those using SIP phones should be aware that Asterisk is sensitive to
|
||||
|
@@ -1,8 +0,0 @@
|
||||
About Hold Music
|
||||
================
|
||||
Digium has licensed the music included with
|
||||
the Asterisk distribution From FreePlayMusic
|
||||
for use and distribution with Asterisk. It
|
||||
is licensed ONLY for use as hold music within
|
||||
an Asterisk based PBX.
|
||||
|
22
README.opsound
Normal file
22
README.opsound
Normal file
@@ -0,0 +1,22 @@
|
||||
About Hold Music
|
||||
================
|
||||
These files were obtained from http://opsound.org, where the authors placed them
|
||||
under the Creative Commons Attribution-Share Alike 2.5 license, a copy of which
|
||||
may be found at http://creativecommons.org.
|
||||
|
||||
Credits
|
||||
================
|
||||
macroform-cold_day - Paul Shuler (Macroform)
|
||||
paulshuler@gmail.com - http://macroform.bandcamp.com/
|
||||
|
||||
macroform-robot_dity - Paul Shuler (Macroform)
|
||||
paulshuler@gmail.com - http://macroform.bandcamp.com/
|
||||
|
||||
macroform-the_simplicity - Paul Shuler (Macroform)
|
||||
paulshuler@gmail.com - http://macroform.bandcamp.com/
|
||||
|
||||
manolo_camp-morning_coffee - Manolo Camp
|
||||
beatbastard@gmx.net - http://ccmixter.org/people/ManoloCamp
|
||||
|
||||
reno_project-system - Reno Project
|
||||
renoproject@hotmail.com - http://www.jamendo.com/en/album/23661
|
11
UPGRADE.txt
Executable file → Normal file
11
UPGRADE.txt
Executable file → Normal file
@@ -52,8 +52,10 @@ Dialing:
|
||||
|
||||
IAX:
|
||||
|
||||
* The naming convention for IAX channels has changed in a minor way such
|
||||
that the call number follows a "-" rather than a "/" character.
|
||||
* The naming convention for IAX channels has changed in two ways:
|
||||
1. The call number follows a "-" rather than a "/" character.
|
||||
2. The name of the channel has been simplified to IAX2/peer-callno,
|
||||
rather than IAX2/peer@peer-callno or even IAX2/peer@peer/callno.
|
||||
|
||||
SIP:
|
||||
|
||||
@@ -129,6 +131,11 @@ Applications:
|
||||
'mailbox options' menu, and 'change your password' option has been
|
||||
moved to option 5.
|
||||
|
||||
* The application VoiceMailMain now only matches the 'default' context if
|
||||
none is specified in the arguments. (This was the previously
|
||||
documented behavior, however, we didn't follow that behavior.) The old
|
||||
behavior can be restored by setting searchcontexts=yes in voicemail.conf.
|
||||
|
||||
Queues:
|
||||
|
||||
* A queue is now considered empty not only if there are no members but if
|
||||
|
0
aescrypt.c
Executable file → Normal file
0
aescrypt.c
Executable file → Normal file
@@ -1,3 +0,0 @@
|
||||
eagi-test
|
||||
eagi-sphinx-test
|
||||
.depend
|
0
agi/DialAnMp3.agi
Executable file → Normal file
0
agi/DialAnMp3.agi
Executable file → Normal file
0
agi/Makefile
Executable file → Normal file
0
agi/Makefile
Executable file → Normal file
0
agi/agi-test.agi
Executable file → Normal file
0
agi/agi-test.agi
Executable file → Normal file
0
agi/eagi-sphinx-test.c
Executable file → Normal file
0
agi/eagi-sphinx-test.c
Executable file → Normal file
0
agi/eagi-test.c
Executable file → Normal file
0
agi/eagi-test.c
Executable file → Normal file
0
agi/fastagi-test
Executable file → Normal file
0
agi/fastagi-test
Executable file → Normal file
0
agi/numeralize
Executable file → Normal file
0
agi/numeralize
Executable file → Normal file
66
app.c
Executable file → Normal file
66
app.c
Executable file → Normal file
@@ -316,8 +316,12 @@ int ast_dtmf_stream(struct ast_channel *chan,struct ast_channel *peer,char *digi
|
||||
}
|
||||
}
|
||||
}
|
||||
if (peer)
|
||||
res = ast_autoservice_stop(peer);
|
||||
if (peer) {
|
||||
/* Stop autoservice on the peer channel, but don't overwrite any error condition
|
||||
that has occurred previously while acting on the primary channel */
|
||||
if (ast_autoservice_stop(peer) && !res)
|
||||
res = -1;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -430,11 +434,11 @@ int ast_control_streamfile(struct ast_channel *chan, const char *file,
|
||||
const char *stop, const char *pause,
|
||||
const char *restart, int skipms)
|
||||
{
|
||||
long elapsed = 0, last_elapsed = 0;
|
||||
char *breaks = NULL;
|
||||
char *end = NULL;
|
||||
int blen = 2;
|
||||
int res;
|
||||
long pause_restart_point = 0;
|
||||
|
||||
if (stop)
|
||||
blen += strlen(stop);
|
||||
@@ -456,9 +460,6 @@ int ast_control_streamfile(struct ast_channel *chan, const char *file,
|
||||
if (chan->_state != AST_STATE_UP)
|
||||
res = ast_answer(chan);
|
||||
|
||||
if (chan)
|
||||
ast_stopstream(chan);
|
||||
|
||||
if (file) {
|
||||
if ((end = strchr(file,':'))) {
|
||||
if (!strcasecmp(end, ":end")) {
|
||||
@@ -469,25 +470,18 @@ int ast_control_streamfile(struct ast_channel *chan, const char *file,
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
struct timeval started = ast_tvnow();
|
||||
|
||||
if (chan)
|
||||
ast_stopstream(chan);
|
||||
ast_stopstream(chan);
|
||||
res = ast_streamfile(chan, file, chan->language);
|
||||
if (!res) {
|
||||
if (end) {
|
||||
if (pause_restart_point) {
|
||||
ast_seekstream(chan->stream, pause_restart_point, SEEK_SET);
|
||||
pause_restart_point = 0;
|
||||
}
|
||||
else if (end) {
|
||||
ast_seekstream(chan->stream, 0, SEEK_END);
|
||||
end=NULL;
|
||||
}
|
||||
res = 1;
|
||||
if (elapsed) {
|
||||
ast_stream_fastforward(chan->stream, elapsed);
|
||||
last_elapsed = elapsed - 200;
|
||||
}
|
||||
if (res)
|
||||
res = ast_waitstream_fr(chan, breaks, fwd, rev, skipms);
|
||||
else
|
||||
break;
|
||||
end = NULL;
|
||||
};
|
||||
res = ast_waitstream_fr(chan, breaks, fwd, rev, skipms);
|
||||
}
|
||||
|
||||
if (res < 1)
|
||||
@@ -496,17 +490,16 @@ int ast_control_streamfile(struct ast_channel *chan, const char *file,
|
||||
/* We go at next loop if we got the restart char */
|
||||
if (restart && strchr(restart, res)) {
|
||||
ast_log(LOG_DEBUG, "we'll restart the stream here at next loop\n");
|
||||
elapsed=0; /* To make sure the next stream will start at beginning */
|
||||
pause_restart_point = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pause != NULL && strchr(pause, res)) {
|
||||
elapsed = ast_tvdiff_ms(ast_tvnow(), started) + last_elapsed;
|
||||
for(;;) {
|
||||
if (chan)
|
||||
ast_stopstream(chan);
|
||||
if (pause && strchr(pause, res)) {
|
||||
pause_restart_point = ast_tellstream(chan->stream);
|
||||
for (;;) {
|
||||
ast_stopstream(chan);
|
||||
res = ast_waitfordigit(chan, 1000);
|
||||
if (res == 0)
|
||||
if (!res)
|
||||
continue;
|
||||
else if (res == -1 || strchr(pause, res) || (stop && strchr(stop, res)))
|
||||
break;
|
||||
@@ -516,17 +509,16 @@ int ast_control_streamfile(struct ast_channel *chan, const char *file,
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (res == -1)
|
||||
break;
|
||||
|
||||
/* if we get one of our stop chars, return it to the calling function */
|
||||
if (stop && strchr(stop, res)) {
|
||||
/* res = 0; */
|
||||
if (stop && strchr(stop, res))
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (chan)
|
||||
ast_stopstream(chan);
|
||||
|
||||
ast_stopstream(chan);
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -597,7 +589,7 @@ int ast_play_and_record(struct ast_channel *chan, const char *playfile, const ch
|
||||
|
||||
while((fmt = strsep(&stringp, "|"))) {
|
||||
if (fmtcnt > MAX_OTHER_FORMATS - 1) {
|
||||
ast_log(LOG_WARNING, "Please increase MAX_OTHER_FORMATS in app_voicemail.c\n");
|
||||
ast_log(LOG_WARNING, "Please increase MAX_OTHER_FORMATS in app.c\n");
|
||||
break;
|
||||
}
|
||||
sfmt[fmtcnt++] = ast_strdupa(fmt);
|
||||
@@ -827,7 +819,7 @@ int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordf
|
||||
|
||||
while((fmt = strsep(&stringp, "|"))) {
|
||||
if (fmtcnt > MAX_OTHER_FORMATS - 1) {
|
||||
ast_log(LOG_WARNING, "Please increase MAX_OTHER_FORMATS in app_voicemail.c\n");
|
||||
ast_log(LOG_WARNING, "Please increase MAX_OTHER_FORMATS in app.c\n");
|
||||
break;
|
||||
}
|
||||
sfmt[fmtcnt++] = ast_strdupa(fmt);
|
||||
@@ -855,6 +847,7 @@ int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordf
|
||||
res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
|
||||
if (res < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
|
||||
ast_dsp_free(sildet);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -959,6 +952,7 @@ int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordf
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Error creating writestream '%s', format '%s'\n", prependfile, sfmt[x]);
|
||||
}
|
||||
ast_dsp_free(sildet);
|
||||
*duration = end - start;
|
||||
#if 0
|
||||
if (outmsg > 1) {
|
||||
|
@@ -1 +0,0 @@
|
||||
.depend
|
2
apps/Makefile
Executable file → Normal file
2
apps/Makefile
Executable file → Normal file
@@ -103,7 +103,7 @@ app_curl.so: app_curl.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(CURLLIBS)
|
||||
|
||||
app_sql_postgres.o: app_sql_postgres.c
|
||||
$(CC) -pipe -I/usr/local/pgsql/include $(CFLAGS) -c -o app_sql_postgres.o app_sql_postgres.c
|
||||
$(CC) -pipe -I$(CROSS_COMPILE_TARGET)/usr/local/pgsql/include -I$(CROSS_COMPILE_TARGET)/usr/include/postgresql $(CFLAGS) -c -o app_sql_postgres.o app_sql_postgres.c
|
||||
|
||||
app_sql_postgres.so: app_sql_postgres.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -L/usr/local/pgsql/lib -lpq
|
||||
|
0
apps/app_adsiprog.c
Executable file → Normal file
0
apps/app_adsiprog.c
Executable file → Normal file
0
apps/app_alarmreceiver.c
Executable file → Normal file
0
apps/app_alarmreceiver.c
Executable file → Normal file
0
apps/app_authenticate.c
Executable file → Normal file
0
apps/app_authenticate.c
Executable file → Normal file
0
apps/app_cdr.c
Executable file → Normal file
0
apps/app_cdr.c
Executable file → Normal file
0
apps/app_chanisavail.c
Executable file → Normal file
0
apps/app_chanisavail.c
Executable file → Normal file
10
apps/app_chanspy.c
Executable file → Normal file
10
apps/app_chanspy.c
Executable file → Normal file
@@ -208,9 +208,9 @@ static int start_spying(struct ast_channel *chan, struct ast_channel *spychan, s
|
||||
|
||||
static void stop_spying(struct ast_channel *chan, struct ast_channel_spy *spy)
|
||||
{
|
||||
/* If our status has changed, then the channel we're spying on is gone....
|
||||
/* If our status has changed to DONE, then the channel we're spying on is gone....
|
||||
DON'T TOUCH IT!!! RUN AWAY!!! */
|
||||
if (spy->status != CHANSPY_RUNNING)
|
||||
if (spy->status == CHANSPY_DONE)
|
||||
return;
|
||||
|
||||
if (!chan)
|
||||
@@ -439,8 +439,8 @@ static int chanspy_exec(struct ast_channel *chan, void *data)
|
||||
|
||||
if (recbase) {
|
||||
char filename[512];
|
||||
snprintf(filename,sizeof(filename),"%s/%s.%ld.raw",ast_config_AST_MONITOR_DIR, recbase, time(NULL));
|
||||
if ((fd = open(filename, O_CREAT | O_WRONLY, O_TRUNC)) <= 0) {
|
||||
snprintf(filename,sizeof(filename),"%s/%s.%d.raw",ast_config_AST_MONITOR_DIR, recbase, (int)time(NULL));
|
||||
if ((fd = open(filename, O_CREAT | O_WRONLY, O_TRUNC, 0644)) <= 0) {
|
||||
ast_log(LOG_WARNING, "Cannot open %s for recording\n", filename);
|
||||
fd = 0;
|
||||
}
|
||||
@@ -482,7 +482,7 @@ static int chanspy_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
if (igrp && (!spec || ((strlen(spec) < strlen(peer->name) &&
|
||||
if (igrp && (!spec || ((strlen(spec) <= strlen(peer->name) &&
|
||||
!strncasecmp(peer->name, spec, strlen(spec)))))) {
|
||||
if (peer && (!bronly || ast_bridged_channel(peer)) &&
|
||||
!ast_check_hangup(peer) && !ast_test_flag(peer, AST_FLAG_SPYING)) {
|
||||
|
2
apps/app_controlplayback.c
Executable file → Normal file
2
apps/app_controlplayback.c
Executable file → Normal file
@@ -140,7 +140,7 @@ static int controlplayback_exec(struct ast_channel *chan, void *data)
|
||||
} else {
|
||||
if (res < 0) {
|
||||
if (priority_jump || option_priority_jumping) {
|
||||
if (!ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) {
|
||||
if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) {
|
||||
ast_log(LOG_WARNING, "ControlPlayback tried to jump to priority n+101 as requested, but priority didn't exist\n");
|
||||
}
|
||||
}
|
||||
|
0
apps/app_curl.c
Executable file → Normal file
0
apps/app_curl.c
Executable file → Normal file
8
apps/app_cut.c
Executable file → Normal file
8
apps/app_cut.c
Executable file → Normal file
@@ -36,7 +36,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/channel.h"
|
||||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/version.h"
|
||||
#include "asterisk/app.h"
|
||||
|
||||
/* Maximum length of any variable */
|
||||
@@ -146,8 +145,9 @@ static int sort_internal(struct ast_channel *chan, char *data, char *buffer, siz
|
||||
int blen = strlen(buffer);
|
||||
if (element_count++) {
|
||||
strncat(buffer + blen, ",", buflen - blen - 1);
|
||||
blen++;
|
||||
}
|
||||
strncat(buffer + blen + 1, sortable_keys[count2].key, buflen - blen - 2);
|
||||
strncat(buffer + blen, sortable_keys[count2].key, buflen - blen - 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -253,6 +253,8 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return ERROR_NOARG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -386,7 +388,7 @@ static char *acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char
|
||||
|
||||
switch (cut_internal(chan, data, buf, len)) {
|
||||
case ERROR_NOARG:
|
||||
ast_log(LOG_ERROR, "Cut() requires an argument\n");
|
||||
ast_log(LOG_ERROR, "CUT() requires an argument\n");
|
||||
break;
|
||||
case ERROR_NOMEM:
|
||||
ast_log(LOG_ERROR, "Out of memory\n");
|
||||
|
0
apps/app_datetime.c
Executable file → Normal file
0
apps/app_datetime.c
Executable file → Normal file
0
apps/app_db.c
Executable file → Normal file
0
apps/app_db.c
Executable file → Normal file
31
apps/app_dial.c
Executable file → Normal file
31
apps/app_dial.c
Executable file → Normal file
@@ -75,7 +75,7 @@ static char *descrip =
|
||||
"continue if no requested channels can be called, or if the timeout expires.\n\n"
|
||||
" This application sets the following channel variables upon completion:\n"
|
||||
" DIALEDTIME - This is the time from dialing a channel until when it\n"
|
||||
" answers.\n"
|
||||
" is disconnected.\n"
|
||||
" ANSWEREDTIME - This is the amount of time for actual call.\n"
|
||||
" DIALSTATUS - This is the status of the call:\n"
|
||||
" CHANUNAVAIL | CONGESTION | NOANSWER | BUSY | ANSWER | CANCEL\n"
|
||||
@@ -108,9 +108,10 @@ static char *descrip =
|
||||
" other than the number assigned to the caller.\n"
|
||||
" g - Proceed with dialplan execution at the current extension if the\n"
|
||||
" destination channel hangs up.\n"
|
||||
" G(context^exten^pri) - If the call is answered, transfer both parties to\n"
|
||||
" the specified priority. Optionally, an extension, or extension and\n"
|
||||
" context may be specified. Otherwise, the current extension is used.\n"
|
||||
" G(context^exten^pri) - If the call is answered, transfer the calling party to\n"
|
||||
" the specified priority and the called party to the specified priority+1.\n"
|
||||
" Optionally, an extension, or extension and context may be specified. \n"
|
||||
" Otherwise, the current extension is used.\n"
|
||||
" h - Allow the called party to hang up by sending the '*' DTMF digit.\n"
|
||||
" H - Allow the calling party to hang up by hitting the '*' DTMF digit.\n"
|
||||
" j - Jump to priority n+101 if all of the requested channels were busy.\n"
|
||||
@@ -161,7 +162,7 @@ static char *descrip =
|
||||
" S(x) - Hang up the call after 'x' seconds *after* the called party has\n"
|
||||
" answered the call.\n"
|
||||
" t - Allow the called party to transfer the calling party by sending the\n"
|
||||
" DTMF sequence defiend in features.conf.\n"
|
||||
" DTMF sequence defined in features.conf.\n"
|
||||
" T - Allow the calling party to transfer the called party by sending the\n"
|
||||
" DTMF sequence defined in features.conf.\n"
|
||||
" w - Allow the called party to enable recording of the call by sending\n"
|
||||
@@ -512,10 +513,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
||||
if (in->cid.cid_ani) {
|
||||
if (o->chan->cid.cid_ani)
|
||||
free(o->chan->cid.cid_ani);
|
||||
o->chan->cid.cid_ani = malloc(strlen(in->cid.cid_ani) + 1);
|
||||
if (o->chan->cid.cid_ani)
|
||||
ast_copy_string(o->chan->cid.cid_ani, in->cid.cid_ani, sizeof(o->chan->cid.cid_ani));
|
||||
else
|
||||
o->chan->cid.cid_ani = strdup(in->cid.cid_ani);
|
||||
if (!o->chan->cid.cid_ani)
|
||||
ast_log(LOG_WARNING, "Out of memory\n");
|
||||
}
|
||||
if (o->chan->cid.cid_rdnis)
|
||||
@@ -650,6 +649,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
||||
ast_hangup(o->chan);
|
||||
o->chan = NULL;
|
||||
ast_clear_flag(o, DIAL_STILLGOING);
|
||||
HANDLE_CAUSE(in->hangupcause, in);
|
||||
}
|
||||
}
|
||||
o = o->next;
|
||||
@@ -737,6 +737,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
char numsubst[AST_MAX_EXTENSION];
|
||||
char restofit[AST_MAX_EXTENSION];
|
||||
char cidname[AST_MAX_EXTENSION];
|
||||
char toast[80];
|
||||
char *newnum;
|
||||
char *l;
|
||||
int privdb_val=0;
|
||||
@@ -963,7 +964,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
/* If a channel group has been specified, get it for use when we create peer channels */
|
||||
outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP");
|
||||
|
||||
ast_copy_flags(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID);
|
||||
ast_copy_flags(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID | OPT_CALLER_HANGUP);
|
||||
cur = args.peers;
|
||||
do {
|
||||
/* Remember where to start next time */
|
||||
@@ -1515,8 +1516,6 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
}
|
||||
|
||||
if (!res) {
|
||||
char toast[80];
|
||||
|
||||
memset(&config,0,sizeof(struct ast_bridge_config));
|
||||
if (play_to_caller)
|
||||
ast_set_flag(&(config.features_caller), AST_FEATURE_PLAY_WARNING);
|
||||
@@ -1560,13 +1559,15 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
|
||||
}
|
||||
res = ast_bridge_call(chan,peer,&config);
|
||||
time(&end_time);
|
||||
snprintf(toast, sizeof(toast), "%ld", (long)(end_time - start_time));
|
||||
pbx_builtin_setvar_helper(chan, "DIALEDTIME", toast);
|
||||
snprintf(toast, sizeof(toast), "%ld", (long)(end_time - answer_time));
|
||||
pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", toast);
|
||||
|
||||
} else
|
||||
} else {
|
||||
time(&end_time);
|
||||
res = -1;
|
||||
}
|
||||
snprintf(toast, sizeof(toast), "%ld", (long)(end_time - start_time));
|
||||
pbx_builtin_setvar_helper(chan, "DIALEDTIME", toast);
|
||||
|
||||
if (res != AST_PBX_NO_HANGUP_PEER) {
|
||||
if (!chan->_softhangup)
|
||||
|
0
apps/app_dictate.c
Executable file → Normal file
0
apps/app_dictate.c
Executable file → Normal file
4
apps/app_directed_pickup.c
Executable file → Normal file
4
apps/app_directed_pickup.c
Executable file → Normal file
@@ -77,7 +77,7 @@ static int pickup_exec(struct ast_channel *chan, void *data)
|
||||
|
||||
/* Find a channel to pickup */
|
||||
origin = ast_get_channel_by_exten_locked(exten, context);
|
||||
if (origin) {
|
||||
if (origin && origin->cdr) {
|
||||
ast_cdr_getvar(origin->cdr, "dstchannel", &tmp, workspace,
|
||||
sizeof(workspace), 0);
|
||||
if (tmp) {
|
||||
@@ -89,6 +89,8 @@ static int pickup_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
ast_mutex_unlock(&origin->lock);
|
||||
} else {
|
||||
if (origin)
|
||||
ast_mutex_unlock(&origin->lock);
|
||||
ast_log(LOG_DEBUG, "No originating channel found.\n");
|
||||
}
|
||||
|
||||
|
0
apps/app_directory.c
Executable file → Normal file
0
apps/app_directory.c
Executable file → Normal file
0
apps/app_disa.c
Executable file → Normal file
0
apps/app_disa.c
Executable file → Normal file
0
apps/app_dumpchan.c
Executable file → Normal file
0
apps/app_dumpchan.c
Executable file → Normal file
0
apps/app_echo.c
Executable file → Normal file
0
apps/app_echo.c
Executable file → Normal file
0
apps/app_enumlookup.c
Executable file → Normal file
0
apps/app_enumlookup.c
Executable file → Normal file
0
apps/app_eval.c
Executable file → Normal file
0
apps/app_eval.c
Executable file → Normal file
0
apps/app_exec.c
Executable file → Normal file
0
apps/app_exec.c
Executable file → Normal file
30
apps/app_externalivr.c
Executable file → Normal file
30
apps/app_externalivr.c
Executable file → Normal file
@@ -43,6 +43,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/linkedlists.h"
|
||||
#include "asterisk/app.h"
|
||||
|
||||
static const char *tdesc = "External IVR Interface Application";
|
||||
|
||||
@@ -93,9 +94,9 @@ static void send_child_event(FILE *handle, const char event, const char *data,
|
||||
char tmp[256];
|
||||
|
||||
if (!data) {
|
||||
snprintf(tmp, sizeof(tmp), "%c,%10ld", event, time(NULL));
|
||||
snprintf(tmp, sizeof(tmp), "%c,%10d", event, (int)time(NULL));
|
||||
} else {
|
||||
snprintf(tmp, sizeof(tmp), "%c,%10ld,%s", event, time(NULL), data);
|
||||
snprintf(tmp, sizeof(tmp), "%c,%10d,%s", event, (int)time(NULL), data);
|
||||
}
|
||||
|
||||
fprintf(handle, "%s\n", tmp);
|
||||
@@ -250,10 +251,9 @@ static int app_exec(struct ast_channel *chan, void *data)
|
||||
int res = -1;
|
||||
int gen_active = 0;
|
||||
int pid;
|
||||
char *command;
|
||||
char *argv[32];
|
||||
int argc = 1;
|
||||
char *buf;
|
||||
char *buf, *command;
|
||||
FILE *child_commands = NULL;
|
||||
FILE *child_errors = NULL;
|
||||
FILE *child_events = NULL;
|
||||
@@ -270,11 +270,13 @@ static int app_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
|
||||
buf = ast_strdupa(data);
|
||||
command = strsep(&buf, "|");
|
||||
memset(argv, 0, sizeof(argv) / sizeof(argv[0]));
|
||||
argv[0] = command;
|
||||
while ((argc < 31) && (argv[argc++] = strsep(&buf, "|")));
|
||||
argv[argc] = NULL;
|
||||
if (!buf) {
|
||||
ast_log(LOG_ERROR, "Out of memory!\n");
|
||||
LOCAL_USER_REMOVE(u);
|
||||
return -1;
|
||||
}
|
||||
|
||||
argc = ast_app_separate_args(buf, '|', argv, sizeof(argv) / sizeof(argv[0]));
|
||||
|
||||
if (pipe(child_stdin)) {
|
||||
ast_chan_log(LOG_WARNING, chan, "Could not create pipe for child input: %s\n", strerror(errno));
|
||||
@@ -316,8 +318,8 @@ static int app_exec(struct ast_channel *chan, void *data)
|
||||
dup2(child_stderr[1], STDERR_FILENO);
|
||||
for (i = STDERR_FILENO + 1; i < 1024; i++)
|
||||
close(i);
|
||||
execv(command, argv);
|
||||
fprintf(stderr, "Failed to execute '%s': %s\n", command, strerror(errno));
|
||||
execv(argv[0], argv);
|
||||
fprintf(stderr, "Failed to execute '%s': %s\n", argv[0], strerror(errno));
|
||||
exit(1);
|
||||
} else {
|
||||
/* parent process */
|
||||
@@ -343,8 +345,6 @@ static int app_exec(struct ast_channel *chan, void *data)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
setvbuf(child_events, NULL, _IONBF, 0);
|
||||
|
||||
if (!(child_commands = fdopen(child_commands_fd, "r"))) {
|
||||
ast_chan_log(LOG_WARNING, chan, "Could not open stream for child commands\n");
|
||||
goto exit;
|
||||
@@ -355,6 +355,10 @@ static int app_exec(struct ast_channel *chan, void *data)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
setvbuf(child_events, NULL, _IONBF, 0);
|
||||
setvbuf(child_commands, NULL, _IONBF, 0);
|
||||
setvbuf(child_errors, NULL, _IONBF, 0);
|
||||
|
||||
res = 0;
|
||||
|
||||
while (1) {
|
||||
|
17
apps/app_festival.c
Executable file → Normal file
17
apps/app_festival.c
Executable file → Normal file
@@ -175,7 +175,8 @@ static int send_waveform_to_channel(struct ast_channel *chan, char *waveform, in
|
||||
if (chan->_state != AST_STATE_UP)
|
||||
ast_answer(chan);
|
||||
ast_stopstream(chan);
|
||||
|
||||
ast_indicate(chan, -1);
|
||||
|
||||
owriteformat = chan->writeformat;
|
||||
res = ast_set_write_format(chan, AST_FORMAT_SLINEAR);
|
||||
if (res < 0) {
|
||||
@@ -455,8 +456,20 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
||||
/* This assumes only one waveform will come back, also LP is unlikely */
|
||||
wave = 0;
|
||||
do {
|
||||
int read_data;
|
||||
for (n=0; n < 3; )
|
||||
n += read(fd,ack+n,3-n);
|
||||
{
|
||||
read_data = read(fd,ack+n,3-n);
|
||||
/* this avoids falling in infinite loop
|
||||
* in case that festival server goes down
|
||||
* */
|
||||
if ( read_data == -1 )
|
||||
{
|
||||
ast_log(LOG_WARNING,"Unable to read from cache/festival fd");
|
||||
return -1;
|
||||
}
|
||||
n += read_data;
|
||||
}
|
||||
ack[3] = '\0';
|
||||
if (strcmp(ack,"WV\n") == 0) { /* receive a waveform */
|
||||
ast_log(LOG_DEBUG,"Festival WV command\n");
|
||||
|
0
apps/app_flash.c
Executable file → Normal file
0
apps/app_flash.c
Executable file → Normal file
0
apps/app_forkcdr.c
Executable file → Normal file
0
apps/app_forkcdr.c
Executable file → Normal file
0
apps/app_getcpeid.c
Executable file → Normal file
0
apps/app_getcpeid.c
Executable file → Normal file
0
apps/app_groupcount.c
Executable file → Normal file
0
apps/app_groupcount.c
Executable file → Normal file
5
apps/app_hasnewvoicemail.c
Executable file → Normal file
5
apps/app_hasnewvoicemail.c
Executable file → Normal file
@@ -68,7 +68,7 @@ static char *hasnewvoicemail_descrip =
|
||||
"Assumes folder 'INBOX' if folder is not specified. Optionally sets <varname> to the number of messages\n"
|
||||
"in that folder.\n"
|
||||
" The option string may contain zero of the following character:\n"
|
||||
" 'j' -- jump to priority n+101, if there is new voicemail in tolder 'folder' or INBOX\n"
|
||||
" 'j' -- jump to priority n+101, if there is new voicemail in folder 'folder' or INBOX\n"
|
||||
" This application sets the following channel variable upon completion:\n"
|
||||
" HASVMSTATUS The result of the new voicemail check returned as a text string as follows\n"
|
||||
" <# of messages in the folder, 0 for NONE>\n";
|
||||
@@ -90,7 +90,6 @@ static int hasvoicemail_internal(char *context, char *box, char *folder)
|
||||
while ((vment = readdir(vmdir))) {
|
||||
if (!strncmp(vment->d_name + 7, ".txt", 4)) {
|
||||
count++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
closedir(vmdir);
|
||||
@@ -163,7 +162,7 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
|
||||
if (vmcount > 0) {
|
||||
/* Branch to the next extension */
|
||||
if (priority_jump || option_priority_jumping) {
|
||||
if (!ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101))
|
||||
if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101))
|
||||
ast_log(LOG_WARNING, "VM box %s@%s has new voicemail, but extension %s, priority %d doesn't exist\n", vmbox, context, chan->exten, chan->priority + 101);
|
||||
}
|
||||
}
|
||||
|
0
apps/app_ices.c
Executable file → Normal file
0
apps/app_ices.c
Executable file → Normal file
0
apps/app_image.c
Executable file → Normal file
0
apps/app_image.c
Executable file → Normal file
0
apps/app_intercom.c
Executable file → Normal file
0
apps/app_intercom.c
Executable file → Normal file
0
apps/app_ivrdemo.c
Executable file → Normal file
0
apps/app_ivrdemo.c
Executable file → Normal file
0
apps/app_lookupblacklist.c
Executable file → Normal file
0
apps/app_lookupblacklist.c
Executable file → Normal file
0
apps/app_lookupcidname.c
Executable file → Normal file
0
apps/app_lookupcidname.c
Executable file → Normal file
37
apps/app_macro.c
Executable file → Normal file
37
apps/app_macro.c
Executable file → Normal file
@@ -104,7 +104,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
||||
char *offsets;
|
||||
int offset, depth;
|
||||
int setmacrocontext=0;
|
||||
int autoloopflag;
|
||||
int autoloopflag, dead = 0;
|
||||
|
||||
char *save_macro_exten;
|
||||
char *save_macro_context;
|
||||
@@ -216,8 +216,8 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
||||
break;
|
||||
}
|
||||
switch(res) {
|
||||
case MACRO_EXIT_RESULT:
|
||||
res = 0;
|
||||
case MACRO_EXIT_RESULT:
|
||||
res = 0;
|
||||
goto out;
|
||||
case AST_PBX_KEEPALIVE:
|
||||
if (option_debug)
|
||||
@@ -231,6 +231,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
||||
ast_log(LOG_DEBUG, "Spawn extension (%s,%s,%d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro);
|
||||
else if (option_verbose > 1)
|
||||
ast_verbose( VERBOSE_PREFIX_2 "Spawn extension (%s, %s, %d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro);
|
||||
dead = 1;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@@ -250,37 +251,44 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
||||
out:
|
||||
/* Reset the depth back to what it was when the routine was entered (like if we called Macro recursively) */
|
||||
snprintf(depthc, sizeof(depthc), "%d", depth);
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_DEPTH", depthc);
|
||||
if (!dead) {
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_DEPTH", depthc);
|
||||
|
||||
ast_set2_flag(chan, autoloopflag, AST_FLAG_IN_AUTOLOOP);
|
||||
for (x=1; x<argc; x++) {
|
||||
ast_set2_flag(chan, autoloopflag, AST_FLAG_IN_AUTOLOOP);
|
||||
}
|
||||
|
||||
for (x = 1; x < argc; x++) {
|
||||
/* Restore old arguments and delete ours */
|
||||
snprintf(varname, sizeof(varname), "ARG%d", x);
|
||||
if (oldargs[x]) {
|
||||
pbx_builtin_setvar_helper(chan, varname, oldargs[x]);
|
||||
if (!dead)
|
||||
pbx_builtin_setvar_helper(chan, varname, oldargs[x]);
|
||||
free(oldargs[x]);
|
||||
} else {
|
||||
} else if (!dead) {
|
||||
pbx_builtin_setvar_helper(chan, varname, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Restore macro variables */
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", save_macro_exten);
|
||||
if (!dead) {
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", save_macro_exten);
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_CONTEXT", save_macro_context);
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority);
|
||||
}
|
||||
if (save_macro_exten)
|
||||
free(save_macro_exten);
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_CONTEXT", save_macro_context);
|
||||
if (save_macro_context)
|
||||
free(save_macro_context);
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority);
|
||||
if (save_macro_priority)
|
||||
free(save_macro_priority);
|
||||
if (setmacrocontext) {
|
||||
|
||||
if (!dead && setmacrocontext) {
|
||||
chan->macrocontext[0] = '\0';
|
||||
chan->macroexten[0] = '\0';
|
||||
chan->macropriority = 0;
|
||||
}
|
||||
|
||||
if (!strcasecmp(chan->context, fullmacro)) {
|
||||
if (!dead && !strcasecmp(chan->context, fullmacro)) {
|
||||
/* If we're leaving the macro normally, restore original information */
|
||||
chan->priority = oldpriority;
|
||||
ast_copy_string(chan->context, oldcontext, sizeof(chan->context));
|
||||
@@ -299,7 +307,8 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", save_macro_offset);
|
||||
if (!dead)
|
||||
pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", save_macro_offset);
|
||||
if (save_macro_offset)
|
||||
free(save_macro_offset);
|
||||
LOCAL_USER_REMOVE(u);
|
||||
|
0
apps/app_math.c
Executable file → Normal file
0
apps/app_math.c
Executable file → Normal file
4
apps/app_md5.c
Executable file → Normal file
4
apps/app_md5.c
Executable file → Normal file
@@ -157,9 +157,9 @@ static int md5check_exec(struct ast_channel *chan, void *data)
|
||||
ast_log(LOG_DEBUG, "ERROR: MD5 not verified: %s -- %s\n", args.md5hash, args.string);
|
||||
pbx_builtin_setvar_helper(chan, "CHECKMD5STATUS", "NOMATCH");
|
||||
if (priority_jump || option_priority_jumping) {
|
||||
if (!ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101))
|
||||
if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101))
|
||||
if (option_debug > 2)
|
||||
ast_log(LOG_DEBUG, "ERROR: Can't jump to exten+101 (e%s,p%d), sorry\n", chan->exten,chan->priority+101);
|
||||
ast_log(LOG_DEBUG, "Can't jump to exten+101 (e%s,p%d), sorry\n", chan->exten,chan->priority+101);
|
||||
}
|
||||
LOCAL_USER_REMOVE(u);
|
||||
return res;
|
||||
|
45
apps/app_meetme.c
Executable file → Normal file
45
apps/app_meetme.c
Executable file → Normal file
@@ -263,14 +263,17 @@ static char *istalking(int x)
|
||||
return "(not talking)";
|
||||
}
|
||||
|
||||
static int careful_write(int fd, unsigned char *data, int len)
|
||||
static int careful_write(int fd, unsigned char *data, int len, int block)
|
||||
{
|
||||
int res;
|
||||
int x;
|
||||
|
||||
while (len) {
|
||||
x = ZT_IOMUX_WRITE | ZT_IOMUX_SIGEVENT;
|
||||
res = ioctl(fd, ZT_IOMUX, &x);
|
||||
if (block) {
|
||||
x = ZT_IOMUX_WRITE | ZT_IOMUX_SIGEVENT;
|
||||
res = ioctl(fd, ZT_IOMUX, &x);
|
||||
} else
|
||||
res = 0;
|
||||
if (res >= 0)
|
||||
res = write(fd, data, len);
|
||||
if (res < 1) {
|
||||
@@ -423,7 +426,7 @@ static void conf_play(struct ast_channel *chan, struct ast_conference *conf, int
|
||||
len = 0;
|
||||
}
|
||||
if (data)
|
||||
careful_write(conf->fd, data, len);
|
||||
careful_write(conf->fd, data, len, 1);
|
||||
|
||||
ast_mutex_unlock(&conflock);
|
||||
|
||||
@@ -734,6 +737,8 @@ static void conf_flush(int fd, struct ast_channel *chan)
|
||||
f = ast_read(chan);
|
||||
if (f)
|
||||
ast_frfree(f);
|
||||
else /* channel was hung up or something else happened */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -898,7 +903,9 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
snprintf(user->namerecloc, sizeof(user->namerecloc),
|
||||
"%s/meetme/meetme-username-%s-%d", ast_config_AST_SPOOL_DIR,
|
||||
conf->confno, user->user_no);
|
||||
ast_record_review(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, NULL);
|
||||
res = ast_record_review(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, NULL);
|
||||
if (res == -1)
|
||||
goto outrun;
|
||||
}
|
||||
|
||||
if (!(confflags & CONFFLAG_QUIET)) {
|
||||
@@ -946,6 +953,8 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
}
|
||||
}
|
||||
|
||||
ast_indicate(chan, -1);
|
||||
|
||||
if (ast_set_write_format(chan, AST_FORMAT_SLINEAR) < 0) {
|
||||
ast_log(LOG_WARNING, "Unable to set '%s' to write linear mode\n", chan->name);
|
||||
goto outrun;
|
||||
@@ -956,7 +965,6 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
goto outrun;
|
||||
}
|
||||
|
||||
ast_indicate(chan, -1);
|
||||
retryzap = strcasecmp(chan->type, "Zap");
|
||||
user->zapchannel = !retryzap;
|
||||
|
||||
@@ -1307,14 +1315,18 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
audio frames (in which case carefully writing would only
|
||||
have delayed the audio even further).
|
||||
*/
|
||||
write(fd, f->data, f->datalen);
|
||||
/* As it turns out, we do want to use careful write. We just
|
||||
don't want to block, but we do want to at least *try*
|
||||
to write out all the samples.
|
||||
*/
|
||||
careful_write(fd, f->data, f->datalen, 0);
|
||||
}
|
||||
} else if ((f->frametype == AST_FRAME_DTMF) && (confflags & CONFFLAG_EXIT_CONTEXT)) {
|
||||
char tmp[2];
|
||||
|
||||
tmp[0] = f->subclass;
|
||||
tmp[1] = '\0';
|
||||
if (ast_goto_if_exists(chan, exitcontext, tmp, 1)) {
|
||||
if (!ast_goto_if_exists(chan, exitcontext, tmp, 1)) {
|
||||
ret = 0;
|
||||
break;
|
||||
} else if (option_debug > 1)
|
||||
@@ -1343,9 +1355,10 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
if (!menu_active) {
|
||||
menu_active = 1;
|
||||
/* Record this sound! */
|
||||
if (!ast_streamfile(chan, "conf-adminmenu", chan->language))
|
||||
if (!ast_streamfile(chan, "conf-adminmenu", chan->language)) {
|
||||
dtmf = ast_waitstream(chan, AST_DIGIT_ANY);
|
||||
else
|
||||
ast_stopstream(chan);
|
||||
} else
|
||||
dtmf = 0;
|
||||
} else
|
||||
dtmf = f->subclass;
|
||||
@@ -1422,9 +1435,10 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
/* User menu */
|
||||
if (!menu_active) {
|
||||
menu_active = 1;
|
||||
if (!ast_streamfile(chan, "conf-usermenu", chan->language))
|
||||
if (!ast_streamfile(chan, "conf-usermenu", chan->language)) {
|
||||
dtmf = ast_waitstream(chan, AST_DIGIT_ANY);
|
||||
else
|
||||
ast_stopstream(chan);
|
||||
} else
|
||||
dtmf = 0;
|
||||
} else
|
||||
dtmf = f->subclass;
|
||||
@@ -1513,6 +1527,10 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
lastmarked = currentmarked;
|
||||
}
|
||||
}
|
||||
|
||||
if (musiconhold)
|
||||
ast_moh_stop(chan);
|
||||
|
||||
if (using_pseudo)
|
||||
close(fd);
|
||||
else {
|
||||
@@ -1623,7 +1641,8 @@ static struct ast_conference *find_conf(struct ast_channel *chan, char *confno,
|
||||
if (dynamic_pin) {
|
||||
if (dynamic_pin[0] == 'q') {
|
||||
/* Query the user to enter a PIN */
|
||||
ast_app_getdata(chan, "conf-getpin", dynamic_pin, AST_MAX_EXTENSION - 1, 0);
|
||||
if (ast_app_getdata(chan, "conf-getpin", dynamic_pin, AST_MAX_EXTENSION - 1, 0) < 0)
|
||||
return NULL;
|
||||
}
|
||||
cnf = build_conf(confno, dynamic_pin, "", make, dynamic);
|
||||
} else {
|
||||
|
15
apps/app_milliwatt.c
Executable file → Normal file
15
apps/app_milliwatt.c
Executable file → Normal file
@@ -73,30 +73,29 @@ static void milliwatt_release(struct ast_channel *chan, void *data)
|
||||
static int milliwatt_generate(struct ast_channel *chan, void *data, int len, int samples)
|
||||
{
|
||||
struct ast_frame wf;
|
||||
unsigned char waste[AST_FRIENDLY_OFFSET];
|
||||
unsigned char buf[640];
|
||||
unsigned char buf[AST_FRIENDLY_OFFSET + 640];
|
||||
int i,*indexp = (int *) data;
|
||||
|
||||
if (len > sizeof(buf))
|
||||
if (len + AST_FRIENDLY_OFFSET > sizeof(buf))
|
||||
{
|
||||
ast_log(LOG_WARNING,"Only doing %d bytes (%d bytes requested)\n",(int)sizeof(buf),len);
|
||||
len = sizeof(buf);
|
||||
ast_log(LOG_WARNING,"Only doing %d bytes (%d bytes requested)\n",(int)(sizeof(buf) - AST_FRIENDLY_OFFSET),len);
|
||||
len = sizeof(buf) - AST_FRIENDLY_OFFSET;
|
||||
}
|
||||
waste[0] = 0; /* make compiler happy */
|
||||
wf.frametype = AST_FRAME_VOICE;
|
||||
wf.subclass = AST_FORMAT_ULAW;
|
||||
wf.offset = AST_FRIENDLY_OFFSET;
|
||||
wf.mallocd = 0;
|
||||
wf.data = buf;
|
||||
wf.data = buf + AST_FRIENDLY_OFFSET;
|
||||
wf.datalen = len;
|
||||
wf.samples = wf.datalen;
|
||||
wf.src = "app_milliwatt";
|
||||
wf.delivery.tv_sec = 0;
|
||||
wf.delivery.tv_usec = 0;
|
||||
wf.prev = wf.next = NULL;
|
||||
/* create a buffer containing the digital milliwatt pattern */
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
buf[i] = digital_milliwatt[(*indexp)++];
|
||||
buf[AST_FRIENDLY_OFFSET + i] = digital_milliwatt[(*indexp)++];
|
||||
*indexp &= 7;
|
||||
}
|
||||
if (ast_write(chan,&wf) < 0)
|
||||
|
26
apps/app_mixmonitor.c
Executable file → Normal file
26
apps/app_mixmonitor.c
Executable file → Normal file
@@ -112,9 +112,9 @@ AST_APP_OPTIONS(mixmonitor_opts, {
|
||||
|
||||
static void stopmon(struct ast_channel *chan, struct ast_channel_spy *spy)
|
||||
{
|
||||
/* If our status has changed, then the channel we're spying on is gone....
|
||||
/* If our status has changed to DONE, then the channel we're spying on is gone....
|
||||
DON'T TOUCH IT!!! RUN AWAY!!! */
|
||||
if (spy->status != CHANSPY_RUNNING)
|
||||
if (spy->status == CHANSPY_DONE)
|
||||
return;
|
||||
|
||||
if (!chan)
|
||||
@@ -203,6 +203,17 @@ static void *mixmonitor_thread(void *obj)
|
||||
if (option_verbose > 1)
|
||||
ast_verbose(VERBOSE_PREFIX_2 "Begin MixMonitor Recording %s\n", name);
|
||||
|
||||
if (mixmonitor->post_process) {
|
||||
char *p;
|
||||
|
||||
for (p = mixmonitor->post_process; *p ; p++) {
|
||||
if (*p == '^' && *(p+1) == '{') {
|
||||
*p = '$';
|
||||
}
|
||||
}
|
||||
pbx_substitute_variables_helper(mixmonitor->chan, mixmonitor->post_process, post_process, sizeof(post_process) - 1);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
struct ast_frame *next;
|
||||
int write;
|
||||
@@ -237,17 +248,6 @@ static void *mixmonitor_thread(void *obj)
|
||||
ast_mutex_unlock(&spy.lock);
|
||||
}
|
||||
|
||||
if (mixmonitor->post_process) {
|
||||
char *p;
|
||||
|
||||
for (p = mixmonitor->post_process; *p ; p++) {
|
||||
if (*p == '^' && *(p+1) == '{') {
|
||||
*p = '$';
|
||||
}
|
||||
}
|
||||
pbx_substitute_variables_helper(mixmonitor->chan, mixmonitor->post_process, post_process, sizeof(post_process) - 1);
|
||||
}
|
||||
|
||||
stopmon(mixmonitor->chan, &spy);
|
||||
|
||||
if (option_verbose > 1)
|
||||
|
0
apps/app_mp3.c
Executable file → Normal file
0
apps/app_mp3.c
Executable file → Normal file
0
apps/app_nbscat.c
Executable file → Normal file
0
apps/app_nbscat.c
Executable file → Normal file
4
apps/app_osplookup.c
Executable file → Normal file
4
apps/app_osplookup.c
Executable file → Normal file
@@ -217,6 +217,10 @@ static int ospnext_exec(struct ast_channel *chan, void *data)
|
||||
temp = pbx_builtin_getvar_helper(chan, "OSPHANDLE");
|
||||
result.handle = -1;
|
||||
if (!ast_strlen_zero(temp) && (sscanf(temp, "%d", &result.handle) == 1) && (result.handle > -1)) {
|
||||
temp = pbx_builtin_getvar_helper(chan, "OSPRESULTS");
|
||||
if (ast_strlen_zero(temp) || (sscanf(temp, "%d", &result.numresults) != 1)) {
|
||||
result.numresults = 0;
|
||||
}
|
||||
if ((res = ast_osp_next(&result, cause)) > 0) {
|
||||
char tmp[80];
|
||||
snprintf(tmp, sizeof(tmp), "%d", result.handle);
|
||||
|
30
apps/app_page.c
Executable file → Normal file
30
apps/app_page.c
Executable file → Normal file
@@ -40,6 +40,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/file.h"
|
||||
#include "asterisk/app.h"
|
||||
#include "asterisk/chanvars.h"
|
||||
|
||||
|
||||
static const char *tdesc = "Page Multiple Phones";
|
||||
@@ -77,13 +78,14 @@ struct calloutdata {
|
||||
char tech[64];
|
||||
char resource[256];
|
||||
char meetmeopts[64];
|
||||
struct ast_variable *variables;
|
||||
};
|
||||
|
||||
static void *page_thread(void *data)
|
||||
{
|
||||
struct calloutdata *cd = data;
|
||||
ast_pbx_outgoing_app(cd->tech, AST_FORMAT_SLINEAR, cd->resource, 30000,
|
||||
"MeetMe", cd->meetmeopts, NULL, 0, cd->cidnum, cd->cidname, NULL, NULL);
|
||||
"MeetMe", cd->meetmeopts, NULL, 0, cd->cidnum, cd->cidname, cd->variables, NULL, NULL);
|
||||
free(cd);
|
||||
return NULL;
|
||||
}
|
||||
@@ -91,6 +93,9 @@ static void *page_thread(void *data)
|
||||
static void launch_page(struct ast_channel *chan, const char *meetmeopts, const char *tech, const char *resource)
|
||||
{
|
||||
struct calloutdata *cd;
|
||||
const char *varname;
|
||||
struct ast_variable *lastvar = NULL;
|
||||
struct ast_var_t *varptr;
|
||||
pthread_t t;
|
||||
pthread_attr_t attr;
|
||||
cd = malloc(sizeof(struct calloutdata));
|
||||
@@ -101,6 +106,29 @@ static void launch_page(struct ast_channel *chan, const char *meetmeopts, const
|
||||
ast_copy_string(cd->tech, tech, sizeof(cd->tech));
|
||||
ast_copy_string(cd->resource, resource, sizeof(cd->resource));
|
||||
ast_copy_string(cd->meetmeopts, meetmeopts, sizeof(cd->meetmeopts));
|
||||
|
||||
AST_LIST_TRAVERSE(&chan->varshead, varptr, entries) {
|
||||
if (!(varname = ast_var_full_name(varptr)))
|
||||
continue;
|
||||
if (varname[0] == '_') {
|
||||
struct ast_variable *newvar = NULL;
|
||||
|
||||
if (varname[1] == '_') {
|
||||
newvar = ast_variable_new(varname, ast_var_value(varptr));
|
||||
} else {
|
||||
newvar = ast_variable_new(&varname[1], ast_var_value(varptr));
|
||||
}
|
||||
|
||||
if (newvar) {
|
||||
if (lastvar)
|
||||
lastvar->next = newvar;
|
||||
else
|
||||
cd->variables = newvar;
|
||||
lastvar = newvar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||
if (ast_pthread_create(&t, &attr, page_thread, cd)) {
|
||||
|
0
apps/app_parkandannounce.c
Executable file → Normal file
0
apps/app_parkandannounce.c
Executable file → Normal file
0
apps/app_playback.c
Executable file → Normal file
0
apps/app_playback.c
Executable file → Normal file
2
apps/app_privacy.c
Executable file → Normal file
2
apps/app_privacy.c
Executable file → Normal file
@@ -193,7 +193,7 @@ static int privacy_exec (struct ast_channel *chan, void *data)
|
||||
}
|
||||
|
||||
/*Got a number, play sounds and send them on their way*/
|
||||
if ((retries < maxretries) && res == 1 ) {
|
||||
if ((retries < maxretries) && !res ) {
|
||||
res = ast_streamfile(chan, "privacy-thankyou", chan->language);
|
||||
if (!res)
|
||||
res = ast_waitstream(chan, "");
|
||||
|
269
apps/app_queue.c
Executable file → Normal file
269
apps/app_queue.c
Executable file → Normal file
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Asterisk -- An open source telephony toolkit.
|
||||
*
|
||||
* Copyright (C) 1999 - 2005, Digium, Inc.
|
||||
* Copyright (C) 1999 - 2006, Digium, Inc.
|
||||
*
|
||||
* Mark Spencer <markster@digium.com>
|
||||
*
|
||||
@@ -484,11 +484,11 @@ static void *changethread(void *data)
|
||||
"Membership: %s\r\n"
|
||||
"Penalty: %d\r\n"
|
||||
"CallsTaken: %d\r\n"
|
||||
"LastCall: %ld\r\n"
|
||||
"LastCall: %d\r\n"
|
||||
"Status: %d\r\n"
|
||||
"Paused: %d\r\n",
|
||||
q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
|
||||
cur->penalty, cur->calls, cur->lastcall, cur->status, cur->paused);
|
||||
cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -755,28 +755,66 @@ static void rt_handle_member_record(struct ast_call_queue *q, char *interface, c
|
||||
}
|
||||
}
|
||||
|
||||
static void free_members(struct ast_call_queue *q, int all)
|
||||
{
|
||||
/* Free non-dynamic members */
|
||||
struct member *curm, *next, *prev = NULL;
|
||||
|
||||
for (curm = q->members; curm; curm = next) {
|
||||
next = curm->next;
|
||||
if (all || !curm->dynamic) {
|
||||
if (prev)
|
||||
prev->next = next;
|
||||
else
|
||||
q->members = next;
|
||||
free(curm);
|
||||
} else
|
||||
prev = curm;
|
||||
}
|
||||
}
|
||||
|
||||
static void destroy_queue(struct ast_call_queue *q)
|
||||
{
|
||||
free_members(q, 1);
|
||||
ast_mutex_destroy(&q->lock);
|
||||
free(q);
|
||||
}
|
||||
|
||||
static void remove_queue(struct ast_call_queue *q)
|
||||
{
|
||||
struct ast_call_queue *cur, *prev = NULL;
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
for (cur = queues; cur; cur = cur->next) {
|
||||
if (cur == q) {
|
||||
if (prev)
|
||||
prev->next = cur->next;
|
||||
else
|
||||
queues = cur->next;
|
||||
} else {
|
||||
prev = cur;
|
||||
}
|
||||
}
|
||||
ast_mutex_unlock(&qlock);
|
||||
}
|
||||
|
||||
/*!\brief Reload a single queue via realtime.
|
||||
\return Return the queue, or NULL if it doesn't exist.
|
||||
\note Should be called with the global qlock locked.
|
||||
When found, the queue is returned with q->lock locked. */
|
||||
static struct ast_call_queue *reload_queue_rt(const char *queuename, struct ast_variable *queue_vars, struct ast_config *member_config)
|
||||
\note Should be called with the global qlock locked. */
|
||||
static struct ast_call_queue *find_queue_by_name_rt(const char *queuename, struct ast_variable *queue_vars, struct ast_config *member_config)
|
||||
{
|
||||
struct ast_variable *v;
|
||||
struct ast_call_queue *q, *prev_q;
|
||||
struct ast_call_queue *q, *prev_q = NULL;
|
||||
struct member *m, *prev_m, *next_m;
|
||||
char *interface;
|
||||
char *tmp, *tmp_name;
|
||||
char tmpbuf[64]; /* Must be longer than the longest queue param name. */
|
||||
|
||||
/* Find the queue in the in-core list (we will create a new one if not found). */
|
||||
q = queues;
|
||||
prev_q = NULL;
|
||||
while (q) {
|
||||
for (q = queues; q; q = q->next) {
|
||||
if (!strcasecmp(q->name, queuename)) {
|
||||
break;
|
||||
}
|
||||
q = q->next;
|
||||
prev_q = q;
|
||||
}
|
||||
|
||||
@@ -788,6 +826,7 @@ static struct ast_call_queue *reload_queue_rt(const char *queuename, struct ast_
|
||||
ast_mutex_unlock(&q->lock);
|
||||
return NULL;
|
||||
} else {
|
||||
ast_mutex_unlock(&q->lock);
|
||||
return q;
|
||||
}
|
||||
}
|
||||
@@ -814,7 +853,7 @@ static struct ast_call_queue *reload_queue_rt(const char *queuename, struct ast_
|
||||
prev_q->next = q->next;
|
||||
}
|
||||
ast_mutex_unlock(&q->lock);
|
||||
free(q);
|
||||
destroy_queue(q);
|
||||
} else
|
||||
ast_mutex_unlock(&q->lock);
|
||||
}
|
||||
@@ -850,10 +889,11 @@ static struct ast_call_queue *reload_queue_rt(const char *queuename, struct ast_
|
||||
v = v->next;
|
||||
}
|
||||
|
||||
/* Temporarily set members dead so we can detect deleted ones. */
|
||||
/* Temporarily set non-dynamic members dead so we can detect deleted ones. */
|
||||
m = q->members;
|
||||
while (m) {
|
||||
m->dead = 1;
|
||||
if (!m->dynamic)
|
||||
m->dead = 1;
|
||||
m = m->next;
|
||||
}
|
||||
|
||||
@@ -881,13 +921,60 @@ static struct ast_call_queue *reload_queue_rt(const char *queuename, struct ast_
|
||||
m = next_m;
|
||||
}
|
||||
|
||||
ast_mutex_unlock(&q->lock);
|
||||
|
||||
return q;
|
||||
}
|
||||
|
||||
static struct ast_call_queue *load_realtime_queue(char *queuename)
|
||||
{
|
||||
struct ast_variable *queue_vars = NULL;
|
||||
struct ast_config *member_config = NULL;
|
||||
struct ast_call_queue *q;
|
||||
|
||||
/* Find the queue in the in-core list first. */
|
||||
ast_mutex_lock(&qlock);
|
||||
for (q = queues; q; q = q->next) {
|
||||
if (!strcasecmp(q->name, queuename)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ast_mutex_unlock(&qlock);
|
||||
|
||||
if (!q || q->realtime) {
|
||||
/*! \note Load from realtime before taking the global qlock, to avoid blocking all
|
||||
queue operations while waiting for the DB.
|
||||
|
||||
This will be two separate database transactions, so we might
|
||||
see queue parameters as they were before another process
|
||||
changed the queue and member list as it was after the change.
|
||||
Thus we might see an empty member list when a queue is
|
||||
deleted. In practise, this is unlikely to cause a problem. */
|
||||
|
||||
queue_vars = ast_load_realtime("queues", "name", queuename, NULL);
|
||||
if (queue_vars) {
|
||||
member_config = ast_load_realtime_multientry("queue_members", "interface LIKE", "%", "queue_name", queuename, NULL);
|
||||
if (!member_config) {
|
||||
ast_log(LOG_ERROR, "no queue_members defined in your config (extconfig.conf).\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
|
||||
q = find_queue_by_name_rt(queuename, queue_vars, member_config);
|
||||
if (member_config)
|
||||
ast_config_destroy(member_config);
|
||||
if (queue_vars)
|
||||
ast_variables_destroy(queue_vars);
|
||||
|
||||
ast_mutex_unlock(&qlock);
|
||||
}
|
||||
return q;
|
||||
}
|
||||
|
||||
static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *reason)
|
||||
{
|
||||
struct ast_variable *queue_vars = NULL;
|
||||
struct ast_config *member_config = NULL;
|
||||
struct ast_call_queue *q;
|
||||
struct queue_ent *cur, *prev = NULL;
|
||||
int res = -1;
|
||||
@@ -895,35 +982,12 @@ static int join_queue(char *queuename, struct queue_ent *qe, enum queue_result *
|
||||
int inserted = 0;
|
||||
enum queue_member_status stat;
|
||||
|
||||
/*! \note Load from realtime before taking the global qlock, to avoid blocking all
|
||||
queue operations while waiting for the DB.
|
||||
|
||||
This will be two separate database transactions, so we might
|
||||
see queue parameters as they were before another process
|
||||
changed the queue and member list as it was after the change.
|
||||
Thus we might see an empty member list when a queue is
|
||||
deleted. In practise, this is unlikely to cause a problem. */
|
||||
queue_vars = ast_load_realtime("queues", "name", queuename, NULL);
|
||||
if (queue_vars) {
|
||||
member_config = ast_load_realtime_multientry("queue_members", "interface LIKE", "%", "queue_name", queuename, NULL);
|
||||
if (!member_config) {
|
||||
ast_log(LOG_ERROR, "no queue_members defined in your config (extconfig.conf).\n");
|
||||
return res;
|
||||
}
|
||||
}
|
||||
q = load_realtime_queue(queuename);
|
||||
if (!q)
|
||||
return res;
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
q = reload_queue_rt(queuename, queue_vars, member_config);
|
||||
/* Note: If found, reload_queue_rt() returns with q->lock locked. */
|
||||
if(member_config)
|
||||
ast_config_destroy(member_config);
|
||||
if(queue_vars)
|
||||
ast_variables_destroy(queue_vars);
|
||||
|
||||
if (!q) {
|
||||
ast_mutex_unlock(&qlock);
|
||||
return res;
|
||||
}
|
||||
ast_mutex_lock(&q->lock);
|
||||
|
||||
/* This is our one */
|
||||
stat = get_member_status(q);
|
||||
@@ -975,48 +1039,6 @@ ast_log(LOG_NOTICE, "Queue '%s' Join, Channel '%s', Position '%d'\n", q->name, q
|
||||
return res;
|
||||
}
|
||||
|
||||
static void free_members(struct ast_call_queue *q, int all)
|
||||
{
|
||||
/* Free non-dynamic members */
|
||||
struct member *curm, *next, *prev;
|
||||
|
||||
curm = q->members;
|
||||
prev = NULL;
|
||||
while(curm) {
|
||||
next = curm->next;
|
||||
if (all || !curm->dynamic) {
|
||||
if (prev)
|
||||
prev->next = next;
|
||||
else
|
||||
q->members = next;
|
||||
free(curm);
|
||||
} else
|
||||
prev = curm;
|
||||
curm = next;
|
||||
}
|
||||
}
|
||||
|
||||
static void destroy_queue(struct ast_call_queue *q)
|
||||
{
|
||||
struct ast_call_queue *cur, *prev = NULL;
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
for (cur = queues; cur; cur = cur->next) {
|
||||
if (cur == q) {
|
||||
if (prev)
|
||||
prev->next = cur->next;
|
||||
else
|
||||
queues = cur->next;
|
||||
} else {
|
||||
prev = cur;
|
||||
}
|
||||
}
|
||||
ast_mutex_unlock(&qlock);
|
||||
free_members(q, 1);
|
||||
ast_mutex_destroy(&q->lock);
|
||||
free(q);
|
||||
}
|
||||
|
||||
static int play_file(struct ast_channel *chan, char *filename)
|
||||
{
|
||||
int res;
|
||||
@@ -1224,6 +1246,7 @@ ast_log(LOG_NOTICE, "Queue '%s' Leave, Channel '%s'\n", q->name, qe->chan->name
|
||||
ast_mutex_unlock(&q->lock);
|
||||
if (q->dead && !q->count) {
|
||||
/* It's dead and nobody is in it, so kill it */
|
||||
remove_queue(q);
|
||||
destroy_queue(q);
|
||||
}
|
||||
}
|
||||
@@ -1261,11 +1284,11 @@ static int update_status(struct ast_call_queue *q, struct member *member, int st
|
||||
"Membership: %s\r\n"
|
||||
"Penalty: %d\r\n"
|
||||
"CallsTaken: %d\r\n"
|
||||
"LastCall: %ld\r\n"
|
||||
"LastCall: %d\r\n"
|
||||
"Status: %d\r\n"
|
||||
"Paused: %d\r\n",
|
||||
q->name, cur->interface, cur->dynamic ? "dynamic" : "static",
|
||||
cur->penalty, cur->calls, cur->lastcall, cur->status, cur->paused);
|
||||
cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1304,7 +1327,7 @@ static int compare_weight(struct ast_call_queue *rq, struct member *member)
|
||||
ast_mutex_lock(&q->lock);
|
||||
if (q->count && q->members) {
|
||||
for (mem = q->members; mem; mem = mem->next) {
|
||||
if (mem == member) {
|
||||
if (!strcmp(mem->interface, member->interface)) {
|
||||
ast_log(LOG_DEBUG, "Found matching member %s in queue '%s'\n", mem->interface, q->name);
|
||||
if (q->weight > rq->weight) {
|
||||
ast_log(LOG_DEBUG, "Queue '%s' (weight %d, calls %d) is preferred over '%s' (weight %d, calls %d)\n", q->name, q->weight, q->count, rq->name, rq->weight, rq->count);
|
||||
@@ -2118,7 +2141,6 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
||||
if (!peer) {
|
||||
if (to) {
|
||||
/* Musta gotten hung up */
|
||||
record_abandoned(qe);
|
||||
res = -1;
|
||||
} else {
|
||||
res = digit;
|
||||
@@ -2404,41 +2426,42 @@ static int add_to_queue(char *queuename, char *interface, int penalty, int pause
|
||||
struct member *new_member;
|
||||
int res = RES_NOSUCHQUEUE;
|
||||
|
||||
/* \note Ensure the appropriate realtime queue is loaded. Note that this
|
||||
* short-circuits if the queue is already in memory. */
|
||||
q = load_realtime_queue(queuename);
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
for (q = queues ; q ; q = q->next) {
|
||||
|
||||
if (q) {
|
||||
ast_mutex_lock(&q->lock);
|
||||
if (!strcmp(q->name, queuename)) {
|
||||
if (interface_exists(q, interface) == NULL) {
|
||||
new_member = create_queue_member(interface, penalty, paused);
|
||||
if (interface_exists(q, interface) == NULL) {
|
||||
new_member = create_queue_member(interface, penalty, paused);
|
||||
|
||||
if (new_member != NULL) {
|
||||
new_member->dynamic = 1;
|
||||
new_member->next = q->members;
|
||||
q->members = new_member;
|
||||
manager_event(EVENT_FLAG_AGENT, "QueueMemberAdded",
|
||||
"Queue: %s\r\n"
|
||||
"Location: %s\r\n"
|
||||
"Membership: %s\r\n"
|
||||
"Penalty: %d\r\n"
|
||||
"CallsTaken: %d\r\n"
|
||||
"LastCall: %ld\r\n"
|
||||
"Status: %d\r\n"
|
||||
"Paused: %d\r\n",
|
||||
q->name, new_member->interface, new_member->dynamic ? "dynamic" : "static",
|
||||
new_member->penalty, new_member->calls, new_member->lastcall, new_member->status, new_member->paused);
|
||||
if (new_member != NULL) {
|
||||
new_member->dynamic = 1;
|
||||
new_member->next = q->members;
|
||||
q->members = new_member;
|
||||
manager_event(EVENT_FLAG_AGENT, "QueueMemberAdded",
|
||||
"Queue: %s\r\n"
|
||||
"Location: %s\r\n"
|
||||
"Membership: %s\r\n"
|
||||
"Penalty: %d\r\n"
|
||||
"CallsTaken: %d\r\n"
|
||||
"LastCall: %d\r\n"
|
||||
"Status: %d\r\n"
|
||||
"Paused: %d\r\n",
|
||||
q->name, new_member->interface, new_member->dynamic ? "dynamic" : "static",
|
||||
new_member->penalty, new_member->calls, (int)new_member->lastcall, new_member->status, new_member->paused);
|
||||
|
||||
if (dump)
|
||||
dump_queue_members(q);
|
||||
if (dump)
|
||||
dump_queue_members(q);
|
||||
|
||||
res = RES_OKAY;
|
||||
} else {
|
||||
res = RES_OUTOFMEMORY;
|
||||
}
|
||||
res = RES_OKAY;
|
||||
} else {
|
||||
res = RES_EXISTS;
|
||||
res = RES_OUTOFMEMORY;
|
||||
}
|
||||
ast_mutex_unlock(&q->lock);
|
||||
break;
|
||||
} else {
|
||||
res = RES_EXISTS;
|
||||
}
|
||||
ast_mutex_unlock(&q->lock);
|
||||
}
|
||||
@@ -3243,7 +3266,7 @@ static void reload_queues(void)
|
||||
else
|
||||
queues = q->next;
|
||||
if (!q->count) {
|
||||
free(q);
|
||||
destroy_queue(q);
|
||||
} else
|
||||
ast_log(LOG_WARNING, "XXX Leaking a little memory :( XXX\n");
|
||||
} else {
|
||||
@@ -3272,7 +3295,13 @@ static int __queues_show(int manager, int fd, int argc, char **argv, int queue_s
|
||||
time(&now);
|
||||
if ((!queue_show && argc != 2) || (queue_show && argc != 3))
|
||||
return RESULT_SHOWUSAGE;
|
||||
|
||||
/* We only want to load realtime queues when a specific queue is asked for. */
|
||||
if (queue_show)
|
||||
load_realtime_queue(argv[2]);
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
|
||||
q = queues;
|
||||
if (!q) {
|
||||
ast_mutex_unlock(&qlock);
|
||||
@@ -3435,13 +3464,13 @@ static int manager_queues_status( struct mansession *s, struct message *m )
|
||||
"Membership: %s\r\n"
|
||||
"Penalty: %d\r\n"
|
||||
"CallsTaken: %d\r\n"
|
||||
"LastCall: %ld\r\n"
|
||||
"LastCall: %d\r\n"
|
||||
"Status: %d\r\n"
|
||||
"Paused: %d\r\n"
|
||||
"%s"
|
||||
"\r\n",
|
||||
q->name, mem->interface, mem->dynamic ? "dynamic" : "static",
|
||||
mem->penalty, mem->calls, mem->lastcall, mem->status, mem->paused, idText);
|
||||
mem->penalty, mem->calls, (int)mem->lastcall, mem->status, mem->paused, idText);
|
||||
}
|
||||
}
|
||||
/* List Queue Entries */
|
||||
|
0
apps/app_random.c
Executable file → Normal file
0
apps/app_random.c
Executable file → Normal file
0
apps/app_read.c
Executable file → Normal file
0
apps/app_read.c
Executable file → Normal file
17
apps/app_readfile.c
Executable file → Normal file
17
apps/app_readfile.c
Executable file → Normal file
@@ -95,15 +95,16 @@ static int readfile_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
returnvar = ast_read_textfile(file);
|
||||
if(len > 0){
|
||||
if(len < strlen(returnvar))
|
||||
returnvar[len]='\0';
|
||||
else
|
||||
ast_log(LOG_WARNING,"%s is longer than %d, and %d \n", file, len, (int)strlen(returnvar));
|
||||
if ((returnvar = ast_read_textfile(file))) {
|
||||
if (len > 0) {
|
||||
if (len < strlen(returnvar))
|
||||
returnvar[len]='\0';
|
||||
else
|
||||
ast_log(LOG_WARNING, "%s is longer than %d, and %d \n", file, len, (int)strlen(returnvar));
|
||||
}
|
||||
pbx_builtin_setvar_helper(chan, varname, returnvar);
|
||||
free(returnvar);
|
||||
}
|
||||
pbx_builtin_setvar_helper(chan, varname, returnvar);
|
||||
free(returnvar);
|
||||
LOCAL_USER_REMOVE(u);
|
||||
return res;
|
||||
}
|
||||
|
0
apps/app_realtime.c
Executable file → Normal file
0
apps/app_realtime.c
Executable file → Normal file
8
apps/app_record.c
Executable file → Normal file
8
apps/app_record.c
Executable file → Normal file
@@ -277,6 +277,7 @@ static int record_exec(struct ast_channel *chan, void *data)
|
||||
|
||||
if (res) {
|
||||
ast_log(LOG_WARNING, "Problem writing frame\n");
|
||||
ast_frfree(f);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -295,16 +296,15 @@ static int record_exec(struct ast_channel *chan, void *data)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (f->frametype == AST_FRAME_VIDEO) {
|
||||
} else if (f->frametype == AST_FRAME_VIDEO) {
|
||||
res = ast_writestream(s, f);
|
||||
|
||||
if (res) {
|
||||
ast_log(LOG_WARNING, "Problem writing frame\n");
|
||||
ast_frfree(f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((f->frametype == AST_FRAME_DTMF) &&
|
||||
} else if ((f->frametype == AST_FRAME_DTMF) &&
|
||||
(f->subclass == terminator)) {
|
||||
ast_frfree(f);
|
||||
break;
|
||||
|
0
apps/app_rpt.c
Executable file → Normal file
0
apps/app_rpt.c
Executable file → Normal file
0
apps/app_sayunixtime.c
Executable file → Normal file
0
apps/app_sayunixtime.c
Executable file → Normal file
0
apps/app_senddtmf.c
Executable file → Normal file
0
apps/app_senddtmf.c
Executable file → Normal file
0
apps/app_sendtext.c
Executable file → Normal file
0
apps/app_sendtext.c
Executable file → Normal file
0
apps/app_setcallerid.c
Executable file → Normal file
0
apps/app_setcallerid.c
Executable file → Normal file
0
apps/app_setcdruserfield.c
Executable file → Normal file
0
apps/app_setcdruserfield.c
Executable file → Normal file
0
apps/app_setcidname.c
Executable file → Normal file
0
apps/app_setcidname.c
Executable file → Normal file
0
apps/app_setcidnum.c
Executable file → Normal file
0
apps/app_setcidnum.c
Executable file → Normal file
0
apps/app_setrdnis.c
Executable file → Normal file
0
apps/app_setrdnis.c
Executable file → Normal file
0
apps/app_settransfercapability.c
Executable file → Normal file
0
apps/app_settransfercapability.c
Executable file → Normal file
5
apps/app_skel.c
Executable file → Normal file
5
apps/app_skel.c
Executable file → Normal file
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) <Year>, <Your Name Here>
|
||||
*
|
||||
* <Your Name Here> <<You Email Here>>
|
||||
* <Your Name Here> <<Your Email Here>>
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
@@ -20,7 +20,7 @@
|
||||
*
|
||||
* \brief Skeleton application
|
||||
*
|
||||
* This is a skeleton for development of an Asterisk application */
|
||||
* This is a skeleton for development of an Asterisk application
|
||||
* \ingroup applications
|
||||
*/
|
||||
|
||||
@@ -77,7 +77,6 @@ static int app_exec(struct ast_channel *chan, void *data)
|
||||
|
||||
if (ast_strlen_zero(data)) {
|
||||
ast_log(LOG_WARNING, "%s requires an argument (dummy|[options])\n",app);
|
||||
LOCAL_USER_REMOVE(u);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
8
apps/app_sms.c
Executable file → Normal file
8
apps/app_sms.c
Executable file → Normal file
@@ -694,7 +694,7 @@ static void sms_readfile (sms_t * h, char *fn)
|
||||
}
|
||||
while (fgets (line, sizeof (line), s))
|
||||
{ /* process line in file */
|
||||
char *p;
|
||||
unsigned char *p;
|
||||
for (p = line; *p && *p != '\n' && *p != '\r'; p++);
|
||||
*p = 0; /* strip eoln */
|
||||
p = line;
|
||||
@@ -1379,8 +1379,8 @@ static int sms_exec (struct ast_channel *chan, void *data)
|
||||
ast_copy_string (h.cli, chan->cid.cid_num, sizeof (h.cli));
|
||||
|
||||
{
|
||||
char *d = data,
|
||||
*p,
|
||||
unsigned char *p;
|
||||
unsigned char *d = data,
|
||||
answer = 0;
|
||||
if (!*d || *d == '|') {
|
||||
ast_log (LOG_ERROR, "Requires queue name\n");
|
||||
@@ -1449,7 +1449,7 @@ static int sms_exec (struct ast_channel *chan, void *data)
|
||||
d = p;
|
||||
h.udl = 0;
|
||||
while (*p && h.udl < SMSLEN)
|
||||
h.ud[h.udl++] = utf8decode((unsigned char **)&p);
|
||||
h.ud[h.udl++] = utf8decode(&p);
|
||||
if (is7bit (h.dcs) && packsms7 (0, h.udhl, h.udh, h.udl, h.ud) < 0)
|
||||
ast_log (LOG_WARNING, "Invalid 7 bit GSM data\n");
|
||||
if (is8bit (h.dcs) && packsms8 (0, h.udhl, h.udh, h.udl, h.ud) < 0)
|
||||
|
0
apps/app_softhangup.c
Executable file → Normal file
0
apps/app_softhangup.c
Executable file → Normal file
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user