Compare commits

...

5 Commits

Author SHA1 Message Date
Kevin P. Fleming
c23e7645fd Convert all release tags to Opsound music-on-hold.
For more details:
http://blogs.digium.com/2009/08/18/asterisk-music-on-hold-changes/



git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.0.10@212958 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2009-08-18 20:42:51 +00:00
Kevin P. Fleming
00d6d3233f remove extraneous svn:executable properties
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.0.10@7221 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2005-11-29 18:24:39 +00:00
Kevin P. Fleming
a7bea083ee remove remaining .cvsignore files
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.0.10@7220 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2005-11-29 18:09:49 +00:00
Kevin P. Fleming
7c322a0d90 automatic tag renames
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.0.10@7201 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2005-11-27 17:18:34 +00:00
Admin Commit
4c710cd189 This commit was manufactured by cvs2svn to create tag 'v1-0-10'.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/v1-0-10@7178 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2005-11-21 16:53:51 +00:00
970 changed files with 5114 additions and 3032 deletions

View File

@@ -1,6 +0,0 @@
asterisk
build.h
ast_expr.c
.version
.depend
.applied

0
BUGS Executable file → Normal file
View File

4
CREDITS Executable file → Normal file
View File

@@ -58,12 +58,14 @@ Thorsten Lockert - OpenBSD, FreeBSD ports, making MacOS X port run on 10.3,
bugs. tholo@sigmasoft.com
Brian West - ODBC support and Bug Marshaling
William Waites - syslog support, SIP NAT traversal for SIP-UA. ww@styx.org
Rich Murphey - Porting to FreeBSD, NetBSD, OpenBSD, and Darwin.
rich@whiteoaklabs.com http://whiteoaklabs.com
=== OTHER CONTRIBUTIONS ===
John Todd - Monkey sounds and associated teletorture prompt
=== HOLD MUSIC ===
Music provided by www.freeplaymusic.com
Music provided by www.opsound.org
=== OTHER SOURCE CODE IN ASTERISK ===

275
CHANGES → ChangeLog Executable file → Normal file
View File

@@ -1,8 +1,279 @@
NOTE: Corrections or additions to the ChangeLog may be submitted to
http://bugs.digium.com. Documentation and formatting fixes are not
not listed here. A complete listing of changes is available through
the Asterisk-CVS mailing list hosted at http://lists.digium.com.
Asterisk 1.0.10
-- chan_local
-- In releases 1.0.8 and 1.0.9, the Local channels that are created would
not be masqueraded into the new channel type. This has now been fixed.
-- chan_sip
-- The 'insecure' options have been changed to support matching peersby IP
only, not requiring authentication on incoming invites, or both. Before,
to not require authentication on incoming invites also required matching
peers based on IP only.
-- chan_zap
-- Before, call waiting could occur during the initial ringing on the line.
This has now been fixed.
-- app_disa
-- We will now not set the accountcode if one is not supplied.
-- app_meetme
-- If the first caller into a conference hangs up while being prompted for
the conference pin number, the conference will no longer be held open.
-- app_userevent
-- Events created with this application were indicated as a "call" event
instead of a "user" event. This made the "user" event permissions
not work correctly.
-- app_voicemail
-- When using the externpass option for voicemail, the password will be
immediately updated in memory as well, instead of having to wait for
the next time the configuration is reloaded.
-- app_zapras
-- We now ensure buffer policy is restored after RAS is done with a channel.
This could cause audio problems on the channel after zapras is done
with it.
-- res_agi
-- We now unmask the SIGHUP signal before executing an AGI script. This
fixes problems where some AGI scripts would continue running long after
the call is over.
-- extensions
-- A potential crash has been fixed when calling LEN() to get the length of
a string that was 80 characters or larger.
-- logger
-- The Asterisk logger will automatically detect when a log file needs to
be rotated. However, this feature could put Asterisk in a nasty loop
that would result in a crash.
-- general
-- Added man pages for astgenkey, autosupport, and safe_asterisk
Asterisk 1.0.9
-- fix bug in callerid matching in the dialplan that was introduced in 1.0.8
Asterisk 1.0.8
-- chan_zap
-- Asterisk will now also look in the regular context for the fax extension
while executing a macro. Previously, for this to work, the fax extension
would have to be included in the macro definition.
-- On some systems, ALERTING will be sent after PROCEEDING, so code has been
added to account for this case.
-- If no extension is specified on an overlap call, the 's' extension will
be used.
-- chan_sip
-- We no longer send a "to" tag on "100 Trying" messages, as it is
inappropriate to do so.
-- We now respond correctly to an invite for T.38 with a "488 Not acceptable
here"
-- We now discard saved tags on 401/407 responses in case the provider we're
talking to tries to pull a dirty trick on us and change it.
-- rtptimeout options will now be correctly set on a peer basis rather than
only global
-- chan_mgcp
-- Fixed setting of accountcode
-- Fixed where *67 to block callerid only worked for first call
-- chan_agent
-- We now will not pass audio until the agent has acked the call if the
configuration
is set up for the agent to do so.
-- chan_alsa
-- Fixed problems with the unloading of this module
-- res_agi
-- A fix has been added to prevent calls from being hung up when more than
one call is executing an AGI script calling the GET DATA command.
-- AGI scripts will now continue to run even if a file was not found with
the GET DATA command.
-- When calling SAY NUMBER with a number like 09, we will now say "nine"
instead of "zero"
-- app_dial
-- There was a problem where text frames would not be forwarded before the
channel has been answered.
-- app_disa
-- Fixed the timeout used when no password is set
-- app_queue
-- Distinctive ring has been fixed to work for queue members
-- rtp
-- Fixed a logic error when setting the "rtpchecksums" option
-- say.c
-- A problem has been fixed with saying the date in Spanish.
-- Makefile
-- A line was missing for the autosupport script that caused "make rpm" to
fail
-- format_wav_gsm
-- Fixed a problem with wav formatting that prevented files from being
played in some media players
-- pbx_spool
-- Fixed if the last line of text in a file for the call spool did not
contain a new line, it would not be processed
-- logger
-- Fixed the logger so that color escape sequences wouldn't be sent to the
logs
-- format_sln
-- A lot of changes were made to correctly handle signed linear format on
big endian machines
-- asterisk.conf
-- fix 'highpriority' option for asterisk.conf
Asterisk 1.0.7
-- chan_sip
-- The fix for some codec availibility issues in 1.0.6 caused music on hold
problems, but has now been fixed.
-- chan_skinny
-- A check has been added to avoid a crash.
-- chan_iax2
-- A feature has been added to CVS head to have the option of sending
timestamps with trunk frames. It is not supported in 1.0, but a change
has been made so that it will at least not choke if sent trunk
timestamps.
-- app_voicemail
-- Some checks have been added to avoid a crash.
-- speex
-- The path /usr/include/speex has been added for a place to look for the
speex header.
Asterisk 1.0.6
-- chan_iax2:
-- Fixed a bug dealing with a division by zero that could cause a crash
-- chan_sip:
-- Behavior was changed so that when a registration fails due to DNS
resolution issues, a retry will be attempted in 20 seconds.
-- Peer settings were not reset to null values when reloading the
configuration file. Behavior has been changed so that these values are
now cleared.
-- 'restrictcid' now properly works on MySQL peers.
-- Only use the default callerid if it has been specified.
-- Asterisk was not sending the same From: line in SIP messages during
certain times. Fixed to make sure it stays the same. This makes some
providers happier, to a working state.
-- Certain circumstances involving a blank callerid caused asterisk to
segmentation fault.
-- There was a problem incorrectly matching codec availablity when global
preferences were different from that of the user. To fix this,
processing of SDP data has been moved to after determining who the call
is coming from.
-- Asterisk would run out of RTP ports while waiting for SUBSCRIBE's to
expire even though an RTP port isn't needed in this case. This has been
fixed by releasing the ports early.
-- chan_zap:
-- During a certain scenario when using flash and '#' transfers you would
hear the other person and the music they were hearing. This has been
fixed.
-- A fix for a compilation issue with gcc4 was added.
-- chan_modem_bestdata:
-- A fix for a compilation issue with gcc4 was added.
-- format_g729:
-- Treat a 10-byte read as an end of file indication instead of an error.
Some G729 encoders like to put 10-bytes at the end to indicate this.
-- res_features:
-- During certain situations when parking a call, both endpoints would get
musiconhold. This has been fixed so the individual who parked the call
will hear the digits and not musiconhold.
-- app_dial:
-- DIALEDPEERNUMBER is now being set, so if you attempted to use it in the
past and failed, it should work now.
-- A callerid change caused many headaches, this has been reversed to the
original 1.0 behavior.
-- A crash caused with the combination of the 'g' option and # transfer was
fixed.
-- app_voicemail:
-- If two people hit the voicemail system at the same time, and were leaving
a message the second message was overwriting the first. This has been
fixed so that each one is distinct and will not overwrite eachother.
-- cdr_tds:
-- If the server you were using was going down, it had the potential to
bring your asterisk server down with it. Extra stuff has been added so
as to bring in more error/connection checking.
-- cdr_pgsql:
-- This will now attempt to reconnect after a connection problem.
-- IAXY firmware:
-- This has been updated to version 23. It includes a fix for lost
registrations.
-- internals
-- Behavior was changed for 'show codec <number>' to make it more intuitive.
-- DNS failures and asterisk do not get along too well, this is not totally
the case anymore.
-- Asterisk will now handle DNS failures at startup more gracefully, and
won't crash and burn
-- Choosing to append to a wave file would render the outputted wave file
corrupt. Appending now works again.
-- If you failed to define certain keys, asterisk had the potential to crash
when seeing if you had used them.
-- Attempting to use such things as ${EXTEN:-1} gave a wrong return value.
However, this was never a documented feature...
Asterisk 1.0.5
-- chan_zap
-- fix a callerid bug introduced in 1.0.4
-- app_queue
-- fix some penalty behavior
Asterisk 1.0.4
-- general
-- fix memory leak evident with extensive use of variables
-- update IAXy firmware to version 22
-- enable some special write protection
-- enable outbound DTMF
-- fix seg fault with incorrect usage of SetVar
-- other minor fixes including typos and doc updates
-- chan_sip
-- fix codecs to not be case sensitive
-- Re-use auth credentials
-- fix MWI when using type=friend
-- fix global NAT option
-- chan_agent / chan_local
-- fix incorrect use count
-- chan_zap
-- Allow CID rings to be configured in zapata.conf
-- no more patching needed for UK CID
-- app_macro
-- allow Macros to exit with '*' or '#' like regular extension processing
-- app_voicemail
-- don't allow '#' as a password
-- add option to save voicemail before going to the operator
-- fix global operator=yes
-- app_read
-- return 0 instead of -1 if user enters nothing
-- res_agi
-- don't exit AGI when file not found to stream
-- send script parameter when using FastAGI
Asterisk 1.0.3
-- chan_zap
-- fix seg fault when doing *0 to flash a trunk
-- rtp
-- seg fault fix
-- chan_sip
-- fix to prevent seg fault when attempting a transfer
-- fix bug with supervised transfers
-- fix codec preferences
-- chan_h323
-- fix compilation problem
-- chan_iax2
-- avoid a deadlock related to a static config of a BUNCH of peers
-- cdr_pgsql
-- fix memory leak when reading config
-- Numerous other minor bug fixes
Asterisk 1.0.2
-- Major bugfix release
Asterisk 1.0.1
-- Added AGI over TCP support
-- Add ability to purge callers from queue if no agents are logged in
-- Fix inband PRI indication detection
-- Fix for MGCP - always request digits if no RTP stream
-- Fixed seg fault for ast_control_streamfile
-- Added AGI over TCP support
-- Make pick-up extension configurable via features.conf
-- Numerous other bug fixes
Asterisk 1.0.0
-- Use Q.931 standard cause codes for asterisk cause codes
-- Bug fixes from the bug tracker
@@ -10,7 +281,7 @@ Asterisk 1.0-RC2
-- Additional CDR backends
-- Allow muted to reconnect
-- Call parking improvements (including SIP parking support)
-- Added licensed hold music from FreePlayMusic
-- Added licensed hold music from opsound.org
-- GR-303 and Zap improvements
-- More bug fixes from the bug tracker
-- Improved FreeBSD/OpenBSD/MacOS X support

0
HARDWARE Executable file → Normal file
View File

0
LICENSE Executable file → Normal file
View File

60
Makefile Executable file → Normal file
View File

@@ -38,6 +38,7 @@ OPTIONS+=$(shell if $(CC) -mcpu=v8 -S -o /dev/null -xc /dev/null >/dev/null 2>&1
OPTIONS+=-fomit-frame-pointer
endif
MPG123TARG=linux
endif
ifeq ($(findstring BSD,${OSARCH}),BSD)
@@ -138,15 +139,17 @@ CFLAGS+=$(shell if [ -f /usr/include/osp/osp.h ]; then echo "-DOSP_SUPPORT -I/us
ifeq (${OSARCH},FreeBSD)
OSVERSION=$(shell make -V OSVERSION -f /usr/share/mk/bsd.port.subdir.mk)
CFLAGS+=$(if ${OSVERSION}<500016,-D_THREAD_SAFE)
LIBS+=$(if ${OSVERSION}<502102,-lc_r,-pthread)
CFLAGS+=$(shell if test ${OSVERSION} -lt 500016 ; then echo "-D_THREAD_SAFE"; fi)
LIBS+=$(shell if test ${OSVERSION} -lt 502102 ; then echo "-lc_r"; else echo "-pthread"; fi)
INCLUDE+=-I/usr/local/include
CFLAGS+=$(shell if [ -d /usr/local/include/spandsp ]; then echo "-I/usr/local/include/spandsp"; fi)
MPG123TARG=freebsd
endif # FreeBSD
ifeq (${OSARCH},NetBSD)
CFLAGS+=-pthread
INCLUDE+=-I/usr/local/include
INCLUDE+=-I/usr/local/include -I/usr/pkg/include
MPG123TARG=netbsd
endif
ifeq (${OSARCH},OpenBSD)
@@ -197,7 +200,7 @@ ifeq (${OSARCH},FreeBSD)
LIBS+=-lcrypto
endif
ifeq (${OSARCH},NetBSD)
LIBS+=-lpthread -lcrypto -lm -L/usr/local/lib -lncurses
LIBS+=-lpthread -lcrypto -lm -L/usr/local/lib -L/usr/pkg/lib -lncurses
endif
ifeq (${OSARCH},OpenBSD)
LIBS=-lcrypto -lpthread -lm -lncurses
@@ -211,14 +214,25 @@ OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \
astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o \
utils.o
ifeq (${OSARCH},Darwin)
OBJS+=poll.o dlfcn.o
ASTLINK=-Wl,-dynamic
SOLINK=-dynamic -bundle -undefined suppress -force_flat_namespace
OBJS+= poll.o
CFLAGS+=-DPOLLCOMPAT
else
ASTLINK=-Wl,-E
SOLINK=-shared -Xlinker -x
endif
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/sys/poll.h),)
OBJS+= poll.o
CFLAGS+=-DPOLLCOMPAT
endif
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/dlfcn.h),)
OBJS+= dhfcn.o
CFLAGS+=-DDLFCNCOMPAT
endif
CC=gcc
INSTALL=install
@@ -307,7 +321,7 @@ clean:
rm -f build.h
rm -f ast_expr.c
@if [ -e editline/Makefile ]; then $(MAKE) -C editline distclean ; fi
@if [ -d mpg123-0.59r ]; then make -C mpg123-0.59r clean; fi
@if [ -d mpg123-0.59r ]; then $(MAKE) -C mpg123-0.59r clean; fi
$(MAKE) -C db1-ast clean
$(MAKE) -C stdtime clean
@@ -339,7 +353,7 @@ datafiles: all
exit 1; \
fi; \
done
for x in sounds/vm-* sounds/transfer* sounds/pbx-* sounds/ss-* sounds/beep* sounds/dir-* sounds/conf-* sounds/agent-* sounds/invalid* sounds/tt-* sounds/auth-* sounds/privacy-* sounds/queue-*; do \
for x in sounds/vm-* sounds/transfer* sounds/pbx-* sounds/ss-* sounds/beep* sounds/dir-* sounds/conf-* sounds/agent-* sounds/invalid* sounds/tt-* sounds/auth-* sounds/privacy-* sounds/queue-* sounds/hello-*; do \
if grep -q "^%`basename $$x`%" sounds.txt; then \
install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
else \
@@ -374,6 +388,7 @@ bininstall: all
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp
install -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/
install -m 755 contrib/scripts/astgenkey $(DESTDIR)$(ASTSBINDIR)/
install -m 755 contrib/scripts/autosupport $(DESTDIR)$(ASTSBINDIR)/
if [ ! -f $(DESTDIR)$(ASTSBINDIR)/safe_asterisk ]; then \
install -m 755 contrib/scripts/safe_asterisk $(DESTDIR)$(ASTSBINDIR)/ ;\
fi
@@ -398,6 +413,9 @@ bininstall: all
install -m 644 keys/iaxtel.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
install -m 644 keys/freeworlddialup.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
install -m 644 asterisk.8.gz $(DESTDIR)$(ASTMANDIR)/man8
install -m 644 contrib/scripts/astgenkey.8 $(DESTDIR)$(ASTMANDIR)/man8
install -m 644 contrib/scripts/autosupport.8 $(DESTDIR)$(ASTMANDIR)/man8
install -m 644 contrib/scripts/safe_asterisk.8 $(DESTDIR)$(ASTMANDIR)/man8
if [ -d contrib/firmware/iax ]; then \
install -m 644 contrib/firmware/iax/iaxy.bin $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax/iaxy.bin; \
else \
@@ -405,7 +423,7 @@ bininstall: all
fi
( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds ; ln -s $(ASTSPOOLDIR)/vm . )
( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds ; ln -s $(ASTSPOOLDIR)/voicemail . )
if [ -f mpg123-0.59r/mpg123 ]; then make -C mpg123-0.59r install; fi
if [ -f mpg123-0.59r/mpg123 ]; then $(MAKE) -C mpg123-0.59r install; fi
@echo " +---- Asterisk Installation Complete -------+"
@echo " + +"
@echo " + YOU MUST READ THE SECURITY DOCUMENT +"
@@ -427,6 +445,19 @@ bininstall: all
@echo " + **Note** This requires that you have +"
@echo " + doxygen installed on your local system +"
@echo " +-------------------------------------------+"
@echo " + +"
@echo " + ** NOTE FOR DOWNGRADING FROM CVS HEAD ** +"
@echo " + +"
@echo " + If you are downgrading from CVS HEAD to +"
@echo " + a stable release, remember to delete +"
@echo " + everything from your asterisk modules +"
@echo " + directory (/usr/lib/asterisk/modules/) +"
@echo " + and the asterisk header directory +"
@echo " + (/usr/include/asterisk/) +"
@echo " + before doing a '$(MAKE) install'. +"
@echo " + +"
@echo " +-------------------------------------------+"
install: all datafiles bininstall
@@ -518,7 +549,7 @@ mpg123:
@wget -V >/dev/null || (echo "You need wget" ; false )
[ -f mpg123-0.59r.tar.gz ] || wget http://www.mpg123.de/mpg123/mpg123-0.59r.tar.gz
[ -d mpg123-0.59r ] || tar xfz mpg123-0.59r.tar.gz
make -C mpg123-0.59r linux
$(MAKE) -C mpg123-0.59r $(MPG123TARG)
config:
if [ -d /etc/rc.d/init.d ]; then \
@@ -537,12 +568,21 @@ depend: .depend
for x in $(SUBDIRS); do $(MAKE) -C $$x depend || exit 1 ; done
.depend:
@if ! which mpg123 &>/dev/null ; then \
echo "*** You don't have mpg123 installed. You're going to need ***";\
echo "*** it if you want MusicOnHold ***";\
elif ! mpg123 --longhelp 2>&1 | grep .59r &>/dev/null ; then \
echo "*************************************************************";\
echo "*** You have the WRONG version of mpg123... you need .59r ***";\
echo "*** Use 'make mpg123' to get the right verison ***";\
echo "*************************************************************";\
fi
./mkdep ${CFLAGS} `ls *.c`
FORCE:
%_env:
make -C $(shell echo $@ | sed "s/_env//g") env
$(MAKE) -C $(shell echo $@ | sed "s/_env//g") env
env:
env

61
README Executable file → Normal file
View File

@@ -136,6 +136,67 @@ parameters. For example, the line "channel => 25-47" creates objects for
the channels 25 through 47 of the tormenta card, obtaining the settings
from the variables specified above.
* SPECIAL NOTE ON TIME
Those using SIP phones should be aware the Asterisk is sensitive to
large jumps in time. Manually changing the system time using date(1)
(or other similar commands) may cause SIP registrations and other
internal processes to fail. If your system cannot keep accurate time
by itself use NTP (http://www.ntp.org/) to keep the system clock
synchronized to "real time". NTP is designed to keep the system clock
synchronized by speeding up or slowing down the system clock until it
is synchronized to "real time" rather than by jumping the time and
causing discontinuities. Most Linux distributions include precompiled
versions of NTP. Beware of some time synchronization methods that get
the correct real time periodically and then manually set the system
clock.
Apparent time changes due to daylight savings time are just that,
apparent. The use of daylight savings time in a Linux system is
purely a user interface issue and does not affect the operation of the
Linux kernel or Asterisk. The system clock on Linux kernels operates
on UTC. UTC does not use daylight savings time.
Also note that this issue is separate from the clocking of TDM
channels, and is known to at least affect SIP registrations.
* FILE DESCRIPTORS
Depending on the size of your system and your configuration,
Asterisk can consume a large number of file descriptors. In UNIX,
file descriptors are used for more than just files on disk. File
descriptors are also used for handling network communication
(e.g. SIP, IAX2, or H.323 calls) and hardware access (e.g. analog and
digital trunk hardware). Asterisk accesses many on-disk files for
everything from configuration information to voicemail storage.
Most systems limit the number of file descriptors that Asterisk can
have open at one time. This can limit the number of simultaneous
calls that your system can handle. For example, if the limit is set
at 1024 (a common default value) Asterisk can handle approxiately 150
SIP calls simultaneously. To change the number of file descriptors
follow the instructions for your system below:
== PAM-based Linux System ==
If your system uses PAM (Pluggable Authentication Modules) edit
/etc/security/limits.conf. Add these lines to the bottom of the file:
root soft nofile 4096
root hard nofile 8196
asterisk soft nofile 4096
asterisk hard nofile 8196
(adjust the numbers to taste). You may need to reboot the system for
these changes to take effect.
== Generic UNIX System ==
If there are no instructions specifically adapted to your system
above you can try adding the command "ulimit -n 8192" to the script
that starts Asterisk.
* MORE INFORMATION
See the doc directory for more documentation.

View File

@@ -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
View 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

0
SECURITY Executable file → Normal file
View File

36
acl.c Executable file → Normal file
View File

@@ -242,20 +242,19 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
memset(&m_rtmsg, 0, sizeof(m_rtmsg));
m_rtmsg.m_rtm.rtm_type = RTM_GET;
m_rtmsg.m_rtm.rtm_flags = RTF_UP | RTF_HOST;
m_rtmsg.m_rtm.rtm_version = RTM_VERSION;
ast_mutex_lock(&routeseq_lock);
seq = ++routeseq;
ast_mutex_unlock(&routeseq_lock);
m_rtmsg.m_rtm.rtm_seq = seq;
m_rtmsg.m_rtm.rtm_addrs = RTA_IFA | RTA_DST;
m_rtmsg.m_rtm.rtm_addrs = RTA_DST | RTA_IFA;
m_rtmsg.m_rtm.rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
sin = (struct sockaddr_in *)m_rtmsg.m_space;
sin->sin_family = AF_INET;
sin->sin_len = sizeof(struct sockaddr_in);
sin->sin_addr = *them;
if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
if ((s = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0) {
ast_log(LOG_ERROR, "Error opening routing socket\n");
return -1;
}
@@ -268,7 +267,7 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
}
do {
l = read(s, (char *)&m_rtmsg, sizeof(m_rtmsg));
} while (l > 0 && (m_rtmsg.m_rtm.rtm_seq != 1 || m_rtmsg.m_rtm.rtm_pid != pid));
} while (l > 0 && (m_rtmsg.m_rtm.rtm_seq != seq || m_rtmsg.m_rtm.rtm_pid != pid));
if (l < 0) {
if (errno != EAGAIN)
ast_log(LOG_ERROR, "Error reading from routing socket\n");
@@ -379,3 +378,32 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
return 0;
#endif
}
int ast_find_ourip(struct in_addr *ourip, struct sockaddr_in bindaddr)
{
char ourhost[MAXHOSTNAMELEN]="";
struct ast_hostent ahp;
struct hostent *hp;
struct in_addr saddr;
/* just use the bind address if it is nonzero */
if (ntohl(bindaddr.sin_addr.s_addr)) {
memcpy(ourip, &bindaddr.sin_addr, sizeof(*ourip));
return 0;
}
/* try to use our hostname */
if (gethostname(ourhost, sizeof(ourhost)-1)) {
ast_log(LOG_WARNING, "Unable to get hostname\n");
} else {
hp = ast_gethostbyname(ourhost, &ahp);
if (hp) {
memcpy(ourip, hp->h_addr, sizeof(*ourip));
return 0;
}
}
/* A.ROOT-SERVERS.NET. */
if (inet_aton("198.41.0.4", &saddr) && !ast_ouraddrfor(&saddr, ourip))
return 0;
return -1;
}

0
aescrypt.c Executable file → Normal file
View File

0
aeskey.c Executable file → Normal file
View File

19
aesopt.h Executable file → Normal file
View File

@@ -136,6 +136,7 @@
#define _AESOPT_H
#include <asterisk/aes.h>
#include "asterisk/endian.h"
/* CONFIGURATION - USE OF DEFINES
@@ -146,24 +147,6 @@
#if clauses.
*/
/* PLATFORM SPECIFIC INCLUDES */
#if defined( __OpenBSD__ )
# include <machine/types.h>
# include <sys/endian.h>
#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
# include <sys/types.h>
# include <sys/endian.h>
#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
# include <machine/endian.h>
#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
# include <endian.h>
#if !defined(__APPLE__)
# include <byteswap.h>
#endif
#elif defined( linux )
# include <endian.h>
#endif
/* BYTE ORDER IN 32-BIT WORDS

0
aestab.c Executable file → Normal file
View File

View File

@@ -1,3 +0,0 @@
eagi-test
eagi-sphinx-test
.depend

0
agi/DialAnMp3.agi Executable file → Normal file
View File

0
agi/Makefile Executable file → Normal file
View File

0
agi/agi-test.agi Executable file → Normal file
View File

0
agi/eagi-sphinx-test.c Executable file → Normal file
View File

0
agi/eagi-test.c Executable file → Normal file
View File

0
agi/fastagi-test Executable file → Normal file
View File

0
agi/numeralize Executable file → Normal file
View File

0
alaw.c Executable file → Normal file
View File

111
app.c Executable file → Normal file
View File

@@ -136,6 +136,13 @@ int ast_app_getvoice(struct ast_channel *c, char *dest, char *dstfmt, char *prom
ast_frfree(f);
break;
}
res = ast_writestream(writer, f);
if (res < 0) {
ast_log(LOG_WARNING, "Failed to write to stream at %s!\n", dest);
ast_frfree(f);
break;
}
}
ast_frfree(f);
}
@@ -278,7 +285,7 @@ int ast_dtmf_stream(struct ast_channel *chan,struct ast_channel *peer,char *digi
if (!res) {
res = ast_waitfor(chan,100);
if (res > -1) {
for (ptr=digits;*ptr;*ptr++) {
for (ptr=digits; *ptr; ptr++) {
if (*ptr == 'w') {
res = ast_safe_sleep(chan, 500);
if (res)
@@ -518,9 +525,10 @@ int ast_play_and_wait(struct ast_channel *chan, char *fn)
static int global_silence_threshold = 128;
static int global_maxsilence = 0;
int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int silencethreshold, int maxsilence)
int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int silencethreshold, int maxsilence, const char *path)
{
char d, *fmts;
int d;
char *fmts;
char comment[256];
int x, fmtcnt=1, res=-1,outmsg=0;
struct ast_frame *f;
@@ -528,7 +536,7 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
char *sfmt[MAX_OTHER_FORMATS];
char *stringp=NULL;
time_t start, end;
struct ast_dsp *sildet; /* silence detector dsp */
struct ast_dsp *sildet=NULL; /* silence detector dsp */
int totalsilence = 0;
int dspsilence = 0;
int gotsilence = 0; /* did we timeout for silence? */
@@ -585,18 +593,22 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
}
}
sildet = ast_dsp_new(); /* Create the silence detector */
if (!sildet) {
ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
return -1;
}
ast_dsp_set_threshold(sildet, silencethreshold);
if (path)
ast_unlock_path(path);
if (maxsilence > 0) {
sildet = ast_dsp_new(); /* Create the silence detector */
if (!sildet) {
ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
return -1;
}
ast_dsp_set_threshold(sildet, silencethreshold);
rfmt = chan->readformat;
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;
}
}
@@ -640,13 +652,13 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
totalsilence = 0;
if (totalsilence > maxsilence) {
/* Ended happily with silence */
if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
ast_frfree(f);
gotsilence = 1;
outmsg=2;
break;
/* Ended happily with silence */
if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
ast_frfree(f);
gotsilence = 1;
outmsg=2;
break;
}
}
/* Exit on any error */
@@ -706,10 +718,12 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
for (x=0;x<fmtcnt;x++) {
if (!others[x])
break;
if (totalsilence)
ast_stream_rewind(others[x], totalsilence-200);
else
ast_stream_rewind(others[x], 200);
if (res > 0) {
if (totalsilence)
ast_stream_rewind(others[x], totalsilence-200);
else
ast_stream_rewind(others[x], 200);
}
ast_truncstream(others[x]);
ast_closestream(others[x]);
}
@@ -718,20 +732,20 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(rfmt), chan->name);
}
}
if (outmsg) {
if (outmsg > 1) {
if (outmsg > 1) {
/* Let them know recording is stopped */
ast_streamfile(chan, "auth-thankyou", chan->language);
if(!ast_streamfile(chan, "auth-thankyou", chan->language))
ast_waitstream(chan, "");
}
}
if (sildet)
ast_dsp_free(sildet);
return res;
}
int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int beep, int silencethreshold, int maxsilence)
{
char d = 0, *fmts;
int d = 0;
char *fmts;
char comment[256];
int x, fmtcnt=1, res=-1,outmsg=0;
struct ast_frame *f;
@@ -961,3 +975,46 @@ int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordf
return res;
}
int ast_lock_path(const char *path)
{
char *s;
char *fs;
int res;
int fd;
time_t start;
s = alloca(strlen(path) + 10);
fs = alloca(strlen(path) + 20);
if (!fs || !s) {
ast_log(LOG_WARNING, "Out of memory!\n");
return -1;
}
snprintf(fs, strlen(path) + 19, "%s/%s-%08x", path, ".lock", rand());
fd = open(fs, O_WRONLY | O_CREAT | O_EXCL, 0600);
if (fd < 0) {
fprintf(stderr, "Unable to create lock file: %s\n", strerror(errno));
return -1;
}
close(fd);
snprintf(s, strlen(path) + 9, "%s/%s", path, ".lock");
time(&start);
while (((res = link(fs, s)) < 0) && (errno == EEXIST) && (time(NULL) - start < 5))
usleep(1);
if (res < 0) {
ast_log(LOG_WARNING, "Failed to lock path '%s': %s\n", path, strerror(errno));
}
unlink(fs);
ast_log(LOG_DEBUG, "Locked path '%s'\n", path);
return res;
}
int ast_unlock_path(const char *path)
{
char *s;
s = alloca(strlen(path) + 10);
if (!s)
return -1;
snprintf(s, strlen(path) + 9, "%s/%s", path, ".lock");
ast_log(LOG_DEBUG, "Unlocked path '%s'\n", path);
return unlink(s);
}

View File

@@ -1 +0,0 @@
.depend

0
apps/Makefile Executable file → Normal file
View File

0
apps/app_adsiprog.c Executable file → Normal file
View File

2
apps/app_alarmreceiver.c Executable file → Normal file
View File

@@ -55,7 +55,7 @@ static char *tdesc = "Alarm Receiver for Asterisk";
static char *app = "AlarmReceiver";
static char *synopsis = "Provide support for receving alarm reports from a burglar or fire alarm panel\n";
static char *synopsis = "Provide support for receving alarm reports from a burglar or fire alarm panel";
static char *descrip =
"Alarm receiver application for Asterisk. Only 1 signalling format is supported at this time:\n"
"Ademco Contact ID. This application should be called whenever there is an alarm panel calling in\n"

0
apps/app_authenticate.c Executable file → Normal file
View File

0
apps/app_cdr.c Executable file → Normal file
View File

11
apps/app_chanisavail.c Executable file → Normal file
View File

@@ -38,11 +38,12 @@ static char *descrip =
"Checks is any of the requested channels are available. If none\n"
"of the requested channels are available the new priority will be\n"
"n+101 (unless such a priority does not exist or on error, in which\n"
"case ChanIsAvail will return -1). If any of the requested channels\n"
"are available, the next priority will be n+1, the channel variable\n"
"${AVAILCHAN} will be set to the name of the available channel and\n"
"the ChanIsAvail app will return 0. ${AVAILORIGCHAN} is\n"
"the canonical channel name that was used to create the channel.\n";
"case ChanIsAvail will return -1).\n"
"If any of the requested channels are available, the next priority will be n+1,\n"
"the channel variable ${AVAILCHAN} will be set to the name of the available channel\n"
"and the ChanIsAvail app will return 0.\n"
"${AVAILORIGCHAN} is the canonical channel name that was used to create the channel.\n"
"${AVAILSTATUS} is the status code for the channel.\n";
STANDARD_LOCAL_USER;

15
apps/app_controlplayback.c Executable file → Normal file
View File

@@ -64,24 +64,19 @@ static int controlplayback_exec(struct ast_channel *chan, void *data)
file = tmp;
if ((skip=strchr(tmp,'|'))) {
*skip = '\0';
*skip++;
*skip++ = '\0';
fwd=strchr(skip,'|');
if (fwd) {
*fwd = '\0';
*fwd++;
*fwd++ = '\0';
rev = strchr(fwd,'|');
if (rev) {
*rev = '\0';
*rev++;
*rev++ = '\0';
stop = strchr(rev,'|');
if (stop) {
*stop = '\0';
*stop++;
*stop++ = '\0';
pause = strchr(stop,'|');
if (pause) {
*pause = '\0';
*pause++;
*pause++ = '\0';
}
}
}

4
apps/app_cut.c Executable file → Normal file
View File

@@ -31,10 +31,10 @@ static char *tdesc = "Cuts up variables";
static char *app_cut = "Cut";
static char *cut_synopsis = "Cut(newvar=varname|delimiter|fieldspec)";
static char *cut_synopsis = "Splits a variable's content using the specified delimiter";
static char *cut_descrip =
"Cut(newvar=varname,delimiter,field)\n"
"Usage: Cut(newvar=varname,delimiter,fieldspec)\n"
" newvar - new variable created from result string\n"
" varname - variable you want cut\n"
" delimiter - defaults to '-'\n"

0
apps/app_datetime.c Executable file → Normal file
View File

0
apps/app_db.c Executable file → Normal file
View File

42
apps/app_dial.c Executable file → Normal file
View File

@@ -113,6 +113,7 @@ struct localuser {
int allowdisconnect_in;
int allowdisconnect_out;
int forcecallerid;
int noforwardhtml;
struct localuser *next;
};
@@ -134,7 +135,7 @@ static void hanguptree(struct localuser *outgoing, struct ast_channel *exception
#define AST_MAX_WATCHERS 256
static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, int *sentringing, char *status, size_t statussize)
static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, int *noforwardhtml, int *sentringing, char *status, size_t statussize)
{
struct localuser *o;
int found;
@@ -207,6 +208,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
*allowredir_out = o->allowredirect_out;
*allowdisconnect_in = o->allowdisconnect_in;
*allowdisconnect_out = o->allowdisconnect_out;
*noforwardhtml = o->noforwardhtml;
}
} else if (o->chan && (o->chan == winner)) {
if (!ast_strlen_zero(o->chan->call_forward)) {
@@ -301,6 +303,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
*allowredir_out = o->allowredirect_out;
*allowdisconnect_in = o->allowdisconnect_in;
*allowdisconnect_out = o->allowdisconnect_out;
*noforwardhtml = o->noforwardhtml;
}
break;
case AST_CONTROL_BUSY:
@@ -336,13 +339,14 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
case AST_CONTROL_PROGRESS:
if (option_verbose > 2)
ast_verbose ( VERBOSE_PREFIX_3 "%s is making progress passing it to %s\n", o->chan->name,in->name);
ast_indicate(in, AST_CONTROL_PROGRESS);
if (!outgoing->ringbackonly)
ast_indicate(in, AST_CONTROL_PROGRESS);
break;
case AST_CONTROL_OFFHOOK:
/* Ignore going off hook */
break;
case -1:
if (!outgoing->ringbackonly && !outgoing->musiconhold) {
if (!(outgoing->ringbackonly || outgoing->musiconhold)) {
if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "%s stopped sounds\n", o->chan->name);
ast_indicate(in, -1);
@@ -360,7 +364,14 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
!(outgoing->ringbackonly || outgoing->musiconhold)) {
if (ast_write(in, f))
ast_log(LOG_WARNING, "Unable to forward image\n");
} else if (single && (f->frametype == AST_FRAME_TEXT) &&
!(outgoing->ringbackonly || outgoing->musiconhold)) {
if (ast_write(in, f))
ast_log(LOG_WARNING, "Unable to text\n");
} else if (single && (f->frametype == AST_FRAME_HTML) && !outgoing->noforwardhtml) {
ast_channel_sendhtml(in, f->subclass, f->data, f->datalen);
}
ast_frfree(f);
} else {
in->hangupcause = o->chan->hangupcause;
@@ -383,6 +394,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
/* Got hung up */
*to=-1;
strncpy(status, "CANCEL", statussize - 1);
if (f)
ast_frfree(f);
return NULL;
}
if (f && (f->frametype == AST_FRAME_DTMF) && *allowdisconnect_out &&
@@ -391,13 +404,18 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
*to=0;
strcpy(status, "CANCEL");
ast_frfree(f);
return NULL;
}
if (single && f && (f->frametype == AST_FRAME_HTML) && !outgoing->noforwardhtml)
ast_channel_sendhtml(outgoing->chan, f->subclass, f->data, f->datalen);
if (single && ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_DTMF))) {
if (ast_write(outgoing->chan, f))
ast_log(LOG_WARNING, "Unable to forward voice\n");
ast_frfree(f);
}
ast_frfree(f);
}
if (!*to && (option_verbose > 2))
ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", orig);
@@ -421,6 +439,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
int allowredir_out=0;
int allowdisconnect_in=0;
int allowdisconnect_out=0;
int noforwardhtml=0;
int hasmacro = 0;
int privacy=0;
int announce=0;
@@ -726,6 +745,9 @@ static int dial_exec(struct ast_channel *chan, void *data)
if (strchr(transfer, 'f'))
tmp->forcecallerid = 1;
else tmp->forcecallerid = 0;
if (url)
tmp->noforwardhtml = 1;
else tmp->noforwardhtml = 0;
}
strncpy(numsubst, number, sizeof(numsubst)-1);
/* If we're dialing by extension, look at the extension to know what to dial */
@@ -746,6 +768,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
cur = rest;
continue;
}
pbx_builtin_setvar_helper(tmp->chan, "DIALEDPEERNUMBER", numsubst);
if (!ast_strlen_zero(tmp->chan->call_forward)) {
char tmpchan[256]="";
char *stuff;
@@ -879,7 +902,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
strncpy(status, "CHANUNAVAIL", sizeof(status) - 1);
time(&start_time);
peer = wait_for_answer(chan, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &sentringing, status, sizeof(status));
peer = wait_for_answer(chan, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &sentringing, &noforwardhtml, status, sizeof(status));
if (!peer) {
if (to)
@@ -908,8 +931,11 @@ static int dial_exec(struct ast_channel *chan, void *data)
ast_cdr_setdestchan(chan->cdr, peer->name);
if (peer->name)
pbx_builtin_setvar_helper(chan, "DIALEDPEERNAME", peer->name);
if (numsubst)
pbx_builtin_setvar_helper(chan, "DIALEDPEERNUMBER", numsubst);
number = pbx_builtin_getvar_helper(peer, "DIALEDPEERNUMBER");
if (!number)
number = numsubst;
pbx_builtin_setvar_helper(chan, "DIALEDPEERNUMBER", number);
/* JDG: sendurl */
if( url && !ast_strlen_zero(url) && ast_channel_supports_html(peer) ) {
ast_log(LOG_DEBUG, "app_dial: sendurl=%s.\n", url);
@@ -1029,7 +1055,7 @@ out:
LOCAL_USER_REMOVE(u);
if((go_on>0) && (!chan->_softhangup))
if((go_on>0) && (!chan->_softhangup) && (res != AST_PBX_KEEPALIVE))
res=0;
return res;

0
apps/app_directory.c Executable file → Normal file
View File

22
apps/app_disa.c Executable file → Normal file
View File

@@ -22,6 +22,7 @@
#include <asterisk/module.h>
#include <asterisk/translate.h>
#include <asterisk/ulaw.h>
#include <asterisk/utils.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
@@ -161,7 +162,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
if (!strcasecmp(tmp, "no-password"))
{;
k = 1;
k |= 1; /* We have the password */
ast_log(LOG_DEBUG, "DISA no-password login success\n");
}
gettimeofday(&lastdigittime,NULL);
@@ -173,10 +174,10 @@ static int disa_exec(struct ast_channel *chan, void *data)
gettimeofday(&now,NULL);
/* if outa time, give em reorder */
if (ms_diff(&now,&lastdigittime) >
((k) ? digittimeout : firstdigittimeout))
((k&2) ? digittimeout : firstdigittimeout))
{
ast_log(LOG_DEBUG,"DISA %s entry timeout on chan %s\n",
((k) ? "extension" : "password"),chan->name);
((k&1) ? "extension" : "password"),chan->name);
break;
}
if ((res = ast_waitfor(chan, -1) < 0)) {
@@ -211,13 +212,15 @@ static int disa_exec(struct ast_channel *chan, void *data)
j = f->subclass; /* save digit */
ast_frfree(f);
if (i == 0)
{
k|=2; /* We have the first digit */
ast_playtones_stop(chan);
}
gettimeofday(&lastdigittime,NULL);
/* got a DTMF tone */
if (i < AST_MAX_EXTENSION) /* if still valid number of digits */
{
if (!k) /* if in password state */
if (!(k&1)) /* if in password state */
{
if (j == '#') /* end of password */
{
@@ -268,7 +271,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
ast_log(LOG_DEBUG,"DISA on chan %s password is good\n",chan->name);
play_dialtone(chan);
k = 1;
k|=1; /* In number mode */
i = 0; /* re-set buffer pointer */
exten[sizeof(acctcode)] = 0;
strncpy(acctcode,exten, sizeof(acctcode) - 1);
@@ -280,7 +283,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
exten[i++] = j; /* save digit */
exten[i] = 0;
if (!k) continue; /* if getting password, continue doing it */
if (!(k&1)) continue; /* if getting password, continue doing it */
/* if this exists */
if (ast_ignore_pattern(ourcontext, exten)) {
@@ -299,7 +302,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
}
}
if (k && ast_exists_extension(chan,ourcontext,exten,1, chan->callerid))
if ((k==3) && (ast_exists_extension(chan,ourcontext,exten,1, chan->callerid)))
{
ast_playtones_stop(chan);
/* We're authenticated and have a valid extension */
@@ -310,7 +313,8 @@ static int disa_exec(struct ast_channel *chan, void *data)
}
strncpy(chan->exten, exten, sizeof(chan->exten) - 1);
strncpy(chan->context, ourcontext, sizeof(chan->context) - 1);
strncpy(chan->accountcode, acctcode, sizeof(chan->accountcode) - 1);
if (!ast_strlen_zero(acctcode))
strncpy(chan->accountcode, acctcode, sizeof(chan->accountcode) - 1);
chan->priority = 0;
ast_cdr_init(chan->cdr,chan);
LOCAL_USER_REMOVE(u);

0
apps/app_echo.c Executable file → Normal file
View File

0
apps/app_enumlookup.c Executable file → Normal file
View File

4
apps/app_eval.c Executable file → Normal file
View File

@@ -31,10 +31,10 @@ static char *tdesc = "Reevaluates strings";
static char *app_eval = "Eval";
static char *eval_synopsis = "Eval(newvar=somestring)";
static char *eval_synopsis = "Evaluates a string";
static char *eval_descrip =
"Eval(newvar=somestring)\n"
"Usage: Eval(newvar=somestring)\n"
" Normally Asterisk evaluates variables inline. But what if you want to\n"
"store variable offsets in a database, to be evaluated later? Eval is\n"
"the answer, by allowing a string to be evaluated twice in the dialplan,\n"

0
apps/app_exec.c Executable file → Normal file
View File

7
apps/app_festival.c Executable file → Normal file
View File

@@ -131,7 +131,6 @@ static int send_waveform_to_fd(char *waveform, int length, int fd) {
#endif
write(fd,waveform,length);
write(fd,"a",1);
close(fd);
exit(0);
}
@@ -305,9 +304,9 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
if (!(festivalcommand = ast_variable_retrieve(cfg, "general", "festivalcommand"))) {
festivalcommand = "(tts_textasterisk \"%s\" 'file)(quit)\n";
}
ast_destroy(cfg);
if (!vdata || ast_strlen_zero(vdata)) {
ast_log(LOG_WARNING, "festival requires an argument (text)\n");
ast_destroy(cfg);
return -1;
}
strncpy(data, vdata, sizeof(data) - 1);
@@ -325,6 +324,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
if (fd < 0) {
ast_log(LOG_WARNING,"festival_client: can't get socket\n");
ast_destroy(cfg);
return -1;
}
memset(&serv_addr, 0, sizeof(serv_addr));
@@ -333,6 +333,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
serverhost = ast_gethostbyname(host, &ahp);
if (serverhost == (struct hostent *)0) {
ast_log(LOG_WARNING,"festival_client: gethostbyname failed\n");
ast_destroy(cfg);
return -1;
}
memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length);
@@ -342,6 +343,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0) {
ast_log(LOG_WARNING,"festival_client: connect to server failed\n");
ast_destroy(cfg);
return -1;
}
@@ -444,6 +446,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
}
} while (strcmp(ack,"OK\n") != 0);
close(fd);
ast_destroy(cfg);
LOCAL_USER_REMOVE(u);
return res;

0
apps/app_flash.c Executable file → Normal file
View File

7
apps/app_forkcdr.c Executable file → Normal file
View File

@@ -20,10 +20,11 @@
#include <string.h>
#include <pthread.h>
static char *tdesc = "Fork The CDR into 2 seperate entities.";
static char *tdesc = "Fork The CDR into 2 separate entities.";
static char *app = "ForkCDR";
static char *synopsis =
"Forks the Call Data Record\n"
"Forks the Call Data Record";
static char *descrip =
" ForkCDR(): Causes the Call Data Record to fork an additional\n"
"cdr record starting from the time of the fork call\n";
@@ -68,7 +69,7 @@ int unload_module(void)
int load_module(void)
{
return ast_register_application(app, forkcdr_exec, synopsis, tdesc);
return ast_register_application(app, forkcdr_exec, synopsis, descrip);
}
char *description(void)

10
apps/app_getcpeid.c Executable file → Normal file
View File

@@ -3,9 +3,9 @@
*
* Execute arbitrary system commands
*
* Copyright (C) 1999, Mark Spencer
* Copyright (C) 1999-2005, Digium
*
* Mark Spencer <markster@linux-support.net>
* Mark Spencer <markster@digium.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
@@ -31,9 +31,9 @@ static char *app = "GetCPEID";
static char *synopsis = "Get ADSI CPE ID";
static char *descrip =
" GetCPEID: Obtains and displays CPE ID and other information in order to\n"
"properly setup zapata.conf for on-hook operations. Returns -1 on hanup\n"
"only.";
" GetCPEID: Obtains and displays ADSI CPE ID and other information in order\n"
"to properly setup zapata.conf for on-hook operations.\n"
"Returns -1 on hangup only.\n";
STANDARD_LOCAL_USER;

0
apps/app_groupcount.c Executable file → Normal file
View File

30
apps/app_hasnewvoicemail.c Executable file → Normal file
View File

@@ -38,6 +38,7 @@
#include <asterisk/pbx.h>
#include <asterisk/module.h>
#include <asterisk/lock.h>
#include <asterisk/utils.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
@@ -70,7 +71,7 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
{
int res=0;
struct localuser *u;
char vmpath[256], *input, *varname = NULL, *vmbox, *vmfolder = "INBOX", *context = "default";
char vmpath[256], *temps, *input, *varname = NULL, *vmbox, *vmfolder = "INBOX", *context = "default";
DIR *vmdir;
struct dirent *vment;
int vmcount = 0;
@@ -83,21 +84,22 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
input = ast_strdupa((char *)data);
if (input) {
if ((vmbox = strsep(&input,":")))
if ((vmfolder = strsep(&input,"|")))
temps = input;
if ((temps = strsep(&input, "|"))) {
if (input && !ast_strlen_zero(input))
varname = input;
else
vmfolder = input;
else
if ((vmbox = strsep(&input,"|")))
varname = input;
else
vmbox = input;
if (index(vmbox,'@')) {
context = vmbox;
vmbox = strsep(&context,"@");
input = temps;
}
if ((temps = strsep(&input, ":"))) {
if (input && !ast_strlen_zero(input))
vmfolder = input;
input = temps;
}
if ((vmbox = strsep(&input, "@")))
if (input && !ast_strlen_zero(input))
context = input;
if (!vmbox)
vmbox = input;
snprintf(vmpath,sizeof(vmpath), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, vmbox, vmfolder);
if (!(vmdir = opendir(vmpath))) {

0
apps/app_ices.c Executable file → Normal file
View File

0
apps/app_image.c Executable file → Normal file
View File

0
apps/app_intercom.c Executable file → Normal file
View File

0
apps/app_lookupblacklist.c Executable file → Normal file
View File

0
apps/app_lookupcidname.c Executable file → Normal file
View File

3
apps/app_macro.c Executable file → Normal file
View File

@@ -140,7 +140,8 @@ static int macro_exec(struct ast_channel *chan, void *data)
while(ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid)) {
if ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid))) {
/* Something bad happened, or a hangup has been requested. */
if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) {
if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F')) ||
(res == '*') || (res == '#')) {
/* Just return result as to the previous application as if it had been dialed */
ast_log(LOG_DEBUG, "Oooh, got something to jump out with ('%c')!\n", res);
break;

83
apps/app_meetme.c Executable file → Normal file
View File

@@ -482,9 +482,39 @@ static int confnonzero(void *ptr)
return res;
}
/* Remove the conference from the list and free it.
We assume that this was called while holding conflock. */
static int conf_free(struct ast_conference *conf)
{
struct ast_conference *prev = NULL, *cur = confs;
while(cur) {
if (cur == conf) {
if (prev)
prev->next = conf->next;
else
confs = conf->next;
break;
}
prev = cur;
cur = cur->next;
}
if (!cur)
ast_log(LOG_WARNING, "Conference not found\n");
if (conf->chan)
ast_hangup(conf->chan);
else
close(conf->fd);
free(conf);
return 0;
}
static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int confflags)
{
struct ast_conference *prev=NULL, *cur;
struct ast_conf_user *user = malloc(sizeof(struct ast_conf_user));
int fd;
struct zt_confinfo ztc;
@@ -524,7 +554,9 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
memset(user, 0, sizeof(struct ast_conf_user));
user->user_no = 0; /* User number 0 means starting up user! (dead - not in the list!) */
time(&user->jointime);
if (conf->locked) {
/* Sorry, but this confernce is locked! */
if (!ast_streamfile(chan, "conf-locked", chan->language))
@@ -557,7 +589,6 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
conf->lastuser = user;
}
}
strncpy(user->usrvalue, "test", sizeof(user->usrvalue) - 1);
user->chan = chan;
user->userflags = confflags;
user->adminflags = 0;
@@ -990,31 +1021,12 @@ outrun:
"Meetme: %s\r\n"
"Usernum: %i\r\n",
chan->name, chan->uniqueid, conf->confno, user->user_no);
prev = NULL;
conf->users--;
if (confflags & CONFFLAG_MARKEDUSER)
conf->markedusers--;
cur = confs;
if (!conf->users) {
/* No more users -- close this one out */
while(cur) {
if (cur == conf) {
if (prev)
prev->next = conf->next;
else
confs = conf->next;
break;
}
prev = cur;
cur = cur->next;
}
if (!cur)
ast_log(LOG_WARNING, "Conference not found\n");
if (conf->chan)
ast_hangup(conf->chan);
else
close(conf->fd);
free(conf);
conf_free(conf);
} else {
/* Remove the user struct */
if (user == conf->firstuser) {
@@ -1043,10 +1055,10 @@ outrun:
else
ast_log(LOG_ERROR, "Bad! Bad! Bad! user->prevuser is NULL but we're not the beginning!\n");
}
/* Return the number of seconds the user was in the conf */
snprintf(meetmesecs, sizeof(meetmesecs), "%i", (int) (user->jointime - time(NULL)));
pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);
}
/* Return the number of seconds the user was in the conf */
snprintf(meetmesecs, sizeof(meetmesecs), "%i", (int) (time(NULL) - user->jointime));
pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);
}
free(user);
ast_mutex_unlock(&conflock);
@@ -1298,7 +1310,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
if (!found) {
/* At this point, we have a confno_tmp (static conference) that is empty */
if ((empty_no_pin && ((!stringp) || (stringp && (stringp[0] == '\0')))) || (!empty_no_pin)) {
/* Case 1: empty_no_pin and pin is nonexistant (NULL)
/* Case 1: empty_no_pin and pin is nonexistent (NULL)
* Case 2: empty_no_pin and pin is blank (but not NULL)
* Case 3: not empty_no_pin
*/
@@ -1399,8 +1411,15 @@ static int conf_exec(struct ast_channel *chan, void *data)
confno[0] = '\0';
}
} else {
/* failed when getting the pin */
res = -1;
allowretry = 0;
/* see if we need to get rid of the conference */
ast_mutex_lock(&conflock);
if (!cnf->users) {
conf_free(cnf);
}
ast_mutex_unlock(&conflock);
break;
}
@@ -1419,8 +1438,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
}
}
} while (allowretry);
/* Do the conference */
LOCAL_USER_REMOVE(u);
return res;
}
@@ -1454,14 +1474,17 @@ static int admin_exec(struct ast_channel *chan, void *data) {
command = strsep(&params, "|");
caller = strsep(&params, "|");
ast_mutex_lock(&conflock);
if (!command) {
ast_log(LOG_WARNING, "MeetmeAdmin requires a command!\n");
ast_mutex_unlock(&conflock);
return -1;
}
cnf = confs;
while (cnf) {
if (strcmp(cnf->confno, conf) == 0)
break;
cnf = cnf->next;
}
ast_mutex_unlock(&conflock);
if (caller)
user = find_user(cnf, caller);

0
apps/app_milliwatt.c Executable file → Normal file
View File

0
apps/app_mp3.c Executable file → Normal file
View File

0
apps/app_nbscat.c Executable file → Normal file
View File

0
apps/app_osplookup.c Executable file → Normal file
View File

4
apps/app_parkandannounce.c Executable file → Normal file
View File

@@ -41,7 +41,7 @@ static char *synopsis = "Park and Announce";
static char *descrip =
" ParkAndAnnounce(announce:template|timeout|dial|[return_context]):\n"
"Park a call into the parkinglot and announce the call over the console.\n"
"announce template: colon seperated list of files to announce, the word PARKED\n"
"announce template: colon separated list of files to announce, the word PARKED\n"
" will be replaced by a say_digits of the ext the call is parked in\n"
"timeout: time in seconds before the call returns into the return context.\n"
"dial: The app_dial style resource to call to make the announcement. Console/dsp calls the console.\n"
@@ -94,7 +94,7 @@ static int parkandannounce_exec(struct ast_channel *chan, void *data)
}
dial=strsep(&s, "|");
if(!dial) {
ast_log(LOG_WARNING, "PARK: A dial resouce must be specified i.e: Console/dsp or Zap/g1/5551212\n");
ast_log(LOG_WARNING, "PARK: A dial resource must be specified i.e: Console/dsp or Zap/g1/5551212\n");
free(orig_s);
return -1;
} else {

0
apps/app_playback.c Executable file → Normal file
View File

0
apps/app_privacy.c Executable file → Normal file
View File

2
apps/app_qcall.c Executable file → Normal file
View File

@@ -317,7 +317,7 @@ static void *qcall_do(void *arg)
extstr,context,channel->name);
if (strlen(ident)) {
strncat(ident,"-ok", sizeof(ident) - strlen(ident) - 1);
/* if file existant, play it */
/* if file existent, play it */
if (!ast_streamfile(channel,ident,0))
{
ast_waitstream(channel,"");

132
apps/app_queue.c Executable file → Normal file
View File

@@ -96,7 +96,7 @@ static char *descrip =
"Queues an incoming call in a particular call queue as defined in queues.conf.\n"
" This application returns -1 if the originating channel hangs up, or if the\n"
"call is bridged and either of the parties in the bridge terminate the call.\n"
"Returns 0 if the queue is full, nonexistant, or has no members.\n"
"Returns 0 if the queue is full, nonexistent, or has no members.\n"
"The option string may contain zero or more of the following characters:\n"
" 't' -- allow the called user transfer the calling user\n"
" 'T' -- to allow the calling user to transfer the call.\n"
@@ -226,6 +226,7 @@ struct ast_call_queue {
int wrapped; /* Round Robin - wrapped around? */
int joinempty; /* Do we care if the queue has no members? */
int eventwhencalled; /* Generate an event when the agent is called (before pickup) */
int leavewhenempty; /* If all agents leave the queue, remove callers from the queue */
struct member *members; /* Member channels to be tried */
struct queue_ent *head; /* Start of the actual queue */
@@ -544,14 +545,17 @@ static void hanguptree(struct localuser *outgoing, struct ast_channel *exception
}
}
static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
static int ring_entry(struct queue_ent *qe, struct localuser *tmp, int *busies)
{
int res;
struct ast_var_t *current, *newvar;
struct varshead *headp, *newheadp;
if (qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime)) {
ast_log(LOG_DEBUG, "Wrapuptime not yet expired for %s/%s\n", tmp->tech, tmp->numsubst);
if (qe->chan->cdr)
ast_cdr_busy(qe->chan->cdr);
tmp->stillgoing = 0;
(*busies)++;
return 0;
}
/* Request the peer */
@@ -563,8 +567,29 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
if (qe->chan->cdr)
ast_cdr_busy(qe->chan->cdr);
tmp->stillgoing = 0;
(*busies)++;
return 0;
}
/* If creating a SIP channel, look for a variable called */
/* VXML_URL in the calling channel and copy it to the */
/* new channel. */
/* Check for ALERT_INFO in the SetVar list. This is for */
/* SIP distinctive ring as per the RFC. For Cisco 7960s, */
/* SetVar(ALERT_INFO=<x>) where x is an integer value 1-5. */
/* However, the RFC says it should be a URL. -km- */
headp=&qe->chan->varshead;
AST_LIST_TRAVERSE(headp,current,entries) {
if (!strcasecmp(ast_var_name(current),"VXML_URL") ||
!strcasecmp(ast_var_name(current), "ALERT_INFO") ||
!strcasecmp(ast_var_name(current), "OSPTOKEN") ||
!strcasecmp(ast_var_name(current), "OSPHANDLE"))
{
newvar=ast_var_assign(ast_var_name(current),ast_var_value(current));
newheadp=&tmp->chan->varshead;
AST_LIST_INSERT_HEAD(newheadp,newvar,entries);
}
}
tmp->chan->appl = "AppQueue";
tmp->chan->data = "(Outgoing Line)";
tmp->chan->whentohangup = 0;
@@ -593,6 +618,7 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
ast_hangup(tmp->chan);
tmp->chan = NULL;
tmp->stillgoing = 0;
(*busies)++;
return 0;
} else {
if (qe->parent->eventwhencalled) {
@@ -610,10 +636,10 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Called %s/%s\n", tmp->tech, tmp->numsubst);
}
return 0;
return 1;
}
static int ring_one(struct queue_ent *qe, struct localuser *outgoing)
static int ring_one(struct queue_ent *qe, struct localuser *outgoing, int *busies)
{
struct localuser *cur;
struct localuser *best;
@@ -635,9 +661,9 @@ static int ring_one(struct queue_ent *qe, struct localuser *outgoing)
/* Ring everyone who shares this best metric (for ringall) */
cur = outgoing;
while(cur) {
if (cur->stillgoing && !cur->chan && (cur->metric == bestmetric)) {
if (cur->stillgoing && !cur->chan && (cur->metric <= bestmetric)) {
ast_log(LOG_DEBUG, "(Parallel) Trying '%s/%s' with metric %d\n", cur->tech, cur->numsubst, cur->metric);
ring_entry(qe, cur);
ring_entry(qe, cur, busies);
}
cur = cur->next;
}
@@ -646,7 +672,7 @@ static int ring_one(struct queue_ent *qe, struct localuser *outgoing)
if (option_debug)
ast_log(LOG_DEBUG, "Trying '%s/%s' with metric %d\n",
best->tech, best->numsubst, best->metric);
ring_entry(qe, best);
ring_entry(qe, best, busies);
}
}
} while (best && !best->chan);
@@ -710,15 +736,36 @@ static int valid_exit(struct queue_ent *qe, char digit)
#define AST_MAX_WATCHERS 256
static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, char *digit)
#define BUILD_STATS do { \
o = outgoing; \
found = -1; \
pos = 1; \
numlines = 0; \
watchers[0] = in; \
while(o) { \
/* Keep track of important channels */ \
if (o->stillgoing) { \
stillgoing = 1; \
if (o->chan) { \
watchers[pos++] = o->chan; \
found = 1; \
} \
} \
o = o->next; \
numlines++; \
} \
} while(0)
static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, char *digit, int prebusies)
{
char *queue = qe->parent->name;
struct localuser *o;
int found;
int numlines;
int sentringing = 0;
int numbusies = 0;
int numbusies = prebusies;
int orig = *to;
int stillgoing = 0;
struct ast_frame *f;
struct localuser *peer = NULL;
struct ast_channel *watchers[AST_MAX_WATCHERS];
@@ -727,25 +774,18 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
struct ast_channel *in = qe->chan;
while(*to && !peer) {
o = outgoing;
found = -1;
pos = 1;
numlines = 0;
watchers[0] = in;
while(o) {
/* Keep track of important channels */
if (o->stillgoing && o->chan) {
watchers[pos++] = o->chan;
found = 1;
}
o = o->next;
numlines++;
BUILD_STATS;
if ((found < 0) && stillgoing && !qe->parent->strategy) {
/* On "ringall" strategy we only move to the next penalty level
when *all* ringing phones are done in the current penalty level */
ring_one(qe, outgoing, &numbusies);
BUILD_STATS;
}
if (found < 0) {
if (numlines == numbusies) {
ast_log(LOG_DEBUG, "Everyone is busy at this time\n");
} else {
ast_log(LOG_NOTICE, "No one is answering queue '%s'\n", queue);
ast_log(LOG_NOTICE, "No one is answering queue '%s' (%d/%d)\n", queue, numlines, numbusies);
}
*to = 0;
return NULL;
@@ -789,7 +829,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
ast_hangup(o->chan);
o->chan = NULL;
if (qe->parent->strategy)
ring_one(qe, outgoing);
ring_one(qe, outgoing, &numbusies);
numbusies++;
break;
case AST_CONTROL_CONGESTION:
@@ -801,7 +841,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
ast_hangup(o->chan);
o->chan = NULL;
if (qe->parent->strategy)
ring_one(qe, outgoing);
ring_one(qe, outgoing, &numbusies);
numbusies++;
break;
case AST_CONTROL_RINGING:
@@ -827,7 +867,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
ast_hangup(o->chan);
o->chan = NULL;
if (qe->parent->strategy)
ring_one(qe, outgoing);
ring_one(qe, outgoing, &numbusies);
}
}
o = o->next;
@@ -843,21 +883,26 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) {
/* Got hung up */
*to=-1;
if (f)
ast_frfree(f);
return NULL;
}
if (f && (f->frametype == AST_FRAME_DTMF) && allowdisconnect_out && (f->subclass == '*')) {
if ((f->frametype == AST_FRAME_DTMF) && allowdisconnect_out && (f->subclass == '*')) {
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
*to=0;
ast_frfree(f);
return NULL;
}
if (f && (f->frametype == AST_FRAME_DTMF) && (f->subclass != '*') && valid_exit(qe, f->subclass)) {
if ((f->frametype == AST_FRAME_DTMF) && (f->subclass != '*') && valid_exit(qe, f->subclass)) {
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_3 "User pressed digit: %c", f->subclass);
ast_verbose(VERBOSE_PREFIX_3 "User pressed digit: %c\n", f->subclass);
*to=0;
*digit=f->subclass;
ast_frfree(f);
return NULL;
}
ast_frfree(f);
}
if (!*to && (option_verbose > 2))
ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", orig);
@@ -912,6 +957,12 @@ static int wait_our_turn(struct queue_ent *qe, int ringing)
break;
}
/* leave the queue if no agents, if enabled */
if (!(qe->parent->members) && qe->parent->leavewhenempty) {
leave_queue(qe);
break;
}
/* Make a position announcement, if enabled */
if (qe->parent->announcefrequency && !ringing)
say_position(qe);
@@ -1017,6 +1068,7 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
struct member *member;
int res = 0, bridge = 0;
int zapx = 2;
int numbusies = 0;
int x=0;
char *announce = NULL;
char digit = 0;
@@ -1099,9 +1151,9 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
to = qe->parent->timeout * 1000;
else
to = -1;
ring_one(qe, outgoing);
ring_one(qe, outgoing, &numbusies);
ast_mutex_unlock(&qe->parent->lock);
lpeer = wait_for_answer(qe, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &digit);
lpeer = wait_for_answer(qe, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &digit, numbusies);
ast_mutex_lock(&qe->parent->lock);
if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
store_next(qe, outgoing);
@@ -1626,11 +1678,18 @@ check_turns:
/* This is the wait loop for the head caller*/
/* To exit, they may get their call answered; */
/* they may dial a digit from the queue context; */
/* or, they may may timeout. */
/* or, they may timeout. */
/* Leave if we have exceeded our queuetimeout */
if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
res = 0;
ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
break;
}
/* leave the queue if no agents, if enabled */
if (!((qe.parent)->members) && (qe.parent)->leavewhenempty) {
leave_queue(&qe);
break;
}
@@ -1652,6 +1711,7 @@ check_turns:
/* Leave if we have exceeded our queuetimeout */
if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
res = 0;
ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
break;
}
@@ -1691,7 +1751,7 @@ check_turns:
}
}
/* Don't allow return code > 0 */
if (res > 0 && res != AST_PBX_KEEPALIVE) {
if ((res == 0) || (res > 0 && res != AST_PBX_KEEPALIVE)) {
res = 0;
if (ringing) {
ast_indicate(chan, -1);
@@ -1781,7 +1841,7 @@ static void reload_queues(void)
strncpy(q->sound_minutes, "queue-minutes", sizeof(q->sound_minutes) - 1);
strncpy(q->sound_seconds, "queue-seconds", sizeof(q->sound_seconds) - 1);
strncpy(q->sound_thanks, "queue-thankyou", sizeof(q->sound_thanks) - 1);
strncpy(q->sound_lessthan, "queue-lessthan", sizeof(q->sound_lessthan) - 1);
strncpy(q->sound_lessthan, "queue-less-than", sizeof(q->sound_lessthan) - 1);
prev = q->members;
if (prev) {
/* find the end of any dynamic members */
@@ -1818,7 +1878,7 @@ static void reload_queues(void)
q->members = cur;
prev = cur;
}
} else if (!strcasecmp(var->name, "music")) {
} else if (!strcasecmp(var->name, "music") || !strcasecmp(var->name, "musiconhold")) {
strncpy(q->moh, var->value, sizeof(q->moh) - 1);
} else if (!strcasecmp(var->name, "announce")) {
strncpy(q->announce, var->value, sizeof(q->announce) - 1);
@@ -1872,6 +1932,8 @@ static void reload_queues(void)
}
} else if (!strcasecmp(var->name, "joinempty")) {
q->joinempty = ast_true(var->value);
} else if (!strcasecmp(var->name, "leavewhenempty")) {
q->leavewhenempty = ast_true(var->value);
} else if (!strcasecmp(var->name, "eventwhencalled")) {
q->eventwhencalled = ast_true(var->value);
} else {

1
apps/app_random.c Executable file → Normal file
View File

@@ -106,7 +106,6 @@ int unload_module(void)
int load_module(void)
{
srandom((unsigned int)getpid() + (unsigned int)time(NULL));
return ast_register_application(app_random, random_exec, random_synopsis, random_descrip);
}

3
apps/app_read.c Executable file → Normal file
View File

@@ -106,8 +106,9 @@ static int read_exec(struct ast_channel *chan, void *data)
if (res > -1) {
pbx_builtin_setvar_helper(chan, varname, tmp);
ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp);
res = 0;
} else {
ast_verbose(VERBOSE_PREFIX_3 "User entered nothing\n");
ast_verbose(VERBOSE_PREFIX_3 "User disconnected\n");
}
}
LOCAL_USER_REMOVE(u);

2
apps/app_record.c Executable file → Normal file
View File

@@ -301,7 +301,7 @@ static int record_exec(struct ast_channel *chan, void *data)
ast_log(LOG_WARNING, "Could not answer channel '%s'\n", chan->name);
LOCAL_USER_REMOVE(u);
if (silence > 0) {
if ((silence > 0) && rfmt) {
res = ast_set_read_format(chan, rfmt);
if (res)
ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name);

0
apps/app_rpt.c Executable file → Normal file
View File

0
apps/app_sayunixtime.c Executable file → Normal file
View File

0
apps/app_senddtmf.c Executable file → Normal file
View File

0
apps/app_sendtext.c Executable file → Normal file
View File

0
apps/app_setcallerid.c Executable file → Normal file
View File

0
apps/app_setcdruserfield.c Executable file → Normal file
View File

0
apps/app_setcidname.c Executable file → Normal file
View File

0
apps/app_setcidnum.c Executable file → Normal file
View File

0
apps/app_skel.c Executable file → Normal file
View File

14
apps/app_sms.c Executable file → Normal file
View File

@@ -24,8 +24,10 @@
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <ctype.h>
#include "../astconf.h"
/* ToDo */
/* When acting as SC and answering, should check for messages and send instead of sending EST as first packet */
@@ -36,6 +38,9 @@
static unsigned char message_ref; /* arbitary message ref */
static char log_file[255];
static char spool_dir[255];
static char *tdesc = "SMS/PSTN handler";
static char *app = "SMS";
@@ -315,7 +320,7 @@ sms_log (sms_t * h, char status)
{ /* log the output, and remove file */
if (*h->oa || *h->da)
{
int o = open ("/var/log/asterisk/sms", O_CREAT | O_APPEND | O_WRONLY, 0666);
int o = open (log_file, O_CREAT | O_APPEND | O_WRONLY, 0666);
if (o >= 0)
{
char line[1000], *p;
@@ -517,7 +522,7 @@ sms_writefile (sms_t * h)
char fn2[200] = "";
FILE *o;
strncpy(fn, "/var/spool/asterisk/sms", sizeof(fn) - 1);
strncpy(fn, spool_dir, sizeof(fn) - 1);
mkdir (fn, 0777); /* ensure it exists */
snprintf(fn + strlen(fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "me-sc" : "sc-me", h->queue);
mkdir (fn, 0777); /* ensure it exists */
@@ -689,7 +694,7 @@ sms_nextoutgoing (sms_t * h)
DIR *d;
char more = 0;
strncpy(fn, "/var/spool/asterisk/sms", sizeof(fn) - 1);
strncpy(fn, spool_dir, sizeof(fn) - 1);
mkdir(fn, 0777); /* ensure it exists */
snprintf(fn + strlen (fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "sc-me" : "me-sc", h->queue);
mkdir (fn, 0777); /* ensure it exists */
@@ -769,6 +774,7 @@ sms_nextoutgoing (sms_t * h)
{ /* no message */
h->omsg[0] = 0x94; /* SMS_REL */
h->omsg[1] = 0;
h->hangup = 1;
sms_messagetx (h);
}
}
@@ -1204,6 +1210,8 @@ load_module (void)
for (p = 0; p < 128; p++)
sms8to7[sms7to8[p]] = p;
}
snprintf(log_file, sizeof(log_file), "%s/sms", ast_config_AST_LOG_DIR);
snprintf(spool_dir, sizeof(spool_dir), "%s/sms", ast_config_AST_SPOOL_DIR);
return ast_register_application (app, sms_exec, synopsis, descrip);
}

0
apps/app_softhangup.c Executable file → Normal file
View File

2
apps/app_sql_postgres.c Executable file → Normal file
View File

@@ -106,8 +106,6 @@ STANDARD_LOCAL_USER;
LOCAL_USER_DECL;
extern void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
#define AST_PGSQL_ID_DUMMY 0
#define AST_PGSQL_ID_CONNID 1
#define AST_PGSQL_ID_RESID 2

0
apps/app_striplsd.c Executable file → Normal file
View File

0
apps/app_substring.c Executable file → Normal file
View File

0
apps/app_system.c Executable file → Normal file
View File

0
apps/app_talkdetect.c Executable file → Normal file
View File

13
apps/app_test.c Executable file → Normal file
View File

@@ -1,7 +1,7 @@
/*
* Asterisk -- A telephony toolkit for Linux.
*
* Applictions connected with CDR engine
* Applications to test connection and produce report in text file
*
* Copyright (C) 2004, Digium, Inc.
*
@@ -14,6 +14,7 @@
#include <sys/types.h>
#include <asterisk/channel.h>
#include <asterisk/options.h>
#include <asterisk/module.h>
#include <asterisk/logger.h>
#include <asterisk/lock.h>
@@ -29,13 +30,15 @@
static char *tdesc = "Interface Test Application";
static char *tests_descrip = "TestServer(): Perform test server function and write call report"
"Results stored in /var/log/asterisk/testreports/<testid>.txt";
static char *tests_descrip =
"TestServer(): Perform test server function and write call report.\n"
"Results stored in /var/log/asterisk/testreports/<testid>-server.txt";
static char *tests_app = "TestServer";
static char *tests_synopsis = "Execute Interface Test Server";
static char *testc_descrip = "TestClient(testid): Executes test client with given testid.\n"
"Results stored in /var/log/asterisk/testreports/<testid>.txt";
static char *testc_descrip =
"TestClient(testid): Executes test client with given testid.\n"
"Results stored in /var/log/asterisk/testreports/<testid>-client.txt";
static char *testc_app = "TestClient";
static char *testc_synopsis = "Execute Interface Test Client";

0
apps/app_transfer.c Executable file → Normal file
View File

0
apps/app_txtcidname.c Executable file → Normal file
View File

0
apps/app_url.c Executable file → Normal file
View File

6
apps/app_userevent.c Executable file → Normal file
View File

@@ -54,22 +54,22 @@ static int userevent_exec(struct ast_channel *chan, void *data)
}
strncpy(info, (char *)data, strlen((char *)data) + AST_MAX_EXTENSION-1);
snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
eventbody = strchr(eventname, '|');
if (eventbody) {
*eventbody = '\0';
eventbody++;
}
snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
LOCAL_USER_ADD(u);
if(eventbody) {
ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, eventbody);
manager_event(EVENT_FLAG_CALL, eventname,
manager_event(EVENT_FLAG_USER, eventname,
"Channel: %s\r\nUniqueid: %s\r\n%s\r\n",
chan->name, chan->uniqueid, eventbody);
} else {
ast_log(LOG_DEBUG, "Sending user event: %s\n", eventname);
manager_event(EVENT_FLAG_CALL, eventname,
manager_event(EVENT_FLAG_USER, eventname,
"Channel: %s\r\nUniqueid: %s\r\n", chan->name, chan->uniqueid);
}

0
apps/app_verbose.c Executable file → Normal file
View File

442
apps/app_voicemail.c Executable file → Normal file
View File

@@ -176,8 +176,9 @@ struct vm_state {
};
static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int msg, int option);
static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, char *outgoing_context);
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration);
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir);
static int vm_delete(char *file);
static int vm_play_folder_name(struct ast_channel *chan, char *mbox);
static char ext_pass_cmd[128];
@@ -215,7 +216,10 @@ static char *descrip_vmain =
"for the checking of voicemail. The mailbox can be passed as the option,\n"
"which will stop the voicemail system from prompting the user for the mailbox.\n"
"If the mailbox is preceded by 's' then the password check will be skipped. If\n"
"a context is specified, logins are considered in that voicemail context only.\n"
"the mailbox is preceded by 'p' then the supplied mailbox is prepended to the\n"
"user's entry and the resulting string is used as the mailbox number. This is\n"
"useful for virtual hosting of voicemail boxes. If a context is specified,\n"
"logins are considered in that voicemail context only.\n"
"Returns -1 if the user hangs up or 0 otherwise.\n";
static char *synopsis_vm_box_exists =
@@ -671,7 +675,7 @@ static void vm_change_password(struct ast_vm_user *vmu, char *newpassword)
}
} else {
/* Put it back like it was */
fprintf(configout, orig);
fprintf(configout, "%s", orig);
}
}
}
@@ -692,7 +696,8 @@ static void vm_change_password_shell(struct ast_vm_user *vmu, char *newpassword)
{
char buf[255];
snprintf(buf,255,"%s %s %s %s",ext_pass_cmd,vmu->context,vmu->mailbox,newpassword);
ast_safe_system(buf);
if (!ast_safe_system(buf))
strncpy(vmu->password, newpassword, sizeof(vmu->password) - 1);
}
static int make_dir(char *dest, int len, char *context, char *ext, char *mailbox)
@@ -705,6 +710,20 @@ static int make_file(char *dest, int len, char *dir, int num)
return snprintf(dest, len, "%s/msg%04d", dir, num);
}
static int last_message_index(char *dir)
{
int x;
char fn[256];
ast_lock_path(dir);
for (x=0;x<MAXMSG;x++) {
make_file(fn, sizeof(fn), dir, x);
if (ast_fileexists(fn, NULL, NULL) < 1)
break;
}
ast_unlock_path(dir);
return x-1;
}
static int
inbuf(struct baseio *bio, FILE *fi)
{
@@ -844,7 +863,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
FILE *p=NULL;
int pfd;
char date[256];
char host[256];
char host[MAXHOSTNAMELEN] = "";
char who[256];
char bound[256];
char fname[256];
@@ -872,7 +891,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
}
}
if (p) {
gethostname(host, sizeof(host));
gethostname(host, sizeof(host)-1);
if (strchr(srcemail, '@'))
strncpy(who, srcemail, sizeof(who)-1);
else {
@@ -989,7 +1008,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
fclose(p);
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
ast_safe_system(tmp2);
ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", who, mailcmd);
ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", vmu->email, mailcmd);
} else {
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
return -1;
@@ -1002,7 +1021,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
FILE *p=NULL;
int pfd;
char date[256];
char host[256];
char host[MAXHOSTNAMELEN]="";
char who[256];
char dur[256];
char tmp[80] = "/tmp/astmail-XXXXXX";
@@ -1021,7 +1040,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
}
if (p) {
gethostname(host, sizeof(host));
gethostname(host, sizeof(host)-1);
if (strchr(srcemail, '@'))
strncpy(who, srcemail, sizeof(who)-1);
else {
@@ -1076,7 +1095,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
fclose(p);
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
ast_safe_system(tmp2);
ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", who, mailcmd);
ast_log(LOG_DEBUG, "Sent page to %s with command '%s'\n", pager, mailcmd);
} else {
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
return -1;
@@ -1239,6 +1258,7 @@ static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int
make_dir(fromdir, sizeof(fromdir), vmu->context, vmu->mailbox, frombox);
make_file(frompath, sizeof(frompath), fromdir, msgnum);
ast_lock_path(topath);
recipmsgnum = 0;
do {
make_file(topath, sizeof(topath), todir, recipmsgnum);
@@ -1255,7 +1275,7 @@ static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int
} else {
ast_log(LOG_ERROR, "Recipient mailbox %s@%s is full\n", recip->mailbox, recip->context);
}
ast_unlock_path(topath);
notify_new_message(chan, recip, recipmsgnum, duration, fmt, chan->callerid);
}
@@ -1282,7 +1302,6 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
FILE *txt;
int res = 0;
int msgnum;
int fd;
int duration = 0;
int ausemacro = 0;
int ousemacro = 0;
@@ -1356,7 +1375,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
strncat(ecodes, "*", sizeof(ecodes) - strlen(ecodes) - 1);
ausemacro = 1;
}
/* Play the beginning intro if desired */
if (!ast_strlen_zero(prefile)) {
if (ast_fileexists(prefile, NULL, NULL) > 0) {
@@ -1403,22 +1422,22 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
}
/* Check for a '0' here */
if (res == '0') {
transfer:
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
if (!ast_strlen_zero(vmu->exit)) {
strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
} else if (ousemacro && !ast_strlen_zero(chan->macrocontext)) {
strncpy(chan->context, chan->macrocontext, sizeof(chan->context) - 1);
transfer:
if (vmu->operator) {
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
if (!ast_strlen_zero(vmu->exit)) {
strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
} else if (ousemacro && !ast_strlen_zero(chan->macrocontext)) {
strncpy(chan->context, chan->macrocontext, sizeof(chan->context) - 1);
}
ast_play_and_wait(chan, "transfer");
chan->priority = 0;
free_user(vmu);
return 0;
} else {
ast_play_and_wait(chan, "vm-sorry");
return 0;
}
chan->priority = 0;
free_user(vmu);
return 0;
}
if (res >= 0) {
/* Unless we're *really* silent, try to send the beep */
res = ast_streamfile(chan, "beep", chan->language);
if (!res)
res = ast_waitstream(chan, "");
}
if (res < 0) {
free_user(vmu);
@@ -1428,6 +1447,13 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
strncpy(fmt, vmfmts, sizeof(fmt) - 1);
if (!ast_strlen_zero(fmt)) {
msgnum = 0;
if (res >= 0) {
/* Unless we're *really* silent, try to send the beep */
res = ast_streamfile(chan, "beep", chan->language);
if (!res)
res = ast_waitstream(chan, "");
}
ast_lock_path(dir);
do {
make_file(fn, sizeof(fn), dir, msgnum);
if (ast_fileexists(fn, NULL, chan->language) <= 0)
@@ -1462,22 +1488,19 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
chan->name,
chan->callerid ? chan->callerid : "Unknown",
date, (long)time(NULL));
fclose(txt);
} else
ast_log(LOG_WARNING, "Error opening text file for output\n");
res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration);
if (res == '0')
res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration, dir);
if (res == '0') {
if (txt)
fclose(txt);
goto transfer;
}
if (res > 0)
res = 0;
fd = open(txtfile, O_APPEND | O_WRONLY);
if (fd > -1) {
txt = fdopen(fd, "a");
if (txt) {
fprintf(txt, "duration=%d\n", duration);
fclose(txt);
} else
close(fd);
if (txt) {
fprintf(txt, "duration=%d\n", duration);
fclose(txt);
}
if (duration < vmminmessage) {
if (option_verbose > 2)
@@ -1502,8 +1525,10 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
free_user(recip);
}
}
notify_new_message(chan, vmu, msgnum, duration, fmt, chan->callerid);
if (ast_fileexists(fn, NULL, NULL))
notify_new_message(chan, vmu, msgnum, duration, fmt, chan->callerid);
} else {
ast_unlock_path(dir);
res = ast_streamfile(chan, "vm-mailboxfull", chan->language);
if (!res)
res = ast_waitstream(chan, "");
@@ -1525,16 +1550,58 @@ leave_vm_out:
static int count_messages(char *dir)
{
int x;
char fn[256];
for (x=0;x<MAXMSG;x++) {
make_file(fn, sizeof(fn), dir, x);
if (ast_fileexists(fn, NULL, NULL) < 1)
break;
/* Find all .txt files - even if they are not in sequence from 0000 */
int vmcount = 0;
DIR *vmdir = NULL;
struct dirent *vment = NULL;
if ((vmdir = opendir(dir))) {
while ((vment = readdir(vmdir)))
{
if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
{
vmcount++;
}
}
closedir(vmdir);
}
return x;
return vmcount;
}
static void resequence_mailbox(char * dir)
{
/* we know max messages, so stop process when number is hit */
int x,dest;
char sfn[256];
char dfn[256];
char stxt[256];
char dtxt[256];
ast_lock_path(dir);
for (x=0,dest=0;x<MAXMSG;x++) {
make_file(sfn, sizeof(sfn), dir, x);
if (ast_fileexists(sfn, NULL, NULL) > 0) {
if(x != dest) {
make_file(dfn, sizeof(dfn), dir, dest);
ast_filerename(sfn,dfn,NULL);
snprintf(stxt, sizeof(stxt), "%s.txt", sfn);
snprintf(dtxt, sizeof(dtxt), "%s.txt", dfn);
rename(stxt, dtxt);
}
dest++;
}
}
ast_unlock_path(dir);
}
static int say_and_wait(struct ast_channel *chan, int num, char *language)
{
int d;
@@ -1554,19 +1621,23 @@ static int save_to_folder(char *dir, int msg, char *context, char *username, int
make_file(sfn, sizeof(sfn), dir, msg);
make_dir(ddir, sizeof(ddir), context, username, dbox);
mkdir(ddir, 0700);
ast_lock_path(ddir);
for (x=0;x<MAXMSG;x++) {
make_file(dfn, sizeof(dfn), ddir, x);
if (ast_fileexists(dfn, NULL, NULL) < 0)
break;
}
if (x >= MAXMSG)
if (x >= MAXMSG) {
ast_unlock_path(ddir);
return -1;
}
ast_filecopy(sfn, dfn, NULL);
if (strcmp(sfn, dfn)) {
snprintf(txt, sizeof(txt), "%s.txt", sfn);
snprintf(ntxt, sizeof(ntxt), "%s.txt", dfn);
copy(txt, ntxt);
}
ast_unlock_path(ddir);
return 0;
}
@@ -2073,23 +2144,10 @@ static int get_folder(struct ast_channel *chan, int start)
d = ast_play_and_wait(chan, "vm-for"); /* "for" */
if (d)
return d;
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Spanish, French or Portuguese syntax */
d = ast_play_and_wait(chan, "vm-messages"); /* "messages */
if (d)
return d;
snprintf(fn, sizeof(fn), "vm-%s", mbox(x)); /* Folder name */
d = ast_play_and_wait(chan, fn);
if (d)
return d;
} else { /* Default English */
snprintf(fn, sizeof(fn), "vm-%s", mbox(x)); /* Folder name */
d = ast_play_and_wait(chan, fn);
if (d)
return d;
d = ast_play_and_wait(chan, "vm-messages"); /* "messages */
if (d)
return d;
}
snprintf(fn, sizeof(fn), "vm-%s", mbox(x)); /* Folder name */
d = vm_play_folder_name(chan, fn);
if (d)
return d;
d = ast_waitfordigit(chan, 500);
if (d)
return d;
@@ -2212,7 +2270,7 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
char callerid[512];
char ext_context[256]="";
int res = 0, cmd = 0;
struct ast_vm_user *receiver, *extensions = NULL, *vmtmp = NULL, *vmfree;
struct ast_vm_user *receiver = NULL, *extensions = NULL, *vmtmp = NULL, *vmfree;
char tmp[256];
char *stringp, *s;
int saved_messages = 0, found = 0;
@@ -2272,7 +2330,7 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
snprintf(todir, sizeof(todir), "%s/voicemail/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, vmtmp->context, vmtmp->mailbox);
snprintf(sys, sizeof(sys), "mkdir -p %s\n", todir);
snprintf(ext_context, sizeof(ext_context), "%s@%s", vmtmp->mailbox, vmtmp->context);
ast_log(LOG_DEBUG, sys);
ast_log(LOG_DEBUG, "%s", sys);
ast_safe_system(sys);
todircount = count_messages(todir);
@@ -2283,11 +2341,11 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
if (!strcasecmp(s, "wav49"))
s = "WAV";
snprintf(sys, sizeof(sys), "cp %s/msg%04d.%s %s/msg%04d.%s\n", dir, curmsg, s, todir, todircount, s);
ast_log(LOG_DEBUG, sys);
ast_log(LOG_DEBUG, "%s", sys);
ast_safe_system(sys);
}
snprintf(sys, sizeof(sys), "cp %s/msg%04d.txt %s/msg%04d.txt\n", dir, curmsg, todir, todircount);
ast_log(LOG_DEBUG, sys);
ast_log(LOG_DEBUG, "%s", sys);
ast_safe_system(sys);
snprintf(fn, sizeof(fn), "%s/msg%04d", todir,todircount);
@@ -2545,6 +2603,20 @@ static void open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu,int box)
strncpy(vms->curbox, mbox(box), sizeof(vms->curbox) - 1);
make_dir(vms->curdir, sizeof(vms->curdir), vmu->context, vms->username, vms->curbox);
vms->lastmsg = count_messages(vms->curdir) - 1;
/*
The following test is needed in case sequencing gets messed up.
There appears to be more than one way to mess up sequence, so
we will not try to find all of the root causes--just fix it when
detected.
*/
if(vms->lastmsg != last_message_index(vms->curdir))
{
ast_log(LOG_NOTICE, "Resequencing Mailbox: %s\n", vms->curdir);
resequence_mailbox(vms->curdir);
}
snprintf(vms->vmbox, sizeof(vms->vmbox), "vm-%s", vms->curbox);
}
@@ -2555,6 +2627,7 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
char txt[256] = "";
if (vms->lastmsg > -1) {
/* Get the deleted messages fixed */
ast_lock_path(vms->curdir);
vms->curmsg = -1;
for (x=0;x < MAXMSG;x++) {
if (!vms->deleted[x] && (strcasecmp(vms->curbox, "INBOX") || !vms->heard[x])) {
@@ -2581,13 +2654,33 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
break;
vm_delete(vms->fn);
}
}
memset(vms->deleted, 0, sizeof(vms->deleted));
memset(vms->heard, 0, sizeof(vms->heard));
ast_unlock_path(vms->curdir);
}
if (vms->deleted)
memset(vms->deleted, 0, sizeof(vms->deleted));
if (vms->heard)
memset(vms->heard, 0, sizeof(vms->heard));
}
static int vm_play_folder_name(struct ast_channel *chan, char *mbox)
{
int cmd;
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /*Spanish, French or Portuguese syntax */
cmd = ast_play_and_wait(chan, "vm-messages"); /* "messages */
if (cmd)
return cmd;
return ast_play_and_wait(chan, mbox);
} else { /* Default English */
cmd = ast_play_and_wait(chan, mbox);
if (cmd)
return cmd;
return ast_play_and_wait(chan, "vm-messages"); /* "messages */
}
}
/* Default English syntax */
static int vm_intro(struct ast_channel *chan,struct vm_state *vms)
static int vm_intro_en(struct ast_channel *chan,struct vm_state *vms)
{
/* Introduce messages they have */
int res;
@@ -2949,6 +3042,26 @@ static int vm_intro_cz(struct ast_channel *chan,struct vm_state *vms)
return res;
}
static int vm_intro(struct ast_channel *chan,struct vm_state *vms)
{
/* Play voicemail intro - syntax is different for different languages */
if (!strcasecmp(chan->language, "de")) { /* GERMAN syntax */
return vm_intro_de(chan, vms);
} else if (!strcasecmp(chan->language, "es")) { /* SPANISH syntax */
return vm_intro_es(chan, vms);
} else if (!strcasecmp(chan->language, "fr")) { /* FRENCH syntax */
return vm_intro_fr(chan, vms);
} else if (!strcasecmp(chan->language, "nl")) { /* DUTCH syntax */
return vm_intro_nl(chan, vms);
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE syntax */
return vm_intro_pt(chan, vms);
} else if (!strcasecmp(chan->language, "cz")) { /* CZECH syntax */
return vm_intro_cz(chan, vms);
} else { /* Default to ENGLISH */
return vm_intro_en(chan, vms);
}
}
static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int skipadvanced)
{
int res = 0;
@@ -2957,17 +3070,8 @@ static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int s
if (vms->starting) {
if (vms->lastmsg > -1) {
res = ast_play_and_wait(chan, "vm-onefor");
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Spanish, French & Portuguese Syntax */
if (!res)
res = ast_play_and_wait(chan, "vm-messages");
if (!res)
res = ast_play_and_wait(chan, vms->vmbox);
} else { /* Default English syntax */
if (!res)
res = ast_play_and_wait(chan, vms->vmbox);
if (!res)
res = ast_play_and_wait(chan, "vm-messages");
}
if (!res)
res = vm_play_folder_name(chan, vms->vmbox);
}
if (!res)
res = ast_play_and_wait(chan, "vm-opts");
@@ -3031,15 +3135,15 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
switch (cmd) {
case '1':
snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/unavail",vmu->context, vms->username);
cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration);
cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
break;
case '2':
snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/busy",vmu->context, vms->username);
cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration);
cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
break;
case '3':
snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/greet",vmu->context, vms->username);
cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration);
cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
break;
case '4':
if (vmu->password[0] == '-') {
@@ -3048,19 +3152,24 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
}
newpassword[1] = '\0';
newpassword[0] = cmd = ast_play_and_wait(chan,"vm-newpassword");
if (cmd < 0)
break;
if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0) {
break;
}
if (cmd == '#')
newpassword[0] = '\0';
else {
if (cmd < 0)
break;
if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0)
break;
}
newpassword2[1] = '\0';
newpassword2[0] = cmd = ast_play_and_wait(chan,"vm-reenterpassword");
if (cmd < 0)
break;
if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#"))) {
break;
}
if (cmd == '#')
newpassword2[0] = '\0';
else {
if (cmd < 0)
break;
if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#")))
break;
}
if (strcmp(newpassword, newpassword2)) {
ast_log(LOG_NOTICE,"Password mismatch for user %s (%s != %s)\n", vms->username, newpassword, newpassword2);
cmd = ast_play_and_wait(chan, "vm-mismatch");
@@ -3092,7 +3201,7 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
}
/* Default English syntax */
static int vm_browse_messages(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
static int vm_browse_messages_en(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
{
int cmd=0;
@@ -3150,6 +3259,17 @@ static int vm_browse_messages_pt(struct ast_channel *chan, struct vm_state *vms,
return cmd;
}
static int vm_browse_messages(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
{
if (!strcasecmp(chan->language, "es")) { /* SPANISH */
return vm_browse_messages_es(chan, vms, vmu);
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE */
return vm_browse_messages_pt(chan, vms, vmu);
} else { /* Default to English syntax */
return vm_browse_messages_en(chan, vms, vmu);
}
}
static int vm_execmain(struct ast_channel *chan, void *data)
{
/* XXX This is, admittedly, some pretty horrendus code. For some
@@ -3269,7 +3389,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
goto out;
}
}
if (prefix) {
if (prefix && !ast_strlen_zero(prefixstr)) {
char fullusername[80] = "";
strncpy(fullusername, prefixstr, sizeof(fullusername) - 1);
strncat(fullusername, vms.username, sizeof(fullusername) - 1);
@@ -3290,15 +3410,20 @@ static int vm_execmain(struct ast_channel *chan, void *data)
logretries++;
if (!valid) {
if (skipuser || logretries >= maxlogins) {
if (ast_streamfile(chan, "vm-incorrect", chan->language))
break;
if (ast_streamfile(chan, "vm-incorrect", chan->language)) {
ast_log(LOG_WARNING, "Unable to stream incorrect message\n");
return -1;
}
} else {
if (useadsi)
adsi_login(chan);
if (ast_streamfile(chan, "vm-incorrect-mailbox", chan->language))
break;
if (ast_streamfile(chan, "vm-incorrect-mailbox", chan->language)) {
ast_log(LOG_WARNING, "Unable to stream incorrect mailbox message\n");
return -1;
}
}
ast_waitstream(chan, "");
if (ast_waitstream(chan, "")) /* Channel is hung up */
return -1;
}
}
if (!valid && (logretries >= maxlogins)) {
@@ -3333,22 +3458,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
if (useadsi)
adsi_status(chan, &vms);
res = 0;
/* Play voicemail intro - syntax is different for different languages */
if (!strcasecmp(chan->language, "de")) { /* GERMAN syntax */
cmd = vm_intro_de(chan, &vms);
} else if (!strcasecmp(chan->language, "es")) { /* SPANISH syntax */
cmd = vm_intro_es(chan, &vms);
} else if (!strcasecmp(chan->language, "fr")) { /* FRENCH syntax */
cmd = vm_intro_fr(chan, &vms);
} else if (!strcasecmp(chan->language, "nl")) { /* DUTCH syntax */
cmd = vm_intro_nl(chan, &vms);
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE syntax */
cmd = vm_intro_pt(chan, &vms);
} else if (!strcasecmp(chan->language, "cz")) { /* CZECH syntax */
cmd = vm_intro_cz(chan, &vms);
} else { /* Default to ENGLISH */
cmd = vm_intro(chan, &vms);
}
cmd = vm_intro(chan, &vms);
vms.repeats = 0;
vms.starting = 1;
while((cmd > -1) && (cmd != 't') && (cmd != '#')) {
@@ -3358,13 +3468,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
vms.curmsg = 0;
/* Fall through */
case '5':
if (!strcasecmp(chan->language, "es")) { /* SPANISH */
cmd = vm_browse_messages_es(chan, &vms, vmu);
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE */
cmd = vm_browse_messages_pt(chan, &vms, vmu);
} else { /* Default to English syntax */
cmd = vm_browse_messages(chan, &vms, vmu);
}
cmd = vm_browse_messages(chan, &vms, vmu);
break;
case '2': /* Change folders */
if (useadsi)
@@ -3380,17 +3484,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
}
if (useadsi)
adsi_status2(chan, &vms);
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* SPANISH or PORTUGUESE */
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-messages");
if (!cmd)
cmd = ast_play_and_wait(chan, vms.vmbox);
} else { /* Default to English syntax */
if (!cmd)
cmd = ast_play_and_wait(chan, vms.vmbox);
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-messages");
}
if (!cmd)
cmd = vm_play_folder_name(chan, vms.vmbox);
vms.starting = 1;
break;
case '3': /* Advanced options */
@@ -3549,21 +3644,9 @@ static int vm_execmain(struct ast_channel *chan, void *data)
cmd = say_and_wait(chan, vms.curmsg + 1, chan->language);
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-savedto");
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* SPANISH or PORTUGUESE */
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-messages");
if (!cmd) {
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
cmd = ast_play_and_wait(chan, vms.fn);
}
} else { /* Default to English */
if (!cmd) {
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
cmd = ast_play_and_wait(chan, vms.fn);
}
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-messages");
}
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
if (!cmd)
cmd = vm_play_folder_name(chan, vms.fn);
if (skipaftercmd) {
if (vms.curmsg < vms.lastmsg) {
vms.curmsg++;
@@ -3577,17 +3660,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
case '*':
if (!vms.starting) {
cmd = ast_play_and_wait(chan, "vm-onefor");
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* Spanish or Portuguese syntax */
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-messages");
if (!cmd)
cmd = ast_play_and_wait(chan, vms.vmbox);
} else {
if (!cmd)
cmd = ast_play_and_wait(chan, vms.vmbox);
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-messages");
}
if (!cmd)
cmd = vm_play_folder_name(chan, vms.vmbox);
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-opts");
if (!cmd)
@@ -3800,7 +3874,7 @@ static int handle_show_voicemail_users(int fd, int argc, char *argv[])
if ((vmdir = opendir(dirname))) {
/* No matter what the format of VM, there will always be a .txt file for each message. */
while ((vment = readdir(vmdir)))
if (!strncmp(vment->d_name + 7,".txt",4))
if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
vmcount++;
closedir(vmdir);
}
@@ -3924,7 +3998,7 @@ static int load_config(void)
zonesl = NULL;
users = NULL;
usersl = NULL;
memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd) - 1);
memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
if (cfg) {
/* General settings */
@@ -4526,7 +4600,7 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration)
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir)
{
/* Record message & let caller review or re-record it, or set options if applicable */
int res = 0;
@@ -4579,14 +4653,12 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
}
recorded = 1;
/* After an attempt has been made to record message, we have to take care of INTRO and beep for incoming messages, but not for greetings */
cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence);
cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence, unlockdir);
if (cmd == -1)
/* User has hung up, no options to give */
return res;
return cmd;
if (cmd == '0') {
/* Erase the message if 0 pushed during playback */
ast_play_and_wait(chan, "vm-deleted");
vm_delete(recordfile);
break;
} else if (cmd == '*') {
break;
}
@@ -4639,13 +4711,20 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
return 1;
#endif
case '0':
if (outsidecaller && vmu->operator) {
if (message_exists)
ast_play_and_wait(chan, "vm-msgsaved");
return cmd;
} else
cmd = ast_play_and_wait(chan, "vm-sorry");
break;
if (message_exists || recorded) {
cmd = ast_play_and_wait(chan, "vm-saveoper");
if (!cmd)
cmd = ast_waitfordigit(chan, 3000);
if (cmd == '1') {
ast_play_and_wait(chan, "vm-msgsaved");
cmd = '0';
} else {
ast_play_and_wait(chan, "vm-deleted");
vm_delete(recordfile);
cmd = '0';
}
}
return cmd;
default:
/* If the caller is an ouside caller, and the review option is enabled,
allow them to review the message, but let the owner of the box review
@@ -4681,7 +4760,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
}
}
if (outsidecaller)
ast_play_and_wait(chan, "vm-goodbye");
ast_play_and_wait(chan, "vm-goodbye");
if (cmd == 't')
cmd = 0;
return cmd;
@@ -4703,6 +4782,7 @@ static int vm_delete(char *file)
return ast_filedelete(file, NULL);
}
int usecount(void)
{
int res;

0
apps/app_waitforring.c Executable file → Normal file
View File

0
apps/app_zapateller.c Executable file → Normal file
View File

0
apps/app_zapbarge.c Executable file → Normal file
View File

27
apps/app_zapras.c Executable file → Normal file
View File

@@ -125,8 +125,14 @@ static void run_ras(struct ast_channel *chan, char *args)
int status;
int res;
int signalled = 0;
struct zt_bufferinfo bi;
struct zt_bufferinfo savebi;
int x;
res = ioctl(chan->fds[0], ZT_GET_BUFINFO, &savebi);
if(res) {
ast_log(LOG_WARNING, "Unable to check buffer policy on channel %s\n", chan->name);
return;
}
pid = spawn_ras(chan, args);
if (pid < 0) {
@@ -162,20 +168,11 @@ static void run_ras(struct ast_channel *chan, char *args)
x = 1;
ioctl(chan->fds[0], ZT_AUDIOMODE, &x);
/* Double check buffering too */
res = ioctl(chan->fds[0], ZT_GET_BUFINFO, &bi);
if (!res) {
/* XXX This is ZAP_BLOCKSIZE XXX */
bi.bufsize = 204;
bi.txbufpolicy = ZT_POLICY_IMMEDIATE;
bi.rxbufpolicy = ZT_POLICY_IMMEDIATE;
bi.numbufs = 4;
res = ioctl(chan->fds[0], ZT_SET_BUFINFO, &bi);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set buffer policy on channel %s\n", chan->name);
}
} else
ast_log(LOG_WARNING, "Unable to check buffer policy on channel %s\n", chan->name);
/* Restore saved values */
res = ioctl(chan->fds[0], ZT_SET_BUFINFO, &savebi);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set buffer policy on channel %s\n", chan->name);
}
break;
}
}

0
apps/app_zapscan.c Executable file → Normal file
View File

0
apps/enter.h Executable file → Normal file
View File

0
apps/leave.h Executable file → Normal file
View File

0
apps/rpt_flow.pdf Executable file → Normal file
View File

Some files were not shown because too many files have changed in this diff Show More