mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-19 04:17:43 +00:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
c23e7645fd | ||
|
00d6d3233f | ||
|
a7bea083ee | ||
|
7c322a0d90 | ||
|
4c710cd189 |
@@ -1,6 +0,0 @@
|
|||||||
asterisk
|
|
||||||
build.h
|
|
||||||
ast_expr.c
|
|
||||||
.version
|
|
||||||
.depend
|
|
||||||
.applied
|
|
4
CREDITS
Executable file → Normal file
4
CREDITS
Executable file → Normal file
@@ -58,12 +58,14 @@ Thorsten Lockert - OpenBSD, FreeBSD ports, making MacOS X port run on 10.3,
|
|||||||
bugs. tholo@sigmasoft.com
|
bugs. tholo@sigmasoft.com
|
||||||
Brian West - ODBC support and Bug Marshaling
|
Brian West - ODBC support and Bug Marshaling
|
||||||
William Waites - syslog support, SIP NAT traversal for SIP-UA. ww@styx.org
|
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 ===
|
=== OTHER CONTRIBUTIONS ===
|
||||||
John Todd - Monkey sounds and associated teletorture prompt
|
John Todd - Monkey sounds and associated teletorture prompt
|
||||||
|
|
||||||
=== HOLD MUSIC ===
|
=== HOLD MUSIC ===
|
||||||
Music provided by www.freeplaymusic.com
|
Music provided by www.opsound.org
|
||||||
|
|
||||||
=== OTHER SOURCE CODE IN ASTERISK ===
|
=== OTHER SOURCE CODE IN ASTERISK ===
|
||||||
|
|
||||||
|
275
CHANGES → ChangeLog
Executable file → Normal file
275
CHANGES → ChangeLog
Executable file → Normal 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 inband PRI indication detection
|
||||||
-- Fix for MGCP - always request digits if no RTP stream
|
-- Fix for MGCP - always request digits if no RTP stream
|
||||||
-- Fixed seg fault for ast_control_streamfile
|
-- Fixed seg fault for ast_control_streamfile
|
||||||
-- Added AGI over TCP support
|
|
||||||
-- Make pick-up extension configurable via features.conf
|
-- Make pick-up extension configurable via features.conf
|
||||||
|
-- Numerous other bug fixes
|
||||||
|
|
||||||
Asterisk 1.0.0
|
Asterisk 1.0.0
|
||||||
-- Use Q.931 standard cause codes for asterisk cause codes
|
-- Use Q.931 standard cause codes for asterisk cause codes
|
||||||
-- Bug fixes from the bug tracker
|
-- Bug fixes from the bug tracker
|
||||||
@@ -10,7 +281,7 @@ Asterisk 1.0-RC2
|
|||||||
-- Additional CDR backends
|
-- Additional CDR backends
|
||||||
-- Allow muted to reconnect
|
-- Allow muted to reconnect
|
||||||
-- Call parking improvements (including SIP parking support)
|
-- 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
|
-- GR-303 and Zap improvements
|
||||||
-- More bug fixes from the bug tracker
|
-- More bug fixes from the bug tracker
|
||||||
-- Improved FreeBSD/OpenBSD/MacOS X support
|
-- Improved FreeBSD/OpenBSD/MacOS X support
|
60
Makefile
Executable file → Normal file
60
Makefile
Executable file → Normal 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
|
OPTIONS+=-fomit-frame-pointer
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
MPG123TARG=linux
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(findstring BSD,${OSARCH}),BSD)
|
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)
|
ifeq (${OSARCH},FreeBSD)
|
||||||
OSVERSION=$(shell make -V OSVERSION -f /usr/share/mk/bsd.port.subdir.mk)
|
OSVERSION=$(shell make -V OSVERSION -f /usr/share/mk/bsd.port.subdir.mk)
|
||||||
CFLAGS+=$(if ${OSVERSION}<500016,-D_THREAD_SAFE)
|
CFLAGS+=$(shell if test ${OSVERSION} -lt 500016 ; then echo "-D_THREAD_SAFE"; fi)
|
||||||
LIBS+=$(if ${OSVERSION}<502102,-lc_r,-pthread)
|
LIBS+=$(shell if test ${OSVERSION} -lt 502102 ; then echo "-lc_r"; else echo "-pthread"; fi)
|
||||||
INCLUDE+=-I/usr/local/include
|
INCLUDE+=-I/usr/local/include
|
||||||
CFLAGS+=$(shell if [ -d /usr/local/include/spandsp ]; then echo "-I/usr/local/include/spandsp"; fi)
|
CFLAGS+=$(shell if [ -d /usr/local/include/spandsp ]; then echo "-I/usr/local/include/spandsp"; fi)
|
||||||
|
MPG123TARG=freebsd
|
||||||
endif # FreeBSD
|
endif # FreeBSD
|
||||||
|
|
||||||
ifeq (${OSARCH},NetBSD)
|
ifeq (${OSARCH},NetBSD)
|
||||||
CFLAGS+=-pthread
|
CFLAGS+=-pthread
|
||||||
INCLUDE+=-I/usr/local/include
|
INCLUDE+=-I/usr/local/include -I/usr/pkg/include
|
||||||
|
MPG123TARG=netbsd
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (${OSARCH},OpenBSD)
|
ifeq (${OSARCH},OpenBSD)
|
||||||
@@ -197,7 +200,7 @@ ifeq (${OSARCH},FreeBSD)
|
|||||||
LIBS+=-lcrypto
|
LIBS+=-lcrypto
|
||||||
endif
|
endif
|
||||||
ifeq (${OSARCH},NetBSD)
|
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
|
endif
|
||||||
ifeq (${OSARCH},OpenBSD)
|
ifeq (${OSARCH},OpenBSD)
|
||||||
LIBS=-lcrypto -lpthread -lm -lncurses
|
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 \
|
astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o \
|
||||||
utils.o
|
utils.o
|
||||||
ifeq (${OSARCH},Darwin)
|
ifeq (${OSARCH},Darwin)
|
||||||
OBJS+=poll.o dlfcn.o
|
|
||||||
ASTLINK=-Wl,-dynamic
|
ASTLINK=-Wl,-dynamic
|
||||||
SOLINK=-dynamic -bundle -undefined suppress -force_flat_namespace
|
SOLINK=-dynamic -bundle -undefined suppress -force_flat_namespace
|
||||||
|
OBJS+= poll.o
|
||||||
|
CFLAGS+=-DPOLLCOMPAT
|
||||||
else
|
else
|
||||||
ASTLINK=-Wl,-E
|
ASTLINK=-Wl,-E
|
||||||
SOLINK=-shared -Xlinker -x
|
SOLINK=-shared -Xlinker -x
|
||||||
endif
|
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
|
CC=gcc
|
||||||
INSTALL=install
|
INSTALL=install
|
||||||
|
|
||||||
@@ -307,7 +321,7 @@ clean:
|
|||||||
rm -f build.h
|
rm -f build.h
|
||||||
rm -f ast_expr.c
|
rm -f ast_expr.c
|
||||||
@if [ -e editline/Makefile ]; then $(MAKE) -C editline distclean ; fi
|
@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 db1-ast clean
|
||||||
$(MAKE) -C stdtime clean
|
$(MAKE) -C stdtime clean
|
||||||
|
|
||||||
@@ -339,7 +353,7 @@ datafiles: all
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
done
|
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 \
|
if grep -q "^%`basename $$x`%" sounds.txt; then \
|
||||||
install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
|
install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
|
||||||
else \
|
else \
|
||||||
@@ -374,6 +388,7 @@ bininstall: all
|
|||||||
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp
|
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp
|
||||||
install -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/
|
install -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/
|
||||||
install -m 755 contrib/scripts/astgenkey $(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 \
|
if [ ! -f $(DESTDIR)$(ASTSBINDIR)/safe_asterisk ]; then \
|
||||||
install -m 755 contrib/scripts/safe_asterisk $(DESTDIR)$(ASTSBINDIR)/ ;\
|
install -m 755 contrib/scripts/safe_asterisk $(DESTDIR)$(ASTSBINDIR)/ ;\
|
||||||
fi
|
fi
|
||||||
@@ -398,6 +413,9 @@ bininstall: all
|
|||||||
install -m 644 keys/iaxtel.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
|
install -m 644 keys/iaxtel.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
|
||||||
install -m 644 keys/freeworlddialup.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 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 \
|
if [ -d contrib/firmware/iax ]; then \
|
||||||
install -m 644 contrib/firmware/iax/iaxy.bin $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax/iaxy.bin; \
|
install -m 644 contrib/firmware/iax/iaxy.bin $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax/iaxy.bin; \
|
||||||
else \
|
else \
|
||||||
@@ -405,7 +423,7 @@ bininstall: all
|
|||||||
fi
|
fi
|
||||||
( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds ; ln -s $(ASTSPOOLDIR)/vm . )
|
( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds ; ln -s $(ASTSPOOLDIR)/vm . )
|
||||||
( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds ; ln -s $(ASTSPOOLDIR)/voicemail . )
|
( 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 " +---- Asterisk Installation Complete -------+"
|
||||||
@echo " + +"
|
@echo " + +"
|
||||||
@echo " + YOU MUST READ THE SECURITY DOCUMENT +"
|
@echo " + YOU MUST READ THE SECURITY DOCUMENT +"
|
||||||
@@ -427,6 +445,19 @@ bininstall: all
|
|||||||
@echo " + **Note** This requires that you have +"
|
@echo " + **Note** This requires that you have +"
|
||||||
@echo " + doxygen installed on your local system +"
|
@echo " + doxygen installed on your local system +"
|
||||||
@echo " +-------------------------------------------+"
|
@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
|
install: all datafiles bininstall
|
||||||
|
|
||||||
@@ -518,7 +549,7 @@ mpg123:
|
|||||||
@wget -V >/dev/null || (echo "You need wget" ; false )
|
@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
|
[ -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
|
[ -d mpg123-0.59r ] || tar xfz mpg123-0.59r.tar.gz
|
||||||
make -C mpg123-0.59r linux
|
$(MAKE) -C mpg123-0.59r $(MPG123TARG)
|
||||||
|
|
||||||
config:
|
config:
|
||||||
if [ -d /etc/rc.d/init.d ]; then \
|
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
|
for x in $(SUBDIRS); do $(MAKE) -C $$x depend || exit 1 ; done
|
||||||
|
|
||||||
.depend:
|
.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`
|
./mkdep ${CFLAGS} `ls *.c`
|
||||||
|
|
||||||
FORCE:
|
FORCE:
|
||||||
|
|
||||||
%_env:
|
%_env:
|
||||||
make -C $(shell echo $@ | sed "s/_env//g") env
|
$(MAKE) -C $(shell echo $@ | sed "s/_env//g") env
|
||||||
|
|
||||||
env:
|
env:
|
||||||
env
|
env
|
||||||
|
61
README
Executable file → Normal file
61
README
Executable file → Normal 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
|
the channels 25 through 47 of the tormenta card, obtaining the settings
|
||||||
from the variables specified above.
|
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
|
* MORE INFORMATION
|
||||||
|
|
||||||
See the doc directory for more documentation.
|
See the doc directory for more documentation.
|
||||||
|
@@ -1,8 +0,0 @@
|
|||||||
About Hold Music
|
|
||||||
================
|
|
||||||
Digium has licensed the music included with
|
|
||||||
the Asterisk distribution From FreePlayMusic
|
|
||||||
for use and distribution with Asterisk. It
|
|
||||||
is licensed ONLY for use as hold music within
|
|
||||||
an Asterisk based PBX.
|
|
||||||
|
|
22
README.opsound
Normal file
22
README.opsound
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
About Hold Music
|
||||||
|
================
|
||||||
|
These files were obtained from http://opsound.org, where the authors placed them
|
||||||
|
under the Creative Commons Attribution-Share Alike 2.5 license, a copy of which
|
||||||
|
may be found at http://creativecommons.org.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
================
|
||||||
|
macroform-cold_day - Paul Shuler (Macroform)
|
||||||
|
paulshuler@gmail.com - http://macroform.bandcamp.com/
|
||||||
|
|
||||||
|
macroform-robot_dity - Paul Shuler (Macroform)
|
||||||
|
paulshuler@gmail.com - http://macroform.bandcamp.com/
|
||||||
|
|
||||||
|
macroform-the_simplicity - Paul Shuler (Macroform)
|
||||||
|
paulshuler@gmail.com - http://macroform.bandcamp.com/
|
||||||
|
|
||||||
|
manolo_camp-morning_coffee - Manolo Camp
|
||||||
|
beatbastard@gmx.net - http://ccmixter.org/people/ManoloCamp
|
||||||
|
|
||||||
|
reno_project-system - Reno Project
|
||||||
|
renoproject@hotmail.com - http://www.jamendo.com/en/album/23661
|
36
acl.c
Executable file → Normal file
36
acl.c
Executable file → Normal file
@@ -242,20 +242,19 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
|
|||||||
|
|
||||||
memset(&m_rtmsg, 0, sizeof(m_rtmsg));
|
memset(&m_rtmsg, 0, sizeof(m_rtmsg));
|
||||||
m_rtmsg.m_rtm.rtm_type = RTM_GET;
|
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;
|
m_rtmsg.m_rtm.rtm_version = RTM_VERSION;
|
||||||
ast_mutex_lock(&routeseq_lock);
|
ast_mutex_lock(&routeseq_lock);
|
||||||
seq = ++routeseq;
|
seq = ++routeseq;
|
||||||
ast_mutex_unlock(&routeseq_lock);
|
ast_mutex_unlock(&routeseq_lock);
|
||||||
m_rtmsg.m_rtm.rtm_seq = seq;
|
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);
|
m_rtmsg.m_rtm.rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
|
||||||
sin = (struct sockaddr_in *)m_rtmsg.m_space;
|
sin = (struct sockaddr_in *)m_rtmsg.m_space;
|
||||||
sin->sin_family = AF_INET;
|
sin->sin_family = AF_INET;
|
||||||
sin->sin_len = sizeof(struct sockaddr_in);
|
sin->sin_len = sizeof(struct sockaddr_in);
|
||||||
sin->sin_addr = *them;
|
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");
|
ast_log(LOG_ERROR, "Error opening routing socket\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -268,7 +267,7 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
|
|||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
l = read(s, (char *)&m_rtmsg, sizeof(m_rtmsg));
|
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 (l < 0) {
|
||||||
if (errno != EAGAIN)
|
if (errno != EAGAIN)
|
||||||
ast_log(LOG_ERROR, "Error reading from routing socket\n");
|
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;
|
return 0;
|
||||||
#endif
|
#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
0
aescrypt.c
Executable file → Normal file
19
aesopt.h
Executable file → Normal file
19
aesopt.h
Executable file → Normal file
@@ -136,6 +136,7 @@
|
|||||||
#define _AESOPT_H
|
#define _AESOPT_H
|
||||||
|
|
||||||
#include <asterisk/aes.h>
|
#include <asterisk/aes.h>
|
||||||
|
#include "asterisk/endian.h"
|
||||||
|
|
||||||
/* CONFIGURATION - USE OF DEFINES
|
/* CONFIGURATION - USE OF DEFINES
|
||||||
|
|
||||||
@@ -146,24 +147,6 @@
|
|||||||
#if clauses.
|
#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
|
/* BYTE ORDER IN 32-BIT WORDS
|
||||||
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
eagi-test
|
|
||||||
eagi-sphinx-test
|
|
||||||
.depend
|
|
0
agi/DialAnMp3.agi
Executable file → Normal file
0
agi/DialAnMp3.agi
Executable file → Normal file
0
agi/Makefile
Executable file → Normal file
0
agi/Makefile
Executable file → Normal file
0
agi/agi-test.agi
Executable file → Normal file
0
agi/agi-test.agi
Executable file → Normal file
0
agi/eagi-sphinx-test.c
Executable file → Normal file
0
agi/eagi-sphinx-test.c
Executable file → Normal file
0
agi/eagi-test.c
Executable file → Normal file
0
agi/eagi-test.c
Executable file → Normal file
0
agi/fastagi-test
Executable file → Normal file
0
agi/fastagi-test
Executable file → Normal file
0
agi/numeralize
Executable file → Normal file
0
agi/numeralize
Executable file → Normal file
111
app.c
Executable file → Normal file
111
app.c
Executable file → Normal file
@@ -136,6 +136,13 @@ int ast_app_getvoice(struct ast_channel *c, char *dest, char *dstfmt, char *prom
|
|||||||
ast_frfree(f);
|
ast_frfree(f);
|
||||||
break;
|
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);
|
ast_frfree(f);
|
||||||
}
|
}
|
||||||
@@ -278,7 +285,7 @@ int ast_dtmf_stream(struct ast_channel *chan,struct ast_channel *peer,char *digi
|
|||||||
if (!res) {
|
if (!res) {
|
||||||
res = ast_waitfor(chan,100);
|
res = ast_waitfor(chan,100);
|
||||||
if (res > -1) {
|
if (res > -1) {
|
||||||
for (ptr=digits;*ptr;*ptr++) {
|
for (ptr=digits; *ptr; ptr++) {
|
||||||
if (*ptr == 'w') {
|
if (*ptr == 'w') {
|
||||||
res = ast_safe_sleep(chan, 500);
|
res = ast_safe_sleep(chan, 500);
|
||||||
if (res)
|
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_silence_threshold = 128;
|
||||||
static int global_maxsilence = 0;
|
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];
|
char comment[256];
|
||||||
int x, fmtcnt=1, res=-1,outmsg=0;
|
int x, fmtcnt=1, res=-1,outmsg=0;
|
||||||
struct ast_frame *f;
|
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 *sfmt[MAX_OTHER_FORMATS];
|
||||||
char *stringp=NULL;
|
char *stringp=NULL;
|
||||||
time_t start, end;
|
time_t start, end;
|
||||||
struct ast_dsp *sildet; /* silence detector dsp */
|
struct ast_dsp *sildet=NULL; /* silence detector dsp */
|
||||||
int totalsilence = 0;
|
int totalsilence = 0;
|
||||||
int dspsilence = 0;
|
int dspsilence = 0;
|
||||||
int gotsilence = 0; /* did we timeout for silence? */
|
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 (path)
|
||||||
if (!sildet) {
|
ast_unlock_path(path);
|
||||||
ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ast_dsp_set_threshold(sildet, silencethreshold);
|
|
||||||
|
|
||||||
if (maxsilence > 0) {
|
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;
|
rfmt = chan->readformat;
|
||||||
res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
|
res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
|
ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
|
||||||
|
ast_dsp_free(sildet);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -640,13 +652,13 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
|
|||||||
totalsilence = 0;
|
totalsilence = 0;
|
||||||
|
|
||||||
if (totalsilence > maxsilence) {
|
if (totalsilence > maxsilence) {
|
||||||
/* Ended happily with silence */
|
/* Ended happily with silence */
|
||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
|
ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
|
||||||
ast_frfree(f);
|
ast_frfree(f);
|
||||||
gotsilence = 1;
|
gotsilence = 1;
|
||||||
outmsg=2;
|
outmsg=2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Exit on any error */
|
/* 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++) {
|
for (x=0;x<fmtcnt;x++) {
|
||||||
if (!others[x])
|
if (!others[x])
|
||||||
break;
|
break;
|
||||||
if (totalsilence)
|
if (res > 0) {
|
||||||
ast_stream_rewind(others[x], totalsilence-200);
|
if (totalsilence)
|
||||||
else
|
ast_stream_rewind(others[x], totalsilence-200);
|
||||||
ast_stream_rewind(others[x], 200);
|
else
|
||||||
|
ast_stream_rewind(others[x], 200);
|
||||||
|
}
|
||||||
ast_truncstream(others[x]);
|
ast_truncstream(others[x]);
|
||||||
ast_closestream(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);
|
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 */
|
/* Let them know recording is stopped */
|
||||||
ast_streamfile(chan, "auth-thankyou", chan->language);
|
if(!ast_streamfile(chan, "auth-thankyou", chan->language))
|
||||||
ast_waitstream(chan, "");
|
ast_waitstream(chan, "");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (sildet)
|
||||||
|
ast_dsp_free(sildet);
|
||||||
return res;
|
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)
|
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];
|
char comment[256];
|
||||||
int x, fmtcnt=1, res=-1,outmsg=0;
|
int x, fmtcnt=1, res=-1,outmsg=0;
|
||||||
struct ast_frame *f;
|
struct ast_frame *f;
|
||||||
@@ -961,3 +975,46 @@ int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordf
|
|||||||
return res;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
.depend
|
|
0
apps/Makefile
Executable file → Normal file
0
apps/Makefile
Executable file → Normal file
0
apps/app_adsiprog.c
Executable file → Normal file
0
apps/app_adsiprog.c
Executable file → Normal file
2
apps/app_alarmreceiver.c
Executable file → Normal file
2
apps/app_alarmreceiver.c
Executable file → Normal file
@@ -55,7 +55,7 @@ static char *tdesc = "Alarm Receiver for Asterisk";
|
|||||||
|
|
||||||
static char *app = "AlarmReceiver";
|
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 =
|
static char *descrip =
|
||||||
"Alarm receiver application for Asterisk. Only 1 signalling format is supported at this time:\n"
|
"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"
|
"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
0
apps/app_authenticate.c
Executable file → Normal file
0
apps/app_cdr.c
Executable file → Normal file
0
apps/app_cdr.c
Executable file → Normal file
11
apps/app_chanisavail.c
Executable file → Normal file
11
apps/app_chanisavail.c
Executable file → Normal file
@@ -38,11 +38,12 @@ static char *descrip =
|
|||||||
"Checks is any of the requested channels are available. If none\n"
|
"Checks is any of the requested channels are available. If none\n"
|
||||||
"of the requested channels are available the new priority will be\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"
|
"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"
|
"case ChanIsAvail will return -1).\n"
|
||||||
"are available, the next priority will be n+1, the channel variable\n"
|
"If any of the requested channels are available, the next priority will be n+1,\n"
|
||||||
"${AVAILCHAN} will be set to the name of the available channel and\n"
|
"the channel variable ${AVAILCHAN} will be set to the name of the available channel\n"
|
||||||
"the ChanIsAvail app will return 0. ${AVAILORIGCHAN} is\n"
|
"and the ChanIsAvail app will return 0.\n"
|
||||||
"the canonical channel name that was used to create the channel.\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;
|
STANDARD_LOCAL_USER;
|
||||||
|
|
||||||
|
15
apps/app_controlplayback.c
Executable file → Normal file
15
apps/app_controlplayback.c
Executable file → Normal file
@@ -64,24 +64,19 @@ static int controlplayback_exec(struct ast_channel *chan, void *data)
|
|||||||
file = tmp;
|
file = tmp;
|
||||||
|
|
||||||
if ((skip=strchr(tmp,'|'))) {
|
if ((skip=strchr(tmp,'|'))) {
|
||||||
*skip = '\0';
|
*skip++ = '\0';
|
||||||
*skip++;
|
|
||||||
fwd=strchr(skip,'|');
|
fwd=strchr(skip,'|');
|
||||||
if (fwd) {
|
if (fwd) {
|
||||||
*fwd = '\0';
|
*fwd++ = '\0';
|
||||||
*fwd++;
|
|
||||||
rev = strchr(fwd,'|');
|
rev = strchr(fwd,'|');
|
||||||
if (rev) {
|
if (rev) {
|
||||||
*rev = '\0';
|
*rev++ = '\0';
|
||||||
*rev++;
|
|
||||||
stop = strchr(rev,'|');
|
stop = strchr(rev,'|');
|
||||||
if (stop) {
|
if (stop) {
|
||||||
*stop = '\0';
|
*stop++ = '\0';
|
||||||
*stop++;
|
|
||||||
pause = strchr(stop,'|');
|
pause = strchr(stop,'|');
|
||||||
if (pause) {
|
if (pause) {
|
||||||
*pause = '\0';
|
*pause++ = '\0';
|
||||||
*pause++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
4
apps/app_cut.c
Executable file → Normal file
4
apps/app_cut.c
Executable file → Normal file
@@ -31,10 +31,10 @@ static char *tdesc = "Cuts up variables";
|
|||||||
|
|
||||||
static char *app_cut = "Cut";
|
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 =
|
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"
|
" newvar - new variable created from result string\n"
|
||||||
" varname - variable you want cut\n"
|
" varname - variable you want cut\n"
|
||||||
" delimiter - defaults to '-'\n"
|
" delimiter - defaults to '-'\n"
|
||||||
|
0
apps/app_datetime.c
Executable file → Normal file
0
apps/app_datetime.c
Executable file → Normal file
0
apps/app_db.c
Executable file → Normal file
0
apps/app_db.c
Executable file → Normal file
42
apps/app_dial.c
Executable file → Normal file
42
apps/app_dial.c
Executable file → Normal file
@@ -113,6 +113,7 @@ struct localuser {
|
|||||||
int allowdisconnect_in;
|
int allowdisconnect_in;
|
||||||
int allowdisconnect_out;
|
int allowdisconnect_out;
|
||||||
int forcecallerid;
|
int forcecallerid;
|
||||||
|
int noforwardhtml;
|
||||||
struct localuser *next;
|
struct localuser *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -134,7 +135,7 @@ static void hanguptree(struct localuser *outgoing, struct ast_channel *exception
|
|||||||
|
|
||||||
#define AST_MAX_WATCHERS 256
|
#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;
|
struct localuser *o;
|
||||||
int found;
|
int found;
|
||||||
@@ -207,6 +208,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
|||||||
*allowredir_out = o->allowredirect_out;
|
*allowredir_out = o->allowredirect_out;
|
||||||
*allowdisconnect_in = o->allowdisconnect_in;
|
*allowdisconnect_in = o->allowdisconnect_in;
|
||||||
*allowdisconnect_out = o->allowdisconnect_out;
|
*allowdisconnect_out = o->allowdisconnect_out;
|
||||||
|
*noforwardhtml = o->noforwardhtml;
|
||||||
}
|
}
|
||||||
} else if (o->chan && (o->chan == winner)) {
|
} else if (o->chan && (o->chan == winner)) {
|
||||||
if (!ast_strlen_zero(o->chan->call_forward)) {
|
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;
|
*allowredir_out = o->allowredirect_out;
|
||||||
*allowdisconnect_in = o->allowdisconnect_in;
|
*allowdisconnect_in = o->allowdisconnect_in;
|
||||||
*allowdisconnect_out = o->allowdisconnect_out;
|
*allowdisconnect_out = o->allowdisconnect_out;
|
||||||
|
*noforwardhtml = o->noforwardhtml;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AST_CONTROL_BUSY:
|
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:
|
case AST_CONTROL_PROGRESS:
|
||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
ast_verbose ( VERBOSE_PREFIX_3 "%s is making progress passing it to %s\n", o->chan->name,in->name);
|
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;
|
break;
|
||||||
case AST_CONTROL_OFFHOOK:
|
case AST_CONTROL_OFFHOOK:
|
||||||
/* Ignore going off hook */
|
/* Ignore going off hook */
|
||||||
break;
|
break;
|
||||||
case -1:
|
case -1:
|
||||||
if (!outgoing->ringbackonly && !outgoing->musiconhold) {
|
if (!(outgoing->ringbackonly || outgoing->musiconhold)) {
|
||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
ast_verbose( VERBOSE_PREFIX_3 "%s stopped sounds\n", o->chan->name);
|
ast_verbose( VERBOSE_PREFIX_3 "%s stopped sounds\n", o->chan->name);
|
||||||
ast_indicate(in, -1);
|
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)) {
|
!(outgoing->ringbackonly || outgoing->musiconhold)) {
|
||||||
if (ast_write(in, f))
|
if (ast_write(in, f))
|
||||||
ast_log(LOG_WARNING, "Unable to forward image\n");
|
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);
|
ast_frfree(f);
|
||||||
} else {
|
} else {
|
||||||
in->hangupcause = o->chan->hangupcause;
|
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 */
|
/* Got hung up */
|
||||||
*to=-1;
|
*to=-1;
|
||||||
strncpy(status, "CANCEL", statussize - 1);
|
strncpy(status, "CANCEL", statussize - 1);
|
||||||
|
if (f)
|
||||||
|
ast_frfree(f);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (f && (f->frametype == AST_FRAME_DTMF) && *allowdisconnect_out &&
|
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);
|
ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
|
||||||
*to=0;
|
*to=0;
|
||||||
strcpy(status, "CANCEL");
|
strcpy(status, "CANCEL");
|
||||||
|
ast_frfree(f);
|
||||||
return NULL;
|
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 (single && ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_DTMF))) {
|
||||||
if (ast_write(outgoing->chan, f))
|
if (ast_write(outgoing->chan, f))
|
||||||
ast_log(LOG_WARNING, "Unable to forward voice\n");
|
ast_log(LOG_WARNING, "Unable to forward voice\n");
|
||||||
ast_frfree(f);
|
|
||||||
}
|
}
|
||||||
|
ast_frfree(f);
|
||||||
}
|
}
|
||||||
if (!*to && (option_verbose > 2))
|
if (!*to && (option_verbose > 2))
|
||||||
ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", orig);
|
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 allowredir_out=0;
|
||||||
int allowdisconnect_in=0;
|
int allowdisconnect_in=0;
|
||||||
int allowdisconnect_out=0;
|
int allowdisconnect_out=0;
|
||||||
|
int noforwardhtml=0;
|
||||||
int hasmacro = 0;
|
int hasmacro = 0;
|
||||||
int privacy=0;
|
int privacy=0;
|
||||||
int announce=0;
|
int announce=0;
|
||||||
@@ -726,6 +745,9 @@ static int dial_exec(struct ast_channel *chan, void *data)
|
|||||||
if (strchr(transfer, 'f'))
|
if (strchr(transfer, 'f'))
|
||||||
tmp->forcecallerid = 1;
|
tmp->forcecallerid = 1;
|
||||||
else tmp->forcecallerid = 0;
|
else tmp->forcecallerid = 0;
|
||||||
|
if (url)
|
||||||
|
tmp->noforwardhtml = 1;
|
||||||
|
else tmp->noforwardhtml = 0;
|
||||||
}
|
}
|
||||||
strncpy(numsubst, number, sizeof(numsubst)-1);
|
strncpy(numsubst, number, sizeof(numsubst)-1);
|
||||||
/* If we're dialing by extension, look at the extension to know what to dial */
|
/* 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;
|
cur = rest;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
pbx_builtin_setvar_helper(tmp->chan, "DIALEDPEERNUMBER", numsubst);
|
||||||
if (!ast_strlen_zero(tmp->chan->call_forward)) {
|
if (!ast_strlen_zero(tmp->chan->call_forward)) {
|
||||||
char tmpchan[256]="";
|
char tmpchan[256]="";
|
||||||
char *stuff;
|
char *stuff;
|
||||||
@@ -879,7 +902,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
|
|||||||
strncpy(status, "CHANUNAVAIL", sizeof(status) - 1);
|
strncpy(status, "CHANUNAVAIL", sizeof(status) - 1);
|
||||||
|
|
||||||
time(&start_time);
|
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 (!peer) {
|
||||||
if (to)
|
if (to)
|
||||||
@@ -908,8 +931,11 @@ static int dial_exec(struct ast_channel *chan, void *data)
|
|||||||
ast_cdr_setdestchan(chan->cdr, peer->name);
|
ast_cdr_setdestchan(chan->cdr, peer->name);
|
||||||
if (peer->name)
|
if (peer->name)
|
||||||
pbx_builtin_setvar_helper(chan, "DIALEDPEERNAME", 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 */
|
/* JDG: sendurl */
|
||||||
if( url && !ast_strlen_zero(url) && ast_channel_supports_html(peer) ) {
|
if( url && !ast_strlen_zero(url) && ast_channel_supports_html(peer) ) {
|
||||||
ast_log(LOG_DEBUG, "app_dial: sendurl=%s.\n", url);
|
ast_log(LOG_DEBUG, "app_dial: sendurl=%s.\n", url);
|
||||||
@@ -1029,7 +1055,7 @@ out:
|
|||||||
|
|
||||||
LOCAL_USER_REMOVE(u);
|
LOCAL_USER_REMOVE(u);
|
||||||
|
|
||||||
if((go_on>0) && (!chan->_softhangup))
|
if((go_on>0) && (!chan->_softhangup) && (res != AST_PBX_KEEPALIVE))
|
||||||
res=0;
|
res=0;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
0
apps/app_directory.c
Executable file → Normal file
0
apps/app_directory.c
Executable file → Normal file
22
apps/app_disa.c
Executable file → Normal file
22
apps/app_disa.c
Executable file → Normal file
@@ -22,6 +22,7 @@
|
|||||||
#include <asterisk/module.h>
|
#include <asterisk/module.h>
|
||||||
#include <asterisk/translate.h>
|
#include <asterisk/translate.h>
|
||||||
#include <asterisk/ulaw.h>
|
#include <asterisk/ulaw.h>
|
||||||
|
#include <asterisk/utils.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -161,7 +162,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
|
|||||||
|
|
||||||
if (!strcasecmp(tmp, "no-password"))
|
if (!strcasecmp(tmp, "no-password"))
|
||||||
{;
|
{;
|
||||||
k = 1;
|
k |= 1; /* We have the password */
|
||||||
ast_log(LOG_DEBUG, "DISA no-password login success\n");
|
ast_log(LOG_DEBUG, "DISA no-password login success\n");
|
||||||
}
|
}
|
||||||
gettimeofday(&lastdigittime,NULL);
|
gettimeofday(&lastdigittime,NULL);
|
||||||
@@ -173,10 +174,10 @@ static int disa_exec(struct ast_channel *chan, void *data)
|
|||||||
gettimeofday(&now,NULL);
|
gettimeofday(&now,NULL);
|
||||||
/* if outa time, give em reorder */
|
/* if outa time, give em reorder */
|
||||||
if (ms_diff(&now,&lastdigittime) >
|
if (ms_diff(&now,&lastdigittime) >
|
||||||
((k) ? digittimeout : firstdigittimeout))
|
((k&2) ? digittimeout : firstdigittimeout))
|
||||||
{
|
{
|
||||||
ast_log(LOG_DEBUG,"DISA %s entry timeout on chan %s\n",
|
ast_log(LOG_DEBUG,"DISA %s entry timeout on chan %s\n",
|
||||||
((k) ? "extension" : "password"),chan->name);
|
((k&1) ? "extension" : "password"),chan->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((res = ast_waitfor(chan, -1) < 0)) {
|
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 */
|
j = f->subclass; /* save digit */
|
||||||
ast_frfree(f);
|
ast_frfree(f);
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
|
{
|
||||||
|
k|=2; /* We have the first digit */
|
||||||
ast_playtones_stop(chan);
|
ast_playtones_stop(chan);
|
||||||
|
}
|
||||||
gettimeofday(&lastdigittime,NULL);
|
gettimeofday(&lastdigittime,NULL);
|
||||||
/* got a DTMF tone */
|
/* got a DTMF tone */
|
||||||
if (i < AST_MAX_EXTENSION) /* if still valid number of digits */
|
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 */
|
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);
|
ast_log(LOG_DEBUG,"DISA on chan %s password is good\n",chan->name);
|
||||||
play_dialtone(chan);
|
play_dialtone(chan);
|
||||||
|
|
||||||
k = 1;
|
k|=1; /* In number mode */
|
||||||
i = 0; /* re-set buffer pointer */
|
i = 0; /* re-set buffer pointer */
|
||||||
exten[sizeof(acctcode)] = 0;
|
exten[sizeof(acctcode)] = 0;
|
||||||
strncpy(acctcode,exten, sizeof(acctcode) - 1);
|
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++] = j; /* save digit */
|
||||||
exten[i] = 0;
|
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 this exists */
|
||||||
|
|
||||||
if (ast_ignore_pattern(ourcontext, exten)) {
|
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);
|
ast_playtones_stop(chan);
|
||||||
/* We're authenticated and have a valid extension */
|
/* 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->exten, exten, sizeof(chan->exten) - 1);
|
||||||
strncpy(chan->context, ourcontext, sizeof(chan->context) - 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;
|
chan->priority = 0;
|
||||||
ast_cdr_init(chan->cdr,chan);
|
ast_cdr_init(chan->cdr,chan);
|
||||||
LOCAL_USER_REMOVE(u);
|
LOCAL_USER_REMOVE(u);
|
||||||
|
0
apps/app_echo.c
Executable file → Normal file
0
apps/app_echo.c
Executable file → Normal file
0
apps/app_enumlookup.c
Executable file → Normal file
0
apps/app_enumlookup.c
Executable file → Normal file
4
apps/app_eval.c
Executable file → Normal file
4
apps/app_eval.c
Executable file → Normal file
@@ -31,10 +31,10 @@ static char *tdesc = "Reevaluates strings";
|
|||||||
|
|
||||||
static char *app_eval = "Eval";
|
static char *app_eval = "Eval";
|
||||||
|
|
||||||
static char *eval_synopsis = "Eval(newvar=somestring)";
|
static char *eval_synopsis = "Evaluates a string";
|
||||||
|
|
||||||
static char *eval_descrip =
|
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"
|
" 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"
|
"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"
|
"the answer, by allowing a string to be evaluated twice in the dialplan,\n"
|
||||||
|
0
apps/app_exec.c
Executable file → Normal file
0
apps/app_exec.c
Executable file → Normal file
7
apps/app_festival.c
Executable file → Normal file
7
apps/app_festival.c
Executable file → Normal file
@@ -131,7 +131,6 @@ static int send_waveform_to_fd(char *waveform, int length, int fd) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
write(fd,waveform,length);
|
write(fd,waveform,length);
|
||||||
write(fd,"a",1);
|
|
||||||
close(fd);
|
close(fd);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
@@ -305,9 +304,9 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
|||||||
if (!(festivalcommand = ast_variable_retrieve(cfg, "general", "festivalcommand"))) {
|
if (!(festivalcommand = ast_variable_retrieve(cfg, "general", "festivalcommand"))) {
|
||||||
festivalcommand = "(tts_textasterisk \"%s\" 'file)(quit)\n";
|
festivalcommand = "(tts_textasterisk \"%s\" 'file)(quit)\n";
|
||||||
}
|
}
|
||||||
ast_destroy(cfg);
|
|
||||||
if (!vdata || ast_strlen_zero(vdata)) {
|
if (!vdata || ast_strlen_zero(vdata)) {
|
||||||
ast_log(LOG_WARNING, "festival requires an argument (text)\n");
|
ast_log(LOG_WARNING, "festival requires an argument (text)\n");
|
||||||
|
ast_destroy(cfg);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
strncpy(data, vdata, sizeof(data) - 1);
|
strncpy(data, vdata, sizeof(data) - 1);
|
||||||
@@ -325,6 +324,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
|||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
ast_log(LOG_WARNING,"festival_client: can't get socket\n");
|
ast_log(LOG_WARNING,"festival_client: can't get socket\n");
|
||||||
|
ast_destroy(cfg);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(&serv_addr, 0, sizeof(serv_addr));
|
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);
|
serverhost = ast_gethostbyname(host, &ahp);
|
||||||
if (serverhost == (struct hostent *)0) {
|
if (serverhost == (struct hostent *)0) {
|
||||||
ast_log(LOG_WARNING,"festival_client: gethostbyname failed\n");
|
ast_log(LOG_WARNING,"festival_client: gethostbyname failed\n");
|
||||||
|
ast_destroy(cfg);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length);
|
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) {
|
if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0) {
|
||||||
ast_log(LOG_WARNING,"festival_client: connect to server failed\n");
|
ast_log(LOG_WARNING,"festival_client: connect to server failed\n");
|
||||||
|
ast_destroy(cfg);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -444,6 +446,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
|||||||
}
|
}
|
||||||
} while (strcmp(ack,"OK\n") != 0);
|
} while (strcmp(ack,"OK\n") != 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
ast_destroy(cfg);
|
||||||
LOCAL_USER_REMOVE(u);
|
LOCAL_USER_REMOVE(u);
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
0
apps/app_flash.c
Executable file → Normal file
0
apps/app_flash.c
Executable file → Normal file
7
apps/app_forkcdr.c
Executable file → Normal file
7
apps/app_forkcdr.c
Executable file → Normal file
@@ -20,10 +20,11 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <pthread.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 *app = "ForkCDR";
|
||||||
static char *synopsis =
|
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"
|
" ForkCDR(): Causes the Call Data Record to fork an additional\n"
|
||||||
"cdr record starting from the time of the fork call\n";
|
"cdr record starting from the time of the fork call\n";
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ int unload_module(void)
|
|||||||
|
|
||||||
int load_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)
|
char *description(void)
|
||||||
|
10
apps/app_getcpeid.c
Executable file → Normal file
10
apps/app_getcpeid.c
Executable file → Normal file
@@ -3,9 +3,9 @@
|
|||||||
*
|
*
|
||||||
* Execute arbitrary system commands
|
* 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
|
* This program is free software, distributed under the terms of
|
||||||
* the GNU General Public License
|
* the GNU General Public License
|
||||||
@@ -31,9 +31,9 @@ static char *app = "GetCPEID";
|
|||||||
static char *synopsis = "Get ADSI CPE ID";
|
static char *synopsis = "Get ADSI CPE ID";
|
||||||
|
|
||||||
static char *descrip =
|
static char *descrip =
|
||||||
" GetCPEID: Obtains and displays CPE ID and other information in order to\n"
|
" GetCPEID: Obtains and displays ADSI CPE ID and other information in order\n"
|
||||||
"properly setup zapata.conf for on-hook operations. Returns -1 on hanup\n"
|
"to properly setup zapata.conf for on-hook operations.\n"
|
||||||
"only.";
|
"Returns -1 on hangup only.\n";
|
||||||
|
|
||||||
STANDARD_LOCAL_USER;
|
STANDARD_LOCAL_USER;
|
||||||
|
|
||||||
|
0
apps/app_groupcount.c
Executable file → Normal file
0
apps/app_groupcount.c
Executable file → Normal file
30
apps/app_hasnewvoicemail.c
Executable file → Normal file
30
apps/app_hasnewvoicemail.c
Executable file → Normal file
@@ -38,6 +38,7 @@
|
|||||||
#include <asterisk/pbx.h>
|
#include <asterisk/pbx.h>
|
||||||
#include <asterisk/module.h>
|
#include <asterisk/module.h>
|
||||||
#include <asterisk/lock.h>
|
#include <asterisk/lock.h>
|
||||||
|
#include <asterisk/utils.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -70,7 +71,7 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
|
|||||||
{
|
{
|
||||||
int res=0;
|
int res=0;
|
||||||
struct localuser *u;
|
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;
|
DIR *vmdir;
|
||||||
struct dirent *vment;
|
struct dirent *vment;
|
||||||
int vmcount = 0;
|
int vmcount = 0;
|
||||||
@@ -83,21 +84,22 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
|
|||||||
|
|
||||||
input = ast_strdupa((char *)data);
|
input = ast_strdupa((char *)data);
|
||||||
if (input) {
|
if (input) {
|
||||||
if ((vmbox = strsep(&input,":")))
|
temps = input;
|
||||||
if ((vmfolder = strsep(&input,"|")))
|
if ((temps = strsep(&input, "|"))) {
|
||||||
|
if (input && !ast_strlen_zero(input))
|
||||||
varname = input;
|
varname = input;
|
||||||
else
|
input = temps;
|
||||||
vmfolder = input;
|
|
||||||
else
|
|
||||||
if ((vmbox = strsep(&input,"|")))
|
|
||||||
varname = input;
|
|
||||||
else
|
|
||||||
vmbox = input;
|
|
||||||
|
|
||||||
if (index(vmbox,'@')) {
|
|
||||||
context = vmbox;
|
|
||||||
vmbox = strsep(&context,"@");
|
|
||||||
}
|
}
|
||||||
|
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);
|
snprintf(vmpath,sizeof(vmpath), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, vmbox, vmfolder);
|
||||||
if (!(vmdir = opendir(vmpath))) {
|
if (!(vmdir = opendir(vmpath))) {
|
||||||
|
0
apps/app_ices.c
Executable file → Normal file
0
apps/app_ices.c
Executable file → Normal file
0
apps/app_image.c
Executable file → Normal file
0
apps/app_image.c
Executable file → Normal file
0
apps/app_intercom.c
Executable file → Normal file
0
apps/app_intercom.c
Executable file → Normal file
0
apps/app_lookupblacklist.c
Executable file → Normal file
0
apps/app_lookupblacklist.c
Executable file → Normal file
0
apps/app_lookupcidname.c
Executable file → Normal file
0
apps/app_lookupcidname.c
Executable file → Normal file
3
apps/app_macro.c
Executable file → Normal file
3
apps/app_macro.c
Executable file → Normal 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)) {
|
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))) {
|
if ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid))) {
|
||||||
/* Something bad happened, or a hangup has been requested. */
|
/* 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 */
|
/* 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);
|
ast_log(LOG_DEBUG, "Oooh, got something to jump out with ('%c')!\n", res);
|
||||||
break;
|
break;
|
||||||
|
83
apps/app_meetme.c
Executable file → Normal file
83
apps/app_meetme.c
Executable file → Normal file
@@ -482,9 +482,39 @@ static int confnonzero(void *ptr)
|
|||||||
return res;
|
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)
|
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));
|
struct ast_conf_user *user = malloc(sizeof(struct ast_conf_user));
|
||||||
int fd;
|
int fd;
|
||||||
struct zt_confinfo ztc;
|
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));
|
memset(user, 0, sizeof(struct ast_conf_user));
|
||||||
|
|
||||||
user->user_no = 0; /* User number 0 means starting up user! (dead - not in the list!) */
|
user->user_no = 0; /* User number 0 means starting up user! (dead - not in the list!) */
|
||||||
|
|
||||||
|
time(&user->jointime);
|
||||||
|
|
||||||
if (conf->locked) {
|
if (conf->locked) {
|
||||||
/* Sorry, but this confernce is locked! */
|
/* Sorry, but this confernce is locked! */
|
||||||
if (!ast_streamfile(chan, "conf-locked", chan->language))
|
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;
|
conf->lastuser = user;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strncpy(user->usrvalue, "test", sizeof(user->usrvalue) - 1);
|
|
||||||
user->chan = chan;
|
user->chan = chan;
|
||||||
user->userflags = confflags;
|
user->userflags = confflags;
|
||||||
user->adminflags = 0;
|
user->adminflags = 0;
|
||||||
@@ -990,31 +1021,12 @@ outrun:
|
|||||||
"Meetme: %s\r\n"
|
"Meetme: %s\r\n"
|
||||||
"Usernum: %i\r\n",
|
"Usernum: %i\r\n",
|
||||||
chan->name, chan->uniqueid, conf->confno, user->user_no);
|
chan->name, chan->uniqueid, conf->confno, user->user_no);
|
||||||
prev = NULL;
|
|
||||||
conf->users--;
|
conf->users--;
|
||||||
if (confflags & CONFFLAG_MARKEDUSER)
|
if (confflags & CONFFLAG_MARKEDUSER)
|
||||||
conf->markedusers--;
|
conf->markedusers--;
|
||||||
cur = confs;
|
|
||||||
if (!conf->users) {
|
if (!conf->users) {
|
||||||
/* No more users -- close this one out */
|
/* No more users -- close this one out */
|
||||||
while(cur) {
|
conf_free(conf);
|
||||||
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);
|
|
||||||
} else {
|
} else {
|
||||||
/* Remove the user struct */
|
/* Remove the user struct */
|
||||||
if (user == conf->firstuser) {
|
if (user == conf->firstuser) {
|
||||||
@@ -1043,10 +1055,10 @@ outrun:
|
|||||||
else
|
else
|
||||||
ast_log(LOG_ERROR, "Bad! Bad! Bad! user->prevuser is NULL but we're not the beginning!\n");
|
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);
|
free(user);
|
||||||
ast_mutex_unlock(&conflock);
|
ast_mutex_unlock(&conflock);
|
||||||
@@ -1298,7 +1310,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
|||||||
if (!found) {
|
if (!found) {
|
||||||
/* At this point, we have a confno_tmp (static conference) that is empty */
|
/* 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)) {
|
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 2: empty_no_pin and pin is blank (but not NULL)
|
||||||
* Case 3: not empty_no_pin
|
* Case 3: not empty_no_pin
|
||||||
*/
|
*/
|
||||||
@@ -1399,8 +1411,15 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
|||||||
confno[0] = '\0';
|
confno[0] = '\0';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/* failed when getting the pin */
|
||||||
res = -1;
|
res = -1;
|
||||||
allowretry = 0;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1419,8 +1438,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (allowretry);
|
} while (allowretry);
|
||||||
/* Do the conference */
|
|
||||||
LOCAL_USER_REMOVE(u);
|
LOCAL_USER_REMOVE(u);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1454,14 +1474,17 @@ static int admin_exec(struct ast_channel *chan, void *data) {
|
|||||||
command = strsep(¶ms, "|");
|
command = strsep(¶ms, "|");
|
||||||
caller = strsep(¶ms, "|");
|
caller = strsep(¶ms, "|");
|
||||||
|
|
||||||
ast_mutex_lock(&conflock);
|
if (!command) {
|
||||||
|
ast_log(LOG_WARNING, "MeetmeAdmin requires a command!\n");
|
||||||
|
ast_mutex_unlock(&conflock);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
cnf = confs;
|
cnf = confs;
|
||||||
while (cnf) {
|
while (cnf) {
|
||||||
if (strcmp(cnf->confno, conf) == 0)
|
if (strcmp(cnf->confno, conf) == 0)
|
||||||
break;
|
break;
|
||||||
cnf = cnf->next;
|
cnf = cnf->next;
|
||||||
}
|
}
|
||||||
ast_mutex_unlock(&conflock);
|
|
||||||
|
|
||||||
if (caller)
|
if (caller)
|
||||||
user = find_user(cnf, caller);
|
user = find_user(cnf, caller);
|
||||||
|
0
apps/app_milliwatt.c
Executable file → Normal file
0
apps/app_milliwatt.c
Executable file → Normal file
0
apps/app_mp3.c
Executable file → Normal file
0
apps/app_mp3.c
Executable file → Normal file
0
apps/app_nbscat.c
Executable file → Normal file
0
apps/app_nbscat.c
Executable file → Normal file
0
apps/app_osplookup.c
Executable file → Normal file
0
apps/app_osplookup.c
Executable file → Normal file
4
apps/app_parkandannounce.c
Executable file → Normal file
4
apps/app_parkandannounce.c
Executable file → Normal file
@@ -41,7 +41,7 @@ static char *synopsis = "Park and Announce";
|
|||||||
static char *descrip =
|
static char *descrip =
|
||||||
" ParkAndAnnounce(announce:template|timeout|dial|[return_context]):\n"
|
" ParkAndAnnounce(announce:template|timeout|dial|[return_context]):\n"
|
||||||
"Park a call into the parkinglot and announce the call over the console.\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"
|
" 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"
|
"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"
|
"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, "|");
|
dial=strsep(&s, "|");
|
||||||
if(!dial) {
|
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);
|
free(orig_s);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
|
0
apps/app_playback.c
Executable file → Normal file
0
apps/app_playback.c
Executable file → Normal file
0
apps/app_privacy.c
Executable file → Normal file
0
apps/app_privacy.c
Executable file → Normal file
2
apps/app_qcall.c
Executable file → Normal file
2
apps/app_qcall.c
Executable file → Normal file
@@ -317,7 +317,7 @@ static void *qcall_do(void *arg)
|
|||||||
extstr,context,channel->name);
|
extstr,context,channel->name);
|
||||||
if (strlen(ident)) {
|
if (strlen(ident)) {
|
||||||
strncat(ident,"-ok", sizeof(ident) - strlen(ident) - 1);
|
strncat(ident,"-ok", sizeof(ident) - strlen(ident) - 1);
|
||||||
/* if file existant, play it */
|
/* if file existent, play it */
|
||||||
if (!ast_streamfile(channel,ident,0))
|
if (!ast_streamfile(channel,ident,0))
|
||||||
{
|
{
|
||||||
ast_waitstream(channel,"");
|
ast_waitstream(channel,"");
|
||||||
|
132
apps/app_queue.c
Executable file → Normal file
132
apps/app_queue.c
Executable file → Normal file
@@ -96,7 +96,7 @@ static char *descrip =
|
|||||||
"Queues an incoming call in a particular call queue as defined in queues.conf.\n"
|
"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"
|
" 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"
|
"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"
|
"The option string may contain zero or more of the following characters:\n"
|
||||||
" 't' -- allow the called user transfer the calling user\n"
|
" 't' -- allow the called user transfer the calling user\n"
|
||||||
" 'T' -- to allow the calling user to transfer the call.\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 wrapped; /* Round Robin - wrapped around? */
|
||||||
int joinempty; /* Do we care if the queue has no members? */
|
int joinempty; /* Do we care if the queue has no members? */
|
||||||
int eventwhencalled; /* Generate an event when the agent is called (before pickup) */
|
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 member *members; /* Member channels to be tried */
|
||||||
struct queue_ent *head; /* Start of the actual queue */
|
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;
|
int res;
|
||||||
|
struct ast_var_t *current, *newvar;
|
||||||
|
struct varshead *headp, *newheadp;
|
||||||
if (qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime)) {
|
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);
|
ast_log(LOG_DEBUG, "Wrapuptime not yet expired for %s/%s\n", tmp->tech, tmp->numsubst);
|
||||||
if (qe->chan->cdr)
|
if (qe->chan->cdr)
|
||||||
ast_cdr_busy(qe->chan->cdr);
|
ast_cdr_busy(qe->chan->cdr);
|
||||||
tmp->stillgoing = 0;
|
tmp->stillgoing = 0;
|
||||||
|
(*busies)++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* Request the peer */
|
/* Request the peer */
|
||||||
@@ -563,8 +567,29 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
|
|||||||
if (qe->chan->cdr)
|
if (qe->chan->cdr)
|
||||||
ast_cdr_busy(qe->chan->cdr);
|
ast_cdr_busy(qe->chan->cdr);
|
||||||
tmp->stillgoing = 0;
|
tmp->stillgoing = 0;
|
||||||
|
(*busies)++;
|
||||||
return 0;
|
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->appl = "AppQueue";
|
||||||
tmp->chan->data = "(Outgoing Line)";
|
tmp->chan->data = "(Outgoing Line)";
|
||||||
tmp->chan->whentohangup = 0;
|
tmp->chan->whentohangup = 0;
|
||||||
@@ -593,6 +618,7 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
|
|||||||
ast_hangup(tmp->chan);
|
ast_hangup(tmp->chan);
|
||||||
tmp->chan = NULL;
|
tmp->chan = NULL;
|
||||||
tmp->stillgoing = 0;
|
tmp->stillgoing = 0;
|
||||||
|
(*busies)++;
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
if (qe->parent->eventwhencalled) {
|
if (qe->parent->eventwhencalled) {
|
||||||
@@ -610,10 +636,10 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
|
|||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "Called %s/%s\n", tmp->tech, tmp->numsubst);
|
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 *cur;
|
||||||
struct localuser *best;
|
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) */
|
/* Ring everyone who shares this best metric (for ringall) */
|
||||||
cur = outgoing;
|
cur = outgoing;
|
||||||
while(cur) {
|
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);
|
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;
|
cur = cur->next;
|
||||||
}
|
}
|
||||||
@@ -646,7 +672,7 @@ static int ring_one(struct queue_ent *qe, struct localuser *outgoing)
|
|||||||
if (option_debug)
|
if (option_debug)
|
||||||
ast_log(LOG_DEBUG, "Trying '%s/%s' with metric %d\n",
|
ast_log(LOG_DEBUG, "Trying '%s/%s' with metric %d\n",
|
||||||
best->tech, best->numsubst, best->metric);
|
best->tech, best->numsubst, best->metric);
|
||||||
ring_entry(qe, best);
|
ring_entry(qe, best, busies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (best && !best->chan);
|
} while (best && !best->chan);
|
||||||
@@ -710,15 +736,36 @@ static int valid_exit(struct queue_ent *qe, char digit)
|
|||||||
|
|
||||||
#define AST_MAX_WATCHERS 256
|
#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;
|
char *queue = qe->parent->name;
|
||||||
struct localuser *o;
|
struct localuser *o;
|
||||||
int found;
|
int found;
|
||||||
int numlines;
|
int numlines;
|
||||||
int sentringing = 0;
|
int sentringing = 0;
|
||||||
int numbusies = 0;
|
int numbusies = prebusies;
|
||||||
int orig = *to;
|
int orig = *to;
|
||||||
|
int stillgoing = 0;
|
||||||
struct ast_frame *f;
|
struct ast_frame *f;
|
||||||
struct localuser *peer = NULL;
|
struct localuser *peer = NULL;
|
||||||
struct ast_channel *watchers[AST_MAX_WATCHERS];
|
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;
|
struct ast_channel *in = qe->chan;
|
||||||
|
|
||||||
while(*to && !peer) {
|
while(*to && !peer) {
|
||||||
o = outgoing;
|
BUILD_STATS;
|
||||||
found = -1;
|
if ((found < 0) && stillgoing && !qe->parent->strategy) {
|
||||||
pos = 1;
|
/* On "ringall" strategy we only move to the next penalty level
|
||||||
numlines = 0;
|
when *all* ringing phones are done in the current penalty level */
|
||||||
watchers[0] = in;
|
ring_one(qe, outgoing, &numbusies);
|
||||||
while(o) {
|
BUILD_STATS;
|
||||||
/* Keep track of important channels */
|
|
||||||
if (o->stillgoing && o->chan) {
|
|
||||||
watchers[pos++] = o->chan;
|
|
||||||
found = 1;
|
|
||||||
}
|
|
||||||
o = o->next;
|
|
||||||
numlines++;
|
|
||||||
}
|
}
|
||||||
if (found < 0) {
|
if (found < 0) {
|
||||||
if (numlines == numbusies) {
|
if (numlines == numbusies) {
|
||||||
ast_log(LOG_DEBUG, "Everyone is busy at this time\n");
|
ast_log(LOG_DEBUG, "Everyone is busy at this time\n");
|
||||||
} else {
|
} 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;
|
*to = 0;
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -789,7 +829,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
|
|||||||
ast_hangup(o->chan);
|
ast_hangup(o->chan);
|
||||||
o->chan = NULL;
|
o->chan = NULL;
|
||||||
if (qe->parent->strategy)
|
if (qe->parent->strategy)
|
||||||
ring_one(qe, outgoing);
|
ring_one(qe, outgoing, &numbusies);
|
||||||
numbusies++;
|
numbusies++;
|
||||||
break;
|
break;
|
||||||
case AST_CONTROL_CONGESTION:
|
case AST_CONTROL_CONGESTION:
|
||||||
@@ -801,7 +841,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
|
|||||||
ast_hangup(o->chan);
|
ast_hangup(o->chan);
|
||||||
o->chan = NULL;
|
o->chan = NULL;
|
||||||
if (qe->parent->strategy)
|
if (qe->parent->strategy)
|
||||||
ring_one(qe, outgoing);
|
ring_one(qe, outgoing, &numbusies);
|
||||||
numbusies++;
|
numbusies++;
|
||||||
break;
|
break;
|
||||||
case AST_CONTROL_RINGING:
|
case AST_CONTROL_RINGING:
|
||||||
@@ -827,7 +867,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
|
|||||||
ast_hangup(o->chan);
|
ast_hangup(o->chan);
|
||||||
o->chan = NULL;
|
o->chan = NULL;
|
||||||
if (qe->parent->strategy)
|
if (qe->parent->strategy)
|
||||||
ring_one(qe, outgoing);
|
ring_one(qe, outgoing, &numbusies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
o = o->next;
|
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))) {
|
if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) {
|
||||||
/* Got hung up */
|
/* Got hung up */
|
||||||
*to=-1;
|
*to=-1;
|
||||||
|
if (f)
|
||||||
|
ast_frfree(f);
|
||||||
return NULL;
|
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)
|
if (option_verbose > 3)
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
|
ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
|
||||||
*to=0;
|
*to=0;
|
||||||
|
ast_frfree(f);
|
||||||
return NULL;
|
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)
|
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;
|
*to=0;
|
||||||
*digit=f->subclass;
|
*digit=f->subclass;
|
||||||
|
ast_frfree(f);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
ast_frfree(f);
|
||||||
}
|
}
|
||||||
if (!*to && (option_verbose > 2))
|
if (!*to && (option_verbose > 2))
|
||||||
ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", orig);
|
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;
|
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 */
|
/* Make a position announcement, if enabled */
|
||||||
if (qe->parent->announcefrequency && !ringing)
|
if (qe->parent->announcefrequency && !ringing)
|
||||||
say_position(qe);
|
say_position(qe);
|
||||||
@@ -1017,6 +1068,7 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
|
|||||||
struct member *member;
|
struct member *member;
|
||||||
int res = 0, bridge = 0;
|
int res = 0, bridge = 0;
|
||||||
int zapx = 2;
|
int zapx = 2;
|
||||||
|
int numbusies = 0;
|
||||||
int x=0;
|
int x=0;
|
||||||
char *announce = NULL;
|
char *announce = NULL;
|
||||||
char digit = 0;
|
char digit = 0;
|
||||||
@@ -1099,9 +1151,9 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
|
|||||||
to = qe->parent->timeout * 1000;
|
to = qe->parent->timeout * 1000;
|
||||||
else
|
else
|
||||||
to = -1;
|
to = -1;
|
||||||
ring_one(qe, outgoing);
|
ring_one(qe, outgoing, &numbusies);
|
||||||
ast_mutex_unlock(&qe->parent->lock);
|
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);
|
ast_mutex_lock(&qe->parent->lock);
|
||||||
if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
|
if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
|
||||||
store_next(qe, outgoing);
|
store_next(qe, outgoing);
|
||||||
@@ -1626,11 +1678,18 @@ check_turns:
|
|||||||
/* This is the wait loop for the head caller*/
|
/* This is the wait loop for the head caller*/
|
||||||
/* To exit, they may get their call answered; */
|
/* To exit, they may get their call answered; */
|
||||||
/* they may dial a digit from the queue context; */
|
/* 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 */
|
/* Leave if we have exceeded our queuetimeout */
|
||||||
if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
|
if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
|
||||||
res = 0;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1652,6 +1711,7 @@ check_turns:
|
|||||||
/* Leave if we have exceeded our queuetimeout */
|
/* Leave if we have exceeded our queuetimeout */
|
||||||
if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
|
if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
|
||||||
res = 0;
|
res = 0;
|
||||||
|
ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1691,7 +1751,7 @@ check_turns:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Don't allow return code > 0 */
|
/* Don't allow return code > 0 */
|
||||||
if (res > 0 && res != AST_PBX_KEEPALIVE) {
|
if ((res == 0) || (res > 0 && res != AST_PBX_KEEPALIVE)) {
|
||||||
res = 0;
|
res = 0;
|
||||||
if (ringing) {
|
if (ringing) {
|
||||||
ast_indicate(chan, -1);
|
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_minutes, "queue-minutes", sizeof(q->sound_minutes) - 1);
|
||||||
strncpy(q->sound_seconds, "queue-seconds", sizeof(q->sound_seconds) - 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_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;
|
prev = q->members;
|
||||||
if (prev) {
|
if (prev) {
|
||||||
/* find the end of any dynamic members */
|
/* find the end of any dynamic members */
|
||||||
@@ -1818,7 +1878,7 @@ static void reload_queues(void)
|
|||||||
q->members = cur;
|
q->members = cur;
|
||||||
prev = 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);
|
strncpy(q->moh, var->value, sizeof(q->moh) - 1);
|
||||||
} else if (!strcasecmp(var->name, "announce")) {
|
} else if (!strcasecmp(var->name, "announce")) {
|
||||||
strncpy(q->announce, var->value, sizeof(q->announce) - 1);
|
strncpy(q->announce, var->value, sizeof(q->announce) - 1);
|
||||||
@@ -1872,6 +1932,8 @@ static void reload_queues(void)
|
|||||||
}
|
}
|
||||||
} else if (!strcasecmp(var->name, "joinempty")) {
|
} else if (!strcasecmp(var->name, "joinempty")) {
|
||||||
q->joinempty = ast_true(var->value);
|
q->joinempty = ast_true(var->value);
|
||||||
|
} else if (!strcasecmp(var->name, "leavewhenempty")) {
|
||||||
|
q->leavewhenempty = ast_true(var->value);
|
||||||
} else if (!strcasecmp(var->name, "eventwhencalled")) {
|
} else if (!strcasecmp(var->name, "eventwhencalled")) {
|
||||||
q->eventwhencalled = ast_true(var->value);
|
q->eventwhencalled = ast_true(var->value);
|
||||||
} else {
|
} else {
|
||||||
|
1
apps/app_random.c
Executable file → Normal file
1
apps/app_random.c
Executable file → Normal file
@@ -106,7 +106,6 @@ int unload_module(void)
|
|||||||
|
|
||||||
int load_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);
|
return ast_register_application(app_random, random_exec, random_synopsis, random_descrip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
apps/app_read.c
Executable file → Normal file
3
apps/app_read.c
Executable file → Normal file
@@ -106,8 +106,9 @@ static int read_exec(struct ast_channel *chan, void *data)
|
|||||||
if (res > -1) {
|
if (res > -1) {
|
||||||
pbx_builtin_setvar_helper(chan, varname, tmp);
|
pbx_builtin_setvar_helper(chan, varname, tmp);
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp);
|
ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp);
|
||||||
|
res = 0;
|
||||||
} else {
|
} else {
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "User entered nothing\n");
|
ast_verbose(VERBOSE_PREFIX_3 "User disconnected\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOCAL_USER_REMOVE(u);
|
LOCAL_USER_REMOVE(u);
|
||||||
|
2
apps/app_record.c
Executable file → Normal file
2
apps/app_record.c
Executable file → Normal 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);
|
ast_log(LOG_WARNING, "Could not answer channel '%s'\n", chan->name);
|
||||||
|
|
||||||
LOCAL_USER_REMOVE(u);
|
LOCAL_USER_REMOVE(u);
|
||||||
if (silence > 0) {
|
if ((silence > 0) && rfmt) {
|
||||||
res = ast_set_read_format(chan, rfmt);
|
res = ast_set_read_format(chan, rfmt);
|
||||||
if (res)
|
if (res)
|
||||||
ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name);
|
ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name);
|
||||||
|
0
apps/app_rpt.c
Executable file → Normal file
0
apps/app_rpt.c
Executable file → Normal file
0
apps/app_sayunixtime.c
Executable file → Normal file
0
apps/app_sayunixtime.c
Executable file → Normal file
0
apps/app_senddtmf.c
Executable file → Normal file
0
apps/app_senddtmf.c
Executable file → Normal file
0
apps/app_sendtext.c
Executable file → Normal file
0
apps/app_sendtext.c
Executable file → Normal file
0
apps/app_setcallerid.c
Executable file → Normal file
0
apps/app_setcallerid.c
Executable file → Normal file
0
apps/app_setcdruserfield.c
Executable file → Normal file
0
apps/app_setcdruserfield.c
Executable file → Normal file
0
apps/app_setcidname.c
Executable file → Normal file
0
apps/app_setcidname.c
Executable file → Normal file
0
apps/app_setcidnum.c
Executable file → Normal file
0
apps/app_setcidnum.c
Executable file → Normal file
0
apps/app_skel.c
Executable file → Normal file
0
apps/app_skel.c
Executable file → Normal file
14
apps/app_sms.c
Executable file → Normal file
14
apps/app_sms.c
Executable file → Normal file
@@ -24,8 +24,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include "../astconf.h"
|
||||||
|
|
||||||
/* ToDo */
|
/* ToDo */
|
||||||
/* When acting as SC and answering, should check for messages and send instead of sending EST as first packet */
|
/* 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 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 *tdesc = "SMS/PSTN handler";
|
||||||
|
|
||||||
static char *app = "SMS";
|
static char *app = "SMS";
|
||||||
@@ -315,7 +320,7 @@ sms_log (sms_t * h, char status)
|
|||||||
{ /* log the output, and remove file */
|
{ /* log the output, and remove file */
|
||||||
if (*h->oa || *h->da)
|
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)
|
if (o >= 0)
|
||||||
{
|
{
|
||||||
char line[1000], *p;
|
char line[1000], *p;
|
||||||
@@ -517,7 +522,7 @@ sms_writefile (sms_t * h)
|
|||||||
char fn2[200] = "";
|
char fn2[200] = "";
|
||||||
FILE *o;
|
FILE *o;
|
||||||
|
|
||||||
strncpy(fn, "/var/spool/asterisk/sms", sizeof(fn) - 1);
|
strncpy(fn, spool_dir, sizeof(fn) - 1);
|
||||||
mkdir (fn, 0777); /* ensure it exists */
|
mkdir (fn, 0777); /* ensure it exists */
|
||||||
snprintf(fn + strlen(fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "me-sc" : "sc-me", h->queue);
|
snprintf(fn + strlen(fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "me-sc" : "sc-me", h->queue);
|
||||||
mkdir (fn, 0777); /* ensure it exists */
|
mkdir (fn, 0777); /* ensure it exists */
|
||||||
@@ -689,7 +694,7 @@ sms_nextoutgoing (sms_t * h)
|
|||||||
DIR *d;
|
DIR *d;
|
||||||
char more = 0;
|
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 */
|
mkdir(fn, 0777); /* ensure it exists */
|
||||||
snprintf(fn + strlen (fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "sc-me" : "me-sc", h->queue);
|
snprintf(fn + strlen (fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "sc-me" : "me-sc", h->queue);
|
||||||
mkdir (fn, 0777); /* ensure it exists */
|
mkdir (fn, 0777); /* ensure it exists */
|
||||||
@@ -769,6 +774,7 @@ sms_nextoutgoing (sms_t * h)
|
|||||||
{ /* no message */
|
{ /* no message */
|
||||||
h->omsg[0] = 0x94; /* SMS_REL */
|
h->omsg[0] = 0x94; /* SMS_REL */
|
||||||
h->omsg[1] = 0;
|
h->omsg[1] = 0;
|
||||||
|
h->hangup = 1;
|
||||||
sms_messagetx (h);
|
sms_messagetx (h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1204,6 +1210,8 @@ load_module (void)
|
|||||||
for (p = 0; p < 128; p++)
|
for (p = 0; p < 128; p++)
|
||||||
sms8to7[sms7to8[p]] = 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);
|
return ast_register_application (app, sms_exec, synopsis, descrip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
0
apps/app_softhangup.c
Executable file → Normal file
0
apps/app_softhangup.c
Executable file → Normal file
2
apps/app_sql_postgres.c
Executable file → Normal file
2
apps/app_sql_postgres.c
Executable file → Normal file
@@ -106,8 +106,6 @@ STANDARD_LOCAL_USER;
|
|||||||
|
|
||||||
LOCAL_USER_DECL;
|
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_DUMMY 0
|
||||||
#define AST_PGSQL_ID_CONNID 1
|
#define AST_PGSQL_ID_CONNID 1
|
||||||
#define AST_PGSQL_ID_RESID 2
|
#define AST_PGSQL_ID_RESID 2
|
||||||
|
0
apps/app_striplsd.c
Executable file → Normal file
0
apps/app_striplsd.c
Executable file → Normal file
0
apps/app_substring.c
Executable file → Normal file
0
apps/app_substring.c
Executable file → Normal file
0
apps/app_system.c
Executable file → Normal file
0
apps/app_system.c
Executable file → Normal file
0
apps/app_talkdetect.c
Executable file → Normal file
0
apps/app_talkdetect.c
Executable file → Normal file
13
apps/app_test.c
Executable file → Normal file
13
apps/app_test.c
Executable file → Normal file
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Asterisk -- A telephony toolkit for Linux.
|
* 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.
|
* Copyright (C) 2004, Digium, Inc.
|
||||||
*
|
*
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <asterisk/channel.h>
|
#include <asterisk/channel.h>
|
||||||
|
#include <asterisk/options.h>
|
||||||
#include <asterisk/module.h>
|
#include <asterisk/module.h>
|
||||||
#include <asterisk/logger.h>
|
#include <asterisk/logger.h>
|
||||||
#include <asterisk/lock.h>
|
#include <asterisk/lock.h>
|
||||||
@@ -29,13 +30,15 @@
|
|||||||
|
|
||||||
static char *tdesc = "Interface Test Application";
|
static char *tdesc = "Interface Test Application";
|
||||||
|
|
||||||
static char *tests_descrip = "TestServer(): Perform test server function and write call report"
|
static char *tests_descrip =
|
||||||
"Results stored in /var/log/asterisk/testreports/<testid>.txt";
|
"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_app = "TestServer";
|
||||||
static char *tests_synopsis = "Execute Interface Test Server";
|
static char *tests_synopsis = "Execute Interface Test Server";
|
||||||
|
|
||||||
static char *testc_descrip = "TestClient(testid): Executes test client with given testid.\n"
|
static char *testc_descrip =
|
||||||
"Results stored in /var/log/asterisk/testreports/<testid>.txt";
|
"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_app = "TestClient";
|
||||||
static char *testc_synopsis = "Execute Interface Test Client";
|
static char *testc_synopsis = "Execute Interface Test Client";
|
||||||
|
0
apps/app_transfer.c
Executable file → Normal file
0
apps/app_transfer.c
Executable file → Normal file
0
apps/app_txtcidname.c
Executable file → Normal file
0
apps/app_txtcidname.c
Executable file → Normal file
0
apps/app_url.c
Executable file → Normal file
0
apps/app_url.c
Executable file → Normal file
6
apps/app_userevent.c
Executable file → Normal file
6
apps/app_userevent.c
Executable file → Normal 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);
|
strncpy(info, (char *)data, strlen((char *)data) + AST_MAX_EXTENSION-1);
|
||||||
|
snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
|
||||||
eventbody = strchr(eventname, '|');
|
eventbody = strchr(eventname, '|');
|
||||||
if (eventbody) {
|
if (eventbody) {
|
||||||
*eventbody = '\0';
|
*eventbody = '\0';
|
||||||
eventbody++;
|
eventbody++;
|
||||||
}
|
}
|
||||||
snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
|
|
||||||
LOCAL_USER_ADD(u);
|
LOCAL_USER_ADD(u);
|
||||||
|
|
||||||
if(eventbody) {
|
if(eventbody) {
|
||||||
ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, 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",
|
"Channel: %s\r\nUniqueid: %s\r\n%s\r\n",
|
||||||
chan->name, chan->uniqueid, eventbody);
|
chan->name, chan->uniqueid, eventbody);
|
||||||
} else {
|
} else {
|
||||||
ast_log(LOG_DEBUG, "Sending user event: %s\n", eventname);
|
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);
|
"Channel: %s\r\nUniqueid: %s\r\n", chan->name, chan->uniqueid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
0
apps/app_verbose.c
Executable file → Normal file
0
apps/app_verbose.c
Executable file → Normal file
442
apps/app_voicemail.c
Executable file → Normal file
442
apps/app_voicemail.c
Executable file → Normal 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 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 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_delete(char *file);
|
||||||
|
static int vm_play_folder_name(struct ast_channel *chan, char *mbox);
|
||||||
|
|
||||||
static char ext_pass_cmd[128];
|
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"
|
"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"
|
"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"
|
"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";
|
"Returns -1 if the user hangs up or 0 otherwise.\n";
|
||||||
|
|
||||||
static char *synopsis_vm_box_exists =
|
static char *synopsis_vm_box_exists =
|
||||||
@@ -671,7 +675,7 @@ static void vm_change_password(struct ast_vm_user *vmu, char *newpassword)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Put it back like it was */
|
/* 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];
|
char buf[255];
|
||||||
snprintf(buf,255,"%s %s %s %s",ext_pass_cmd,vmu->context,vmu->mailbox,newpassword);
|
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)
|
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);
|
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
|
static int
|
||||||
inbuf(struct baseio *bio, FILE *fi)
|
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;
|
FILE *p=NULL;
|
||||||
int pfd;
|
int pfd;
|
||||||
char date[256];
|
char date[256];
|
||||||
char host[256];
|
char host[MAXHOSTNAMELEN] = "";
|
||||||
char who[256];
|
char who[256];
|
||||||
char bound[256];
|
char bound[256];
|
||||||
char fname[256];
|
char fname[256];
|
||||||
@@ -872,7 +891,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (p) {
|
if (p) {
|
||||||
gethostname(host, sizeof(host));
|
gethostname(host, sizeof(host)-1);
|
||||||
if (strchr(srcemail, '@'))
|
if (strchr(srcemail, '@'))
|
||||||
strncpy(who, srcemail, sizeof(who)-1);
|
strncpy(who, srcemail, sizeof(who)-1);
|
||||||
else {
|
else {
|
||||||
@@ -989,7 +1008,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
|
|||||||
fclose(p);
|
fclose(p);
|
||||||
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
|
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
|
||||||
ast_safe_system(tmp2);
|
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 {
|
} else {
|
||||||
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
|
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1002,7 +1021,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
|
|||||||
FILE *p=NULL;
|
FILE *p=NULL;
|
||||||
int pfd;
|
int pfd;
|
||||||
char date[256];
|
char date[256];
|
||||||
char host[256];
|
char host[MAXHOSTNAMELEN]="";
|
||||||
char who[256];
|
char who[256];
|
||||||
char dur[256];
|
char dur[256];
|
||||||
char tmp[80] = "/tmp/astmail-XXXXXX";
|
char tmp[80] = "/tmp/astmail-XXXXXX";
|
||||||
@@ -1021,7 +1040,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (p) {
|
if (p) {
|
||||||
gethostname(host, sizeof(host));
|
gethostname(host, sizeof(host)-1);
|
||||||
if (strchr(srcemail, '@'))
|
if (strchr(srcemail, '@'))
|
||||||
strncpy(who, srcemail, sizeof(who)-1);
|
strncpy(who, srcemail, sizeof(who)-1);
|
||||||
else {
|
else {
|
||||||
@@ -1076,7 +1095,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
|
|||||||
fclose(p);
|
fclose(p);
|
||||||
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
|
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
|
||||||
ast_safe_system(tmp2);
|
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 {
|
} else {
|
||||||
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
|
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
|
||||||
return -1;
|
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_dir(fromdir, sizeof(fromdir), vmu->context, vmu->mailbox, frombox);
|
||||||
make_file(frompath, sizeof(frompath), fromdir, msgnum);
|
make_file(frompath, sizeof(frompath), fromdir, msgnum);
|
||||||
|
ast_lock_path(topath);
|
||||||
recipmsgnum = 0;
|
recipmsgnum = 0;
|
||||||
do {
|
do {
|
||||||
make_file(topath, sizeof(topath), todir, recipmsgnum);
|
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 {
|
} else {
|
||||||
ast_log(LOG_ERROR, "Recipient mailbox %s@%s is full\n", recip->mailbox, recip->context);
|
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);
|
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;
|
FILE *txt;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
int msgnum;
|
int msgnum;
|
||||||
int fd;
|
|
||||||
int duration = 0;
|
int duration = 0;
|
||||||
int ausemacro = 0;
|
int ausemacro = 0;
|
||||||
int ousemacro = 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);
|
strncat(ecodes, "*", sizeof(ecodes) - strlen(ecodes) - 1);
|
||||||
ausemacro = 1;
|
ausemacro = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Play the beginning intro if desired */
|
/* Play the beginning intro if desired */
|
||||||
if (!ast_strlen_zero(prefile)) {
|
if (!ast_strlen_zero(prefile)) {
|
||||||
if (ast_fileexists(prefile, NULL, NULL) > 0) {
|
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 */
|
/* Check for a '0' here */
|
||||||
if (res == '0') {
|
if (res == '0') {
|
||||||
transfer:
|
transfer:
|
||||||
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
|
if (vmu->operator) {
|
||||||
if (!ast_strlen_zero(vmu->exit)) {
|
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
|
||||||
strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
|
if (!ast_strlen_zero(vmu->exit)) {
|
||||||
} else if (ousemacro && !ast_strlen_zero(chan->macrocontext)) {
|
strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
|
||||||
strncpy(chan->context, chan->macrocontext, 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) {
|
if (res < 0) {
|
||||||
free_user(vmu);
|
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);
|
strncpy(fmt, vmfmts, sizeof(fmt) - 1);
|
||||||
if (!ast_strlen_zero(fmt)) {
|
if (!ast_strlen_zero(fmt)) {
|
||||||
msgnum = 0;
|
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 {
|
do {
|
||||||
make_file(fn, sizeof(fn), dir, msgnum);
|
make_file(fn, sizeof(fn), dir, msgnum);
|
||||||
if (ast_fileexists(fn, NULL, chan->language) <= 0)
|
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->name,
|
||||||
chan->callerid ? chan->callerid : "Unknown",
|
chan->callerid ? chan->callerid : "Unknown",
|
||||||
date, (long)time(NULL));
|
date, (long)time(NULL));
|
||||||
fclose(txt);
|
|
||||||
} else
|
} else
|
||||||
ast_log(LOG_WARNING, "Error opening text file for output\n");
|
ast_log(LOG_WARNING, "Error opening text file for output\n");
|
||||||
res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration);
|
res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration, dir);
|
||||||
if (res == '0')
|
if (res == '0') {
|
||||||
|
if (txt)
|
||||||
|
fclose(txt);
|
||||||
goto transfer;
|
goto transfer;
|
||||||
|
}
|
||||||
if (res > 0)
|
if (res > 0)
|
||||||
res = 0;
|
res = 0;
|
||||||
fd = open(txtfile, O_APPEND | O_WRONLY);
|
if (txt) {
|
||||||
if (fd > -1) {
|
fprintf(txt, "duration=%d\n", duration);
|
||||||
txt = fdopen(fd, "a");
|
fclose(txt);
|
||||||
if (txt) {
|
|
||||||
fprintf(txt, "duration=%d\n", duration);
|
|
||||||
fclose(txt);
|
|
||||||
} else
|
|
||||||
close(fd);
|
|
||||||
}
|
}
|
||||||
if (duration < vmminmessage) {
|
if (duration < vmminmessage) {
|
||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
@@ -1502,8 +1525,10 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
|||||||
free_user(recip);
|
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 {
|
} else {
|
||||||
|
ast_unlock_path(dir);
|
||||||
res = ast_streamfile(chan, "vm-mailboxfull", chan->language);
|
res = ast_streamfile(chan, "vm-mailboxfull", chan->language);
|
||||||
if (!res)
|
if (!res)
|
||||||
res = ast_waitstream(chan, "");
|
res = ast_waitstream(chan, "");
|
||||||
@@ -1525,16 +1550,58 @@ leave_vm_out:
|
|||||||
|
|
||||||
static int count_messages(char *dir)
|
static int count_messages(char *dir)
|
||||||
{
|
{
|
||||||
int x;
|
/* Find all .txt files - even if they are not in sequence from 0000 */
|
||||||
char fn[256];
|
|
||||||
for (x=0;x<MAXMSG;x++) {
|
|
||||||
make_file(fn, sizeof(fn), dir, x);
|
int vmcount = 0;
|
||||||
if (ast_fileexists(fn, NULL, NULL) < 1)
|
DIR *vmdir = NULL;
|
||||||
break;
|
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)
|
static int say_and_wait(struct ast_channel *chan, int num, char *language)
|
||||||
{
|
{
|
||||||
int d;
|
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_file(sfn, sizeof(sfn), dir, msg);
|
||||||
make_dir(ddir, sizeof(ddir), context, username, dbox);
|
make_dir(ddir, sizeof(ddir), context, username, dbox);
|
||||||
mkdir(ddir, 0700);
|
mkdir(ddir, 0700);
|
||||||
|
ast_lock_path(ddir);
|
||||||
for (x=0;x<MAXMSG;x++) {
|
for (x=0;x<MAXMSG;x++) {
|
||||||
make_file(dfn, sizeof(dfn), ddir, x);
|
make_file(dfn, sizeof(dfn), ddir, x);
|
||||||
if (ast_fileexists(dfn, NULL, NULL) < 0)
|
if (ast_fileexists(dfn, NULL, NULL) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (x >= MAXMSG)
|
if (x >= MAXMSG) {
|
||||||
|
ast_unlock_path(ddir);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
ast_filecopy(sfn, dfn, NULL);
|
ast_filecopy(sfn, dfn, NULL);
|
||||||
if (strcmp(sfn, dfn)) {
|
if (strcmp(sfn, dfn)) {
|
||||||
snprintf(txt, sizeof(txt), "%s.txt", sfn);
|
snprintf(txt, sizeof(txt), "%s.txt", sfn);
|
||||||
snprintf(ntxt, sizeof(ntxt), "%s.txt", dfn);
|
snprintf(ntxt, sizeof(ntxt), "%s.txt", dfn);
|
||||||
copy(txt, ntxt);
|
copy(txt, ntxt);
|
||||||
}
|
}
|
||||||
|
ast_unlock_path(ddir);
|
||||||
return 0;
|
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" */
|
d = ast_play_and_wait(chan, "vm-for"); /* "for" */
|
||||||
if (d)
|
if (d)
|
||||||
return d;
|
return d;
|
||||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Spanish, French or Portuguese syntax */
|
snprintf(fn, sizeof(fn), "vm-%s", mbox(x)); /* Folder name */
|
||||||
d = ast_play_and_wait(chan, "vm-messages"); /* "messages */
|
d = vm_play_folder_name(chan, fn);
|
||||||
if (d)
|
if (d)
|
||||||
return 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;
|
|
||||||
}
|
|
||||||
d = ast_waitfordigit(chan, 500);
|
d = ast_waitfordigit(chan, 500);
|
||||||
if (d)
|
if (d)
|
||||||
return d;
|
return d;
|
||||||
@@ -2212,7 +2270,7 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
|
|||||||
char callerid[512];
|
char callerid[512];
|
||||||
char ext_context[256]="";
|
char ext_context[256]="";
|
||||||
int res = 0, cmd = 0;
|
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 tmp[256];
|
||||||
char *stringp, *s;
|
char *stringp, *s;
|
||||||
int saved_messages = 0, found = 0;
|
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(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(sys, sizeof(sys), "mkdir -p %s\n", todir);
|
||||||
snprintf(ext_context, sizeof(ext_context), "%s@%s", vmtmp->mailbox, vmtmp->context);
|
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);
|
ast_safe_system(sys);
|
||||||
|
|
||||||
todircount = count_messages(todir);
|
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"))
|
if (!strcasecmp(s, "wav49"))
|
||||||
s = "WAV";
|
s = "WAV";
|
||||||
snprintf(sys, sizeof(sys), "cp %s/msg%04d.%s %s/msg%04d.%s\n", dir, curmsg, s, todir, todircount, s);
|
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);
|
ast_safe_system(sys);
|
||||||
}
|
}
|
||||||
snprintf(sys, sizeof(sys), "cp %s/msg%04d.txt %s/msg%04d.txt\n", dir, curmsg, todir, todircount);
|
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);
|
ast_safe_system(sys);
|
||||||
snprintf(fn, sizeof(fn), "%s/msg%04d", todir,todircount);
|
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);
|
strncpy(vms->curbox, mbox(box), sizeof(vms->curbox) - 1);
|
||||||
make_dir(vms->curdir, sizeof(vms->curdir), vmu->context, vms->username, vms->curbox);
|
make_dir(vms->curdir, sizeof(vms->curdir), vmu->context, vms->username, vms->curbox);
|
||||||
vms->lastmsg = count_messages(vms->curdir) - 1;
|
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);
|
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] = "";
|
char txt[256] = "";
|
||||||
if (vms->lastmsg > -1) {
|
if (vms->lastmsg > -1) {
|
||||||
/* Get the deleted messages fixed */
|
/* Get the deleted messages fixed */
|
||||||
|
ast_lock_path(vms->curdir);
|
||||||
vms->curmsg = -1;
|
vms->curmsg = -1;
|
||||||
for (x=0;x < MAXMSG;x++) {
|
for (x=0;x < MAXMSG;x++) {
|
||||||
if (!vms->deleted[x] && (strcasecmp(vms->curbox, "INBOX") || !vms->heard[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;
|
break;
|
||||||
vm_delete(vms->fn);
|
vm_delete(vms->fn);
|
||||||
}
|
}
|
||||||
}
|
ast_unlock_path(vms->curdir);
|
||||||
memset(vms->deleted, 0, sizeof(vms->deleted));
|
}
|
||||||
memset(vms->heard, 0, sizeof(vms->heard));
|
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 */
|
/* 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 */
|
/* Introduce messages they have */
|
||||||
int res;
|
int res;
|
||||||
@@ -2949,6 +3042,26 @@ static int vm_intro_cz(struct ast_channel *chan,struct vm_state *vms)
|
|||||||
return res;
|
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)
|
static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int skipadvanced)
|
||||||
{
|
{
|
||||||
int res = 0;
|
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->starting) {
|
||||||
if (vms->lastmsg > -1) {
|
if (vms->lastmsg > -1) {
|
||||||
res = ast_play_and_wait(chan, "vm-onefor");
|
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)
|
||||||
if (!res)
|
res = vm_play_folder_name(chan, vms->vmbox);
|
||||||
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)
|
if (!res)
|
||||||
res = ast_play_and_wait(chan, "vm-opts");
|
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) {
|
switch (cmd) {
|
||||||
case '1':
|
case '1':
|
||||||
snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/unavail",vmu->context, vms->username);
|
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;
|
break;
|
||||||
case '2':
|
case '2':
|
||||||
snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/busy",vmu->context, vms->username);
|
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;
|
break;
|
||||||
case '3':
|
case '3':
|
||||||
snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/greet",vmu->context, vms->username);
|
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;
|
break;
|
||||||
case '4':
|
case '4':
|
||||||
if (vmu->password[0] == '-') {
|
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[1] = '\0';
|
||||||
newpassword[0] = cmd = ast_play_and_wait(chan,"vm-newpassword");
|
newpassword[0] = cmd = ast_play_and_wait(chan,"vm-newpassword");
|
||||||
if (cmd < 0)
|
if (cmd == '#')
|
||||||
break;
|
newpassword[0] = '\0';
|
||||||
if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0) {
|
else {
|
||||||
break;
|
if (cmd < 0)
|
||||||
}
|
break;
|
||||||
|
if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
newpassword2[1] = '\0';
|
newpassword2[1] = '\0';
|
||||||
newpassword2[0] = cmd = ast_play_and_wait(chan,"vm-reenterpassword");
|
newpassword2[0] = cmd = ast_play_and_wait(chan,"vm-reenterpassword");
|
||||||
if (cmd < 0)
|
if (cmd == '#')
|
||||||
break;
|
newpassword2[0] = '\0';
|
||||||
|
else {
|
||||||
if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#"))) {
|
if (cmd < 0)
|
||||||
break;
|
break;
|
||||||
}
|
if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#")))
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (strcmp(newpassword, newpassword2)) {
|
if (strcmp(newpassword, newpassword2)) {
|
||||||
ast_log(LOG_NOTICE,"Password mismatch for user %s (%s != %s)\n", vms->username, 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");
|
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 */
|
/* 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;
|
int cmd=0;
|
||||||
|
|
||||||
@@ -3150,6 +3259,17 @@ static int vm_browse_messages_pt(struct ast_channel *chan, struct vm_state *vms,
|
|||||||
return cmd;
|
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)
|
static int vm_execmain(struct ast_channel *chan, void *data)
|
||||||
{
|
{
|
||||||
/* XXX This is, admittedly, some pretty horrendus code. For some
|
/* 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;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (prefix) {
|
if (prefix && !ast_strlen_zero(prefixstr)) {
|
||||||
char fullusername[80] = "";
|
char fullusername[80] = "";
|
||||||
strncpy(fullusername, prefixstr, sizeof(fullusername) - 1);
|
strncpy(fullusername, prefixstr, sizeof(fullusername) - 1);
|
||||||
strncat(fullusername, vms.username, 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++;
|
logretries++;
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
if (skipuser || logretries >= maxlogins) {
|
if (skipuser || logretries >= maxlogins) {
|
||||||
if (ast_streamfile(chan, "vm-incorrect", chan->language))
|
if (ast_streamfile(chan, "vm-incorrect", chan->language)) {
|
||||||
break;
|
ast_log(LOG_WARNING, "Unable to stream incorrect message\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (useadsi)
|
if (useadsi)
|
||||||
adsi_login(chan);
|
adsi_login(chan);
|
||||||
if (ast_streamfile(chan, "vm-incorrect-mailbox", chan->language))
|
if (ast_streamfile(chan, "vm-incorrect-mailbox", chan->language)) {
|
||||||
break;
|
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)) {
|
if (!valid && (logretries >= maxlogins)) {
|
||||||
@@ -3333,22 +3458,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
|||||||
if (useadsi)
|
if (useadsi)
|
||||||
adsi_status(chan, &vms);
|
adsi_status(chan, &vms);
|
||||||
res = 0;
|
res = 0;
|
||||||
/* Play voicemail intro - syntax is different for different languages */
|
cmd = vm_intro(chan, &vms);
|
||||||
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);
|
|
||||||
}
|
|
||||||
vms.repeats = 0;
|
vms.repeats = 0;
|
||||||
vms.starting = 1;
|
vms.starting = 1;
|
||||||
while((cmd > -1) && (cmd != 't') && (cmd != '#')) {
|
while((cmd > -1) && (cmd != 't') && (cmd != '#')) {
|
||||||
@@ -3358,13 +3468,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
|||||||
vms.curmsg = 0;
|
vms.curmsg = 0;
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
case '5':
|
case '5':
|
||||||
if (!strcasecmp(chan->language, "es")) { /* SPANISH */
|
cmd = vm_browse_messages(chan, &vms, vmu);
|
||||||
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);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case '2': /* Change folders */
|
case '2': /* Change folders */
|
||||||
if (useadsi)
|
if (useadsi)
|
||||||
@@ -3380,17 +3484,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
|||||||
}
|
}
|
||||||
if (useadsi)
|
if (useadsi)
|
||||||
adsi_status2(chan, &vms);
|
adsi_status2(chan, &vms);
|
||||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* SPANISH or PORTUGUESE */
|
if (!cmd)
|
||||||
if (!cmd)
|
cmd = vm_play_folder_name(chan, vms.vmbox);
|
||||||
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");
|
|
||||||
}
|
|
||||||
vms.starting = 1;
|
vms.starting = 1;
|
||||||
break;
|
break;
|
||||||
case '3': /* Advanced options */
|
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);
|
cmd = say_and_wait(chan, vms.curmsg + 1, chan->language);
|
||||||
if (!cmd)
|
if (!cmd)
|
||||||
cmd = ast_play_and_wait(chan, "vm-savedto");
|
cmd = ast_play_and_wait(chan, "vm-savedto");
|
||||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* SPANISH or PORTUGUESE */
|
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
|
||||||
if (!cmd)
|
if (!cmd)
|
||||||
cmd = ast_play_and_wait(chan, "vm-messages");
|
cmd = vm_play_folder_name(chan, vms.fn);
|
||||||
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");
|
|
||||||
}
|
|
||||||
if (skipaftercmd) {
|
if (skipaftercmd) {
|
||||||
if (vms.curmsg < vms.lastmsg) {
|
if (vms.curmsg < vms.lastmsg) {
|
||||||
vms.curmsg++;
|
vms.curmsg++;
|
||||||
@@ -3577,17 +3660,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
|||||||
case '*':
|
case '*':
|
||||||
if (!vms.starting) {
|
if (!vms.starting) {
|
||||||
cmd = ast_play_and_wait(chan, "vm-onefor");
|
cmd = ast_play_and_wait(chan, "vm-onefor");
|
||||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* Spanish or Portuguese syntax */
|
if (!cmd)
|
||||||
if (!cmd)
|
cmd = vm_play_folder_name(chan, vms.vmbox);
|
||||||
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)
|
if (!cmd)
|
||||||
cmd = ast_play_and_wait(chan, "vm-opts");
|
cmd = ast_play_and_wait(chan, "vm-opts");
|
||||||
if (!cmd)
|
if (!cmd)
|
||||||
@@ -3800,7 +3874,7 @@ static int handle_show_voicemail_users(int fd, int argc, char *argv[])
|
|||||||
if ((vmdir = opendir(dirname))) {
|
if ((vmdir = opendir(dirname))) {
|
||||||
/* No matter what the format of VM, there will always be a .txt file for each message. */
|
/* No matter what the format of VM, there will always be a .txt file for each message. */
|
||||||
while ((vment = readdir(vmdir)))
|
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++;
|
vmcount++;
|
||||||
closedir(vmdir);
|
closedir(vmdir);
|
||||||
}
|
}
|
||||||
@@ -3924,7 +3998,7 @@ static int load_config(void)
|
|||||||
zonesl = NULL;
|
zonesl = NULL;
|
||||||
users = NULL;
|
users = NULL;
|
||||||
usersl = NULL;
|
usersl = NULL;
|
||||||
memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd) - 1);
|
memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
|
||||||
if (cfg) {
|
if (cfg) {
|
||||||
/* General settings */
|
/* 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 */
|
/* Record message & let caller review or re-record it, or set options if applicable */
|
||||||
int res = 0;
|
int res = 0;
|
||||||
@@ -4579,14 +4653,12 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
|
|||||||
}
|
}
|
||||||
recorded = 1;
|
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 */
|
/* 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)
|
if (cmd == -1)
|
||||||
/* User has hung up, no options to give */
|
/* User has hung up, no options to give */
|
||||||
return res;
|
return cmd;
|
||||||
if (cmd == '0') {
|
if (cmd == '0') {
|
||||||
/* Erase the message if 0 pushed during playback */
|
break;
|
||||||
ast_play_and_wait(chan, "vm-deleted");
|
|
||||||
vm_delete(recordfile);
|
|
||||||
} else if (cmd == '*') {
|
} else if (cmd == '*') {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -4639,13 +4711,20 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
|
|||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
case '0':
|
case '0':
|
||||||
if (outsidecaller && vmu->operator) {
|
if (message_exists || recorded) {
|
||||||
if (message_exists)
|
cmd = ast_play_and_wait(chan, "vm-saveoper");
|
||||||
ast_play_and_wait(chan, "vm-msgsaved");
|
if (!cmd)
|
||||||
return cmd;
|
cmd = ast_waitfordigit(chan, 3000);
|
||||||
} else
|
if (cmd == '1') {
|
||||||
cmd = ast_play_and_wait(chan, "vm-sorry");
|
ast_play_and_wait(chan, "vm-msgsaved");
|
||||||
break;
|
cmd = '0';
|
||||||
|
} else {
|
||||||
|
ast_play_and_wait(chan, "vm-deleted");
|
||||||
|
vm_delete(recordfile);
|
||||||
|
cmd = '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cmd;
|
||||||
default:
|
default:
|
||||||
/* If the caller is an ouside caller, and the review option is enabled,
|
/* 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
|
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)
|
if (outsidecaller)
|
||||||
ast_play_and_wait(chan, "vm-goodbye");
|
ast_play_and_wait(chan, "vm-goodbye");
|
||||||
if (cmd == 't')
|
if (cmd == 't')
|
||||||
cmd = 0;
|
cmd = 0;
|
||||||
return cmd;
|
return cmd;
|
||||||
@@ -4703,6 +4782,7 @@ static int vm_delete(char *file)
|
|||||||
return ast_filedelete(file, NULL);
|
return ast_filedelete(file, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int usecount(void)
|
int usecount(void)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
0
apps/app_waitforring.c
Executable file → Normal file
0
apps/app_waitforring.c
Executable file → Normal file
0
apps/app_zapateller.c
Executable file → Normal file
0
apps/app_zapateller.c
Executable file → Normal file
0
apps/app_zapbarge.c
Executable file → Normal file
0
apps/app_zapbarge.c
Executable file → Normal file
27
apps/app_zapras.c
Executable file → Normal file
27
apps/app_zapras.c
Executable file → Normal file
@@ -125,8 +125,14 @@ static void run_ras(struct ast_channel *chan, char *args)
|
|||||||
int status;
|
int status;
|
||||||
int res;
|
int res;
|
||||||
int signalled = 0;
|
int signalled = 0;
|
||||||
struct zt_bufferinfo bi;
|
struct zt_bufferinfo savebi;
|
||||||
int x;
|
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);
|
pid = spawn_ras(chan, args);
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
@@ -162,20 +168,11 @@ static void run_ras(struct ast_channel *chan, char *args)
|
|||||||
x = 1;
|
x = 1;
|
||||||
ioctl(chan->fds[0], ZT_AUDIOMODE, &x);
|
ioctl(chan->fds[0], ZT_AUDIOMODE, &x);
|
||||||
|
|
||||||
/* Double check buffering too */
|
/* Restore saved values */
|
||||||
res = ioctl(chan->fds[0], ZT_GET_BUFINFO, &bi);
|
res = ioctl(chan->fds[0], ZT_SET_BUFINFO, &savebi);
|
||||||
if (!res) {
|
if (res < 0) {
|
||||||
/* XXX This is ZAP_BLOCKSIZE XXX */
|
ast_log(LOG_WARNING, "Unable to set buffer policy on channel %s\n", chan->name);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
0
apps/app_zapscan.c
Executable file → Normal file
0
apps/app_zapscan.c
Executable file → Normal file
0
apps/enter.h
Executable file → Normal file
0
apps/enter.h
Executable file → Normal file
0
apps/leave.h
Executable file → Normal file
0
apps/leave.h
Executable file → Normal file
0
apps/rpt_flow.pdf
Executable file → Normal file
0
apps/rpt_flow.pdf
Executable file → Normal file
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user