[asterisk-commits] branch oej/sdpcleanup r29642 - in
/team/oej/sdpcleanup: ./ apps/ build_tools/...
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Tue May 23 04:18:23 MST 2006
Author: oej
Date: Tue May 23 06:18:22 2006
New Revision: 29642
URL: http://svn.digium.com/view/asterisk?rev=29642&view=rev
Log:
Reset automerge
Added:
team/oej/sdpcleanup/cdr/cdr_radius.c
- copied unchanged from r29364, trunk/cdr/cdr_radius.c
team/oej/sdpcleanup/contrib/dictionary.digium
- copied unchanged from r29364, trunk/contrib/dictionary.digium
team/oej/sdpcleanup/doc/radius.txt
- copied unchanged from r29364, trunk/doc/radius.txt
team/oej/sdpcleanup/doc/video.txt
- copied unchanged from r29364, trunk/doc/video.txt
Modified:
team/oej/sdpcleanup/ (props changed)
team/oej/sdpcleanup/.cleancount
team/oej/sdpcleanup/CREDITS
team/oej/sdpcleanup/Makefile
team/oej/sdpcleanup/UPGRADE.txt
team/oej/sdpcleanup/acinclude.m4
team/oej/sdpcleanup/app.c
team/oej/sdpcleanup/apps/app_hasnewvoicemail.c
team/oej/sdpcleanup/apps/app_meetme.c
team/oej/sdpcleanup/apps/app_queue.c
team/oej/sdpcleanup/apps/app_sms.c
team/oej/sdpcleanup/apps/app_userevent.c
team/oej/sdpcleanup/apps/app_voicemail.c
team/oej/sdpcleanup/asterisk.c
team/oej/sdpcleanup/build_tools/menuselect-deps.in
team/oej/sdpcleanup/cdr/Makefile
team/oej/sdpcleanup/cdr/cdr_pgsql.c
team/oej/sdpcleanup/channels/chan_iax2.c
team/oej/sdpcleanup/channels/chan_local.c
team/oej/sdpcleanup/channels/chan_misdn.c
team/oej/sdpcleanup/channels/chan_sip.c
team/oej/sdpcleanup/channels/chan_skinny.c
team/oej/sdpcleanup/channels/chan_zap.c
team/oej/sdpcleanup/channels/h323/Makefile
team/oej/sdpcleanup/channels/misdn/isdn_lib.c
team/oej/sdpcleanup/cli.c
team/oej/sdpcleanup/codecs/codec_a_mu.c
team/oej/sdpcleanup/codecs/codec_adpcm.c
team/oej/sdpcleanup/codecs/codec_alaw.c
team/oej/sdpcleanup/codecs/codec_ulaw.c
team/oej/sdpcleanup/configs/cdr.conf.sample
team/oej/sdpcleanup/configs/func_odbc.conf.sample
team/oej/sdpcleanup/configs/sip.conf.sample
team/oej/sdpcleanup/configs/zapata.conf.sample
team/oej/sdpcleanup/configure
team/oej/sdpcleanup/configure.ac
team/oej/sdpcleanup/doc/cdrdriver.txt
team/oej/sdpcleanup/enum.c
team/oej/sdpcleanup/funcs/func_odbc.c
team/oej/sdpcleanup/funcs/func_realtime.c
team/oej/sdpcleanup/funcs/func_strings.c
team/oej/sdpcleanup/include/asterisk/app.h
team/oej/sdpcleanup/include/autoconfig.h.in
team/oej/sdpcleanup/makeopts.in
team/oej/sdpcleanup/manager.c
team/oej/sdpcleanup/pbx.c
team/oej/sdpcleanup/pbx/pbx_spool.c
team/oej/sdpcleanup/res/res_features.c
team/oej/sdpcleanup/res/res_musiconhold.c
team/oej/sdpcleanup/sample.call
team/oej/sdpcleanup/utils/Makefile
team/oej/sdpcleanup/utils/ael_main.c
team/oej/sdpcleanup/utils/smsq.c
Propchange: team/oej/sdpcleanup/
------------------------------------------------------------------------------
automerge = http://edvina.net/training/
Propchange: team/oej/sdpcleanup/
------------------------------------------------------------------------------
Binary property 'branch-1.2-blocked' - no diff available.
Propchange: team/oej/sdpcleanup/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.
Propchange: team/oej/sdpcleanup/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Tue May 23 06:18:22 2006
@@ -1,1 +1,1 @@
-/trunk:1-27721
+/trunk:1-29392
Modified: team/oej/sdpcleanup/.cleancount
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/.cleancount?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/.cleancount (original)
+++ team/oej/sdpcleanup/.cleancount Tue May 23 06:18:22 2006
@@ -1,1 +1,1 @@
-16
+17
Modified: team/oej/sdpcleanup/CREDITS
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/CREDITS?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/CREDITS (original)
+++ team/oej/sdpcleanup/CREDITS Tue May 23 06:18:22 2006
@@ -92,8 +92,9 @@
Music provided by www.freeplaymusic.com
=== OTHER SOURCE CODE IN ASTERISK ===
-Asterisk uses libedit, the lightweight readline replacement from
-NetBSD. It is BSD-licensed and requires the following statement:
+Asterisk uses libedit, the lightweight readline replacement from NetBSD.
+The cdr_radius module uses libradiusclient-ng, which is also from NetBSD.
+They are BSD-licensed and require the following statement:
This product includes software developed by the NetBSD
Foundation, Inc. and its contributors.
Modified: team/oej/sdpcleanup/Makefile
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/Makefile?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/Makefile (original)
+++ team/oej/sdpcleanup/Makefile Tue May 23 06:18:22 2006
@@ -82,41 +82,27 @@
# Define standard directories for various platforms
# These apply if they are not redefined in asterisk.conf
ifeq ($(OSARCH),SunOS)
- ASTETCDIR=$(INSTALL_PREFIX)/etc/opt/asterisk
- ASTLIBDIR=$(INSTALL_PREFIX)/opt/asterisk/lib
- ASTVARLIBDIR=$(INSTALL_PREFIX)/var/opt/asterisk/lib
- ASTSPOOLDIR=$(INSTALL_PREFIX)/var/opt/asterisk/spool
- ASTLOGDIR=$(INSTALL_PREFIX)/var/opt/asterisk/log
- ASTHEADERDIR=$(INSTALL_PREFIX)/opt/asterisk/usr/include/asterisk
- ASTBINDIR=$(INSTALL_PREFIX)/opt/asterisk/usr/bin
- ASTSBINDIR=$(INSTALL_PREFIX)/opt/asterisk/usr/sbin
- ASTVARRUNDIR=$(INSTALL_PREFIX)/var/opt/asterisk/run
- ASTMANDIR=$(INSTALL_PREFIX)/opt/asterisk/usr/share/man
+ ASTETCDIR=/etc/opt/asterisk
+ ASTLIBDIR=/opt/asterisk/lib
+ ASTVARLIBDIR=/var/opt/asterisk/lib
+ ASTSPOOLDIR=/var/opt/asterisk/spool
+ ASTLOGDIR=/var/opt/asterisk/log
+ ASTHEADERDIR=/opt/asterisk/usr/include/asterisk
+ ASTBINDIR=/opt/asterisk/usr/bin
+ ASTSBINDIR=/opt/asterisk/usr/sbin
+ ASTVARRUNDIR=/var/opt/asterisk/run
+ ASTMANDIR=/opt/asterisk/usr/share/man
else
-ifeq ($(OSARCH),FreeBSD)
- PREFIX?=/usr/local
- ASTETCDIR=$(INSTALL_PREFIX)$(PREFIX)/etc/asterisk
- ASTLIBDIR=$(INSTALL_PREFIX)$(PREFIX)/lib/asterisk
- ASTVARLIBDIR=$(INSTALL_PREFIX)$(PREFIX)/share/asterisk
- ASTSPOOLDIR=$(INSTALL_PREFIX)/var/spool/asterisk
- ASTLOGDIR=$(INSTALL_PREFIX)/var/log/asterisk
- ASTHEADERDIR=$(INSTALL_PREFIX)$(PREFIX)/include/asterisk
- ASTBINDIR=$(INSTALL_PREFIX)$(PREFIX)/bin
- ASTSBINDIR=$(INSTALL_PREFIX)$(PREFIX)/sbin
- ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run
- ASTMANDIR=$(INSTALL_PREFIX)$(PREFIX)/man
-else
- ASTETCDIR=$(INSTALL_PREFIX)/etc/asterisk
- ASTLIBDIR=$(INSTALL_PREFIX)/usr/lib/asterisk
- ASTVARLIBDIR=$(INSTALL_PREFIX)/var/lib/asterisk
- ASTSPOOLDIR=$(INSTALL_PREFIX)/var/spool/asterisk
- ASTLOGDIR=$(INSTALL_PREFIX)/var/log/asterisk
- ASTHEADERDIR=$(INSTALL_PREFIX)/usr/include/asterisk
- ASTBINDIR=$(INSTALL_PREFIX)/usr/bin
- ASTSBINDIR=$(INSTALL_PREFIX)/usr/sbin
- ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run
- ASTMANDIR=$(INSTALL_PREFIX)/usr/share/man
-endif
+ ASTETCDIR=$(sysconfdir)/asterisk
+ ASTLIBDIR=$(libdir)/asterisk
+ ASTVARLIBDIR=$(localstatedir)/lib/asterisk
+ ASTSPOOLDIR=$(localstatedir)/spool/asterisk
+ ASTLOGDIR=$(localstatedir)/log/asterisk
+ ASTHEADERDIR=$(includedir)/asterisk
+ ASTBINDIR=$(bindir)
+ ASTSBINDIR=$(sbindir)
+ ASTVARRUNDIR=$(localstatedir)/run
+ ASTMANDIR=$(mandir)
endif
ASTDATADIR?=$(ASTVARLIBDIR)
@@ -279,12 +265,10 @@
endif
ASTCFLAGS+=$(MALLOC_DEBUG)$(BUSYDETECT)$(OPTIONS)
-ifeq ($(findstring dont-optimize,$(MAKECMDGOALS)),)
-ASTCFLAGS+=-fomit-frame-pointer
-endif
MOD_SUBDIRS=res channels pbx apps codecs formats cdr funcs
-SUBDIRS:=$(MOD_SUBDIRS) utils stdtime agi
+OTHER_SUBDIRS=utils stdtime agi
+SUBDIRS:=$(MOD_SUBDIRS) $(OTHER_SUBDIRS)
OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \
translate.o file.o pbx.o cli.o md5.o term.o \
@@ -383,7 +367,7 @@
@echo " + make install +"
@echo " +-------------------------------------------+"
-all: cleantest config.status menuselect.makeopts depend asterisk subdirs
+all: cleantest defaults.h config.status menuselect.makeopts depend asterisk subdirs
config.status: configure
@CFLAGS="" ./configure
@@ -871,7 +855,8 @@
valgrind: dont-optimize
depend: include/asterisk/version.h include/asterisk/buildopts.h .depend defaults.h
- @for x in $(SUBDIRS); do $(MAKE) -C $$x depend || exit 1 ; done
+ @for x in $(MOD_SUBDIRS); do CFLAGS="$(MOD_SUBDIR_CFLAGS)$(ASTCFLAGS)" $(MAKE) -C $$x depend || exit 1 ; done
+ @for x in $(OTHER_SUBDIRS); do CFLAGS="$(OTHER_SUBDIR_CFLAGS)$(ASTCFLAGS)" $(MAKE) -C $$x depend || exit 1 ; done
.depend: include/asterisk/version.h include/asterisk/buildopts.h defaults.h
build_tools/mkdep $(CFLAGS) $(wildcard *.c)
Modified: team/oej/sdpcleanup/UPGRADE.txt
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/UPGRADE.txt?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/UPGRADE.txt (original)
+++ team/oej/sdpcleanup/UPGRADE.txt Tue May 23 06:18:22 2006
@@ -107,6 +107,12 @@
to specify which DTMF digits can be used to accept a recording and
which digits can be used to cancel a recording.
+* ast_app_messagecount has been renamed to ast_app_inboxcount. There is now a
+ new ast_app_messagecount function which takes a single context/mailbox/folder
+ mailbox specification and returns the message count for that folder only.
+ This addresses the deficiency of not being able to count the number of
+ messages in folders other than INBOX and Old.
+
Manager:
* After executing the 'status' manager action, the "Status" manager events
@@ -120,6 +126,11 @@
which contains the unique ID of the queue member channel that is taking the
call. This is useful when trying to link recording filenames back to
a particular call from the queue.
+
+* app_userevent has been modified to always send Event: UserEvent with the
+ additional header UserEvent: <userspec>. Also, the Channel and UniqueID
+ headers are not automatically sent, unless you specify them as separate
+ arguments. Please see the application help for the new syntax.
Variables:
Modified: team/oej/sdpcleanup/acinclude.m4
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/acinclude.m4?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/acinclude.m4 (original)
+++ team/oej/sdpcleanup/acinclude.m4 Tue May 23 06:18:22 2006
@@ -5,35 +5,35 @@
AC_ARG_WITH([$1], AC_HELP_STRING([--with-$1=PATH],[use $5 files in PATH]),[
case ${withval} in
n|no)
- USE_$1=no
+ USE_$4=no
;;
y|ye|yes)
- $1_MANDATORY="yes"
+ $4_MANDATORY="yes"
;;
*)
- $1_DIR="${withval}"
- $1_MANDATORY="yes"
+ $4_DIR="${withval}"
+ $4_MANDATORY="yes"
;;
esac
])
-PBX_LIB$1=0
+PBX_LIB$4=0
-if test "${USE_$1}" != "no"; then
- libdir=""
- if test "x${$1_DIR}" != "x"; then
- libdir="-L${$1_DIR}/lib"
+if test "${USE_$4}" != "no"; then
+ pbxlibdir=""
+ if test "x${$4_DIR}" != "x"; then
+ pbxlibdir="-L${$1_DIR}/lib"
fi
- AC_CHECK_LIB([$1], [$2], [:], [], ${libdir} $6)
+ AC_CHECK_LIB([$1], [$2], [AST_$4_FOUND=yes], [AST_$4_FOUND=no], ${pbxlibdir} $6)
- if test "${ac_cv_lib_$1_$2}" = "yes"; then
- $1_LIB="-l$1 $6"
+ if test "${AST_$4_FOUND}" = "yes"; then
+ $4_LIB="-l$1 $6"
$4_HEADER_FOUND="1"
- if test "x${$1_DIR}" != "x"; then
- $1_LIB="${libdir} ${$1_LIB}"
- $1_INCLUDE="-I${$1_DIR}/include"
+ if test "x${$4_DIR}" != "x"; then
+ $4_LIB="${pbxlibdir} ${$4_LIB}"
+ $4_INCLUDE="-I${$4_DIR}/include"
if test "x$3" != "x" ; then
- AC_CHECK_HEADER([${$1_DIR}/include/$3], [$4_HEADER_FOUND=1], [$4_HEADER_FOUND=0] )
+ AC_CHECK_HEADER([${$4_DIR}/include/$3], [$4_HEADER_FOUND=1], [$4_HEADER_FOUND=0] )
fi
else
if test "x$3" != "x" ; then
@@ -41,7 +41,7 @@
fi
fi
if test "x${$4_HEADER_FOUND}" = "x0" ; then
- if test ! -z "${$1_MANDATORY}" ;
+ if test ! -z "${$4_MANDATORY}" ;
then
echo " ***"
echo " *** It appears that you do not have the $1 development package installed."
@@ -49,14 +49,14 @@
echo " *** without explicitly specifying --with-$1"
exit 1
fi
- $1_LIB=""
- $1_INCLUDE=""
- PBX_LIB$1=0
+ $4_LIB=""
+ $4_INCLUDE=""
+ PBX_LIB$4=0
else
- PBX_LIB$1=1
+ PBX_LIB$4=1
AC_DEFINE_UNQUOTED([HAVE_$4], 1, [Define to indicate the $5 library])
fi
- elif test ! -z "${$1_MANDATORY}";
+ elif test ! -z "${$4_MANDATORY}";
then
echo "***"
echo "*** The $5 installation on this system appears to be broken."
@@ -65,9 +65,9 @@
exit 1
fi
fi
-AC_SUBST([$1_LIB])
-AC_SUBST([$1_INCLUDE])
-AC_SUBST([PBX_LIB$1])
+AC_SUBST([$4_LIB])
+AC_SUBST([$4_INCLUDE])
+AC_SUBST([PBX_LIB$4])
])
Modified: team/oej/sdpcleanup/app.c
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/app.c?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/app.c (original)
+++ team/oej/sdpcleanup/app.c Tue May 23 06:18:22 2006
@@ -145,18 +145,22 @@
}
static int (*ast_has_voicemail_func)(const char *mailbox, const char *folder) = NULL;
-static int (*ast_messagecount_func)(const char *mailbox, int *newmsgs, int *oldmsgs) = NULL;
+static int (*ast_inboxcount_func)(const char *mailbox, int *newmsgs, int *oldmsgs) = NULL;
+static int (*ast_messagecount_func)(const char *context, const char *mailbox, const char *folder) = NULL;
void ast_install_vm_functions(int (*has_voicemail_func)(const char *mailbox, const char *folder),
- int (*messagecount_func)(const char *mailbox, int *newmsgs, int *oldmsgs))
+ int (*inboxcount_func)(const char *mailbox, int *newmsgs, int *oldmsgs),
+ int (*messagecount_func)(const char *context, const char *mailbox, const char *folder))
{
ast_has_voicemail_func = has_voicemail_func;
+ ast_inboxcount_func = inboxcount_func;
ast_messagecount_func = messagecount_func;
}
void ast_uninstall_vm_functions(void)
{
ast_has_voicemail_func = NULL;
+ ast_inboxcount_func = NULL;
ast_messagecount_func = NULL;
}
@@ -174,19 +178,33 @@
}
-int ast_app_messagecount(const char *mailbox, int *newmsgs, int *oldmsgs)
+int ast_app_inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
{
static int warned = 0;
if (newmsgs)
*newmsgs = 0;
if (oldmsgs)
*oldmsgs = 0;
- if (ast_messagecount_func)
- return ast_messagecount_func(mailbox, newmsgs, oldmsgs);
+ if (ast_inboxcount_func)
+ return ast_inboxcount_func(mailbox, newmsgs, oldmsgs);
if (!warned && (option_verbose > 2)) {
warned++;
ast_verbose(VERBOSE_PREFIX_3 "Message count requested for mailbox %s but voicemail not loaded.\n", mailbox);
+ }
+
+ return 0;
+}
+
+int ast_app_messagecount(const char *context, const char *mailbox, const char *folder)
+{
+ static int warned = 0;
+ if (ast_messagecount_func)
+ return ast_messagecount_func(context, mailbox, folder);
+
+ if (!warned && (option_verbose > 2)) {
+ warned++;
+ ast_verbose(VERBOSE_PREFIX_3 "Message count requested for mailbox %s@%s/%s but voicemail not loaded.\n", mailbox, context, folder);
}
return 0;
@@ -531,8 +549,7 @@
sfmt[fmtcnt++] = ast_strdupa(fmt);
}
- time(&start);
- end = start; /* pre-initialize end to be same as start in case we never get into loop */
+ end = start = time(NULL); /* pre-initialize end to be same as start in case we never get into loop */
for (x = 0; x < fmtcnt; x++) {
others[x] = ast_writefile(prepend ? prependfile : recordfile, sfmt[x], comment, O_TRUNC, 0, 0700);
if (option_verbose > 2)
@@ -652,7 +669,7 @@
}
}
if (maxtime) {
- time(&end);
+ end = time(NULL);
if (maxtime < (end - start)) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Took too long, cutting it short...\n");
@@ -671,7 +688,8 @@
} else {
ast_frfree(f);
}
- if (end == start) time(&end);
+ if (end == start)
+ end = time(NULL);
} else {
ast_log(LOG_WARNING, "Error creating writestream '%s', format '%s'\n", recordfile, sfmt[x]);
}
@@ -913,7 +931,7 @@
close(fd);
snprintf(s, strlen(path) + 9, "%s/.lock", path);
- time(&start);
+ start = time(NULL);
while (((res = link(fs, s)) < 0) && (errno == EEXIST) && (time(NULL) - start < 5))
usleep(1);
if (res) {
Modified: team/oej/sdpcleanup/apps/app_hasnewvoicemail.c
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/apps/app_hasnewvoicemail.c?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/apps/app_hasnewvoicemail.c (original)
+++ team/oej/sdpcleanup/apps/app_hasnewvoicemail.c Tue May 23 06:18:22 2006
@@ -78,26 +78,6 @@
" <# of messages in the folder, 0 for NONE>\n";
LOCAL_USER_DECL;
-
-static int hasvoicemail_internal(char *context, char *box, char *folder)
-{
- char vmpath[256];
- DIR *vmdir;
- struct dirent *vment;
- int count=0;
-
- snprintf(vmpath,sizeof(vmpath), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, box, folder);
- if ((vmdir = opendir(vmpath))) {
- /* 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)) {
- count++;
- }
- }
- closedir(vmdir);
- }
- return count;
-}
static int hasvoicemail_exec(struct ast_channel *chan, void *data)
{
@@ -130,11 +110,10 @@
AST_STANDARD_APP_ARGS(args, input);
- if ((vmbox = strsep(&args.vmbox, "@")))
- if (!ast_strlen_zero(args.vmbox))
- context = args.vmbox;
- if (!vmbox)
- vmbox = args.vmbox;
+ vmbox = strsep(&args.vmbox, "@");
+
+ if (!ast_strlen_zero(args.vmbox))
+ context = args.vmbox;
vmfolder = strchr(vmbox, '/');
if (vmfolder) {
@@ -149,7 +128,7 @@
priority_jump = 1;
}
- vmcount = hasvoicemail_internal(context, vmbox, vmfolder);
+ vmcount = ast_app_messagecount(context, vmbox, vmfolder);
/* Set the count in the channel variable */
if (varname) {
snprintf(tmp, sizeof(tmp), "%d", vmcount);
@@ -198,7 +177,7 @@
args.folder = "INBOX";
}
- snprintf(buf, len, "%d", hasvoicemail_internal(context, args.vmbox, args.folder));
+ snprintf(buf, len, "%d", ast_app_messagecount(context, args.vmbox, args.folder));
LOCAL_USER_REMOVE(u);
Modified: team/oej/sdpcleanup/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/apps/app_meetme.c?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/apps/app_meetme.c (original)
+++ team/oej/sdpcleanup/apps/app_meetme.c Tue May 23 06:18:22 2006
@@ -63,6 +63,120 @@
#include "asterisk/translate.h"
#include "asterisk/ulaw.h"
+#include "enter.h"
+#include "leave.h"
+
+LOCAL_USER_DECL;
+
+#define CONFIG_FILE_NAME "meetme.conf"
+
+/*! each buffer is 20ms, so this is 640ms total */
+#define DEFAULT_AUDIO_BUFFERS 32
+
+enum {
+ ADMINFLAG_MUTED = (1 << 1), /*!< User is muted */
+ ADMINFLAG_KICKME = (1 << 2) /*!< User has been kicked */
+};
+
+#define MEETME_DELAYDETECTTALK 300
+#define MEETME_DELAYDETECTENDTALK 1000
+
+#define AST_FRAME_BITS 32
+
+enum volume_action {
+ VOL_UP,
+ VOL_DOWN
+};
+
+enum entrance_sound {
+ ENTER,
+ LEAVE
+};
+
+enum recording_state {
+ MEETME_RECORD_OFF,
+ MEETME_RECORD_STARTED,
+ MEETME_RECORD_ACTIVE,
+ MEETME_RECORD_TERMINATE
+};
+
+#define CONF_SIZE 320
+
+enum {
+ /*! user has admin access on the conference */
+ CONFFLAG_ADMIN = (1 << 0),
+ /*! If set the user can only receive audio from the conference */
+ CONFFLAG_MONITOR = (1 << 1),
+ /*! If set asterisk will exit conference when '#' is pressed */
+ CONFFLAG_POUNDEXIT = (1 << 2),
+ /*! If set asterisk will provide a menu to the user when '*' is pressed */
+ CONFFLAG_STARMENU = (1 << 3),
+ /*! If set the use can only send audio to the conference */
+ CONFFLAG_TALKER = (1 << 4),
+ /*! If set there will be no enter or leave sounds */
+ CONFFLAG_QUIET = (1 << 5),
+ /*! If set, when user joins the conference, they will be told the number
+ * of users that are already in */
+ CONFFLAG_ANNOUNCEUSERCOUNT = (1 << 6),
+ /*! Set to run AGI Script in Background */
+ CONFFLAG_AGI = (1 << 7),
+ /*! Set to have music on hold when user is alone in conference */
+ CONFFLAG_MOH = (1 << 8),
+ /*! If set the MeetMe will return if all marked with this flag left */
+ CONFFLAG_MARKEDEXIT = (1 << 9),
+ /*! If set, the MeetMe will wait until a marked user enters */
+ CONFFLAG_WAITMARKED = (1 << 10),
+ /*! If set, the MeetMe will exit to the specified context */
+ CONFFLAG_EXIT_CONTEXT = (1 << 11),
+ /*! If set, the user will be marked */
+ CONFFLAG_MARKEDUSER = (1 << 12),
+ /*! If set, user will be ask record name on entry of conference */
+ CONFFLAG_INTROUSER = (1 << 13),
+ /*! If set, the MeetMe will be recorded */
+ CONFFLAG_RECORDCONF = (1<< 14),
+ /*! If set, the user will be monitored if the user is talking or not */
+ CONFFLAG_MONITORTALKER = (1 << 15),
+ CONFFLAG_DYNAMIC = (1 << 16),
+ CONFFLAG_DYNAMICPIN = (1 << 17),
+ CONFFLAG_EMPTY = (1 << 18),
+ CONFFLAG_EMPTYNOPIN = (1 << 19),
+ CONFFLAG_ALWAYSPROMPT = (1 << 20),
+ /*! If set, treats talking users as muted users */
+ CONFFLAG_OPTIMIZETALKER = (1 << 21),
+ /*! If set, won't speak the extra prompt when the first person
+ * enters the conference */
+ CONFFLAG_NOONLYPERSON = (1 << 22),
+ CONFFLAG_INTROUSERNOREVIEW = (1 << 23)
+ /*! If set, user will be asked to record name on entry of conference
+ * without review */
+};
+
+AST_APP_OPTIONS(meetme_opts, {
+ AST_APP_OPTION('A', CONFFLAG_MARKEDUSER ),
+ AST_APP_OPTION('a', CONFFLAG_ADMIN ),
+ AST_APP_OPTION('b', CONFFLAG_AGI ),
+ AST_APP_OPTION('c', CONFFLAG_ANNOUNCEUSERCOUNT ),
+ AST_APP_OPTION('D', CONFFLAG_DYNAMICPIN ),
+ AST_APP_OPTION('d', CONFFLAG_DYNAMIC ),
+ AST_APP_OPTION('E', CONFFLAG_EMPTYNOPIN ),
+ AST_APP_OPTION('e', CONFFLAG_EMPTY ),
+ AST_APP_OPTION('i', CONFFLAG_INTROUSER ),
+ AST_APP_OPTION('I', CONFFLAG_INTROUSERNOREVIEW ),
+ AST_APP_OPTION('M', CONFFLAG_MOH ),
+ AST_APP_OPTION('m', CONFFLAG_MONITOR ),
+ AST_APP_OPTION('o', CONFFLAG_OPTIMIZETALKER ),
+ AST_APP_OPTION('P', CONFFLAG_ALWAYSPROMPT ),
+ AST_APP_OPTION('p', CONFFLAG_POUNDEXIT ),
+ AST_APP_OPTION('q', CONFFLAG_QUIET ),
+ AST_APP_OPTION('r', CONFFLAG_RECORDCONF ),
+ AST_APP_OPTION('s', CONFFLAG_STARMENU ),
+ AST_APP_OPTION('T', CONFFLAG_MONITORTALKER ),
+ AST_APP_OPTION('t', CONFFLAG_TALKER ),
+ AST_APP_OPTION('w', CONFFLAG_WAITMARKED ),
+ AST_APP_OPTION('X', CONFFLAG_EXIT_CONTEXT ),
+ AST_APP_OPTION('x', CONFFLAG_MARKEDEXIT ),
+ AST_APP_OPTION('1', CONFFLAG_NOONLYPERSON ),
+});
static const char *app = "MeetMe";
static const char *app2 = "MeetMeCount";
@@ -109,7 +223,6 @@
" 's' -- Present menu (user or admin) when '*' is received ('send' to menu)\n"
" 't' -- set talk only mode. (Talk only, no listening)\n"
" 'T' -- set talker detection (sent to manager interface and meetme list)\n"
-" 'v' -- video mode\n"
" 'w' -- wait until the marked user enters the conference\n"
" 'x' -- close the conference when last marked user exits\n"
" 'X' -- allow user to exit the conference by entering a valid single\n"
@@ -138,31 +251,27 @@
" 'N' -- Mute entire conference (except admin)\n"
"";
-#define CONFIG_FILE_NAME "meetme.conf"
-
-LOCAL_USER_DECL;
-
struct ast_conference {
- ast_mutex_t playlock; /* Conference specific lock (players) */
- ast_mutex_t listenlock; /* Conference specific lock (listeners) */
- char confno[AST_MAX_EXTENSION]; /* Conference */
- struct ast_channel *chan; /* Announcements channel */
- struct ast_channel *lchan; /* Listen/Record channel */
- int fd; /* Announcements fd */
- int zapconf; /* Zaptel Conf # */
- int users; /* Number of active users */
- int markedusers; /* Number of marked users */
- time_t start; /* Start time (s) */
- int refcount; /* reference count of usage */
- unsigned int recording:2; /* recording status */
- unsigned int isdynamic:1; /* Created on the fly? */
- unsigned int locked:1; /* Is the conference locked? */
- pthread_t recordthread; /* thread for recording */
- pthread_attr_t attr; /* thread attribute */
- const char *recordingfilename; /* Filename to record the Conference into */
- const char *recordingformat; /* Format to record the Conference in */
- char pin[AST_MAX_EXTENSION]; /* If protected by a PIN */
- char pinadmin[AST_MAX_EXTENSION]; /* If protected by a admin PIN */
+ ast_mutex_t playlock; /*!< Conference specific lock (players) */
+ ast_mutex_t listenlock; /*!< Conference specific lock (listeners) */
+ char confno[AST_MAX_EXTENSION]; /*!< Conference */
+ struct ast_channel *chan; /*!< Announcements channel */
+ struct ast_channel *lchan; /*!< Listen/Record channel */
+ int fd; /*!< Announcements fd */
+ int zapconf; /*!< Zaptel Conf # */
+ int users; /*!< Number of active users */
+ int markedusers; /*!< Number of marked users */
+ time_t start; /*!< Start time (s) */
+ int refcount; /*!< reference count of usage */
+ enum recording_state recording:2; /*!< recording status */
+ unsigned int isdynamic:1; /*!< Created on the fly? */
+ unsigned int locked:1; /*!< Is the conference locked? */
+ pthread_t recordthread; /*!< thread for recording */
+ pthread_attr_t attr; /*!< thread attribute */
+ const char *recordingfilename; /*!< Filename to record the Conference into */
+ const char *recordingformat; /*!< Format to record the Conference in */
+ char pin[AST_MAX_EXTENSION]; /*!< If protected by a PIN */
+ char pinadmin[AST_MAX_EXTENSION]; /*!< If protected by a admin PIN */
struct ast_frame *transframe[32];
struct ast_frame *origframe;
struct ast_trans_pvt *transpath[32];
@@ -173,112 +282,52 @@
static AST_LIST_HEAD_STATIC(confs, ast_conference);
struct volume {
- int desired; /* Desired volume adjustment */
- int actual; /* Actual volume adjustment (for channels that can't adjust) */
+ int desired; /*!< Desired volume adjustment */
+ int actual; /*!< Actual volume adjustment (for channels that can't adjust) */
};
struct ast_conf_user {
- int user_no; /* User Number */
- int userflags; /* Flags as set in the conference */
- int adminflags; /* Flags set by the Admin */
- struct ast_channel *chan; /* Connected channel */
- int talking; /* Is user talking */
- int zapchannel; /* Is a Zaptel channel */
- char usrvalue[50]; /* Custom User Value */
- char namerecloc[AST_MAX_EXTENSION]; /* Name Recorded file Location */
- time_t jointime; /* Time the user joined the conference */
+ int user_no; /*!< User Number */
+ int userflags; /*!< Flags as set in the conference */
+ int adminflags; /*!< Flags set by the Admin */
+ struct ast_channel *chan; /*!< Connected channel */
+ int talking; /*!< Is user talking */
+ int zapchannel; /*!< Is a Zaptel channel */
+ char usrvalue[50]; /*!< Custom User Value */
+ char namerecloc[AST_MAX_EXTENSION]; /*!< Name Recorded file Location */
+ time_t jointime; /*!< Time the user joined the conference */
struct volume talk;
struct volume listen;
AST_LIST_ENTRY(ast_conf_user) list;
};
-static int audio_buffers; /* The number of audio buffers to be allocated on pseudo channels
- when in a conference
- */
-
-#define DEFAULT_AUDIO_BUFFERS 32 /* each buffer is 20ms, so this is 640ms total */
-
-#define ADMINFLAG_MUTED (1 << 1) /* User is muted */
-#define ADMINFLAG_KICKME (1 << 2) /* User is kicked */
-#define MEETME_DELAYDETECTTALK 300
-#define MEETME_DELAYDETECTENDTALK 1000
-
-#define AST_FRAME_BITS 32
-
-enum volume_action {
- VOL_UP,
- VOL_DOWN,
+/*! The number of audio buffers to be allocated on pseudo channels
+ * when in a conference */
+static int audio_buffers;
+
+/*! Map 'volume' levels from -5 through +5 into
+ * decibel (dB) settings for channel drivers
+ * Note: these are not a straight linear-to-dB
+ * conversion... the numbers have been modified
+ * to give the user a better level of adjustability
+ */
+static signed char gain_map[] = {
+ -15,
+ -13,
+ -10,
+ -6,
+ 0,
+ 0,
+ 0,
+ 6,
+ 10,
+ 13,
+ 15,
};
+
static int admin_exec(struct ast_channel *chan, void *data);
-
static void *recordthread(void *args);
-
-#include "enter.h"
-#include "leave.h"
-
-#define ENTER 0
-#define LEAVE 1
-
-#define MEETME_RECORD_OFF 0
-#define MEETME_RECORD_STARTED 1
-#define MEETME_RECORD_ACTIVE 2
-#define MEETME_RECORD_TERMINATE 3
-
-#define CONF_SIZE 320
-
-#define CONFFLAG_ADMIN (1 << 1) /* If set the user has admin access on the conference */
-#define CONFFLAG_MONITOR (1 << 2) /* If set the user can only receive audio from the conference */
-#define CONFFLAG_POUNDEXIT (1 << 3) /* If set asterisk will exit conference when '#' is pressed */
-#define CONFFLAG_STARMENU (1 << 4) /* If set asterisk will provide a menu to the user when '*' is pressed */
-#define CONFFLAG_TALKER (1 << 5) /* If set the use can only send audio to the conference */
-#define CONFFLAG_QUIET (1 << 6) /* If set there will be no enter or leave sounds */
-#define CONFFLAG_VIDEO (1 << 7) /* Set to enable video mode */
-#define CONFFLAG_AGI (1 << 8) /* Set to run AGI Script in Background */
-#define CONFFLAG_MOH (1 << 9) /* Set to have music on hold when user is alone in conference */
-#define CONFFLAG_MARKEDEXIT (1 << 10) /* If set the MeetMe will return if all marked with this flag left */
-#define CONFFLAG_WAITMARKED (1 << 11) /* If set, the MeetMe will wait until a marked user enters */
-#define CONFFLAG_EXIT_CONTEXT (1 << 12) /* If set, the MeetMe will exit to the specified context */
-#define CONFFLAG_MARKEDUSER (1 << 13) /* If set, the user will be marked */
-#define CONFFLAG_INTROUSER (1 << 14) /* If set, user will be ask record name on entry of conference */
-#define CONFFLAG_RECORDCONF (1<< 15) /* If set, the MeetMe will be recorded */
-#define CONFFLAG_MONITORTALKER (1 << 16) /* If set, the user will be monitored if the user is talking or not */
-#define CONFFLAG_DYNAMIC (1 << 17)
-#define CONFFLAG_DYNAMICPIN (1 << 18)
-#define CONFFLAG_EMPTY (1 << 19)
-#define CONFFLAG_EMPTYNOPIN (1 << 20)
-#define CONFFLAG_ALWAYSPROMPT (1 << 21)
-#define CONFFLAG_ANNOUNCEUSERCOUNT (1 << 22) /* If set, when user joins the conference, they will be told the number of users that are already in */
-#define CONFFLAG_OPTIMIZETALKER (1 << 23) /* If set, treats talking users as muted users */
-#define CONFFLAG_NOONLYPERSON (1 << 24) /* If set, won't speak the extra prompt when the first person enters the conference */
-#define CONFFLAG_INTROUSERNOREVIEW (1 << 25) /* If set, user will be asked to record name on entry of conference without review */
-
-AST_APP_OPTIONS(meetme_opts, {
- AST_APP_OPTION('A', CONFFLAG_MARKEDUSER ),
- AST_APP_OPTION('a', CONFFLAG_ADMIN ),
- AST_APP_OPTION('b', CONFFLAG_AGI ),
- AST_APP_OPTION('c', CONFFLAG_ANNOUNCEUSERCOUNT ),
- AST_APP_OPTION('D', CONFFLAG_DYNAMICPIN ),
- AST_APP_OPTION('d', CONFFLAG_DYNAMIC ),
- AST_APP_OPTION('E', CONFFLAG_EMPTYNOPIN ),
- AST_APP_OPTION('e', CONFFLAG_EMPTY ),
- AST_APP_OPTION('i', CONFFLAG_INTROUSER ),
- AST_APP_OPTION('I', CONFFLAG_INTROUSERNOREVIEW ),
- AST_APP_OPTION('M', CONFFLAG_MOH ),
- AST_APP_OPTION('m', CONFFLAG_MONITOR ),
- AST_APP_OPTION('o', CONFFLAG_OPTIMIZETALKER ),
- AST_APP_OPTION('P', CONFFLAG_ALWAYSPROMPT ),
- AST_APP_OPTION('p', CONFFLAG_POUNDEXIT ),
- AST_APP_OPTION('q', CONFFLAG_QUIET ),
- AST_APP_OPTION('r', CONFFLAG_RECORDCONF ),
- AST_APP_OPTION('s', CONFFLAG_STARMENU ),
- AST_APP_OPTION('T', CONFFLAG_MONITORTALKER ),
- AST_APP_OPTION('t', CONFFLAG_TALKER ),
- AST_APP_OPTION('w', CONFFLAG_WAITMARKED ),
- AST_APP_OPTION('X', CONFFLAG_EXIT_CONTEXT ),
- AST_APP_OPTION('x', CONFFLAG_MARKEDEXIT ),
- AST_APP_OPTION('1', CONFFLAG_NOONLYPERSON ),
-});
static char *istalking(int x)
{
@@ -317,26 +366,6 @@
return 0;
}
-/* Map 'volume' levels from -5 through +5 into
- decibel (dB) settings for channel drivers
- Note: these are not a straight linear-to-dB
- conversion... the numbers have been modified
- to give the user a better level of adjustability
-*/
-static signed char gain_map[] = {
- -15,
- -13,
- -10,
- -6,
- 0,
- 0,
- 0,
- 6,
- 10,
- 13,
- 15,
-};
-
static int set_talk_volume(struct ast_conf_user *user, int volume)
{
signed char gain_adjust;
@@ -428,7 +457,7 @@
ast_channel_setoption(user->chan, AST_OPTION_RXGAIN, &zero_volume, sizeof(zero_volume), 0);
}
-static void conf_play(struct ast_channel *chan, struct ast_conference *conf, int sound)
+static void conf_play(struct ast_channel *chan, struct ast_conference *conf, enum entrance_sound sound)
{
unsigned char *data;
int len;
@@ -543,20 +572,6 @@
return cnf;
}
-static int confs_show(int fd, int argc, char **argv)
-{
- ast_cli(fd, "Deprecated! Please use 'meetme' instead.\n");
-
- return RESULT_SUCCESS;
-}
-
-static char show_confs_usage[] =
-"Deprecated! Please use 'meetme' instead.\n";
-
-static struct ast_cli_entry cli_show_confs = {
- { "show", "conferences", NULL }, confs_show,
- "Show status of conferences", show_confs_usage, NULL };
-
static int conf_cmd(int fd, int argc, char **argv) {
/* Process the command */
struct ast_conference *cnf;
@@ -2394,8 +2409,7 @@
{
int res;
- res = ast_cli_unregister(&cli_show_confs);
- res |= ast_cli_unregister(&cli_conf);
+ res = ast_cli_unregister(&cli_conf);
res |= ast_unregister_application(app3);
res |= ast_unregister_application(app2);
res |= ast_unregister_application(app);
@@ -2411,8 +2425,7 @@
load_config();
- res = ast_cli_register(&cli_show_confs);
- res |= ast_cli_register(&cli_conf);
+ res = ast_cli_register(&cli_conf);
res |= ast_register_application(app3, admin_exec, synopsis3, descrip3);
res |= ast_register_application(app2, count_exec, synopsis2, descrip2);
res |= ast_register_application(app, conf_exec, synopsis, descrip);
Modified: team/oej/sdpcleanup/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/apps/app_queue.c?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/apps/app_queue.c (original)
+++ team/oej/sdpcleanup/apps/app_queue.c Tue May 23 06:18:22 2006
@@ -454,6 +454,8 @@
for (member = q->members; member; member = member->next) {
if (max_penalty && (member->penalty > max_penalty))
continue;
+
+ if (member->paused) continue;
switch (member->status) {
case AST_DEVICE_INVALID:
@@ -1895,11 +1897,10 @@
int res;
if (!qe->parent->autofill) {
-
/* Atomically read the parent head -- does not need a lock */
ch = qe->parent->head;
/* If we are now at the top of the head, break out */
- if ((ch == qe) || (qe->parent->autofill)) {
+ if (ch == qe) {
if (option_debug)
ast_log(LOG_DEBUG, "It's our turn (%s).\n", qe->chan->name);
res = 1;
@@ -2200,7 +2201,10 @@
free(tmp);
}
}
- to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1;
+ if (qe->expire && (!qe->parent->timeout || (qe->expire - now) <= qe->parent->timeout))
+ to = (qe->expire - now) * 1000;
+ else
+ to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1;
ring_one(qe, outgoing, &numbusies);
ast_mutex_unlock(&qe->parent->lock);
if (use_weight)
Modified: team/oej/sdpcleanup/apps/app_sms.c
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/apps/app_sms.c?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/apps/app_sms.c (original)
+++ team/oej/sdpcleanup/apps/app_sms.c Tue May 23 06:18:22 2006
@@ -1176,14 +1176,13 @@
static int sms_generate (struct ast_channel *chan, void *data, int len, int samples)
{
struct ast_frame f = { 0 };
- unsigned char waste[AST_FRIENDLY_OFFSET];
#define MAXSAMPLES (800)
#ifdef OUTALAW
- unsigned char buf[MAXSAMPLES];
+ unsigned char *buf;
#else
- signed short buf[MAXSAMPLES];
+ short *buf;
#endif
-#define SAMPLE2LEN (sizeof (buf[0]))
+#define SAMPLE2LEN sizeof(*buf)
sms_t *h = data;
int i;
@@ -1192,9 +1191,9 @@
MAXSAMPLES, samples);
samples = MAXSAMPLES;
}
- len = samples * SAMPLE2LEN;
-
- waste[0] = 0; /* make compiler happy */
+ len = samples * SAMPLE2LEN + AST_FRIENDLY_OFFSET;
+ buf = alloca(len);
+
f.frametype = AST_FRAME_VOICE;
#ifdef OUTALAW
f.subclass = AST_FORMAT_ALAW;
@@ -1204,7 +1203,7 @@
f.datalen = len;
f.offset = AST_FRIENDLY_OFFSET;
f.mallocd = 0;
- f.data = buf;
+ f.data = buf + AST_FRIENDLY_OFFSET;
f.samples = samples;
f.src = "app_sms";
/* create a buffer containing the digital sms pattern */
Modified: team/oej/sdpcleanup/apps/app_userevent.c
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/apps/app_userevent.c?rev=29642&r1=29641&r2=29642&view=diff
==============================================================================
--- team/oej/sdpcleanup/apps/app_userevent.c (original)
+++ team/oej/sdpcleanup/apps/app_userevent.c Tue May 23 06:18:22 2006
@@ -38,6 +38,7 @@
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/manager.h"
+#include "asterisk/app.h"
static char *tdesc = "Custom User Event Application";
@@ -46,24 +47,27 @@
static char *synopsis = "Send an arbitrary event to the manager interface";
static char *descrip =
-" UserEvent(eventname[|body]): Sends an arbitrary event to the\n"
-"manager interface, with an optional body representing additional\n"
-"arguments. The format of the event will be:\n"
-" Event: UserEvent<specified event name>\n"
-" Channel: <channel name>\n"
-" Uniqueid: <call uniqueid>\n"
+" UserEvent(eventname[|body]): Sends an arbitrary event to the manager\n"
+"interface, with an optional body representing additional arguments. The\n"
+"body may be specified as a | delimeted list of headers. Each additional\n"
+"argument will be placed on a new line in the event. The format of the\n"
+"event will be:\n"
+" Event: UserEvent\n"
+" UserEvent: <specified event name>\n"
" [body]\n"
-"If the body is not specified, only Event, Channel, and Uniqueid fields\n"
-"will be present. Returns 0.";
+"If no body is specified, only Event and UserEvent headers will be present.\n";
LOCAL_USER_DECL;
static int userevent_exec(struct ast_channel *chan, void *data)
{
struct localuser *u;
- char *info;
- char eventname[512];
- char *eventbody;
+ char *parse, buf[2048] = "";
+ int x, buflen = 0;
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(eventname);
+ AST_APP_ARG(extra)[100];
+ );
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "UserEvent requires an argument (eventname|optional event body)\n");
@@ -72,25 +76,18 @@
LOCAL_USER_ADD(u);
- info = ast_strdupa(data);
+ parse = ast_strdupa(data);
- snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
[... 10587 lines stripped ...]
More information about the asterisk-commits
mailing list