mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-17 19:46:52 +00:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
6e20552bca | ||
|
f09fbd398e | ||
|
517518809a | ||
|
b4cd946ef0 | ||
|
59286cfbc1 |
@@ -1,6 +0,0 @@
|
||||
asterisk
|
||||
build.h
|
||||
ast_expr.c
|
||||
.version
|
||||
.depend
|
||||
.applied
|
57
CHANGES
Executable file → Normal file
57
CHANGES
Executable file → Normal file
@@ -1,8 +1,63 @@
|
||||
NOTE: Corrections or additions to the ChangeLog may be submitted
|
||||
to http://bugs.digium.com. A complete listing of changes
|
||||
is available through the Asterisk-CVS mailing list hosted
|
||||
at http://lists.digium.com.
|
||||
|
||||
Asterisk 1.0.4
|
||||
-- general
|
||||
-- fix memory leak evident with extensive use of variables
|
||||
-- update IAXy firmware to version 22
|
||||
-- enable some special write protection
|
||||
-- enable outbound DTMF
|
||||
-- fix seg fault with incorrect usage of SetVar
|
||||
-- other minor fixes including typos and doc updates
|
||||
-- chan_sip
|
||||
-- fix codecs to not be case sensitive
|
||||
-- Re-use auth credentials
|
||||
-- fix MWI when using type=friend
|
||||
-- fix global NAT option
|
||||
-- chan_agent / chan_local
|
||||
-- fix incorrect use count
|
||||
-- chan_zap
|
||||
-- Allow CID rings to be configured in zapata.conf
|
||||
-- no more patching needed for UK CID
|
||||
-- app_macro
|
||||
-- allow Macros to exit with '*' or '#' like regular extension processing
|
||||
-- app_voicemail
|
||||
-- don't allow '#' as a password
|
||||
-- add option to save voicemail before going to the operator
|
||||
-- fix global operator=yes
|
||||
-- app_read
|
||||
-- return 0 instead of -1 if user enters nothing
|
||||
-- res_agi
|
||||
-- don't exit AGI when file not found to stream
|
||||
-- send script parameter when using FastAGI
|
||||
Asterisk 1.0.3
|
||||
-- chan_zap
|
||||
-- fix seg fault when doing *0 to flash a trunk
|
||||
-- rtp
|
||||
-- seg fault fix
|
||||
-- chan_sip
|
||||
-- fix to prevent seg fault when attempting a transfer
|
||||
-- fix bug with supervised transfers
|
||||
-- fix codec preferences
|
||||
-- chan_h323
|
||||
-- fix compilation problem
|
||||
-- chan_iax2
|
||||
-- avoid a deadlock related to a static config of a BUNCH of peers
|
||||
-- cdr_pgsql
|
||||
-- fix memory leak when reading config
|
||||
-- Numerous other minor bug fixes
|
||||
Asterisk 1.0.2
|
||||
-- Major bugfix release
|
||||
Asterisk 1.0.1
|
||||
-- Added AGI over TCP support
|
||||
-- Add ability to purge callers from queue if no agents are logged in
|
||||
-- Fix inband PRI indication detection
|
||||
-- Fix for MGCP - always request digits if no RTP stream
|
||||
-- Fixed seg fault for ast_control_streamfile
|
||||
-- Added AGI over TCP support
|
||||
-- Make pick-up extension configurable via features.conf
|
||||
-- Numerous other bug fixes
|
||||
Asterisk 1.0.0
|
||||
-- Use Q.931 standard cause codes for asterisk cause codes
|
||||
-- Bug fixes from the bug tracker
|
||||
|
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
|
||||
Brian West - ODBC support and Bug Marshaling
|
||||
William Waites - syslog support, SIP NAT traversal for SIP-UA. ww@styx.org
|
||||
Rich Murphey - Porting to FreeBSD, NetBSD, OpenBSD, and Darwin.
|
||||
rich@whiteoaklabs.com http://whiteoaklabs.com
|
||||
|
||||
=== OTHER CONTRIBUTIONS ===
|
||||
John Todd - Monkey sounds and associated teletorture prompt
|
||||
|
||||
=== HOLD MUSIC ===
|
||||
Music provided by www.freeplaymusic.com
|
||||
Music provided by www.opsound.org
|
||||
|
||||
=== OTHER SOURCE CODE IN ASTERISK ===
|
||||
|
||||
|
8
Makefile
Executable file → Normal file
8
Makefile
Executable file → Normal file
@@ -138,15 +138,15 @@ CFLAGS+=$(shell if [ -f /usr/include/osp/osp.h ]; then echo "-DOSP_SUPPORT -I/us
|
||||
|
||||
ifeq (${OSARCH},FreeBSD)
|
||||
OSVERSION=$(shell make -V OSVERSION -f /usr/share/mk/bsd.port.subdir.mk)
|
||||
CFLAGS+=$(if ${OSVERSION}<500016,-D_THREAD_SAFE)
|
||||
LIBS+=$(if ${OSVERSION}<502102,-lc_r,-pthread)
|
||||
CFLAGS+=$(shell if test ${OSVERSION} -lt 500016 ; then echo "-D_THREAD_SAFE"; fi)
|
||||
LIBS+=$(shell if test ${OSVERSION} -lt 502102 ; then echo "-lc_r"; else echo "-pthread"; fi)
|
||||
INCLUDE+=-I/usr/local/include
|
||||
CFLAGS+=$(shell if [ -d /usr/local/include/spandsp ]; then echo "-I/usr/local/include/spandsp"; fi)
|
||||
endif # FreeBSD
|
||||
|
||||
ifeq (${OSARCH},NetBSD)
|
||||
CFLAGS+=-pthread
|
||||
INCLUDE+=-I/usr/local/include
|
||||
INCLUDE+=-I/usr/local/include -I/usr/pkg/include
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},OpenBSD)
|
||||
@@ -197,7 +197,7 @@ ifeq (${OSARCH},FreeBSD)
|
||||
LIBS+=-lcrypto
|
||||
endif
|
||||
ifeq (${OSARCH},NetBSD)
|
||||
LIBS+=-lpthread -lcrypto -lm -L/usr/local/lib -lncurses
|
||||
LIBS+=-lpthread -lcrypto -lm -L/usr/local/lib -L/usr/pkg/lib -lncurses
|
||||
endif
|
||||
ifeq (${OSARCH},OpenBSD)
|
||||
LIBS=-lcrypto -lpthread -lm -lncurses
|
||||
|
@@ -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
|
7
acl.c
Executable file → Normal file
7
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));
|
||||
m_rtmsg.m_rtm.rtm_type = RTM_GET;
|
||||
m_rtmsg.m_rtm.rtm_flags = RTF_UP | RTF_HOST;
|
||||
m_rtmsg.m_rtm.rtm_version = RTM_VERSION;
|
||||
ast_mutex_lock(&routeseq_lock);
|
||||
seq = ++routeseq;
|
||||
ast_mutex_unlock(&routeseq_lock);
|
||||
m_rtmsg.m_rtm.rtm_seq = seq;
|
||||
m_rtmsg.m_rtm.rtm_addrs = RTA_IFA | RTA_DST;
|
||||
m_rtmsg.m_rtm.rtm_addrs = RTA_DST | RTA_IFA;
|
||||
m_rtmsg.m_rtm.rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
|
||||
sin = (struct sockaddr_in *)m_rtmsg.m_space;
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_len = sizeof(struct sockaddr_in);
|
||||
sin->sin_addr = *them;
|
||||
|
||||
if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
|
||||
if ((s = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0) {
|
||||
ast_log(LOG_ERROR, "Error opening routing socket\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -268,7 +267,7 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
|
||||
}
|
||||
do {
|
||||
l = read(s, (char *)&m_rtmsg, sizeof(m_rtmsg));
|
||||
} while (l > 0 && (m_rtmsg.m_rtm.rtm_seq != 1 || m_rtmsg.m_rtm.rtm_pid != pid));
|
||||
} while (l > 0 && (m_rtmsg.m_rtm.rtm_seq != seq || m_rtmsg.m_rtm.rtm_pid != pid));
|
||||
if (l < 0) {
|
||||
if (errno != EAGAIN)
|
||||
ast_log(LOG_ERROR, "Error reading from routing socket\n");
|
||||
|
0
aescrypt.c
Executable file → Normal file
0
aescrypt.c
Executable file → Normal file
@@ -1,3 +0,0 @@
|
||||
eagi-test
|
||||
eagi-sphinx-test
|
||||
.depend
|
0
agi/DialAnMp3.agi
Executable file → Normal file
0
agi/DialAnMp3.agi
Executable file → Normal file
0
agi/Makefile
Executable file → Normal file
0
agi/Makefile
Executable file → Normal file
0
agi/agi-test.agi
Executable file → Normal file
0
agi/agi-test.agi
Executable file → Normal file
0
agi/eagi-sphinx-test.c
Executable file → Normal file
0
agi/eagi-sphinx-test.c
Executable file → Normal file
0
agi/eagi-test.c
Executable file → Normal file
0
agi/eagi-test.c
Executable file → Normal file
0
agi/fastagi-test
Executable file → Normal file
0
agi/fastagi-test
Executable file → Normal file
0
agi/numeralize
Executable file → Normal file
0
agi/numeralize
Executable file → Normal file
17
app.c
Executable file → Normal file
17
app.c
Executable file → Normal file
@@ -706,10 +706,12 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
|
||||
for (x=0;x<fmtcnt;x++) {
|
||||
if (!others[x])
|
||||
break;
|
||||
if (totalsilence)
|
||||
ast_stream_rewind(others[x], totalsilence-200);
|
||||
else
|
||||
ast_stream_rewind(others[x], 200);
|
||||
if (res > 0) {
|
||||
if (totalsilence)
|
||||
ast_stream_rewind(others[x], totalsilence-200);
|
||||
else
|
||||
ast_stream_rewind(others[x], 200);
|
||||
}
|
||||
ast_truncstream(others[x]);
|
||||
ast_closestream(others[x]);
|
||||
}
|
||||
@@ -718,14 +720,11 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
|
||||
ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(rfmt), chan->name);
|
||||
}
|
||||
}
|
||||
if (outmsg) {
|
||||
if (outmsg > 1) {
|
||||
if (outmsg > 1) {
|
||||
/* Let them know recording is stopped */
|
||||
ast_streamfile(chan, "auth-thankyou", chan->language);
|
||||
if(!ast_streamfile(chan, "auth-thankyou", chan->language))
|
||||
ast_waitstream(chan, "");
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@@ -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 *synopsis = "Provide support for receving alarm reports from a burglar or fire alarm panel\n";
|
||||
static char *synopsis = "Provide support for receving alarm reports from a burglar or fire alarm panel";
|
||||
static char *descrip =
|
||||
"Alarm receiver application for Asterisk. Only 1 signalling format is supported at this time:\n"
|
||||
"Ademco Contact ID. This application should be called whenever there is an alarm panel calling in\n"
|
||||
|
0
apps/app_authenticate.c
Executable file → Normal file
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"
|
||||
"of the requested channels are available the new priority will be\n"
|
||||
"n+101 (unless such a priority does not exist or on error, in which\n"
|
||||
"case ChanIsAvail will return -1). If any of the requested channels\n"
|
||||
"are available, the next priority will be n+1, the channel variable\n"
|
||||
"${AVAILCHAN} will be set to the name of the available channel and\n"
|
||||
"the ChanIsAvail app will return 0. ${AVAILORIGCHAN} is\n"
|
||||
"the canonical channel name that was used to create the channel.\n";
|
||||
"case ChanIsAvail will return -1).\n"
|
||||
"If any of the requested channels are available, the next priority will be n+1,\n"
|
||||
"the channel variable ${AVAILCHAN} will be set to the name of the available channel\n"
|
||||
"and the ChanIsAvail app will return 0.\n"
|
||||
"${AVAILORIGCHAN} is the canonical channel name that was used to create the channel.\n"
|
||||
"${AVAILSTATUS} is the status code for the channel.\n";
|
||||
|
||||
STANDARD_LOCAL_USER;
|
||||
|
||||
|
0
apps/app_controlplayback.c
Executable file → Normal file
0
apps/app_controlplayback.c
Executable file → Normal file
0
apps/app_cut.c
Executable file → Normal file
0
apps/app_cut.c
Executable file → Normal file
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
13
apps/app_dial.c
Executable file → Normal file
13
apps/app_dial.c
Executable file → Normal file
@@ -281,6 +281,9 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
||||
ast_hangup(o->chan);
|
||||
o->chan = NULL;
|
||||
numnochan++;
|
||||
} else {
|
||||
/* After calling, set callerid to extension */
|
||||
ast_set_callerid(o->chan, ast_strlen_zero(in->macroexten) ? in->exten : in->macroexten, 0);
|
||||
}
|
||||
}
|
||||
/* Hangup the original channel now, in case we needed it */
|
||||
@@ -336,7 +339,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
||||
case AST_CONTROL_PROGRESS:
|
||||
if (option_verbose > 2)
|
||||
ast_verbose ( VERBOSE_PREFIX_3 "%s is making progress passing it to %s\n", o->chan->name,in->name);
|
||||
ast_indicate(in, AST_CONTROL_PROGRESS);
|
||||
if (!outgoing->ringbackonly)
|
||||
ast_indicate(in, AST_CONTROL_PROGRESS);
|
||||
break;
|
||||
case AST_CONTROL_OFFHOOK:
|
||||
/* Ignore going off hook */
|
||||
@@ -383,6 +387,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
||||
/* Got hung up */
|
||||
*to=-1;
|
||||
strncpy(status, "CANCEL", statussize - 1);
|
||||
if (f)
|
||||
ast_frfree(f);
|
||||
return NULL;
|
||||
}
|
||||
if (f && (f->frametype == AST_FRAME_DTMF) && *allowdisconnect_out &&
|
||||
@@ -391,6 +397,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
|
||||
ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
|
||||
*to=0;
|
||||
strcpy(status, "CANCEL");
|
||||
ast_frfree(f);
|
||||
return NULL;
|
||||
}
|
||||
if (single && ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_DTMF))) {
|
||||
@@ -841,9 +848,11 @@ static int dial_exec(struct ast_channel *chan, void *data)
|
||||
free(tmp);
|
||||
cur = rest;
|
||||
continue;
|
||||
} else
|
||||
} else {
|
||||
if (option_verbose > 2)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "Called %s\n", numsubst);
|
||||
ast_set_callerid(tmp->chan, ast_strlen_zero(chan->macroexten) ? chan->exten : chan->macroexten, 0);
|
||||
}
|
||||
/* Put them in the list of outgoing thingies... We're ready now.
|
||||
XXX If we're forcibly removed, these outgoing calls won't get
|
||||
hung up XXX */
|
||||
|
0
apps/app_directory.c
Executable file → Normal file
0
apps/app_directory.c
Executable file → Normal file
0
apps/app_disa.c
Executable file → Normal file
0
apps/app_disa.c
Executable file → Normal file
0
apps/app_echo.c
Executable file → Normal file
0
apps/app_echo.c
Executable file → Normal file
0
apps/app_enumlookup.c
Executable file → Normal file
0
apps/app_enumlookup.c
Executable file → Normal file
0
apps/app_eval.c
Executable file → Normal file
0
apps/app_eval.c
Executable file → Normal file
0
apps/app_exec.c
Executable file → Normal file
0
apps/app_exec.c
Executable file → Normal file
6
apps/app_festival.c
Executable file → Normal file
6
apps/app_festival.c
Executable file → Normal file
@@ -305,9 +305,9 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
||||
if (!(festivalcommand = ast_variable_retrieve(cfg, "general", "festivalcommand"))) {
|
||||
festivalcommand = "(tts_textasterisk \"%s\" 'file)(quit)\n";
|
||||
}
|
||||
ast_destroy(cfg);
|
||||
if (!vdata || ast_strlen_zero(vdata)) {
|
||||
ast_log(LOG_WARNING, "festival requires an argument (text)\n");
|
||||
ast_destroy(cfg);
|
||||
return -1;
|
||||
}
|
||||
strncpy(data, vdata, sizeof(data) - 1);
|
||||
@@ -325,6 +325,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
||||
|
||||
if (fd < 0) {
|
||||
ast_log(LOG_WARNING,"festival_client: can't get socket\n");
|
||||
ast_destroy(cfg);
|
||||
return -1;
|
||||
}
|
||||
memset(&serv_addr, 0, sizeof(serv_addr));
|
||||
@@ -333,6 +334,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
||||
serverhost = ast_gethostbyname(host, &ahp);
|
||||
if (serverhost == (struct hostent *)0) {
|
||||
ast_log(LOG_WARNING,"festival_client: gethostbyname failed\n");
|
||||
ast_destroy(cfg);
|
||||
return -1;
|
||||
}
|
||||
memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length);
|
||||
@@ -342,6 +344,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
||||
|
||||
if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0) {
|
||||
ast_log(LOG_WARNING,"festival_client: connect to server failed\n");
|
||||
ast_destroy(cfg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -444,6 +447,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
|
||||
}
|
||||
} while (strcmp(ack,"OK\n") != 0);
|
||||
close(fd);
|
||||
ast_destroy(cfg);
|
||||
LOCAL_USER_REMOVE(u);
|
||||
return res;
|
||||
|
||||
|
0
apps/app_flash.c
Executable file → Normal file
0
apps/app_flash.c
Executable file → Normal file
5
apps/app_forkcdr.c
Executable file → Normal file
5
apps/app_forkcdr.c
Executable file → Normal file
@@ -23,7 +23,8 @@
|
||||
static char *tdesc = "Fork The CDR into 2 seperate entities.";
|
||||
static char *app = "ForkCDR";
|
||||
static char *synopsis =
|
||||
"Forks the Call Data Record\n"
|
||||
"Forks the Call Data Record";
|
||||
static char *descrip =
|
||||
" ForkCDR(): Causes the Call Data Record to fork an additional\n"
|
||||
"cdr record starting from the time of the fork call\n";
|
||||
|
||||
@@ -68,7 +69,7 @@ int unload_module(void)
|
||||
|
||||
int load_module(void)
|
||||
{
|
||||
return ast_register_application(app, forkcdr_exec, synopsis, tdesc);
|
||||
return ast_register_application(app, forkcdr_exec, synopsis, descrip);
|
||||
}
|
||||
|
||||
char *description(void)
|
||||
|
10
apps/app_getcpeid.c
Executable file → Normal file
10
apps/app_getcpeid.c
Executable file → Normal file
@@ -3,9 +3,9 @@
|
||||
*
|
||||
* Execute arbitrary system commands
|
||||
*
|
||||
* Copyright (C) 1999, Mark Spencer
|
||||
* Copyright (C) 1999-2005, Digium
|
||||
*
|
||||
* Mark Spencer <markster@linux-support.net>
|
||||
* Mark Spencer <markster@digium.com>
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License
|
||||
@@ -31,9 +31,9 @@ static char *app = "GetCPEID";
|
||||
static char *synopsis = "Get ADSI CPE ID";
|
||||
|
||||
static char *descrip =
|
||||
" GetCPEID: Obtains and displays CPE ID and other information in order to\n"
|
||||
"properly setup zapata.conf for on-hook operations. Returns -1 on hanup\n"
|
||||
"only.";
|
||||
" GetCPEID: Obtains and displays ADSI CPE ID and other information in order\n"
|
||||
"to properly setup zapata.conf for on-hook operations.\n"
|
||||
"Returns -1 on hangup only.\n";
|
||||
|
||||
STANDARD_LOCAL_USER;
|
||||
|
||||
|
0
apps/app_groupcount.c
Executable file → Normal file
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/module.h>
|
||||
#include <asterisk/lock.h>
|
||||
#include <asterisk/utils.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
@@ -70,7 +71,7 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
|
||||
{
|
||||
int res=0;
|
||||
struct localuser *u;
|
||||
char vmpath[256], *input, *varname = NULL, *vmbox, *vmfolder = "INBOX", *context = "default";
|
||||
char vmpath[256], *temps, *input, *varname = NULL, *vmbox, *vmfolder = "INBOX", *context = "default";
|
||||
DIR *vmdir;
|
||||
struct dirent *vment;
|
||||
int vmcount = 0;
|
||||
@@ -83,21 +84,22 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
|
||||
|
||||
input = ast_strdupa((char *)data);
|
||||
if (input) {
|
||||
if ((vmbox = strsep(&input,":")))
|
||||
if ((vmfolder = strsep(&input,"|")))
|
||||
temps = input;
|
||||
if ((temps = strsep(&input, "|"))) {
|
||||
if (input && !ast_strlen_zero(input))
|
||||
varname = input;
|
||||
else
|
||||
vmfolder = input;
|
||||
else
|
||||
if ((vmbox = strsep(&input,"|")))
|
||||
varname = input;
|
||||
else
|
||||
vmbox = input;
|
||||
|
||||
if (index(vmbox,'@')) {
|
||||
context = vmbox;
|
||||
vmbox = strsep(&context,"@");
|
||||
input = temps;
|
||||
}
|
||||
if ((temps = strsep(&input, ":"))) {
|
||||
if (input && !ast_strlen_zero(input))
|
||||
vmfolder = input;
|
||||
input = temps;
|
||||
}
|
||||
if ((vmbox = strsep(&input, "@")))
|
||||
if (input && !ast_strlen_zero(input))
|
||||
context = input;
|
||||
if (!vmbox)
|
||||
vmbox = input;
|
||||
|
||||
snprintf(vmpath,sizeof(vmpath), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, vmbox, vmfolder);
|
||||
if (!(vmdir = opendir(vmpath))) {
|
||||
|
0
apps/app_ices.c
Executable file → Normal file
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)) {
|
||||
if ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid))) {
|
||||
/* Something bad happened, or a hangup has been requested. */
|
||||
if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) {
|
||||
if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F')) ||
|
||||
(res == '*') || (res == '#')) {
|
||||
/* Just return result as to the previous application as if it had been dialed */
|
||||
ast_log(LOG_DEBUG, "Oooh, got something to jump out with ('%c')!\n", res);
|
||||
break;
|
||||
|
18
apps/app_meetme.c
Executable file → Normal file
18
apps/app_meetme.c
Executable file → Normal file
@@ -524,7 +524,9 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
memset(user, 0, sizeof(struct ast_conf_user));
|
||||
|
||||
user->user_no = 0; /* User number 0 means starting up user! (dead - not in the list!) */
|
||||
|
||||
|
||||
time(&user->jointime);
|
||||
|
||||
if (conf->locked) {
|
||||
/* Sorry, but this confernce is locked! */
|
||||
if (!ast_streamfile(chan, "conf-locked", chan->language))
|
||||
@@ -557,7 +559,6 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
|
||||
conf->lastuser = user;
|
||||
}
|
||||
}
|
||||
strncpy(user->usrvalue, "test", sizeof(user->usrvalue) - 1);
|
||||
user->chan = chan;
|
||||
user->userflags = confflags;
|
||||
user->adminflags = 0;
|
||||
@@ -1043,10 +1044,10 @@ outrun:
|
||||
else
|
||||
ast_log(LOG_ERROR, "Bad! Bad! Bad! user->prevuser is NULL but we're not the beginning!\n");
|
||||
}
|
||||
/* Return the number of seconds the user was in the conf */
|
||||
snprintf(meetmesecs, sizeof(meetmesecs), "%i", (int) (user->jointime - time(NULL)));
|
||||
pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);
|
||||
}
|
||||
/* Return the number of seconds the user was in the conf */
|
||||
snprintf(meetmesecs, sizeof(meetmesecs), "%i", (int) (time(NULL) - user->jointime));
|
||||
pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);
|
||||
}
|
||||
free(user);
|
||||
ast_mutex_unlock(&conflock);
|
||||
@@ -1454,14 +1455,17 @@ static int admin_exec(struct ast_channel *chan, void *data) {
|
||||
command = 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;
|
||||
while (cnf) {
|
||||
if (strcmp(cnf->confno, conf) == 0)
|
||||
break;
|
||||
cnf = cnf->next;
|
||||
}
|
||||
ast_mutex_unlock(&conflock);
|
||||
|
||||
if (caller)
|
||||
user = find_user(cnf, caller);
|
||||
|
0
apps/app_milliwatt.c
Executable file → Normal file
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
2
apps/app_parkandannounce.c
Executable file → Normal file
2
apps/app_parkandannounce.c
Executable file → Normal file
@@ -94,7 +94,7 @@ static int parkandannounce_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
dial=strsep(&s, "|");
|
||||
if(!dial) {
|
||||
ast_log(LOG_WARNING, "PARK: A dial resouce must be specified i.e: Console/dsp or Zap/g1/5551212\n");
|
||||
ast_log(LOG_WARNING, "PARK: A dial resource must be specified i.e: Console/dsp or Zap/g1/5551212\n");
|
||||
free(orig_s);
|
||||
return -1;
|
||||
} else {
|
||||
|
0
apps/app_playback.c
Executable file → Normal file
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
0
apps/app_qcall.c
Executable file → Normal file
0
apps/app_qcall.c
Executable file → Normal file
23
apps/app_queue.c
Executable file → Normal file
23
apps/app_queue.c
Executable file → Normal file
@@ -226,6 +226,7 @@ struct ast_call_queue {
|
||||
int wrapped; /* Round Robin - wrapped around? */
|
||||
int joinempty; /* Do we care if the queue has no members? */
|
||||
int eventwhencalled; /* Generate an event when the agent is called (before pickup) */
|
||||
int leavewhenempty; /* If all agents leave the queue, remove callers from the queue */
|
||||
|
||||
struct member *members; /* Member channels to be tried */
|
||||
struct queue_ent *head; /* Start of the actual queue */
|
||||
@@ -912,6 +913,12 @@ static int wait_our_turn(struct queue_ent *qe, int ringing)
|
||||
break;
|
||||
}
|
||||
|
||||
/* leave the queue if no agents, if enabled */
|
||||
if (!(qe->parent->members) && qe->parent->leavewhenempty) {
|
||||
leave_queue(qe);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Make a position announcement, if enabled */
|
||||
if (qe->parent->announcefrequency && !ringing)
|
||||
say_position(qe);
|
||||
@@ -1626,7 +1633,7 @@ check_turns:
|
||||
/* This is the wait loop for the head caller*/
|
||||
/* To exit, they may get their call answered; */
|
||||
/* they may dial a digit from the queue context; */
|
||||
/* or, they may may timeout. */
|
||||
/* or, they may timeout. */
|
||||
|
||||
/* Leave if we have exceeded our queuetimeout */
|
||||
if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
|
||||
@@ -1634,6 +1641,12 @@ check_turns:
|
||||
break;
|
||||
}
|
||||
|
||||
/* leave the queue if no agents, if enabled */
|
||||
if (!((qe.parent)->members) && (qe.parent)->leavewhenempty) {
|
||||
leave_queue(&qe);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Make a position announcement, if enabled */
|
||||
if (qe.parent->announcefrequency && !ringing)
|
||||
say_position(&qe);
|
||||
@@ -1691,7 +1704,7 @@ check_turns:
|
||||
}
|
||||
}
|
||||
/* Don't allow return code > 0 */
|
||||
if (res > 0 && res != AST_PBX_KEEPALIVE) {
|
||||
if ((res == 0) || (res > 0 && res != AST_PBX_KEEPALIVE)) {
|
||||
res = 0;
|
||||
if (ringing) {
|
||||
ast_indicate(chan, -1);
|
||||
@@ -1781,7 +1794,7 @@ static void reload_queues(void)
|
||||
strncpy(q->sound_minutes, "queue-minutes", sizeof(q->sound_minutes) - 1);
|
||||
strncpy(q->sound_seconds, "queue-seconds", sizeof(q->sound_seconds) - 1);
|
||||
strncpy(q->sound_thanks, "queue-thankyou", sizeof(q->sound_thanks) - 1);
|
||||
strncpy(q->sound_lessthan, "queue-lessthan", sizeof(q->sound_lessthan) - 1);
|
||||
strncpy(q->sound_lessthan, "queue-less-than", sizeof(q->sound_lessthan) - 1);
|
||||
prev = q->members;
|
||||
if (prev) {
|
||||
/* find the end of any dynamic members */
|
||||
@@ -1818,7 +1831,7 @@ static void reload_queues(void)
|
||||
q->members = cur;
|
||||
prev = cur;
|
||||
}
|
||||
} else if (!strcasecmp(var->name, "music")) {
|
||||
} else if (!strcasecmp(var->name, "music") || !strcasecmp(var->name, "musiconhold")) {
|
||||
strncpy(q->moh, var->value, sizeof(q->moh) - 1);
|
||||
} else if (!strcasecmp(var->name, "announce")) {
|
||||
strncpy(q->announce, var->value, sizeof(q->announce) - 1);
|
||||
@@ -1872,6 +1885,8 @@ static void reload_queues(void)
|
||||
}
|
||||
} else if (!strcasecmp(var->name, "joinempty")) {
|
||||
q->joinempty = ast_true(var->value);
|
||||
} else if (!strcasecmp(var->name, "leavewhenempty")) {
|
||||
q->leavewhenempty = ast_true(var->value);
|
||||
} else if (!strcasecmp(var->name, "eventwhencalled")) {
|
||||
q->eventwhencalled = ast_true(var->value);
|
||||
} else {
|
||||
|
0
apps/app_random.c
Executable file → Normal file
0
apps/app_random.c
Executable file → Normal file
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) {
|
||||
pbx_builtin_setvar_helper(chan, varname, tmp);
|
||||
ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp);
|
||||
res = 0;
|
||||
} else {
|
||||
ast_verbose(VERBOSE_PREFIX_3 "User entered nothing\n");
|
||||
ast_verbose(VERBOSE_PREFIX_3 "User disconnected\n");
|
||||
}
|
||||
}
|
||||
LOCAL_USER_REMOVE(u);
|
||||
|
2
apps/app_record.c
Executable file → Normal file
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);
|
||||
|
||||
LOCAL_USER_REMOVE(u);
|
||||
if (silence > 0) {
|
||||
if ((silence > 0) && rfmt) {
|
||||
res = ast_set_read_format(chan, rfmt);
|
||||
if (res)
|
||||
ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name);
|
||||
|
0
apps/app_rpt.c
Executable file → Normal file
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
13
apps/app_sms.c
Executable file → Normal file
13
apps/app_sms.c
Executable file → Normal file
@@ -26,6 +26,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <ctype.h>
|
||||
#include "../astconf.h"
|
||||
|
||||
/* ToDo */
|
||||
/* When acting as SC and answering, should check for messages and send instead of sending EST as first packet */
|
||||
@@ -36,6 +37,9 @@
|
||||
|
||||
static unsigned char message_ref; /* arbitary message ref */
|
||||
|
||||
static char log_file[255];
|
||||
static char spool_dir[255];
|
||||
|
||||
static char *tdesc = "SMS/PSTN handler";
|
||||
|
||||
static char *app = "SMS";
|
||||
@@ -315,7 +319,7 @@ sms_log (sms_t * h, char status)
|
||||
{ /* log the output, and remove file */
|
||||
if (*h->oa || *h->da)
|
||||
{
|
||||
int o = open ("/var/log/asterisk/sms", O_CREAT | O_APPEND | O_WRONLY, 0666);
|
||||
int o = open (log_file, O_CREAT | O_APPEND | O_WRONLY, 0666);
|
||||
if (o >= 0)
|
||||
{
|
||||
char line[1000], *p;
|
||||
@@ -517,7 +521,7 @@ sms_writefile (sms_t * h)
|
||||
char fn2[200] = "";
|
||||
FILE *o;
|
||||
|
||||
strncpy(fn, "/var/spool/asterisk/sms", sizeof(fn) - 1);
|
||||
strncpy(fn, spool_dir, sizeof(fn) - 1);
|
||||
mkdir (fn, 0777); /* ensure it exists */
|
||||
snprintf(fn + strlen(fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "me-sc" : "sc-me", h->queue);
|
||||
mkdir (fn, 0777); /* ensure it exists */
|
||||
@@ -689,7 +693,7 @@ sms_nextoutgoing (sms_t * h)
|
||||
DIR *d;
|
||||
char more = 0;
|
||||
|
||||
strncpy(fn, "/var/spool/asterisk/sms", sizeof(fn) - 1);
|
||||
strncpy(fn, spool_dir, sizeof(fn) - 1);
|
||||
mkdir(fn, 0777); /* ensure it exists */
|
||||
snprintf(fn + strlen (fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "sc-me" : "me-sc", h->queue);
|
||||
mkdir (fn, 0777); /* ensure it exists */
|
||||
@@ -769,6 +773,7 @@ sms_nextoutgoing (sms_t * h)
|
||||
{ /* no message */
|
||||
h->omsg[0] = 0x94; /* SMS_REL */
|
||||
h->omsg[1] = 0;
|
||||
h->hangup = 1;
|
||||
sms_messagetx (h);
|
||||
}
|
||||
}
|
||||
@@ -1204,6 +1209,8 @@ load_module (void)
|
||||
for (p = 0; p < 128; p++)
|
||||
sms8to7[sms7to8[p]] = p;
|
||||
}
|
||||
snprintf(log_file, sizeof(log_file), "%s/sms", ast_config_AST_LOG_DIR);
|
||||
snprintf(spool_dir, sizeof(spool_dir), "%s/sms", ast_config_AST_SPOOL_DIR);
|
||||
return ast_register_application (app, sms_exec, synopsis, descrip);
|
||||
}
|
||||
|
||||
|
0
apps/app_softhangup.c
Executable file → Normal file
0
apps/app_softhangup.c
Executable file → Normal file
0
apps/app_sql_postgres.c
Executable file → Normal file
0
apps/app_sql_postgres.c
Executable file → Normal file
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.
|
||||
*
|
||||
* Applictions connected with CDR engine
|
||||
* Applications to test connection and produce report in text file
|
||||
*
|
||||
* Copyright (C) 2004, Digium, Inc.
|
||||
*
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <asterisk/channel.h>
|
||||
#include <asterisk/options.h>
|
||||
#include <asterisk/module.h>
|
||||
#include <asterisk/logger.h>
|
||||
#include <asterisk/lock.h>
|
||||
@@ -29,13 +30,15 @@
|
||||
|
||||
static char *tdesc = "Interface Test Application";
|
||||
|
||||
static char *tests_descrip = "TestServer(): Perform test server function and write call report"
|
||||
"Results stored in /var/log/asterisk/testreports/<testid>.txt";
|
||||
static char *tests_descrip =
|
||||
"TestServer(): Perform test server function and write call report.\n"
|
||||
"Results stored in /var/log/asterisk/testreports/<testid>-server.txt";
|
||||
static char *tests_app = "TestServer";
|
||||
static char *tests_synopsis = "Execute Interface Test Server";
|
||||
|
||||
static char *testc_descrip = "TestClient(testid): Executes test client with given testid.\n"
|
||||
"Results stored in /var/log/asterisk/testreports/<testid>.txt";
|
||||
static char *testc_descrip =
|
||||
"TestClient(testid): Executes test client with given testid.\n"
|
||||
"Results stored in /var/log/asterisk/testreports/<testid>-client.txt";
|
||||
|
||||
static char *testc_app = "TestClient";
|
||||
static char *testc_synopsis = "Execute Interface Test Client";
|
||||
|
0
apps/app_transfer.c
Executable file → Normal file
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
2
apps/app_userevent.c
Executable file → Normal file
2
apps/app_userevent.c
Executable file → Normal file
@@ -54,12 +54,12 @@ static int userevent_exec(struct ast_channel *chan, void *data)
|
||||
}
|
||||
|
||||
strncpy(info, (char *)data, strlen((char *)data) + AST_MAX_EXTENSION-1);
|
||||
snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
|
||||
eventbody = strchr(eventname, '|');
|
||||
if (eventbody) {
|
||||
*eventbody = '\0';
|
||||
eventbody++;
|
||||
}
|
||||
snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
|
||||
LOCAL_USER_ADD(u);
|
||||
|
||||
if(eventbody) {
|
||||
|
0
apps/app_verbose.c
Executable file → Normal file
0
apps/app_verbose.c
Executable file → Normal file
353
apps/app_voicemail.c
Executable file → Normal file
353
apps/app_voicemail.c
Executable file → Normal file
@@ -178,6 +178,7 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
|
||||
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 vm_delete(char *file);
|
||||
static int vm_play_folder_name(struct ast_channel *chan, char *mbox);
|
||||
|
||||
static char ext_pass_cmd[128];
|
||||
|
||||
@@ -215,7 +216,10 @@ static char *descrip_vmain =
|
||||
"for the checking of voicemail. The mailbox can be passed as the option,\n"
|
||||
"which will stop the voicemail system from prompting the user for the mailbox.\n"
|
||||
"If the mailbox is preceded by 's' then the password check will be skipped. If\n"
|
||||
"a context is specified, logins are considered in that voicemail context only.\n"
|
||||
"the mailbox is preceded by 'p' then the supplied mailbox is prepended to the\n"
|
||||
"user's entry and the resulting string is used as the mailbox number. This is\n"
|
||||
"useful for virtual hosting of voicemail boxes. If a context is specified,\n"
|
||||
"logins are considered in that voicemail context only.\n"
|
||||
"Returns -1 if the user hangs up or 0 otherwise.\n";
|
||||
|
||||
static char *synopsis_vm_box_exists =
|
||||
@@ -705,6 +709,18 @@ static int make_file(char *dest, int len, char *dir, int num)
|
||||
return snprintf(dest, len, "%s/msg%04d", dir, num);
|
||||
}
|
||||
|
||||
static int last_message_index(char *dir)
|
||||
{
|
||||
int x;
|
||||
char fn[256];
|
||||
for (x=0;x<MAXMSG;x++) {
|
||||
make_file(fn, sizeof(fn), dir, x);
|
||||
if (ast_fileexists(fn, NULL, NULL) < 1)
|
||||
break;
|
||||
}
|
||||
return x-1;
|
||||
}
|
||||
|
||||
static int
|
||||
inbuf(struct baseio *bio, FILE *fi)
|
||||
{
|
||||
@@ -989,7 +1005,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
|
||||
fclose(p);
|
||||
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
|
||||
ast_safe_system(tmp2);
|
||||
ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", who, mailcmd);
|
||||
ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", vmu->email, mailcmd);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
|
||||
return -1;
|
||||
@@ -1076,7 +1092,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
|
||||
fclose(p);
|
||||
snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
|
||||
ast_safe_system(tmp2);
|
||||
ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", who, mailcmd);
|
||||
ast_log(LOG_DEBUG, "Sent page to %s with command '%s'\n", pager, mailcmd);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
|
||||
return -1;
|
||||
@@ -1356,7 +1372,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
||||
strncat(ecodes, "*", sizeof(ecodes) - strlen(ecodes) - 1);
|
||||
ausemacro = 1;
|
||||
}
|
||||
|
||||
|
||||
/* Play the beginning intro if desired */
|
||||
if (!ast_strlen_zero(prefile)) {
|
||||
if (ast_fileexists(prefile, NULL, NULL) > 0) {
|
||||
@@ -1403,22 +1419,22 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
||||
}
|
||||
/* Check for a '0' here */
|
||||
if (res == '0') {
|
||||
transfer:
|
||||
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
|
||||
if (!ast_strlen_zero(vmu->exit)) {
|
||||
strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
|
||||
} else if (ousemacro && !ast_strlen_zero(chan->macrocontext)) {
|
||||
strncpy(chan->context, chan->macrocontext, sizeof(chan->context) - 1);
|
||||
transfer:
|
||||
if (vmu->operator) {
|
||||
strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
|
||||
if (!ast_strlen_zero(vmu->exit)) {
|
||||
strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
|
||||
} else if (ousemacro && !ast_strlen_zero(chan->macrocontext)) {
|
||||
strncpy(chan->context, chan->macrocontext, sizeof(chan->context) - 1);
|
||||
}
|
||||
ast_play_and_wait(chan, "transfer");
|
||||
chan->priority = 0;
|
||||
free_user(vmu);
|
||||
return 0;
|
||||
} else {
|
||||
ast_play_and_wait(chan, "vm-sorry");
|
||||
return 0;
|
||||
}
|
||||
chan->priority = 0;
|
||||
free_user(vmu);
|
||||
return 0;
|
||||
}
|
||||
if (res >= 0) {
|
||||
/* Unless we're *really* silent, try to send the beep */
|
||||
res = ast_streamfile(chan, "beep", chan->language);
|
||||
if (!res)
|
||||
res = ast_waitstream(chan, "");
|
||||
}
|
||||
if (res < 0) {
|
||||
free_user(vmu);
|
||||
@@ -1434,6 +1450,12 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
||||
break;
|
||||
msgnum++;
|
||||
} while(msgnum < MAXMSG);
|
||||
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 (msgnum < MAXMSG) {
|
||||
/* Store information */
|
||||
snprintf(txtfile, sizeof(txtfile), "%s.txt", fn);
|
||||
@@ -1502,7 +1524,8 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
|
||||
free_user(recip);
|
||||
}
|
||||
}
|
||||
notify_new_message(chan, vmu, msgnum, duration, fmt, chan->callerid);
|
||||
if (ast_fileexists(fn, NULL, NULL))
|
||||
notify_new_message(chan, vmu, msgnum, duration, fmt, chan->callerid);
|
||||
} else {
|
||||
res = ast_streamfile(chan, "vm-mailboxfull", chan->language);
|
||||
if (!res)
|
||||
@@ -1525,16 +1548,56 @@ leave_vm_out:
|
||||
|
||||
static int count_messages(char *dir)
|
||||
{
|
||||
int x;
|
||||
char fn[256];
|
||||
for (x=0;x<MAXMSG;x++) {
|
||||
make_file(fn, sizeof(fn), dir, x);
|
||||
if (ast_fileexists(fn, NULL, NULL) < 1)
|
||||
break;
|
||||
/* Find all .txt files - even if they are not in sequence from 0000 */
|
||||
|
||||
|
||||
int vmcount = 0;
|
||||
DIR *vmdir = NULL;
|
||||
struct dirent *vment = NULL;
|
||||
|
||||
if ((vmdir = opendir(dir))) {
|
||||
while ((vment = readdir(vmdir)))
|
||||
{
|
||||
if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
|
||||
{
|
||||
vmcount++;
|
||||
}
|
||||
}
|
||||
closedir(vmdir);
|
||||
}
|
||||
return x;
|
||||
|
||||
return vmcount;
|
||||
}
|
||||
|
||||
static void resequence_mailbox(char * dir)
|
||||
{
|
||||
/* we know max messages, so stop process when number is hit */
|
||||
|
||||
int x,dest;
|
||||
char sfn[256];
|
||||
char dfn[256];
|
||||
char stxt[256];
|
||||
char dtxt[256];
|
||||
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int say_and_wait(struct ast_channel *chan, int num, char *language)
|
||||
{
|
||||
int d;
|
||||
@@ -2073,23 +2136,10 @@ static int get_folder(struct ast_channel *chan, int start)
|
||||
d = ast_play_and_wait(chan, "vm-for"); /* "for" */
|
||||
if (d)
|
||||
return d;
|
||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Spanish, French or Portuguese syntax */
|
||||
d = ast_play_and_wait(chan, "vm-messages"); /* "messages */
|
||||
if (d)
|
||||
return d;
|
||||
snprintf(fn, sizeof(fn), "vm-%s", mbox(x)); /* Folder name */
|
||||
d = ast_play_and_wait(chan, fn);
|
||||
if (d)
|
||||
return d;
|
||||
} else { /* Default English */
|
||||
snprintf(fn, sizeof(fn), "vm-%s", mbox(x)); /* Folder name */
|
||||
d = ast_play_and_wait(chan, fn);
|
||||
if (d)
|
||||
return d;
|
||||
d = ast_play_and_wait(chan, "vm-messages"); /* "messages */
|
||||
if (d)
|
||||
return d;
|
||||
}
|
||||
snprintf(fn, sizeof(fn), "vm-%s", mbox(x)); /* Folder name */
|
||||
d = vm_play_folder_name(chan, fn);
|
||||
if (d)
|
||||
return d;
|
||||
d = ast_waitfordigit(chan, 500);
|
||||
if (d)
|
||||
return d;
|
||||
@@ -2272,7 +2322,7 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
|
||||
snprintf(todir, sizeof(todir), "%s/voicemail/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, vmtmp->context, vmtmp->mailbox);
|
||||
snprintf(sys, sizeof(sys), "mkdir -p %s\n", todir);
|
||||
snprintf(ext_context, sizeof(ext_context), "%s@%s", vmtmp->mailbox, vmtmp->context);
|
||||
ast_log(LOG_DEBUG, sys);
|
||||
ast_log(LOG_DEBUG, "%s", sys);
|
||||
ast_safe_system(sys);
|
||||
|
||||
todircount = count_messages(todir);
|
||||
@@ -2283,11 +2333,11 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
|
||||
if (!strcasecmp(s, "wav49"))
|
||||
s = "WAV";
|
||||
snprintf(sys, sizeof(sys), "cp %s/msg%04d.%s %s/msg%04d.%s\n", dir, curmsg, s, todir, todircount, s);
|
||||
ast_log(LOG_DEBUG, sys);
|
||||
ast_log(LOG_DEBUG, "%s", sys);
|
||||
ast_safe_system(sys);
|
||||
}
|
||||
snprintf(sys, sizeof(sys), "cp %s/msg%04d.txt %s/msg%04d.txt\n", dir, curmsg, todir, todircount);
|
||||
ast_log(LOG_DEBUG, sys);
|
||||
ast_log(LOG_DEBUG, "%s", sys);
|
||||
ast_safe_system(sys);
|
||||
snprintf(fn, sizeof(fn), "%s/msg%04d", todir,todircount);
|
||||
|
||||
@@ -2545,6 +2595,20 @@ static void open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu,int box)
|
||||
strncpy(vms->curbox, mbox(box), sizeof(vms->curbox) - 1);
|
||||
make_dir(vms->curdir, sizeof(vms->curdir), vmu->context, vms->username, vms->curbox);
|
||||
vms->lastmsg = count_messages(vms->curdir) - 1;
|
||||
|
||||
/*
|
||||
The following test is needed in case sequencing gets messed up.
|
||||
There appears to be more than one way to mess up sequence, so
|
||||
we will not try to find all of the root causes--just fix it when
|
||||
detected.
|
||||
*/
|
||||
|
||||
if(vms->lastmsg != last_message_index(vms->curdir))
|
||||
{
|
||||
ast_log(LOG_NOTICE, "Resequencing Mailbox: %s\n", vms->curdir);
|
||||
resequence_mailbox(vms->curdir);
|
||||
}
|
||||
|
||||
snprintf(vms->vmbox, sizeof(vms->vmbox), "vm-%s", vms->curbox);
|
||||
}
|
||||
|
||||
@@ -2586,8 +2650,25 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
memset(vms->heard, 0, sizeof(vms->heard));
|
||||
}
|
||||
|
||||
static int vm_play_folder_name(struct ast_channel *chan, char *mbox)
|
||||
{
|
||||
int cmd;
|
||||
|
||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /*Spanish, French or Portuguese syntax */
|
||||
cmd = ast_play_and_wait(chan, "vm-messages"); /* "messages */
|
||||
if (cmd)
|
||||
return cmd;
|
||||
return ast_play_and_wait(chan, mbox);
|
||||
} else { /* Default English */
|
||||
cmd = ast_play_and_wait(chan, mbox);
|
||||
if (cmd)
|
||||
return cmd;
|
||||
return ast_play_and_wait(chan, "vm-messages"); /* "messages */
|
||||
}
|
||||
}
|
||||
|
||||
/* Default English syntax */
|
||||
static int vm_intro(struct ast_channel *chan,struct vm_state *vms)
|
||||
static int vm_intro_en(struct ast_channel *chan,struct vm_state *vms)
|
||||
{
|
||||
/* Introduce messages they have */
|
||||
int res;
|
||||
@@ -2949,6 +3030,26 @@ static int vm_intro_cz(struct ast_channel *chan,struct vm_state *vms)
|
||||
return res;
|
||||
}
|
||||
|
||||
static int vm_intro(struct ast_channel *chan,struct vm_state *vms)
|
||||
{
|
||||
/* Play voicemail intro - syntax is different for different languages */
|
||||
if (!strcasecmp(chan->language, "de")) { /* GERMAN syntax */
|
||||
return vm_intro_de(chan, vms);
|
||||
} else if (!strcasecmp(chan->language, "es")) { /* SPANISH syntax */
|
||||
return vm_intro_es(chan, vms);
|
||||
} else if (!strcasecmp(chan->language, "fr")) { /* FRENCH syntax */
|
||||
return vm_intro_fr(chan, vms);
|
||||
} else if (!strcasecmp(chan->language, "nl")) { /* DUTCH syntax */
|
||||
return vm_intro_nl(chan, vms);
|
||||
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE syntax */
|
||||
return vm_intro_pt(chan, vms);
|
||||
} else if (!strcasecmp(chan->language, "cz")) { /* CZECH syntax */
|
||||
return vm_intro_cz(chan, vms);
|
||||
} else { /* Default to ENGLISH */
|
||||
return vm_intro_en(chan, vms);
|
||||
}
|
||||
}
|
||||
|
||||
static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int skipadvanced)
|
||||
{
|
||||
int res = 0;
|
||||
@@ -2957,17 +3058,8 @@ static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int s
|
||||
if (vms->starting) {
|
||||
if (vms->lastmsg > -1) {
|
||||
res = ast_play_and_wait(chan, "vm-onefor");
|
||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Spanish, French & Portuguese Syntax */
|
||||
if (!res)
|
||||
res = ast_play_and_wait(chan, "vm-messages");
|
||||
if (!res)
|
||||
res = ast_play_and_wait(chan, vms->vmbox);
|
||||
} else { /* Default English syntax */
|
||||
if (!res)
|
||||
res = ast_play_and_wait(chan, vms->vmbox);
|
||||
if (!res)
|
||||
res = ast_play_and_wait(chan, "vm-messages");
|
||||
}
|
||||
if (!res)
|
||||
res = vm_play_folder_name(chan, vms->vmbox);
|
||||
}
|
||||
if (!res)
|
||||
res = ast_play_and_wait(chan, "vm-opts");
|
||||
@@ -3048,19 +3140,24 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
|
||||
}
|
||||
newpassword[1] = '\0';
|
||||
newpassword[0] = cmd = ast_play_and_wait(chan,"vm-newpassword");
|
||||
if (cmd < 0)
|
||||
break;
|
||||
if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0) {
|
||||
break;
|
||||
}
|
||||
if (cmd == '#')
|
||||
newpassword[0] = '\0';
|
||||
else {
|
||||
if (cmd < 0)
|
||||
break;
|
||||
if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0)
|
||||
break;
|
||||
}
|
||||
newpassword2[1] = '\0';
|
||||
newpassword2[0] = cmd = ast_play_and_wait(chan,"vm-reenterpassword");
|
||||
if (cmd < 0)
|
||||
break;
|
||||
|
||||
if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#"))) {
|
||||
break;
|
||||
}
|
||||
if (cmd == '#')
|
||||
newpassword2[0] = '\0';
|
||||
else {
|
||||
if (cmd < 0)
|
||||
break;
|
||||
if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#")))
|
||||
break;
|
||||
}
|
||||
if (strcmp(newpassword, newpassword2)) {
|
||||
ast_log(LOG_NOTICE,"Password mismatch for user %s (%s != %s)\n", vms->username, newpassword, newpassword2);
|
||||
cmd = ast_play_and_wait(chan, "vm-mismatch");
|
||||
@@ -3092,7 +3189,7 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
|
||||
}
|
||||
|
||||
/* Default English syntax */
|
||||
static int vm_browse_messages(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
static int vm_browse_messages_en(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
{
|
||||
int cmd=0;
|
||||
|
||||
@@ -3150,6 +3247,17 @@ static int vm_browse_messages_pt(struct ast_channel *chan, struct vm_state *vms,
|
||||
return cmd;
|
||||
}
|
||||
|
||||
static int vm_browse_messages(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
|
||||
{
|
||||
if (!strcasecmp(chan->language, "es")) { /* SPANISH */
|
||||
return vm_browse_messages_es(chan, vms, vmu);
|
||||
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE */
|
||||
return vm_browse_messages_pt(chan, vms, vmu);
|
||||
} else { /* Default to English syntax */
|
||||
return vm_browse_messages_en(chan, vms, vmu);
|
||||
}
|
||||
}
|
||||
|
||||
static int vm_execmain(struct ast_channel *chan, void *data)
|
||||
{
|
||||
/* XXX This is, admittedly, some pretty horrendus code. For some
|
||||
@@ -3269,7 +3377,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
if (prefix) {
|
||||
if (prefix && !ast_strlen_zero(prefixstr)) {
|
||||
char fullusername[80] = "";
|
||||
strncpy(fullusername, prefixstr, sizeof(fullusername) - 1);
|
||||
strncat(fullusername, vms.username, sizeof(fullusername) - 1);
|
||||
@@ -3333,22 +3441,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
||||
if (useadsi)
|
||||
adsi_status(chan, &vms);
|
||||
res = 0;
|
||||
/* Play voicemail intro - syntax is different for different languages */
|
||||
if (!strcasecmp(chan->language, "de")) { /* GERMAN syntax */
|
||||
cmd = vm_intro_de(chan, &vms);
|
||||
} else if (!strcasecmp(chan->language, "es")) { /* SPANISH syntax */
|
||||
cmd = vm_intro_es(chan, &vms);
|
||||
} else if (!strcasecmp(chan->language, "fr")) { /* FRENCH syntax */
|
||||
cmd = vm_intro_fr(chan, &vms);
|
||||
} else if (!strcasecmp(chan->language, "nl")) { /* DUTCH syntax */
|
||||
cmd = vm_intro_nl(chan, &vms);
|
||||
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE syntax */
|
||||
cmd = vm_intro_pt(chan, &vms);
|
||||
} else if (!strcasecmp(chan->language, "cz")) { /* CZECH syntax */
|
||||
cmd = vm_intro_cz(chan, &vms);
|
||||
} else { /* Default to ENGLISH */
|
||||
cmd = vm_intro(chan, &vms);
|
||||
}
|
||||
cmd = vm_intro(chan, &vms);
|
||||
vms.repeats = 0;
|
||||
vms.starting = 1;
|
||||
while((cmd > -1) && (cmd != 't') && (cmd != '#')) {
|
||||
@@ -3358,13 +3451,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
||||
vms.curmsg = 0;
|
||||
/* Fall through */
|
||||
case '5':
|
||||
if (!strcasecmp(chan->language, "es")) { /* SPANISH */
|
||||
cmd = vm_browse_messages_es(chan, &vms, vmu);
|
||||
} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE */
|
||||
cmd = vm_browse_messages_pt(chan, &vms, vmu);
|
||||
} else { /* Default to English syntax */
|
||||
cmd = vm_browse_messages(chan, &vms, vmu);
|
||||
}
|
||||
cmd = vm_browse_messages(chan, &vms, vmu);
|
||||
break;
|
||||
case '2': /* Change folders */
|
||||
if (useadsi)
|
||||
@@ -3380,17 +3467,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
||||
}
|
||||
if (useadsi)
|
||||
adsi_status2(chan, &vms);
|
||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* SPANISH or PORTUGUESE */
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-messages");
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, vms.vmbox);
|
||||
} else { /* Default to English syntax */
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, vms.vmbox);
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-messages");
|
||||
}
|
||||
if (!cmd)
|
||||
cmd = vm_play_folder_name(chan, vms.vmbox);
|
||||
vms.starting = 1;
|
||||
break;
|
||||
case '3': /* Advanced options */
|
||||
@@ -3549,21 +3627,9 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
||||
cmd = say_and_wait(chan, vms.curmsg + 1, chan->language);
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-savedto");
|
||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* SPANISH or PORTUGUESE */
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-messages");
|
||||
if (!cmd) {
|
||||
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
|
||||
cmd = ast_play_and_wait(chan, vms.fn);
|
||||
}
|
||||
} else { /* Default to English */
|
||||
if (!cmd) {
|
||||
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
|
||||
cmd = ast_play_and_wait(chan, vms.fn);
|
||||
}
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-messages");
|
||||
}
|
||||
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
|
||||
if (!cmd)
|
||||
cmd = vm_play_folder_name(chan, vms.fn);
|
||||
if (skipaftercmd) {
|
||||
if (vms.curmsg < vms.lastmsg) {
|
||||
vms.curmsg++;
|
||||
@@ -3577,17 +3643,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
|
||||
case '*':
|
||||
if (!vms.starting) {
|
||||
cmd = ast_play_and_wait(chan, "vm-onefor");
|
||||
if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) { /* Spanish or Portuguese syntax */
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-messages");
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, vms.vmbox);
|
||||
} else {
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, vms.vmbox);
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-messages");
|
||||
}
|
||||
if (!cmd)
|
||||
cmd = vm_play_folder_name(chan, vms.vmbox);
|
||||
if (!cmd)
|
||||
cmd = ast_play_and_wait(chan, "vm-opts");
|
||||
if (!cmd)
|
||||
@@ -3800,7 +3857,7 @@ static int handle_show_voicemail_users(int fd, int argc, char *argv[])
|
||||
if ((vmdir = opendir(dirname))) {
|
||||
/* No matter what the format of VM, there will always be a .txt file for each message. */
|
||||
while ((vment = readdir(vmdir)))
|
||||
if (!strncmp(vment->d_name + 7,".txt",4))
|
||||
if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
|
||||
vmcount++;
|
||||
closedir(vmdir);
|
||||
}
|
||||
@@ -4582,11 +4639,9 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
|
||||
cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence);
|
||||
if (cmd == -1)
|
||||
/* User has hung up, no options to give */
|
||||
return res;
|
||||
return cmd;
|
||||
if (cmd == '0') {
|
||||
/* Erase the message if 0 pushed during playback */
|
||||
ast_play_and_wait(chan, "vm-deleted");
|
||||
vm_delete(recordfile);
|
||||
break;
|
||||
} else if (cmd == '*') {
|
||||
break;
|
||||
}
|
||||
@@ -4639,13 +4694,20 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
|
||||
return 1;
|
||||
#endif
|
||||
case '0':
|
||||
if (outsidecaller && vmu->operator) {
|
||||
if (message_exists)
|
||||
ast_play_and_wait(chan, "vm-msgsaved");
|
||||
return cmd;
|
||||
} else
|
||||
cmd = ast_play_and_wait(chan, "vm-sorry");
|
||||
break;
|
||||
if (message_exists || recorded) {
|
||||
cmd = ast_play_and_wait(chan, "vm-saveoper");
|
||||
if (!cmd)
|
||||
cmd = ast_waitfordigit(chan, 3000);
|
||||
if (cmd == '1') {
|
||||
ast_play_and_wait(chan, "vm-msgsaved");
|
||||
cmd = '0';
|
||||
} else {
|
||||
ast_play_and_wait(chan, "vm-deleted");
|
||||
vm_delete(recordfile);
|
||||
cmd = '0';
|
||||
}
|
||||
}
|
||||
return cmd;
|
||||
default:
|
||||
/* If the caller is an ouside caller, and the review option is enabled,
|
||||
allow them to review the message, but let the owner of the box review
|
||||
@@ -4681,7 +4743,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
|
||||
}
|
||||
}
|
||||
if (outsidecaller)
|
||||
ast_play_and_wait(chan, "vm-goodbye");
|
||||
ast_play_and_wait(chan, "vm-goodbye");
|
||||
if (cmd == 't')
|
||||
cmd = 0;
|
||||
return cmd;
|
||||
@@ -4703,6 +4765,7 @@ static int vm_delete(char *file)
|
||||
return ast_filedelete(file, NULL);
|
||||
}
|
||||
|
||||
|
||||
int usecount(void)
|
||||
{
|
||||
int res;
|
||||
|
0
apps/app_waitforring.c
Executable file → Normal file
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
0
apps/app_zapras.c
Executable file → Normal file
0
apps/app_zapras.c
Executable file → Normal file
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