mirror of https://github.com/asterisk/asterisk
Backport menuselect from 13->12->11->1.8 Change-Id: I54c4dd2bdacd3c9d858be3acab08706941f2e585changes/97/97/4
parent
41a9d426ba
commit
59af44b1a2
@ -0,0 +1,123 @@
|
|||||||
|
#
|
||||||
|
# Asterisk -- A telephony toolkit for Linux.
|
||||||
|
#
|
||||||
|
# Makefile for Menuselect
|
||||||
|
#
|
||||||
|
# Copyright (C) 2005-2008, Digium, Inc.
|
||||||
|
#
|
||||||
|
# Russell Bryant <russell@digium.com>
|
||||||
|
#
|
||||||
|
# This program is free software, distributed under the terms of
|
||||||
|
# the GNU General Public License
|
||||||
|
#
|
||||||
|
|
||||||
|
# even though we could use '-include makeopts' here, use a wildcard
|
||||||
|
# lookup anyway, so that make won't try to build makeopts if it doesn't
|
||||||
|
# exist (other rules will force it to be built if needed)
|
||||||
|
ifneq ($(wildcard makeopts),)
|
||||||
|
include makeopts
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: clean dist-clean distclean test ntest ctest gtest
|
||||||
|
|
||||||
|
# Basic set of sources and flags/libraries/includes
|
||||||
|
OBJS:=menuselect.o strcompat.o
|
||||||
|
CFLAGS+=-g -D_GNU_SOURCE -Wall
|
||||||
|
|
||||||
|
ifeq ($(MENUSELECT_DEBUG),yes)
|
||||||
|
CFLAGS += -DMENUSELECT_DEBUG
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef NCURSES_LIB
|
||||||
|
C_OBJS += menuselect_curses.o
|
||||||
|
C_LIBS +=$(NCURSES_LIB)
|
||||||
|
C_INCLUDE += $(NCURSES_INCLUDE)
|
||||||
|
ALL_TGTS += cmenuselect
|
||||||
|
else
|
||||||
|
ifdef CURSES_LIB
|
||||||
|
C_OBJS += menuselect_curses.o
|
||||||
|
C_LIBS +=$(CURSES_LIB)
|
||||||
|
C_INCLUDE += $(CURSES_INCLUDE)
|
||||||
|
ALL_TGTS += cmenuselect
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef GTK2_LIB
|
||||||
|
G_OBJS += menuselect_gtk.o
|
||||||
|
G_LIBS += $(GTK2_LIB)
|
||||||
|
G_INCLUDE += $(GTK2_INCLUDE)
|
||||||
|
ALL_TGTS += gmenuselect
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef NEWT_LIB
|
||||||
|
N_OBJS += menuselect_newt.o
|
||||||
|
N_LIBS += $(NEWT_LIB)
|
||||||
|
N_INCLUDE += $(NEWT_INCLUDE)
|
||||||
|
ALL_TGTS += nmenuselect
|
||||||
|
endif
|
||||||
|
|
||||||
|
M_OBJS += menuselect_stub.o
|
||||||
|
M_LIBS += $(LIBXML2_LIB)
|
||||||
|
ALL_TGTS += menuselect
|
||||||
|
|
||||||
|
all: $(ALL_TGTS)
|
||||||
|
|
||||||
|
$(OBJS) $(C_OBJS) $(N_OBJS) $(G_OBJS) $(M_OBJS): autoconfig.h menuselect.h
|
||||||
|
|
||||||
|
makeopts autoconfig.h: autoconfig.h.in makeopts.in
|
||||||
|
@./configure $(CONFIGURE_SILENT)
|
||||||
|
@echo "****"
|
||||||
|
@echo "**** The configure script was just executed, so 'make' needs to be"
|
||||||
|
@echo "**** restarted."
|
||||||
|
@echo "****"
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
ifdef C_OBJS
|
||||||
|
menuselect_curses.o: CFLAGS+=$(C_INCLUDE)
|
||||||
|
cmenuselect: $(OBJS) $(C_OBJS)
|
||||||
|
$(CC) $(LDFLAGS) -o $@ $^ $(C_LIBS) $(LIBXML2_LIB)
|
||||||
|
else
|
||||||
|
cmenuselect:
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef G_OBJS
|
||||||
|
menuselect_gtk.o: CFLAGS+=$(G_INCLUDE)
|
||||||
|
gmenuselect: $(OBJS) $(G_OBJS)
|
||||||
|
$(CC) $(LDFLAGS) -o $@ $^ $(G_LIBS) $(LIBXML2_LIB)
|
||||||
|
else
|
||||||
|
gmenuselect:
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef N_OBJS
|
||||||
|
menuselect_newt.o: CFLAGS+=$(N_INCLUDE)
|
||||||
|
nmenuselect: $(OBJS) $(N_OBJS)
|
||||||
|
$(CC) $(LDFLAGS) -o $@ $^ $(N_LIBS) $(LIBXML2_LIB)
|
||||||
|
else
|
||||||
|
nmenuselect:
|
||||||
|
endif
|
||||||
|
|
||||||
|
menuselect.o: CFLAGS+=$(LIBXML2_INCLUDE)
|
||||||
|
|
||||||
|
menuselect: $(OBJS) $(M_OBJS)
|
||||||
|
$(CC) $(LDFLAGS) -o $@ $^ $(M_LIBS)
|
||||||
|
|
||||||
|
test: menuselect
|
||||||
|
(cd test; ../$< menuselect.makeopts)
|
||||||
|
|
||||||
|
ctest: cmenuselect
|
||||||
|
(cd test; ../$< menuselect.makeopts)
|
||||||
|
|
||||||
|
gtest: gmenuselect
|
||||||
|
(cd test; ../$< menuselect.makeopts)
|
||||||
|
|
||||||
|
ntest: nmenuselect
|
||||||
|
(cd test; ../$< menuselect.makeopts)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f menuselect cmenuselect gmenuselect nmenuselect $(OBJS) $(M_OBJS) $(C_OBJS) $(G_OBJS) $(N_OBJS)
|
||||||
|
|
||||||
|
dist-clean: distclean
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f autoconfig.h config.status config.log makeopts
|
||||||
|
rm -rf autom4te.cache
|
@ -0,0 +1,178 @@
|
|||||||
|
MENUSELECT
|
||||||
|
Copyright (C) 2005-2006, Digium, Inc.
|
||||||
|
Russell Bryant <russell@digium.com>
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
ABOUT
|
||||||
|
|
||||||
|
Menuselect is a tool designed to be used in conjunction with GNU make. It
|
||||||
|
allows for an XML specification of Makefile variables and optional space
|
||||||
|
delimited values of these variables. These values can then be used in the
|
||||||
|
Makefile to make various decisions during the build process.
|
||||||
|
|
||||||
|
Menuselect also provides a mechanism for dependency checking for each possible
|
||||||
|
member (value) of each category (Makefile variable). These dependencies are
|
||||||
|
generally checked by using autoconf and the results provided to menuselect. If
|
||||||
|
dependencies for a member are not met, the user will not be allowed to make
|
||||||
|
that selection. In the same way the menuselect does dependency checking, it
|
||||||
|
also does conflict checking. If a listed conflict for a member is met, then
|
||||||
|
the user will not be allowed to select it.
|
||||||
|
|
||||||
|
For use with automated builds or when the user has no desire to make selections
|
||||||
|
different than the defined defaults, menuselect can generate a default output
|
||||||
|
file for use in the build.
|
||||||
|
|
||||||
|
Menuselect can also do a sanity check on existing input files. If any member
|
||||||
|
has been selected that has conflicts or unmet dependencies, then menuselect
|
||||||
|
will exit with an error and output to notify the user of the situation. This is
|
||||||
|
typically done at the beginning of the build process to ensure that given all
|
||||||
|
of the known information, the build is going to be successful.
|
||||||
|
|
||||||
|
|
||||||
|
MENUSELECT DEPENDENCIES
|
||||||
|
|
||||||
|
libncurses -- This is needed for the curses frontend.
|
||||||
|
libnewt -- This is needed for the newt frontend (optional).
|
||||||
|
libxml2 -- This library, the XML C parser and toolkit of Gnome, is used for
|
||||||
|
XML parsing.
|
||||||
|
(http://xmlsoft.org/)
|
||||||
|
|
||||||
|
ENVIRONMENT SETUP
|
||||||
|
|
||||||
|
The file menuselect.h contains a couple of defines which specify locations for
|
||||||
|
various files. These locations are relative to the directory from which
|
||||||
|
menuselect will be executed.
|
||||||
|
|
||||||
|
#define OUTPUT_MAKEOPTS_DEFAULT "menuselect.makeopts"
|
||||||
|
This is the location where the menuselect output will be saved.
|
||||||
|
|
||||||
|
#define MENUSELECT_DEPS "build_tools/menuselect-deps"
|
||||||
|
This is the location where menuselect will expect to find the input file that
|
||||||
|
provides dependency and conflict information. More information on the format of
|
||||||
|
this file can be found in the section about dependency and conflict checking.
|
||||||
|
|
||||||
|
|
||||||
|
DEPENDENCY AND CONFLICT CHECKING
|
||||||
|
|
||||||
|
Members may have as many conflicts and dependencies specified as needed. An
|
||||||
|
example of the MENUSELECT_DEPS file would look like this:
|
||||||
|
|
||||||
|
DEPENDENCY1=1
|
||||||
|
DEPENDENCY2=0
|
||||||
|
CONFLICT1=0
|
||||||
|
|
||||||
|
In this case, "DEPENDENCY1" has been met, "DEPENDENCY2" has not been met, and
|
||||||
|
"CONFLICT1" is not present.
|
||||||
|
|
||||||
|
To ask menuselect to do a background sanity check on dependencies and
|
||||||
|
conflicts, it can be called like this:
|
||||||
|
|
||||||
|
./menuselect --check-deps <input_file1> [input_file2] [...]
|
||||||
|
|
||||||
|
The format of the input files must be of the same format menuselect uses to
|
||||||
|
create the OUPUT_MAKEOPTS_DEFAULT.
|
||||||
|
|
||||||
|
|
||||||
|
ENABLING AND DISABLING OPTIONS FROM THE COMMAND LINE
|
||||||
|
|
||||||
|
If you would like menuselect to update choices via the command line, it can be
|
||||||
|
done with the following syntax:
|
||||||
|
|
||||||
|
Enable an option:
|
||||||
|
$ menuselect/menuselect --enable TEST_FRAMEWORK menuselect.makeopts
|
||||||
|
|
||||||
|
Enable all options in a category:
|
||||||
|
$ menuselect/menuselect --enable-category MENUSELECT_TEST menuselect.makeopts
|
||||||
|
|
||||||
|
Disable an option:
|
||||||
|
$ menuselect/menuselect --disable TEST_FRAMEWORK menuselect.makeopts
|
||||||
|
|
||||||
|
Disable all options in a category:
|
||||||
|
$ menuselect/menuselect --disable-category MENUSELECT_TEST menuselect.makeopts
|
||||||
|
|
||||||
|
|
||||||
|
SETTING UP AVAILABLE OPTIONS
|
||||||
|
|
||||||
|
The XML specification for the menu lives in the file "menuselect-tree" and should
|
||||||
|
be in the same directory that menuselect will be executed from. An example
|
||||||
|
menuselect-tree file as used in the Asterisk project (http://www.asterisk.org) is
|
||||||
|
provided in example_menuselect-tree
|
||||||
|
|
||||||
|
Menu:
|
||||||
|
The top level tag in menuselect-tree is the <menu> tag. All of the categories
|
||||||
|
reside inside of the <menu> ... </menu> block.
|
||||||
|
|
||||||
|
Menu Attributes:
|
||||||
|
name="Asterisk Module Selection"
|
||||||
|
This specifies the title of the menu. It is displayed at the top of the
|
||||||
|
screen when using the curses frontend
|
||||||
|
|
||||||
|
Categories:
|
||||||
|
A <category> contains members. The category tag can contain a number of
|
||||||
|
different attributes to specify different behavior.
|
||||||
|
|
||||||
|
Category Attributes:
|
||||||
|
name="MENUSELECT_APPS"
|
||||||
|
The name attribute is required. This is the name of the variable that will
|
||||||
|
be in the output from menuselect.
|
||||||
|
|
||||||
|
displayname="Applications"
|
||||||
|
If this is specfied, this is what will be shown in the menu to the user.
|
||||||
|
|
||||||
|
positive_output="yes"
|
||||||
|
The default for menuselect is to output all of the members of a category
|
||||||
|
that are *not* selected. This is because it is often convenient to be able
|
||||||
|
to define a full list in the Makefile and then filter out the results from
|
||||||
|
menuselect. Using GNU make, an example of this would be:
|
||||||
|
APPS:=$(filter-out $(MENUSELECT_APPS),$(APPS))
|
||||||
|
|
||||||
|
remove_on_change=".lastclean"
|
||||||
|
This attribute can contain a space delimited list of files to be deleted
|
||||||
|
when it is time to build an output file if any of the members of this
|
||||||
|
category have changed values from their values for existing input when the
|
||||||
|
application was started.
|
||||||
|
|
||||||
|
Members:
|
||||||
|
A <member> contains conflicts and dependencies. The member tag can contain a
|
||||||
|
number of different attributes to specify different behavior.
|
||||||
|
|
||||||
|
Member Attributes:
|
||||||
|
name="app_meetme"
|
||||||
|
The name attribute is required. This is the value that will be added to the
|
||||||
|
variable specified by the category when selected (or not selected) depending
|
||||||
|
on the setting of the positive_output attribute of the category.
|
||||||
|
|
||||||
|
displayname="Call Conferencing Application"
|
||||||
|
If this is specified, this will be provided as a description of this member
|
||||||
|
when the cursor is on it in the menu.
|
||||||
|
|
||||||
|
remove_on_change="apps/app_meetme.o apps/app_meetme.so"
|
||||||
|
This attribute can contain a space delimeted list of files to be deleted
|
||||||
|
when it is time to build an output file if the value of this member has
|
||||||
|
changed from its value in any existing input when the application was
|
||||||
|
started.
|
||||||
|
|
||||||
|
Dependencies:
|
||||||
|
A dependency for a <member> is specified using a <depend> tag. The name of
|
||||||
|
the dependency corresponds to names in the MENUSELECT_DEPS file. This is an
|
||||||
|
example of specifying a dependency for a member:
|
||||||
|
<member name="app_meetme">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
Conflicts:
|
||||||
|
A conflict for a <member> is specified using a <conflict> tag. The name of
|
||||||
|
the conflict corresponds to names in the MENUSELECT_DEPS file. This is an
|
||||||
|
example of specifying a dependency for a member:
|
||||||
|
<member name="res_musiconhold">
|
||||||
|
<conflict>win32</conflict>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
|
||||||
|
REPORTING BUGS
|
||||||
|
|
||||||
|
Any bug reports or feature enhancement submissions to menuselect should be
|
||||||
|
submitted at https://issues.asterisk.org/
|
||||||
|
|
||||||
|
Thank you!
|
@ -0,0 +1,19 @@
|
|||||||
|
# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This file is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
|
||||||
|
m4_include([../autoconf/ast_check_gnu_make.m4])
|
||||||
|
m4_include([../autoconf/ast_ext_lib.m4])
|
||||||
|
m4_include([../autoconf/ast_ext_tool_check.m4])
|
||||||
|
m4_include([../autoconf/ast_gcc_attribute.m4])
|
||||||
|
m4_include([../autoconf/ast_prog_sed.m4])
|
@ -0,0 +1,137 @@
|
|||||||
|
/* autoconfig.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
#ifndef MENUSELECT_AUTOCONFIG_H
|
||||||
|
#define MENUSELECT_AUTOCONFIG_H
|
||||||
|
|
||||||
|
#ifndef _REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
|
||||||
|
systems. This function is required for `alloca.c' support on those systems.
|
||||||
|
*/
|
||||||
|
#undef CRAY_STACKSEG_END
|
||||||
|
|
||||||
|
/* Define to 1 if using `alloca.c'. */
|
||||||
|
#undef C_ALLOCA
|
||||||
|
|
||||||
|
/* Define to 1 if you have `alloca', as a function or macro. */
|
||||||
|
#undef HAVE_ALLOCA
|
||||||
|
|
||||||
|
/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
|
||||||
|
*/
|
||||||
|
#undef HAVE_ALLOCA_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `asprintf' function. */
|
||||||
|
#undef HAVE_ASPRINTF
|
||||||
|
|
||||||
|
/* Define to 1 if your GCC C compiler supports the 'weak' attribute. */
|
||||||
|
#undef HAVE_ATTRIBUTE_weak
|
||||||
|
|
||||||
|
/* Define to 1 if your GCC C compiler supports the 'weak_import' attribute. */
|
||||||
|
#undef HAVE_ATTRIBUTE_weak_import
|
||||||
|
|
||||||
|
/* Define to 1 if your GCC C compiler supports the 'weakref' attribute. */
|
||||||
|
#undef HAVE_ATTRIBUTE_weakref
|
||||||
|
|
||||||
|
/* Define to 1 if you have the curses library. */
|
||||||
|
#undef HAVE_CURSES
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `getloadavg' function. */
|
||||||
|
#undef HAVE_GETLOADAVG
|
||||||
|
|
||||||
|
/* Define if your system has the GTK2 libraries. */
|
||||||
|
#undef HAVE_GTK2
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define if your system has the LIBXML2 libraries. */
|
||||||
|
#undef HAVE_LIBXML2
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ncurses library. */
|
||||||
|
#undef HAVE_NCURSES
|
||||||
|
|
||||||
|
/* Define to 1 if you have the newt library. */
|
||||||
|
#undef HAVE_NEWT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `setenv' function. */
|
||||||
|
#undef HAVE_SETENV
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strcasestr' function. */
|
||||||
|
#undef HAVE_STRCASESTR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strndup' function. */
|
||||||
|
#undef HAVE_STRNDUP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strnlen' function. */
|
||||||
|
#undef HAVE_STRNLEN
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strsep' function. */
|
||||||
|
#undef HAVE_STRSEP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `unsetenv' function. */
|
||||||
|
#undef HAVE_UNSETENV
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `vasprintf' function. */
|
||||||
|
#undef HAVE_VASPRINTF
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* If using the C implementation of alloca, define if you know the
|
||||||
|
direction of stack growth for your system; otherwise it will be
|
||||||
|
automatically deduced at runtime.
|
||||||
|
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||||
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
|
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||||
|
#undef STACK_DIRECTION
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||||
|
#undef size_t
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,41 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
check_for_app() {
|
||||||
|
$1 --version 2>&1 >/dev/null
|
||||||
|
if [ $? != 0 ]
|
||||||
|
then
|
||||||
|
echo "Please install $1 and run bootstrap.sh again!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
uname -s | grep -q FreeBSD
|
||||||
|
if [ $? = 0 ]
|
||||||
|
then
|
||||||
|
check_for_app autoconf259
|
||||||
|
check_for_app autoheader259
|
||||||
|
check_for_app automake19
|
||||||
|
check_for_app aclocal19
|
||||||
|
echo "Generating the configure script ..."
|
||||||
|
aclocal19 -I ../autoconf 2>/dev/null
|
||||||
|
autoconf259
|
||||||
|
autoheader259
|
||||||
|
automake19 --add-missing --copy 2>/dev/null
|
||||||
|
else
|
||||||
|
AUTOCONF_VERSION=2.59
|
||||||
|
AUTOMAKE_VERSION=1.9
|
||||||
|
export AUTOCONF_VERSION
|
||||||
|
export AUTOMAKE_VERSION
|
||||||
|
|
||||||
|
check_for_app autoconf
|
||||||
|
check_for_app autoheader
|
||||||
|
check_for_app automake
|
||||||
|
check_for_app aclocal
|
||||||
|
echo "Generating the configure script ..."
|
||||||
|
aclocal -I ../autoconf 2>/dev/null
|
||||||
|
autoconf
|
||||||
|
autoheader
|
||||||
|
automake --add-missing --copy 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,154 @@
|
|||||||
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_PREREQ(2.59)
|
||||||
|
|
||||||
|
m4_define([MENUSELECT_VERSION],
|
||||||
|
m4_bpatsubst(m4_esyscmd([./make_version .]),
|
||||||
|
[\([0-9.]*\)\(\w\|\W\)*],
|
||||||
|
[\1]))
|
||||||
|
AC_INIT(menuselect, MENUSELECT_VERSION, www.asterisk.org)
|
||||||
|
|
||||||
|
# check existence of the package
|
||||||
|
AC_CONFIG_SRCDIR([menuselect.c])
|
||||||
|
|
||||||
|
# specify output header file
|
||||||
|
AC_CONFIG_HEADER(autoconfig.h)
|
||||||
|
|
||||||
|
AC_COPYRIGHT("Menuselect")
|
||||||
|
AC_REVISION($Revision$)
|
||||||
|
|
||||||
|
AC_CANONICAL_BUILD
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
HOST_OS=${host_os}
|
||||||
|
AC_SUBST(HOST_OS)
|
||||||
|
|
||||||
|
PBX_WINARCH=0
|
||||||
|
case "${host_os}" in
|
||||||
|
freebsd*)
|
||||||
|
OSARCH=FreeBSD
|
||||||
|
;;
|
||||||
|
netbsd*)
|
||||||
|
OSARCH=NetBSD
|
||||||
|
;;
|
||||||
|
openbsd*)
|
||||||
|
OSARCH=OpenBSD
|
||||||
|
;;
|
||||||
|
solaris*)
|
||||||
|
OSARCH=SunOS
|
||||||
|
;;
|
||||||
|
mingw32)
|
||||||
|
OSARCH=mingw32
|
||||||
|
PBX_WINARCH=1
|
||||||
|
;;
|
||||||
|
cygwin)
|
||||||
|
OSARCH=cygwin
|
||||||
|
PBX_WINARCH=1
|
||||||
|
;;
|
||||||
|
linux-gnueabi)
|
||||||
|
OSARCH=linux-gnu
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
OSARCH=${host_os}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AH_TOP(
|
||||||
|
#ifndef MENUSELECT_AUTOCONFIG_H
|
||||||
|
#define MENUSELECT_AUTOCONFIG_H
|
||||||
|
|
||||||
|
#ifndef _REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
|
||||||
|
AH_BOTTOM(
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AST_CHECK_GNU_MAKE
|
||||||
|
|
||||||
|
|
||||||
|
AC_LANG(C)
|
||||||
|
AC_ARG_ENABLE([debug],
|
||||||
|
[AS_HELP_STRING([--enable-debug], [Turn on debug mode])],
|
||||||
|
[case "${enableval}" in
|
||||||
|
y|ye|yes) MENUSELECT_DEBUG=yes ;;
|
||||||
|
n|no) MENUSELECT_DEBUG=no ;;
|
||||||
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
|
||||||
|
esac])
|
||||||
|
AC_SUBST(MENUSELECT_DEBUG)
|
||||||
|
|
||||||
|
# Support weak symbols on a platform specific basis. The Mac OS X
|
||||||
|
# (Darwin) support must be isolated from the other platforms because
|
||||||
|
# it has caused other platforms to fail.
|
||||||
|
#
|
||||||
|
case "${OSARCH}" in
|
||||||
|
darwin*)
|
||||||
|
# Allow weak symbol support on Darwin platforms only because there
|
||||||
|
# is active community support for it.
|
||||||
|
# However, Darwin seems to break weak symbols for each new version.
|
||||||
|
#
|
||||||
|
AST_GCC_ATTRIBUTE(weak_import, [], [], PBX_WEAKREF)
|
||||||
|
|
||||||
|
# Several other platforms including Linux have GCC versions that
|
||||||
|
# define the weak attribute. However, this attribute is only
|
||||||
|
# setup for use in the code by Darwin.
|
||||||
|
AST_GCC_ATTRIBUTE(weak, [], [], PBX_WEAKREF)
|
||||||
|
;;
|
||||||
|
linux-gnu)
|
||||||
|
# Primarily support weak symbols on Linux platforms.
|
||||||
|
#
|
||||||
|
AST_GCC_ATTRIBUTE(weakref, [weakref("foo")], static, PBX_WEAKREF)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Allow weak symbols on other platforms. However, any problems
|
||||||
|
# with this feature on other platforms must be fixed by the
|
||||||
|
# community.
|
||||||
|
#
|
||||||
|
AST_GCC_ATTRIBUTE(weakref, [weakref("foo")], static, PBX_WEAKREF)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_FUNC_ALLOCA
|
||||||
|
AC_CHECK_FUNCS([asprintf getloadavg setenv strcasestr strndup strnlen strsep unsetenv vasprintf])
|
||||||
|
|
||||||
|
# The frontend can use curses, ncurses, newt or GTK2 so check for all of them
|
||||||
|
|
||||||
|
AST_EXT_LIB_SETUP([NEWT], [newt], [newt])
|
||||||
|
AST_EXT_LIB_SETUP([CURSES], [curses], [curses])
|
||||||
|
AST_EXT_LIB_SETUP([NCURSES], [ncurses], [ncurses])
|
||||||
|
AST_EXT_LIB_SETUP([LIBXML2], [LibXML2], [libxml2])
|
||||||
|
|
||||||
|
AST_EXT_LIB_CHECK([NEWT], [newt], [newtBell], [newt.h])
|
||||||
|
AST_EXT_LIB_CHECK([CURSES], [curses], [initscr], [curses.h])
|
||||||
|
AST_EXT_LIB_CHECK([NCURSES], [ncurses], [initscr], [curses.h])
|
||||||
|
AST_EXT_TOOL_CHECK([LIBXML2], [xml2-config], , ,
|
||||||
|
[#include <libxml/tree.h>
|
||||||
|
#include <libxml/parser.h>],
|
||||||
|
[LIBXML_TEST_VERSION])
|
||||||
|
|
||||||
|
if test "${PBX_LIBXML2}" != 1; then
|
||||||
|
AC_MSG_ERROR([Could not find required 'Libxml2' development package])
|
||||||
|
fi
|
||||||
|
|
||||||
|
PBX_GTK2=0
|
||||||
|
AC_CHECK_TOOL(PKGCONFIG, pkg-config, No)
|
||||||
|
if test ! "x${PKGCONFIG}" = xNo; then
|
||||||
|
GTK2_INCLUDE=$(${PKGCONFIG} gtk+-2.0 --cflags 2>/dev/null)
|
||||||
|
GTK2_LIB=$(${PKGCONFIG} gtk+-2.0 --libs)
|
||||||
|
PBX_GTK2=1
|
||||||
|
AC_DEFINE([HAVE_GTK2], 1, [Define if your system has the GTK2 libraries.])
|
||||||
|
fi
|
||||||
|
AC_SUBST(PBX_GTK2)
|
||||||
|
AC_SUBST(GTK2_INCLUDE)
|
||||||
|
AC_SUBST(GTK2_LIB)
|
||||||
|
|
||||||
|
test "$silent"=yes && ac_sub_configure_args="${ac_sub_configure_args} --silent"
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([makeopts])
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
AC_MSG_NOTICE(Menuselect build configuration successfully completed)
|
@ -0,0 +1,17 @@
|
|||||||
|
all:
|
||||||
|
|
||||||
|
clean:
|
||||||
|
|
||||||
|
dist-clean:
|
||||||
|
|
||||||
|
makeopts:
|
||||||
|
|
||||||
|
menuselect:
|
||||||
|
./menuselect-dummy
|
||||||
|
|
||||||
|
# Generate some dummy files to satifsy dependencies from the main
|
||||||
|
# Makefile.
|
||||||
|
dummies:
|
||||||
|
touch linkedlists.h menuselect.c menuselect_curses.c \
|
||||||
|
menuselect.h menuselect_stub.c
|
||||||
|
|
@ -0,0 +1,741 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
|
# menuselect - a simple drop-in replacement of the batch-mode menuselect
|
||||||
|
# included with Asterisk.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
# USA
|
||||||
|
|
||||||
|
# Installation: copy this script to menuselect/menuselect . Copy the
|
||||||
|
# included Makefile as menuselect/Makefile and run:
|
||||||
|
#
|
||||||
|
# make -C makefile dummies
|
||||||
|
#
|
||||||
|
# It takes configuration from build_tools/conf . Sample config file:
|
||||||
|
#
|
||||||
|
# By default all modules will be built (except those marked not be
|
||||||
|
# used by default)
|
||||||
|
#
|
||||||
|
# # exclude: Don't try to build the following modules.
|
||||||
|
# #exclude app_test
|
||||||
|
#
|
||||||
|
# # You can have multiple items in each line, and multiple lines.
|
||||||
|
# # Each item is a perl regular expression that must match the whole
|
||||||
|
# # module name.
|
||||||
|
# #exclude res_config_.*
|
||||||
|
#
|
||||||
|
# # include: syntax is the same as exclude. Overrides exclude and
|
||||||
|
# # modules that are marked as disabled by defualt:
|
||||||
|
# #include res_config_sqlite3 app_skel
|
||||||
|
#
|
||||||
|
# # If you want to make sure some modules will be conifgured to build,
|
||||||
|
# # you can require them. If modules that match any of the 'require'
|
||||||
|
# # pattern are not configured to build, menuselect will panic.
|
||||||
|
# # Same pattern rules apply here. Why would you want that? I have no
|
||||||
|
# # idea.
|
||||||
|
# #require chan_h323 app_directory
|
||||||
|
#
|
||||||
|
# # random - the value for this keyword is a number between 1 and
|
||||||
|
# # 100. The higher it is, more chances not to include each module.
|
||||||
|
# # Writes the list of modules that got hit to
|
||||||
|
# # build_tools/mods_removed_random .
|
||||||
|
# # Note that unlike 'make randomconfig' and such the random
|
||||||
|
# # configuration changes each time you run 'make', thus if a build
|
||||||
|
# # failed you should first read build_tools/mods_removed_random
|
||||||
|
# # before re-running make.
|
||||||
|
# #random 10
|
||||||
|
#
|
||||||
|
# # Anything after a '#' is ignored, and likewise empty lines.
|
||||||
|
# # Naturally.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
# Holds global dependncy information. Keys are module names.
|
||||||
|
my %ModInfo = ();
|
||||||
|
|
||||||
|
# extract configuration from kernel modules:
|
||||||
|
my $AutoconfDepsFile = "build_tools/menuselect-deps";
|
||||||
|
|
||||||
|
my $AutoconfOptsFile = "makeopts";
|
||||||
|
my %ConfigureOpts = (); #
|
||||||
|
|
||||||
|
# configuration file to read for some directives:
|
||||||
|
my $ConfFile = "build_tools/conf";
|
||||||
|
|
||||||
|
my $DumpFile = 'build_tools/dump_deps';
|
||||||
|
|
||||||
|
# Modules removed randomely:
|
||||||
|
my $RandomeModsFile = "build_tools/mods_removed_random";
|
||||||
|
|
||||||
|
my $MakedepsFile = "menuselect.makedeps";
|
||||||
|
|
||||||
|
my $MakeoptsFile = "menuselect.makeopts";
|
||||||
|
|
||||||
|
# If those modules are not present, the build will fail (PCRE patterns)
|
||||||
|
my @RequiredModules = ();
|
||||||
|
|
||||||
|
my @Subdirs = qw/addons apps bridges cdr cel channels codecs formats funcs main pbx res tests utils/;
|
||||||
|
|
||||||
|
my @XmlCategories = 'cflags';
|
||||||
|
|
||||||
|
# Modules should not bother building (PCRE patterns)
|
||||||
|
my @ExcludedModules = ();
|
||||||
|
|
||||||
|
# Do try building those. Overrides 'exclude' and 'defaultenable: no'
|
||||||
|
my @IncludedModules = ();
|
||||||
|
|
||||||
|
# A chance to rule-out a module randomely.
|
||||||
|
my $RandomKnockoutFactor = 0;
|
||||||
|
|
||||||
|
sub warning($) {
|
||||||
|
my $msg = shift;
|
||||||
|
print STDERR "$0: Warning: $msg\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Convert XML syntax to mail-header-like syntax:
|
||||||
|
# <var>value</var> --> Var: value
|
||||||
|
sub extract_xml_key($) {
|
||||||
|
my %attr = ();
|
||||||
|
my $xml_line = shift;
|
||||||
|
if ($xml_line !~ m{^\s*<([a-z_A-Z0-9]+)(\s+([^>]*))?>([^<]*)</\1>}) {
|
||||||
|
warning "parsed empty value from XML line $xml_line";
|
||||||
|
return ('', ''); # warn?
|
||||||
|
}
|
||||||
|
my ($var, $val) = ($1, $4);
|
||||||
|
$var =~ s{^[a-z]}{\u$&};
|
||||||
|
if (defined $3) {
|
||||||
|
my $attr_text = $3;
|
||||||
|
while ($attr_text =~ /^( *([^=]+)="([^"]+)")/) {
|
||||||
|
my ($var, $val) = ($2, $3);
|
||||||
|
$attr_text =~ s/^$1//;
|
||||||
|
$attr{$var} = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ($var, $val, %attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get information embedded in source files from a subdirectory.
|
||||||
|
# First parameter is the subdirectory and further ones are the actual
|
||||||
|
# source files.
|
||||||
|
sub get_subdir_module_info {
|
||||||
|
my $subdir = shift;
|
||||||
|
my @files = @_;
|
||||||
|
|
||||||
|
my $dir = uc($subdir);
|
||||||
|
|
||||||
|
foreach my $src (@files) {
|
||||||
|
open SRC,$src or die "Can't read from source file $src: $!\n";
|
||||||
|
$src =~ m|.*/([^/]*)\.c|;
|
||||||
|
my $mod_name = $1;
|
||||||
|
my %data = (
|
||||||
|
Type=>'module',
|
||||||
|
Module=>$mod_name,
|
||||||
|
Dir=> $dir,
|
||||||
|
Avail=>1
|
||||||
|
);
|
||||||
|
|
||||||
|
while (<SRC>) {
|
||||||
|
next unless (m|^/\*\*\* MODULEINFO| .. m|^ *[*]+/|);
|
||||||
|
next unless (m|^[A-Z]| || m|^\s*<|);
|
||||||
|
|
||||||
|
# At this point we can assume we're in the module
|
||||||
|
# info section.
|
||||||
|
chomp;
|
||||||
|
my ($var, $val, %attr) = extract_xml_key($_);
|
||||||
|
foreach (keys %attr) {
|
||||||
|
push @{$data{$_}},($attr{$_});
|
||||||
|
}
|
||||||
|
if ($var =~ /^(Depend|Use)$/i) {
|
||||||
|
# use uppercase for dependency names;
|
||||||
|
$val = uc($val);
|
||||||
|
}
|
||||||
|
if ( ! exists $data{$var} ) {
|
||||||
|
$data{$var} = [$val];
|
||||||
|
} else {
|
||||||
|
push @{$data{$var}},($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close SRC;
|
||||||
|
|
||||||
|
$ModInfo{uc($mod_name)} = \%data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# extract embedded information in all the source tree.
|
||||||
|
sub extract_subdirs {
|
||||||
|
for my $subdir(@_) {
|
||||||
|
get_subdir_module_info($subdir, <$subdir/*.c> , <$subdir/*.cc>);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# parse a partial XML document that is included as an input
|
||||||
|
# for menuselect in a few places. Naturally a full-fledged XML parsing
|
||||||
|
# will not be done here. A line-based parsing that happens to work will
|
||||||
|
# have to do.
|
||||||
|
sub parse_menuselect_xml_file($) {
|
||||||
|
my $file_name = shift;
|
||||||
|
open XML,$file_name or
|
||||||
|
die "Failed opening XML file $file_name: $!.\n";
|
||||||
|
|
||||||
|
my $header = <XML>;
|
||||||
|
$header =~ /^\s*<category\s+name="MENUSELECT_([^"]+)"\s/;
|
||||||
|
my $category = $1;
|
||||||
|
my $member;
|
||||||
|
|
||||||
|
while(<XML>){
|
||||||
|
next unless (m{^\s*<(/?[a-z]+)[>\s]});
|
||||||
|
my $tag = $1;
|
||||||
|
|
||||||
|
if ($tag eq 'member') {
|
||||||
|
if (! m{^\s*<member\s+name="([^"]+)" displayname="([^"]+)"\s*>}){
|
||||||
|
warning "Bad XML member line: $_ ($file_name:$.)\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
my ($name, $display_name) = ($1, $2);
|
||||||
|
|
||||||
|
$member = {
|
||||||
|
Type => 'XML',
|
||||||
|
Dir => $category,
|
||||||
|
Module => $1,
|
||||||
|
DisplayName => $2,
|
||||||
|
Defaultenabled => ['no'],
|
||||||
|
Avail => 1,
|
||||||
|
|
||||||
|
};
|
||||||
|
} elsif ($tag eq '/member') {
|
||||||
|
$ModInfo{$member->{Module}} = $member;
|
||||||
|
} elsif ($tag eq '/category') {
|
||||||
|
last;
|
||||||
|
} else {
|
||||||
|
if (! m/^\s*<([a-z]+)>([^<]+)</) {
|
||||||
|
warning "(1) Unknown XML line $_ ($file_name:$.)\n";
|
||||||
|
next
|
||||||
|
}
|
||||||
|
my ($key, $val) = extract_xml_key($_);
|
||||||
|
if ($key eq '') {
|
||||||
|
warning "Unknown XML line $_ ($file_name:$.)\n";
|
||||||
|
next
|
||||||
|
}
|
||||||
|
if (! exists $member->{$key}) {
|
||||||
|
$member->{$key} = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make sure dependencies are upper-case.
|
||||||
|
# FIXME: this is not the proper place for such a fix
|
||||||
|
$val = uc($val) if ($key =~ /Depend|Use/);
|
||||||
|
|
||||||
|
# Using "unshift' rather than 'push'.
|
||||||
|
# For a singleton value this makes the action an
|
||||||
|
# override, as only the first value counts.
|
||||||
|
# For a list value, however, it means a reversed
|
||||||
|
# order.
|
||||||
|
unshift @{$member->{$key}}, ($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
close XML;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dump our data structure to a file.
|
||||||
|
sub dump_deps($) {
|
||||||
|
my $file = shift;
|
||||||
|
open OUTPUT,">$file" or
|
||||||
|
die "cannot open category file $file for writing: $!\n";
|
||||||
|
|
||||||
|
foreach my $mod_name (sort keys %ModInfo) {
|
||||||
|
print OUTPUT "Key: $mod_name\n";
|
||||||
|
my $data = $ModInfo{$mod_name};
|
||||||
|
foreach my $var (sort keys %{$data} ) {
|
||||||
|
my $val = $$data{$var};
|
||||||
|
if (ref($val) eq 'ARRAY') {
|
||||||
|
print OUTPUT $var.": ". (join ", ", @$val)."\n";
|
||||||
|
} else {
|
||||||
|
print OUTPUT "$var: $val\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print OUTPUT "\n";
|
||||||
|
}
|
||||||
|
close OUTPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the available libraries that autoconf generated.
|
||||||
|
sub get_autoconf_deps() {
|
||||||
|
open DEPS, $AutoconfDepsFile or
|
||||||
|
die "Failed to open $AutoconfDepsFile. Aborting: $!\n";
|
||||||
|
|
||||||
|
my @deps_list = (<DEPS>);
|
||||||
|
foreach (@deps_list){
|
||||||
|
chomp;
|
||||||
|
my ($lib, $avail_val) = split(/=/);
|
||||||
|
my ($avail, $avail_old) = split(/:/, $avail_val);
|
||||||
|
my $disabled = 0;
|
||||||
|
if ($avail == -1) {
|
||||||
|
$disabled = 1;
|
||||||
|
$avail = 0;
|
||||||
|
}
|
||||||
|
$ModInfo{$lib} = {
|
||||||
|
Type=>'lib', Avail=>$avail, Disabled => $disabled
|
||||||
|
};
|
||||||
|
if (defined $avail_old) {
|
||||||
|
$ModInfo{$lib}{AvailOld} = $avail_old;
|
||||||
|
}
|
||||||
|
# FIXME:
|
||||||
|
if (($avail ne "0") && ($avail ne "1")) {
|
||||||
|
warning "Library $lib has invalid availability ".
|
||||||
|
"value <$avail> (check $AutoconfDepsFile).\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close DEPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the available libraries that autoconf generated.
|
||||||
|
sub get_autoconf_opts() {
|
||||||
|
open OPTS, $AutoconfOptsFile or
|
||||||
|
die "Failed to open $AutoconfOptsFile. Aborting: $!\n";
|
||||||
|
|
||||||
|
while (<OPTS>) {
|
||||||
|
chomp;
|
||||||
|
next if /^(#|$)/;
|
||||||
|
my ($var, $val) = split /\s*=\s*/, $_, 2;
|
||||||
|
$ConfigureOpts{$var} = $val;
|
||||||
|
}
|
||||||
|
close OPTS;
|
||||||
|
if (not exists $ConfigureOpts{AST_DEVMODE}) {
|
||||||
|
$ConfigureOpts{AST_DEVMODE} = 'no';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read our specific config file.
|
||||||
|
#
|
||||||
|
# Its format:
|
||||||
|
#
|
||||||
|
# keyword values
|
||||||
|
#
|
||||||
|
# values are always a spaces-separated list.
|
||||||
|
sub read_conf() {
|
||||||
|
open CONF,$ConfFile or return;
|
||||||
|
|
||||||
|
while (<CONF>) {
|
||||||
|
# remove comments and empty lines:
|
||||||
|
chomp;
|
||||||
|
s/#.*$//;
|
||||||
|
next if /^\s*$/;
|
||||||
|
|
||||||
|
my ($keyword, @value) = split;
|
||||||
|
|
||||||
|
if ($keyword eq 'exclude') {
|
||||||
|
push @ExcludedModules, @value;
|
||||||
|
} elsif ($keyword eq 'include') {
|
||||||
|
push @IncludedModules, @value;
|
||||||
|
} elsif ($keyword eq 'require') {
|
||||||
|
push @RequiredModules, @value;
|
||||||
|
} elsif ($keyword eq 'random') {
|
||||||
|
$RandomKnockoutFactor = $value[0] / 100;
|
||||||
|
} else {
|
||||||
|
warning "unknown keyword $keyword in line $. of $ConfFile.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# generate menuselect.makedeps.
|
||||||
|
# In this file menuselect writes dependecies of each module. CFLAGS will
|
||||||
|
# then automatically include for each module the _INCLUDE and LDFLAGS
|
||||||
|
# will include the _LIBS from all the depedencies of the module.
|
||||||
|
sub gen_makedeps() {
|
||||||
|
open MAKEDEPSS, ">$MakedepsFile" or
|
||||||
|
die "Failed to open deps file $MakedepsFile for writing. Aborting: $!\n";
|
||||||
|
|
||||||
|
for my $mod_name (sort keys %ModInfo) {
|
||||||
|
next unless ($ModInfo{$mod_name}{Type} eq 'module');
|
||||||
|
|
||||||
|
my $mod = $ModInfo{$mod_name};
|
||||||
|
my @deps = ();
|
||||||
|
|
||||||
|
# if we have Depend or Use, put their values into
|
||||||
|
# @deps . If we have none, move on.
|
||||||
|
push @deps, @{$mod->{Depend}} if (exists $mod->{Depend});
|
||||||
|
push @deps, @{$mod->{Use}} if (exists $mod->{Use});
|
||||||
|
next unless @deps;
|
||||||
|
|
||||||
|
# TODO: don't print dependencies that are not external libs.
|
||||||
|
# Not done yet until I figure out if this is safe.
|
||||||
|
my $dep = join(' ', @deps);
|
||||||
|
print MAKEDEPSS "MENUSELECT_DEPENDS_".$mod->{Module}."=$dep\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
close MAKEDEPSS;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set modules from patterns specified by 'exclude' in the configuration file
|
||||||
|
# to exclude modules from building (mark them as unavailable).
|
||||||
|
sub apply_excluded_patterns() {
|
||||||
|
foreach my $pattern (@ExcludedModules) {
|
||||||
|
my @excluded = grep {/^$pattern$/i} (keys %ModInfo);
|
||||||
|
foreach (@excluded) {
|
||||||
|
$ModInfo{$_}{Avail} = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set modules from patterns specified by 'include' in the configuration
|
||||||
|
# file to exclude from building (mark them as available).
|
||||||
|
sub apply_included_patterns() {
|
||||||
|
foreach my $pattern (@IncludedModules) {
|
||||||
|
my @included = grep {/^$pattern$/i} (keys %ModInfo);
|
||||||
|
foreach (@included) {
|
||||||
|
$ModInfo{$_}{Avail} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# If user set the "random" config to anything > 0, drop some random
|
||||||
|
# modules. May help expose wrong dependencies.
|
||||||
|
sub apply_random_drop() {
|
||||||
|
return if ($RandomKnockoutFactor <= 0);
|
||||||
|
|
||||||
|
open MODS_LIST, ">$RandomeModsFile" or
|
||||||
|
die "Failed to open modules list file $RandomeModsFile for writing. Aborting: $!\n";
|
||||||
|
for my $mod (keys %ModInfo) {
|
||||||
|
next unless ($ModInfo{$mod}{Type} eq 'module');
|
||||||
|
next unless (rand() < $RandomKnockoutFactor);
|
||||||
|
$ModInfo{$mod}{Avail} = 0;
|
||||||
|
$ModInfo{$mod}{RandomKill} = 1;
|
||||||
|
print MODS_LIST $ModInfo{$mod}{Module}."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
close MODS_LIST;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_required_patterns() {
|
||||||
|
my @failed = ();
|
||||||
|
foreach my $pattern (@RequiredModules) {
|
||||||
|
my @required = grep {/^$pattern$/i} (keys %ModInfo);
|
||||||
|
foreach my $mod (@required) {
|
||||||
|
if ((! exists $ModInfo{$mod}{Checked}) ||
|
||||||
|
(! $ModInfo{$mod}{Checked}) )
|
||||||
|
{
|
||||||
|
push @failed, $mod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return unless (@failed);
|
||||||
|
|
||||||
|
my $failed_str = join ' ',@failed;
|
||||||
|
die("Missing dependencies for the following modules: $failed_str\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
# Disable building for modules that were marked in the embedded module
|
||||||
|
# information as disabled for building by default.
|
||||||
|
sub apply_default_enabled() {
|
||||||
|
foreach my $mod (keys %ModInfo) {
|
||||||
|
if ((exists $ModInfo{$mod}{Defaultenabled}) &&
|
||||||
|
$ModInfo{$mod}{Defaultenabled}[0] eq 'no')
|
||||||
|
{
|
||||||
|
$ModInfo{$mod}{Avail} = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# We found a dependency we don't know about. Warn the user, and add
|
||||||
|
# information about it:
|
||||||
|
sub handle_unknown_dep($$) {
|
||||||
|
my ($dep_mod, $mod) = @_;
|
||||||
|
|
||||||
|
my $mod_info = {
|
||||||
|
Type => 'Unknown',
|
||||||
|
Avail => 0,
|
||||||
|
Checked => 0,
|
||||||
|
};
|
||||||
|
$ModInfo{$dep_mod} = $mod_info;
|
||||||
|
|
||||||
|
warning "Unknown dependency module $dep_mod (for e.g. $mod)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# recursively check dependency for a module.
|
||||||
|
#
|
||||||
|
# We run a scan for modules. Modules marked as 'Checked' are ones we
|
||||||
|
# have already fully verified to have proper dependencies.
|
||||||
|
#
|
||||||
|
# We can only use a module or library marked as Avail => 1 (library
|
||||||
|
# available or module not excluded).
|
||||||
|
sub check_module($);
|
||||||
|
sub check_module($) {
|
||||||
|
my $mod = shift;
|
||||||
|
|
||||||
|
# we checked it:
|
||||||
|
if (exists $ModInfo{$mod}{Checked}) {
|
||||||
|
return $ModInfo{$mod}{Checked};
|
||||||
|
}
|
||||||
|
# A library has no dependencies of its own.
|
||||||
|
if ($ModInfo{$mod}{Type} eq 'lib') {
|
||||||
|
return ($ModInfo{$mod}{Avail} || 0);
|
||||||
|
}
|
||||||
|
# An excluded module.
|
||||||
|
if ($ModInfo{$mod}{Avail} == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (! exists $ModInfo{$mod}{Depend}) {
|
||||||
|
$ModInfo{$mod}{Checked} = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $deps_checked = 1; # may be reset below on failures:
|
||||||
|
|
||||||
|
if (exists $ModInfo{$mod}{Tested}) {
|
||||||
|
# this probably means a circular dependency of some sort.
|
||||||
|
warning "Got to module $mod that is already tested.";
|
||||||
|
}
|
||||||
|
$ModInfo{$mod}{Tested} = 1;
|
||||||
|
|
||||||
|
foreach my $dep_mod (@{$ModInfo{$mod}{Depend}} ) {
|
||||||
|
if (!exists ${ModInfo}{$dep_mod}) {
|
||||||
|
handle_unknown_dep($dep_mod, $mod);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
$deps_checked &= check_module($dep_mod);
|
||||||
|
last if(!$deps_checked) # no point testing further if we failed.
|
||||||
|
}
|
||||||
|
|
||||||
|
$ModInfo{$mod}{Checked} = $deps_checked;
|
||||||
|
return $deps_checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
# The main dependency resolver function.
|
||||||
|
sub resolve_deps() {
|
||||||
|
apply_default_enabled();
|
||||||
|
apply_excluded_patterns();
|
||||||
|
apply_included_patterns();
|
||||||
|
|
||||||
|
foreach my $mod (keys %ModInfo) {
|
||||||
|
check_module($mod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# generate menuselect.makeopts.
|
||||||
|
# The values in this file obey to different semantics:
|
||||||
|
# 1. For modules, a module will be built unles listed here
|
||||||
|
# 2. For XML values (sounds, CFLAGS) it will be enabled if listed here
|
||||||
|
sub gen_makeopts() {
|
||||||
|
open MAKEDEPS, ">$MakeoptsFile" or
|
||||||
|
die "Failed to open opts file $MakeoptsFile for writing. Aborting: $!\n";
|
||||||
|
|
||||||
|
my %Subdirs;
|
||||||
|
foreach my $mod (sort keys %ModInfo) {
|
||||||
|
next unless ($ModInfo{$mod}{Type} =~ /^(module|XML)$/);
|
||||||
|
if ($ModInfo{$mod}{Type} eq 'XML') {
|
||||||
|
next unless ($ModInfo{$mod}{Checked});
|
||||||
|
} else {
|
||||||
|
next if ($ModInfo{$mod}{Checked});
|
||||||
|
}
|
||||||
|
my $dir = $ModInfo{$mod}{Dir};
|
||||||
|
if (! exists $Subdirs{$dir}) {
|
||||||
|
$Subdirs{$dir} = [];
|
||||||
|
}
|
||||||
|
push @{$Subdirs{$dir}},( $ModInfo{$mod}{Module} );
|
||||||
|
}
|
||||||
|
foreach my $dir (sort keys %Subdirs) {
|
||||||
|
my $deps = join(' ', @{$Subdirs{$dir}});
|
||||||
|
print MAKEDEPS "MENUSELECT_$dir=$deps\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
close MAKEDEPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main function for --check-deps
|
||||||
|
sub check_dependencies() {
|
||||||
|
read_conf();
|
||||||
|
|
||||||
|
extract_subdirs(@Subdirs);
|
||||||
|
|
||||||
|
get_autoconf_opts();
|
||||||
|
|
||||||
|
parse_menuselect_xml_file('build_tools/cflags.xml');
|
||||||
|
if ($ConfigureOpts{AST_DEVMODE} eq 'yes') {
|
||||||
|
parse_menuselect_xml_file('build_tools/cflags-devmode.xml');
|
||||||
|
}
|
||||||
|
parse_menuselect_xml_file('sounds/sounds.xml');
|
||||||
|
|
||||||
|
apply_random_drop();
|
||||||
|
|
||||||
|
get_autoconf_deps();
|
||||||
|
|
||||||
|
#dump_deps('build_tools/dump_deps_before_resolve');
|
||||||
|
resolve_deps();
|
||||||
|
|
||||||
|
# Handy debugging:
|
||||||
|
dump_deps($DumpFile);
|
||||||
|
|
||||||
|
check_required_patterns();
|
||||||
|
|
||||||
|
gen_makedeps();
|
||||||
|
|
||||||
|
gen_makeopts();
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# The main program start here
|
||||||
|
#
|
||||||
|
|
||||||
|
sub read_dump() {
|
||||||
|
my %items = ();
|
||||||
|
my $saved_rs = $/;
|
||||||
|
$/ = "\n\n";
|
||||||
|
open DUMP_FILE,$DumpFile or die "Can't read from dump file $DumpFile\n";
|
||||||
|
while (<DUMP_FILE>) {
|
||||||
|
my %item = ();
|
||||||
|
my @item_lines = split /\n\r?/;
|
||||||
|
foreach (@item_lines) {
|
||||||
|
my ($var, $value) = split /: /, $_, 2;
|
||||||
|
$item{$var} = $value;
|
||||||
|
}
|
||||||
|
# FIXME: dependencies are a list. This should not be a
|
||||||
|
# special case.
|
||||||
|
if (exists $item{Depend}) {
|
||||||
|
$item{Depend} = [split /\s*,\s*/,$item{Depend}];
|
||||||
|
}
|
||||||
|
$items{$item{Key}} = \%item;
|
||||||
|
}
|
||||||
|
close DUMP_FILE;
|
||||||
|
$/ = $saved_rs;
|
||||||
|
return \%items;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Explain why a module (read from the dump file) was not enabled.
|
||||||
|
# (We assume here that $item->{Avail} is 0)
|
||||||
|
sub fail_reason($) {
|
||||||
|
my $item = shift;
|
||||||
|
if ($item->{Type} eq 'lib') {
|
||||||
|
return " Not found: system library";
|
||||||
|
} elsif ($item->{Type} eq 'XML') {
|
||||||
|
if ($item->{Defaultenabled} !~ /^y/) {
|
||||||
|
return "Not enabled";
|
||||||
|
} else {
|
||||||
|
return "Missing dependencies";
|
||||||
|
}
|
||||||
|
} elsif ($item->{Type} eq 'module') {
|
||||||
|
if (exists ($item->{Defaultenabled}) &&
|
||||||
|
$item->{Defaultenabled} =~ /^n/) {
|
||||||
|
return "Disabled";
|
||||||
|
} else {
|
||||||
|
return "Missing dependencies";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub item_used($) {
|
||||||
|
my $item = shift;
|
||||||
|
my $type = $item->{Type};
|
||||||
|
|
||||||
|
return $item->{Avail} if ($type eq 'lib');
|
||||||
|
return $item->{Checked};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub print_module_status {
|
||||||
|
my $flag_verbose = shift;
|
||||||
|
my $items = read_dump();
|
||||||
|
my %items_matched = ();
|
||||||
|
|
||||||
|
foreach my $pattern (@_) {
|
||||||
|
foreach (keys %$items) {
|
||||||
|
if (/$pattern/i) {
|
||||||
|
$items_matched{$_} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my @items_list = sort keys %items_matched;
|
||||||
|
|
||||||
|
foreach my $item_name (@items_list) {
|
||||||
|
my $item = $items->{$item_name};
|
||||||
|
if ($flag_verbose) {
|
||||||
|
printf "%s %-8s %-30s\n",
|
||||||
|
(item_used($item)? 'Y':'n'),
|
||||||
|
$item->{Type},
|
||||||
|
$item->{Key};
|
||||||
|
if (!$item->{Avail}) {
|
||||||
|
my $reason = fail_reason($item);
|
||||||
|
print " $reason\n";
|
||||||
|
}
|
||||||
|
foreach (@{$item->{Depend}}) {
|
||||||
|
my $depmod = $items->{$_};
|
||||||
|
printf(" * %-12s ",$_);
|
||||||
|
print (item_used($depmod)? '': "un");
|
||||||
|
print "available\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf "%s %-8s %-30s",
|
||||||
|
(item_used($item)? 'Y':'n'),
|
||||||
|
$item->{Type},
|
||||||
|
$item->{Key};
|
||||||
|
foreach (@{$item->{Depend}}) {
|
||||||
|
my $depmod = $items->{$_};
|
||||||
|
if (item_used($depmod)) {
|
||||||
|
print "$_ ";
|
||||||
|
} else {
|
||||||
|
printf "[%s] ", $_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usage() {
|
||||||
|
print "$0: menuselect reimplementation\n";
|
||||||
|
print "\n";
|
||||||
|
print "Usage:\n";
|
||||||
|
print "$0 # menuselect processing\n";
|
||||||
|
print "$0 -m|--modinfo|--moduls-info PATTERN # Status of modules\n";
|
||||||
|
print "$0 -v|--verbose # verbose (modinfo)\n";
|
||||||
|
print "$0 -c|--check-deps # Check for dependencies\n";
|
||||||
|
print "\n";
|
||||||
|
print "PATTERN is a partial perl regex. Use '-m .' to list all.\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
my @module_status = ();
|
||||||
|
|
||||||
|
my $flag_verbose = 0;
|
||||||
|
|
||||||
|
my $action = '';
|
||||||
|
|
||||||
|
my $rc = GetOptions(
|
||||||
|
'modinfo|modules-info|m=s' => \@module_status,
|
||||||
|
'verbose|v' => \$flag_verbose,
|
||||||
|
'check-deps|c:s' => sub { $action = 'check_dependencies'},
|
||||||
|
'help|h' => sub { usage(); exit 0 },
|
||||||
|
);
|
||||||
|
if (!$rc) {
|
||||||
|
usage();
|
||||||
|
exit $rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (@module_status) {
|
||||||
|
$action = 'module_status';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($action eq 'module_status') {
|
||||||
|
print_module_status($flag_verbose, @module_status);
|
||||||
|
exit 0;
|
||||||
|
} elsif ( $action eq 'check_dependencies') {
|
||||||
|
check_dependencies();
|
||||||
|
} else {
|
||||||
|
usage(); exit(1);
|
||||||
|
}
|
@ -0,0 +1,487 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<menu name="Asterisk Module Selection">
|
||||||
|
<category name="MENUSELECT_APPS" displayname="Applications">
|
||||||
|
<member name="app_adsiprog" displayname="Asterisk ADSI Programming Application" remove_on_change="apps/app_adsiprog.o apps/app_adsiprog.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_alarmreceiver" displayname="Alarm Receiver for Asterisk" remove_on_change="apps/app_alarmreceiver.o apps/app_alarmreceiver.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_amd" displayname="Answering Machine Detection Application" remove_on_change="apps/app_amd.o apps/app_amd.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_authenticate" displayname="Authentication Application" remove_on_change="apps/app_authenticate.o apps/app_authenticate.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_cdr" displayname="Tell Asterisk to not maintain a CDR for the current call" remove_on_change="apps/app_cdr.o apps/app_cdr.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_chanisavail" displayname="Check channel availability" remove_on_change="apps/app_chanisavail.o apps/app_chanisavail.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_channelredirect" displayname="Channel Redirect" remove_on_change="apps/app_channelredirect.o apps/app_channelredirect.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_chanspy" displayname="Listen to the audio of an active channel" remove_on_change="apps/app_chanspy.o apps/app_chanspy.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_controlplayback" displayname="Control Playback Application" remove_on_change="apps/app_controlplayback.o apps/app_controlplayback.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_db" displayname="Database Access Functions" remove_on_change="apps/app_db.o apps/app_db.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_dial" displayname="Dialing Application" remove_on_change="apps/app_dial.o apps/app_dial.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_dictate" displayname="Virtual Dictation Machine" remove_on_change="apps/app_dictate.o apps/app_dictate.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_directed_pickup" displayname="Directed Call Pickup Application" remove_on_change="apps/app_directed_pickup.o apps/app_directed_pickup.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_directory" displayname="Extension Directory" remove_on_change="apps/app_directory.o apps/app_directory.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_disa" displayname="DISA (Direct Inward System Access) Application" remove_on_change="apps/app_disa.o apps/app_disa.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_dumpchan" displayname="Dump Info About The Calling Channel" remove_on_change="apps/app_dumpchan.o apps/app_dumpchan.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_echo" displayname="Simple Echo Application" remove_on_change="apps/app_echo.o apps/app_echo.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_exec" displayname="Executes dialplan applications" remove_on_change="apps/app_exec.o apps/app_exec.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_externalivr" displayname="External IVR Interface Application" remove_on_change="apps/app_externalivr.o apps/app_externalivr.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_festival" displayname="Simple Festival Interface" remove_on_change="apps/app_festival.o apps/app_festival.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_flash" displayname="Flash zap trunk application" remove_on_change="apps/app_flash.o apps/app_flash.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_followme" displayname="Find-Me/Follow-Me Application" remove_on_change="apps/app_followme.o apps/app_followme.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_forkcdr" displayname="Fork The CDR into 2 separate entities." remove_on_change="apps/app_forkcdr.o apps/app_forkcdr.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_getcpeid" displayname="Get ADSI CPE ID" remove_on_change="apps/app_getcpeid.o apps/app_getcpeid.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_hasnewvoicemail" displayname="Indicator for whether a voice mailbox has messages in a given folder." remove_on_change="apps/app_hasnewvoicemail.o apps/app_hasnewvoicemail.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_ices" displayname="Encode and Stream via icecast and ices" remove_on_change="apps/app_ices.o apps/app_ices.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_image" displayname="Image Transmission Application" remove_on_change="apps/app_image.o apps/app_image.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_ivrdemo" displayname="IVR Demo Application" remove_on_change="apps/app_ivrdemo.o apps/app_ivrdemo.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="app_lookupblacklist" displayname="Look up Caller*ID name/number from blacklist database" remove_on_change="apps/app_lookupblacklist.o apps/app_lookupblacklist.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_lookupcidname" displayname="Look up CallerID Name from local database" remove_on_change="apps/app_lookupcidname.o apps/app_lookupcidname.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_macro" displayname="Extension Macros" remove_on_change="apps/app_macro.o apps/app_macro.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_meetme" displayname="MeetMe conference bridge" remove_on_change="apps/app_meetme.o apps/app_meetme.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_milliwatt" displayname="Digital Milliwatt (mu-law) Test Application" remove_on_change="apps/app_milliwatt.o apps/app_milliwatt.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_mixmonitor" displayname="Mixed Audio Monitoring Application" remove_on_change="apps/app_mixmonitor.o apps/app_mixmonitor.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_morsecode" displayname="Morse code" remove_on_change="apps/app_morsecode.o apps/app_morsecode.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_mp3" displayname="Silly MP3 Application" remove_on_change="apps/app_mp3.o apps/app_mp3.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_nbscat" displayname="Silly NBS Stream Application" remove_on_change="apps/app_nbscat.o apps/app_nbscat.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_osplookup" displayname="Open Settlement Protocol Applications" remove_on_change="apps/app_osplookup.o apps/app_osplookup.so">
|
||||||
|
<depend>libosptk</depend>
|
||||||
|
<depend>ssl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_page" displayname="Page Multiple Phones" remove_on_change="apps/app_page.o apps/app_page.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_parkandannounce" displayname="Call Parking and Announce Application" remove_on_change="apps/app_parkandannounce.o apps/app_parkandannounce.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_playback" displayname="Sound File Playback Application" remove_on_change="apps/app_playback.o apps/app_playback.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_privacy" displayname="Require phone number to be entered, if no CallerID sent" remove_on_change="apps/app_privacy.o apps/app_privacy.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_queue" displayname="True Call Queueing" remove_on_change="apps/app_queue.o apps/app_queue.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_random" displayname="Random goto" remove_on_change="apps/app_random.o apps/app_random.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_read" displayname="Read Variable Application" remove_on_change="apps/app_read.o apps/app_read.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_readfile" displayname="Stores output of file into a variable" remove_on_change="apps/app_readfile.o apps/app_readfile.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_realtime" displayname="Realtime Data Lookup/Rewrite" remove_on_change="apps/app_realtime.o apps/app_realtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_record" displayname="Trivial Record Application" remove_on_change="apps/app_record.o apps/app_record.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_rpt" displayname="Radio Repeater / Remote Base version 0.48 06/13/2006" remove_on_change="apps/app_rpt.o apps/app_rpt.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="app_sayunixtime" displayname="Say time" remove_on_change="apps/app_sayunixtime.o apps/app_sayunixtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_senddtmf" displayname="Send DTMF digits Application" remove_on_change="apps/app_senddtmf.o apps/app_senddtmf.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_sendtext" displayname="Send Text Applications" remove_on_change="apps/app_sendtext.o apps/app_sendtext.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_setcallerid" displayname="Set CallerID Application" remove_on_change="apps/app_setcallerid.o apps/app_setcallerid.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_setcdruserfield" displayname="CDR user field apps" remove_on_change="apps/app_setcdruserfield.o apps/app_setcdruserfield.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_settransfercapability" displayname="Set ISDN Transfer Capability" remove_on_change="apps/app_settransfercapability.o apps/app_settransfercapability.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_skel" displayname="Trivial skeleton Application" remove_on_change="apps/app_skel.o apps/app_skel.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="app_sms" displayname="SMS/PSTN handler" remove_on_change="apps/app_sms.o apps/app_sms.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_softhangup" displayname="Hangs up the requested channel" remove_on_change="apps/app_softhangup.o apps/app_softhangup.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_speech_utils" displayname="Dialplan Speech Applications" remove_on_change="apps/app_speech_utils.o apps/app_speech_utils.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_stack" displayname="Stack Routines" remove_on_change="apps/app_stack.o apps/app_stack.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_system" displayname="Generic System() application" remove_on_change="apps/app_system.o apps/app_system.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_talkdetect" displayname="Playback with Talk Detection" remove_on_change="apps/app_talkdetect.o apps/app_talkdetect.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_test" displayname="Interface Test Application" remove_on_change="apps/app_test.o apps/app_test.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_transfer" displayname="Transfer" remove_on_change="apps/app_transfer.o apps/app_transfer.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_url" displayname="Send URL Applications" remove_on_change="apps/app_url.o apps/app_url.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_userevent" displayname="Custom User Event Application" remove_on_change="apps/app_userevent.o apps/app_userevent.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_verbose" displayname="Send verbose output" remove_on_change="apps/app_verbose.o apps/app_verbose.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_voicemail" displayname="Comedian Mail (Voicemail System)" remove_on_change="apps/app_voicemail.o apps/app_voicemail.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_waitforring" displayname="Waits until first ring after time" remove_on_change="apps/app_waitforring.o apps/app_waitforring.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_waitforsilence" displayname="Wait For Silence" remove_on_change="apps/app_waitforsilence.o apps/app_waitforsilence.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_while" displayname="While Loops and Conditional Execution" remove_on_change="apps/app_while.o apps/app_while.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_zapateller" displayname="Block Telemarketers with Special Information Tone" remove_on_change="apps/app_zapateller.o apps/app_zapateller.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_zapbarge" displayname="Barge in on Zap channel application" remove_on_change="apps/app_zapbarge.o apps/app_zapbarge.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_zapras" displayname="Zap RAS Application" remove_on_change="apps/app_zapras.o apps/app_zapras.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_zapscan" displayname="Scan Zap channels application" remove_on_change="apps/app_zapscan.o apps/app_zapscan.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CDR" displayname="Call Detail Recording">
|
||||||
|
<member name="cdr_csv" displayname="Comma Separated Values CDR Backend" remove_on_change="cdr/cdr_csv.o cdr/cdr_csv.so">
|
||||||
|
</member>
|
||||||
|
<member name="cdr_custom" displayname="Customizable Comma Separated Values CDR Backend" remove_on_change="cdr/cdr_custom.o cdr/cdr_custom.so">
|
||||||
|
</member>
|
||||||
|
<member name="cdr_manager" displayname="Asterisk Call Manager CDR Backend" remove_on_change="cdr/cdr_manager.o cdr/cdr_manager.so">
|
||||||
|
</member>
|
||||||
|
<member name="cdr_odbc" displayname="ODBC CDR Backend" remove_on_change="cdr/cdr_odbc.o cdr/cdr_odbc.so">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_pgsql" displayname="PostgreSQL CDR Backend" remove_on_change="cdr/cdr_pgsql.o cdr/cdr_pgsql.so">
|
||||||
|
<depend>pgsql</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_radius" displayname="RADIUS CDR Backend" remove_on_change="cdr/cdr_radius.o cdr/cdr_radius.so">
|
||||||
|
<depend>radiusclient</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_sqlite" displayname="SQLite CDR Backend" remove_on_change="cdr/cdr_sqlite.o cdr/cdr_sqlite.so">
|
||||||
|
<depend>sqlite</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_tds" displayname="MSSQL CDR Backend" remove_on_change="cdr/cdr_tds.o cdr/cdr_tds.so">
|
||||||
|
<depend>freetds</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CHANNELS" displayname="Channel Drivers">
|
||||||
|
<member name="chan_agent" displayname="Agent Proxy Channel" remove_on_change="channels/chan_agent.o channels/chan_agent.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_alsa" displayname="ALSA Console Channel Driver" remove_on_change="channels/chan_alsa.o channels/chan_alsa.so">
|
||||||
|
<depend>asound</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_features" displayname="Feature Proxy Channel" remove_on_change="channels/chan_features.o channels/chan_features.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_h323" displayname="The NuFone Network's Open H.323 Channel Driver" remove_on_change="channels/chan_h323.o channels/chan_h323.so">
|
||||||
|
<depend>h323</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_iax2" displayname="Inter Asterisk eXchange (Ver 2)" remove_on_change="channels/chan_iax2.o channels/chan_iax2.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_jingle" displayname="Jingle Channel Driver" remove_on_change="channels/chan_jingle.o channels/chan_jingle.so">
|
||||||
|
<depend>iksemel</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_local" displayname="Local Proxy Channel" remove_on_change="channels/chan_local.o channels/chan_local.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_mgcp" displayname="Media Gateway Control Protocol (MGCP)" remove_on_change="channels/chan_mgcp.o channels/chan_mgcp.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_misdn" displayname="Channel driver for mISDN Support (Bri/Pri)" remove_on_change="channels/chan_misdn.o channels/chan_misdn.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_nbs" displayname="Network Broadcast Sound Driver" remove_on_change="channels/chan_nbs.o channels/chan_nbs.so">
|
||||||
|
<depend>nbs</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_oss" displayname="OSS Console Channel Driver" remove_on_change="channels/chan_oss.o channels/chan_oss.so">
|
||||||
|
<depend>ossaudio</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_phone" displayname="Standard Linux Telephony API Driver" remove_on_change="channels/chan_phone.o channels/chan_phone.so">
|
||||||
|
<depend>ixjuser</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_sip" displayname="Session Initiation Protocol (SIP)" remove_on_change="channels/chan_sip.o channels/chan_sip.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_skinny" displayname="Skinny Client Control Protocol (Skinny)" remove_on_change="channels/chan_skinny.o channels/chan_skinny.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_vpb" displayname="Standard VoiceTronix API Driver" remove_on_change="channels/chan_vpb.o channels/chan_vpb.so">
|
||||||
|
<depend>vpbapi</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_zap" displayname="Zapata Telephony" remove_on_change="channels/chan_zap.o channels/chan_zap.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CODECS" displayname="Codec Translators">
|
||||||
|
<member name="codec_a_mu" displayname="A-law and Mulaw direct Coder/Decoder" remove_on_change="codecs/codec_a_mu.o codecs/codec_a_mu.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_adpcm" displayname="Adaptive Differential PCM Coder/Decoder" remove_on_change="codecs/codec_adpcm.o codecs/codec_adpcm.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_alaw" displayname="A-law Coder/Decoder" remove_on_change="codecs/codec_alaw.o codecs/codec_alaw.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_g723_1" displayname="" remove_on_change="codecs/codec_g723_1.o codecs/codec_g723_1.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="codec_g726" displayname="ITU G.726-32kbps G726 Transcoder" remove_on_change="codecs/codec_g726.o codecs/codec_g726.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_gsm" displayname="GSM/PCM16 (signed linear) Codec Translator" remove_on_change="codecs/codec_gsm.o codecs/codec_gsm.so">
|
||||||
|
<depend>libgsm</depend>
|
||||||
|
</member>
|
||||||
|
<member name="codec_ilbc" displayname="iLBC/PCM16 (signed linear) Codec Translator" remove_on_change="codecs/codec_ilbc.o codecs/codec_ilbc.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_lpc10" displayname="LPC10 2.4kbps (signed linear) Voice Coder" remove_on_change="codecs/codec_lpc10.o codecs/codec_lpc10.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_speex" displayname="Speex/PCM16 (signed linear) Codec Translator" remove_on_change="codecs/codec_speex.o codecs/codec_speex.so">
|
||||||
|
<depend>libspeex</depend>
|
||||||
|
</member>
|
||||||
|
<member name="codec_ulaw" displayname="Mu-law Coder/Decoder" remove_on_change="codecs/codec_ulaw.o codecs/codec_ulaw.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_zap" displayname="Generic Zaptel Transcoder Codec Translator" remove_on_change="codecs/codec_zap.o codecs/codec_zap.so">
|
||||||
|
<depend>zaptel</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_FORMATS" displayname="Format Interpreters">
|
||||||
|
<member name="format_g723" displayname="G.723.1 Simple Timestamp File Format" remove_on_change="formats/format_g723.o formats/format_g723.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_g726" displayname="Raw G.726 (16/24/32/40kbps) data" remove_on_change="formats/format_g726.o formats/format_g726.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_g729" displayname="Raw G729 data" remove_on_change="formats/format_g729.o formats/format_g729.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_gsm" displayname="Raw GSM data" remove_on_change="formats/format_gsm.o formats/format_gsm.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_h263" displayname="Raw h263 data" remove_on_change="formats/format_h263.o formats/format_h263.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_h264" displayname="Raw h264 data" remove_on_change="formats/format_h264.o formats/format_h264.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_ilbc" displayname="Raw iLBC data" remove_on_change="formats/format_ilbc.o formats/format_ilbc.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_jpeg" displayname="JPEG (Joint Picture Experts Group) Image Format" remove_on_change="formats/format_jpeg.o formats/format_jpeg.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_ogg_vorbis" displayname="OGG/Vorbis audio" remove_on_change="formats/format_ogg_vorbis.o formats/format_ogg_vorbis.so">
|
||||||
|
<depend>libvorbis</depend>
|
||||||
|
<depend>ogg</depend>
|
||||||
|
</member>
|
||||||
|
<member name="format_pcm" displayname="Raw/Sun uLaw/ALaw 8khz Audio support (PCM,PCMA,AU)" remove_on_change="formats/format_pcm.o formats/format_pcm.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_sln" displayname="Raw Signed Linear Audio support (SLN)" remove_on_change="formats/format_sln.o formats/format_sln.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_vox" displayname="Dialogic VOX (ADPCM) File Format" remove_on_change="formats/format_vox.o formats/format_vox.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_wav" displayname="Microsoft WAV format (8000hz Signed Linear)" remove_on_change="formats/format_wav.o formats/format_wav.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_wav_gsm" displayname="Microsoft WAV format (Proprietary GSM)" remove_on_change="formats/format_wav_gsm.o formats/format_wav_gsm.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_FUNCS" displayname="Dialplan Functions">
|
||||||
|
<member name="func_base64" displayname="base64 encode/decode dialplan functions" remove_on_change="funcs/func_base64.o funcs/func_base64.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_callerid" displayname="Caller ID related dialplan function" remove_on_change="funcs/func_callerid.o funcs/func_callerid.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_cdr" displayname="CDR dialplan function" remove_on_change="funcs/func_cdr.o funcs/func_cdr.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_channel" displayname="Channel information dialplan function" remove_on_change="funcs/func_channel.o funcs/func_channel.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_curl" displayname="Load external URL" remove_on_change="funcs/func_curl.o funcs/func_curl.so">
|
||||||
|
<depend>curl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="func_cut" displayname="Cut out information from a string" remove_on_change="funcs/func_cut.o funcs/func_cut.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_db" displayname="Database (astdb) related dialplan functions" remove_on_change="funcs/func_db.o funcs/func_db.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_enum" displayname="ENUM related dialplan functions" remove_on_change="funcs/func_enum.o funcs/func_enum.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_env" displayname="Environment/filesystem dialplan functions" remove_on_change="funcs/func_env.o funcs/func_env.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_global" displayname="Global variable dialplan functions" remove_on_change="funcs/func_global.o funcs/func_global.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_groupcount" displayname="Channel group dialplan functions" remove_on_change="funcs/func_groupcount.o funcs/func_groupcount.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_language" displayname="Channel language dialplan function" remove_on_change="funcs/func_language.o funcs/func_language.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_logic" displayname="Logical dialplan functions" remove_on_change="funcs/func_logic.o funcs/func_logic.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_math" displayname="Mathematical dialplan function" remove_on_change="funcs/func_math.o funcs/func_math.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_md5" displayname="MD5 digest dialplan functions" remove_on_change="funcs/func_md5.o funcs/func_md5.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_moh" displayname="Music-on-hold dialplan function" remove_on_change="funcs/func_moh.o funcs/func_moh.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_odbc" displayname="ODBC lookups" remove_on_change="funcs/func_odbc.o funcs/func_odbc.so">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
</member>
|
||||||
|
<member name="func_rand" displayname="Random number dialplan function" remove_on_change="funcs/func_rand.o funcs/func_rand.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_realtime" displayname="Read/Write values from a RealTime repository" remove_on_change="funcs/func_realtime.o funcs/func_realtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_sha1" displayname="SHA-1 computation dialplan function" remove_on_change="funcs/func_sha1.o funcs/func_sha1.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_strings" displayname="String handling dialplan functions" remove_on_change="funcs/func_strings.o funcs/func_strings.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_timeout" displayname="Channel timeout dialplan functions" remove_on_change="funcs/func_timeout.o funcs/func_timeout.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_uri" displayname="URI encode/decode dialplan functions" remove_on_change="funcs/func_uri.o funcs/func_uri.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_PBX" displayname="PBX Modules">
|
||||||
|
<member name="pbx_ael" displayname="Asterisk Extension Language Compiler v2" remove_on_change="pbx/pbx_ael.o pbx/pbx_ael.so">
|
||||||
|
</member>
|
||||||
|
<member name="pbx_config" displayname="Text Extension Configuration" remove_on_change="pbx/pbx_config.o pbx/pbx_config.so">
|
||||||
|
</member>
|
||||||
|
<member name="pbx_dundi" displayname="Distributed Universal Number Discovery (DUNDi)" remove_on_change="pbx/pbx_dundi.o pbx/pbx_dundi.so">
|
||||||
|
<depend>zlib</depend>
|
||||||
|
</member>
|
||||||
|
<member name="pbx_gtkconsole" displayname="Asterisk PBX Console (GTK Version)" remove_on_change="pbx/pbx_gtkconsole.o pbx/pbx_gtkconsole.so">
|
||||||
|
<depend>gtk</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="pbx_loopback" displayname="Loopback Switch" remove_on_change="pbx/pbx_loopback.o pbx/pbx_loopback.so">
|
||||||
|
</member>
|
||||||
|
<member name="pbx_realtime" displayname="Realtime Switch" remove_on_change="pbx/pbx_realtime.o pbx/pbx_realtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="pbx_spool" displayname="Outgoing Spool Support" remove_on_change="pbx/pbx_spool.o pbx/pbx_spool.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_RES" displayname="Resource Modules">
|
||||||
|
<member name="res_adsi" displayname="ADSI Resource" remove_on_change="res/res_adsi.o res/res_adsi.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_agi" displayname="Asterisk Gateway Interface (AGI)" remove_on_change="res/res_agi.o res/res_agi.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_clioriginate" displayname="Call origination from the CLI" remove_on_change="res/res_clioriginate.o res/res_clioriginate.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_config_odbc" displayname="ODBC Configuration" remove_on_change="res/res_config_odbc.o res/res_config_odbc.so">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_config_pgsql" displayname="Postgresql RealTime Configuration Driver" remove_on_change="res/res_config_pgsql.o res/res_config_pgsql.so">
|
||||||
|
<depend>pgsql</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_convert" displayname="File format conversion CLI command" remove_on_change="res/res_convert.o res/res_convert.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_crypto" displayname="Cryptographic Digital Signatures" remove_on_change="res/res_crypto.o res/res_crypto.so">
|
||||||
|
<depend>ssl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_features" displayname="Call Features Resource" remove_on_change="res/res_features.o res/res_features.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_indications" displayname="Indications Configuration" remove_on_change="res/res_indications.o res/res_indications.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_jabber" displayname="AJI - Asterisk JABBER Interface" remove_on_change="res/res_jabber.o res/res_jabber.so">
|
||||||
|
<depend>iksemel</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_monitor" displayname="Call Monitoring Resource" remove_on_change="res/res_monitor.o res/res_monitor.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_musiconhold" displayname="Music On Hold Resource" remove_on_change="res/res_musiconhold.o res/res_musiconhold.so">
|
||||||
|
<conflict>win32</conflict>
|
||||||
|
</member>
|
||||||
|
<member name="res_odbc" displayname="ODBC Resource" remove_on_change="res/res_odbc.o res/res_odbc.so">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_osp" displayname="Open Settlement Protocol Support" remove_on_change="res/res_osp.o res/res_osp.so">
|
||||||
|
<depend>libosptk</depend>
|
||||||
|
<depend>ssl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_smdi" displayname="Asterisk Simplified Message Desk Interface (SMDI) Module" remove_on_change="res/res_smdi.o res/res_smdi.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_snmp" displayname="SNMP [Sub]Agent for Asterisk" remove_on_change="res/res_snmp.o res/res_snmp.so">
|
||||||
|
<depend>netsnmp</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="res_speech" displayname="Generic Speech Recognition API" remove_on_change="res/res_speech.o res/res_speech.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CFLAGS" displayname="Compiler Flags" positive_output="yes" remove_on_change=".lastclean">
|
||||||
|
<member name="DEBUG_CHANNEL_LOCKS" displayname="Debug Channel Locking">
|
||||||
|
</member>
|
||||||
|
<member name="DEBUG_SCHEDULER" displayname="Enable Scheduler Debugging Output">
|
||||||
|
</member>
|
||||||
|
<member name="DEBUG_THREADS" displayname="Enable Thread Debugging">
|
||||||
|
</member>
|
||||||
|
<member name="DETECT_DEADLOCKS" displayname="Detect Deadlocks">
|
||||||
|
</member>
|
||||||
|
<member name="DONT_OPTIMIZE" displayname="Disable Optimizations from the Compiler">
|
||||||
|
</member>
|
||||||
|
<member name="DUMP_SCHEDULER" displayname="Dump Scheduler Contents for Debugging">
|
||||||
|
</member>
|
||||||
|
<member name="LOW_MEMORY" displayname="Optimize for Low Memory Usage">
|
||||||
|
</member>
|
||||||
|
<member name="MALLOC_DEBUG" displayname="Keep Track of Memory Allocations">
|
||||||
|
</member>
|
||||||
|
<member name="MTX_PROFILE" displayname="Enable Code Profiling Using TSC Counters">
|
||||||
|
</member>
|
||||||
|
<member name="RADIO_RELAX" displayname="Relax DTMF for Radio Applications">
|
||||||
|
</member>
|
||||||
|
<member name="TRACE_FRAMES" displayname="Trace Frame Allocations">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CORE_SOUNDS" displayname="Core Sound Packages" positive_output="yes">
|
||||||
|
<member name="CORE-SOUNDS-EN-WAV" displayname="English, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-ULAW" displayname="English, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-ALAW" displayname="English, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-GSM" displayname="English, GSM format" >
|
||||||
|
<defaultenabled>yes</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-G729" displayname="English, G.729 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-WAV" displayname="Spanish, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-ULAW" displayname="Spanish, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-ALAW" displayname="Spanish, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-GSM" displayname="Spanish, GSM format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-G729" displayname="Spanish, G.729 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-WAV" displayname="French, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-ULAW" displayname="French, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-ALAW" displayname="French, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-GSM" displayname="French, GSM format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-G729" displayname="French, G.729 format">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_EXTRA_SOUNDS" displayname="Extras Sound Packages" positive_output="yes">
|
||||||
|
<member name="EXTRA-SOUNDS-EN-WAV" displayname="English, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-ULAW" displayname="English, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-ALAW" displayname="English, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-GSM" displayname="English, GSM format" >
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-G729" displayname="English, G.729 format">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_app_voicemail" displayname="Voicemail Build Options" positive_output="yes" remove_on_change="apps/app_voicemail.o">
|
||||||
|
<member name="ODBC_STORAGE" displayname="Storage of Voicemail using ODBC">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="EXTENDED_ODBC_STORAGE" displayname="Storage of Voicemail using ODBC (extended)">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
</menu>
|
@ -0,0 +1,323 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2005-05-14.22
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# `make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch. It can only install one file at a time, a restriction
|
||||||
|
# shared with many OS's install programs.
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit="${DOITPROG-}"
|
||||||
|
|
||||||
|
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||||
|
|
||||||
|
mvprog="${MVPROG-mv}"
|
||||||
|
cpprog="${CPPROG-cp}"
|
||||||
|
chmodprog="${CHMODPROG-chmod}"
|
||||||
|
chownprog="${CHOWNPROG-chown}"
|
||||||
|
chgrpprog="${CHGRPPROG-chgrp}"
|
||||||
|
stripprog="${STRIPPROG-strip}"
|
||||||
|
rmprog="${RMPROG-rm}"
|
||||||
|
mkdirprog="${MKDIRPROG-mkdir}"
|
||||||
|
|
||||||
|
chmodcmd="$chmodprog 0755"
|
||||||
|
chowncmd=
|
||||||
|
chgrpcmd=
|
||||||
|
stripcmd=
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
mvcmd="$mvprog"
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dstarg=
|
||||||
|
no_target_directory=
|
||||||
|
|
||||||
|
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-c (ignored)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test -n "$1"; do
|
||||||
|
case $1 in
|
||||||
|
-c) shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-d) dir_arg=true
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) chmodcmd="$chmodprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-t) dstarg=$2
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-T) no_target_directory=true
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
*) # When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
test -n "$dir_arg$dstarg" && break
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dstarg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dstarg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dstarg=$arg
|
||||||
|
done
|
||||||
|
break;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -z "$1"; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call `install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names starting with `-'.
|
||||||
|
case $src in
|
||||||
|
-*) src=./$src ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
src=
|
||||||
|
|
||||||
|
if test -d "$dst"; then
|
||||||
|
mkdircmd=:
|
||||||
|
chmodcmd=
|
||||||
|
else
|
||||||
|
mkdircmd=$mkdirprog
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dstarg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
dst=$dstarg
|
||||||
|
# Protect names starting with `-'.
|
||||||
|
case $dst in
|
||||||
|
-*) dst=./$dst ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test -n "$no_target_directory"; then
|
||||||
|
echo "$0: $dstarg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst/`basename "$src"`
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This sed command emulates the dirname command.
|
||||||
|
dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
|
||||||
|
|
||||||
|
# Make sure that the destination directory exists.
|
||||||
|
|
||||||
|
# Skip lots of stat calls in the usual case.
|
||||||
|
if test ! -d "$dstdir"; then
|
||||||
|
defaultIFS='
|
||||||
|
'
|
||||||
|
IFS="${IFS-$defaultIFS}"
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
# Some sh's can't handle IFS=/ for some reason.
|
||||||
|
IFS='%'
|
||||||
|
set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||||
|
shift
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
pathcomp=
|
||||||
|
|
||||||
|
while test $# -ne 0 ; do
|
||||||
|
pathcomp=$pathcomp$1
|
||||||
|
shift
|
||||||
|
if test ! -d "$pathcomp"; then
|
||||||
|
$mkdirprog "$pathcomp"
|
||||||
|
# mkdir can fail with a `File exist' error in case several
|
||||||
|
# install-sh are creating the directory concurrently. This
|
||||||
|
# is OK.
|
||||||
|
test -d "$pathcomp" || exit
|
||||||
|
fi
|
||||||
|
pathcomp=$pathcomp/
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
$doit $mkdircmd "$dst" \
|
||||||
|
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
|
||||||
|
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
|
||||||
|
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
|
||||||
|
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
|
||||||
|
|
||||||
|
else
|
||||||
|
dstfile=`basename "$dst"`
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=$dstdir/_inst.$$_
|
||||||
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
trap '(exit $?); exit' 1 2 13 15
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
$doit $cpprog "$src" "$dsttmp" &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
|
||||||
|
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
|
||||||
|
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
|
||||||
|
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|
||||||
|
|| {
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
if test -f "$dstdir/$dstfile"; then
|
||||||
|
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|
||||||
|
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|
||||||
|
|| {
|
||||||
|
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
else
|
||||||
|
:
|
||||||
|
fi
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fi || { (exit 1); exit 1; }
|
||||||
|
done
|
||||||
|
|
||||||
|
# The final little trick to "correctly" pass the exit status to the exit trap.
|
||||||
|
{
|
||||||
|
(exit 0); exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-end: "$"
|
||||||
|
# End:
|
@ -0,0 +1,372 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- An open source telephony toolkit.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999 - 2006, Digium, Inc.
|
||||||
|
*
|
||||||
|
* Mark Spencer <markster@digium.com>
|
||||||
|
* Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
*
|
||||||
|
* See http://www.asterisk.org for more information about
|
||||||
|
* the Asterisk project. Please do not directly contact
|
||||||
|
* any of the maintainers of this project for assistance;
|
||||||
|
* the project provides a web site, mailing lists and IRC
|
||||||
|
* channels for your use.
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License Version 2. See the LICENSE file
|
||||||
|
* at the top of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ASTERISK_LINKEDLISTS_H
|
||||||
|
#define ASTERISK_LINKEDLISTS_H
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Defines a structure to be used to hold a list of specified type (with no lock).
|
||||||
|
\param name This will be the name of the defined structure.
|
||||||
|
\param type This is the type of each list entry.
|
||||||
|
|
||||||
|
This macro creates a structure definition that can be used
|
||||||
|
to hold a list of the entries of type \a type. It does not actually
|
||||||
|
declare (allocate) a structure; to do that, either follow this
|
||||||
|
macro with the desired name of the instance you wish to declare,
|
||||||
|
or use the specified \a name to declare instances elsewhere.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
\code
|
||||||
|
static AST_LIST_HEAD_NOLOCK(entry_list, entry) entries;
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
This would define \c struct \c entry_list, and declare an instance of it named
|
||||||
|
\a entries, all intended to hold a list of type \c struct \c entry.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_NOLOCK(name, type) \
|
||||||
|
struct name { \
|
||||||
|
struct type *first; \
|
||||||
|
struct type *last; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_NOLOCK_INIT_VALUE { \
|
||||||
|
.first = NULL, \
|
||||||
|
.last = NULL, \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Defines a structure to be used to hold a list of specified type, statically initialized.
|
||||||
|
|
||||||
|
This is the same as AST_LIST_HEAD_STATIC, except without the lock included.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_NOLOCK_STATIC(name, type) \
|
||||||
|
struct name { \
|
||||||
|
struct type *first; \
|
||||||
|
struct type *last; \
|
||||||
|
} name = AST_LIST_HEAD_NOLOCK_INIT_VALUE
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Initializes a list head structure with a specified first entry.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param entry pointer to the list entry that will become the head of the list
|
||||||
|
|
||||||
|
This macro initializes a list head structure by setting the head
|
||||||
|
entry to the supplied value.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_SET_NOLOCK(head, entry) do { \
|
||||||
|
(head)->first = (entry); \
|
||||||
|
(head)->last = (entry); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Declare a forward link structure inside a list entry.
|
||||||
|
\param type This is the type of each list entry.
|
||||||
|
|
||||||
|
This macro declares a structure to be used to link list entries together.
|
||||||
|
It must be used inside the definition of the structure named in
|
||||||
|
\a type, as follows:
|
||||||
|
|
||||||
|
\code
|
||||||
|
struct list_entry {
|
||||||
|
...
|
||||||
|
AST_LIST_ENTRY(list_entry) list;
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
The field name \a list here is arbitrary, and can be anything you wish.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_ENTRY(type) \
|
||||||
|
struct { \
|
||||||
|
struct type *next; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Returns the first entry contained in a list.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
*/
|
||||||
|
#define AST_LIST_FIRST(head) ((head)->first)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Returns the last entry contained in a list.
|
||||||
|
\param head This is a pointer to the list tail structure
|
||||||
|
*/
|
||||||
|
#define AST_LIST_LAST(head) ((head)->last)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Returns the next entry in the list after the given entry.
|
||||||
|
\param elm This is a pointer to the current entry.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_NEXT(elm, field) ((elm)->field.next)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Checks whether the specified list contains any entries.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
|
||||||
|
Returns non-zero if the list has entries, zero if not.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_EMPTY(head) (AST_LIST_FIRST(head) == NULL)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Loops over (traverses) the entries in a list.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param var This is the name of the variable that will hold a pointer to the
|
||||||
|
current list entry on each iteration. It must be declared before calling
|
||||||
|
this macro.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
|
||||||
|
This macro is use to loop over (traverse) the entries in a list. It uses a
|
||||||
|
\a for loop, and supplies the enclosed code with a pointer to each list
|
||||||
|
entry as it loops. It is typically used as follows:
|
||||||
|
\code
|
||||||
|
static AST_LIST_HEAD(entry_list, list_entry) entries;
|
||||||
|
...
|
||||||
|
struct list_entry {
|
||||||
|
...
|
||||||
|
AST_LIST_ENTRY(list_entry) list;
|
||||||
|
}
|
||||||
|
...
|
||||||
|
struct list_entry *current;
|
||||||
|
...
|
||||||
|
AST_LIST_TRAVERSE(&entries, current, list) {
|
||||||
|
(do something with current here)
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
\warning If you modify the forward-link pointer contained in the \a current entry while
|
||||||
|
inside the loop, the behavior will be unpredictable. At a minimum, the following
|
||||||
|
macros will modify the forward-link pointer, and should not be used inside
|
||||||
|
AST_LIST_TRAVERSE() against the entry pointed to by the \a current pointer without
|
||||||
|
careful consideration of their consequences:
|
||||||
|
\li AST_LIST_NEXT() (when used as an lvalue)
|
||||||
|
\li AST_LIST_INSERT_AFTER()
|
||||||
|
\li AST_LIST_INSERT_HEAD()
|
||||||
|
\li AST_LIST_INSERT_TAIL()
|
||||||
|
*/
|
||||||
|
#define AST_LIST_TRAVERSE(head,var,field) \
|
||||||
|
for((var) = (head)->first; (var); (var) = (var)->field.next)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Loops safely over (traverses) the entries in a list.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param var This is the name of the variable that will hold a pointer to the
|
||||||
|
current list entry on each iteration. It must be declared before calling
|
||||||
|
this macro.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
|
||||||
|
This macro is used to safely loop over (traverse) the entries in a list. It
|
||||||
|
uses a \a for loop, and supplies the enclosed code with a pointer to each list
|
||||||
|
entry as it loops. It is typically used as follows:
|
||||||
|
|
||||||
|
\code
|
||||||
|
static AST_LIST_HEAD(entry_list, list_entry) entries;
|
||||||
|
...
|
||||||
|
struct list_entry {
|
||||||
|
...
|
||||||
|
AST_LIST_ENTRY(list_entry) list;
|
||||||
|
}
|
||||||
|
...
|
||||||
|
struct list_entry *current;
|
||||||
|
...
|
||||||
|
AST_LIST_TRAVERSE_SAFE_BEGIN(&entries, current, list) {
|
||||||
|
(do something with current here)
|
||||||
|
}
|
||||||
|
AST_LIST_TRAVERSE_SAFE_END;
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
It differs from AST_LIST_TRAVERSE() in that the code inside the loop can modify
|
||||||
|
(or even free, after calling AST_LIST_REMOVE_CURRENT()) the entry pointed to by
|
||||||
|
the \a current pointer without affecting the loop traversal.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field) { \
|
||||||
|
typeof((head)->first) __list_next; \
|
||||||
|
typeof((head)->first) __list_prev = NULL; \
|
||||||
|
typeof((head)->first) __new_prev = NULL; \
|
||||||
|
for ((var) = (head)->first, __new_prev = (var), \
|
||||||
|
__list_next = (var) ? (var)->field.next : NULL; \
|
||||||
|
(var); \
|
||||||
|
__list_prev = __new_prev, (var) = __list_next, \
|
||||||
|
__new_prev = (var), \
|
||||||
|
__list_next = (var) ? (var)->field.next : NULL \
|
||||||
|
)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Removes the \a current entry from a list during a traversal.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
|
||||||
|
\note This macro can \b only be used inside an AST_LIST_TRAVERSE_SAFE_BEGIN()
|
||||||
|
block; it is used to unlink the current entry from the list without affecting
|
||||||
|
the list traversal (and without having to re-traverse the list to modify the
|
||||||
|
previous entry, if any).
|
||||||
|
*/
|
||||||
|
#define AST_LIST_REMOVE_CURRENT(head, field) do { \
|
||||||
|
__new_prev->field.next = NULL; \
|
||||||
|
__new_prev = __list_prev; \
|
||||||
|
if (__list_prev) \
|
||||||
|
__list_prev->field.next = __list_next; \
|
||||||
|
else \
|
||||||
|
(head)->first = __list_next; \
|
||||||
|
if (!__list_next) \
|
||||||
|
(head)->last = __list_prev; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Inserts a list entry before the current entry during a traversal.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param elm This is a pointer to the entry to be inserted.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
|
||||||
|
\note This macro can \b only be used inside an AST_LIST_TRAVERSE_SAFE_BEGIN()
|
||||||
|
block.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_INSERT_BEFORE_CURRENT(head, elm, field) do { \
|
||||||
|
if (__list_prev) { \
|
||||||
|
(elm)->field.next = __list_prev->field.next; \
|
||||||
|
__list_prev->field.next = elm; \
|
||||||
|
} else { \
|
||||||
|
(elm)->field.next = (head)->first; \
|
||||||
|
(head)->first = (elm); \
|
||||||
|
} \
|
||||||
|
__new_prev = (elm); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Closes a safe loop traversal block.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_TRAVERSE_SAFE_END }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Initializes a list head structure.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
|
||||||
|
This macro initializes a list head structure by setting the head
|
||||||
|
entry to \a NULL (empty list). There is no embedded lock handling
|
||||||
|
with this macro.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_INIT_NOLOCK(head) { \
|
||||||
|
(head)->first = NULL; \
|
||||||
|
(head)->last = NULL; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Inserts a list entry after a given entry.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param listelm This is a pointer to the entry after which the new entry should
|
||||||
|
be inserted.
|
||||||
|
\param elm This is a pointer to the entry to be inserted.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_INSERT_AFTER(head, listelm, elm, field) do { \
|
||||||
|
(elm)->field.next = (listelm)->field.next; \
|
||||||
|
(listelm)->field.next = (elm); \
|
||||||
|
if ((head)->last == (listelm)) \
|
||||||
|
(head)->last = (elm); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Inserts a list entry at the head of a list.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param elm This is a pointer to the entry to be inserted.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_INSERT_HEAD(head, elm, field) do { \
|
||||||
|
(elm)->field.next = (head)->first; \
|
||||||
|
(head)->first = (elm); \
|
||||||
|
if (!(head)->last) \
|
||||||
|
(head)->last = (elm); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Appends a list entry to the tail of a list.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param elm This is a pointer to the entry to be appended.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
|
||||||
|
Note: The link field in the appended entry is \b not modified, so if it is
|
||||||
|
actually the head of a list itself, the entire list will be appended
|
||||||
|
temporarily (until the next AST_LIST_INSERT_TAIL is performed).
|
||||||
|
*/
|
||||||
|
#define AST_LIST_INSERT_TAIL(head, elm, field) do { \
|
||||||
|
if (!(head)->first) { \
|
||||||
|
(head)->first = (elm); \
|
||||||
|
(head)->last = (elm); \
|
||||||
|
} else { \
|
||||||
|
(head)->last->field.next = (elm); \
|
||||||
|
(head)->last = (elm); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Removes and returns the head entry from a list.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
|
||||||
|
Removes the head entry from the list, and returns a pointer to it.
|
||||||
|
This macro is safe to call on an empty list.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_REMOVE_HEAD(head, field) ({ \
|
||||||
|
typeof((head)->first) cur = (head)->first; \
|
||||||
|
if (cur) { \
|
||||||
|
(head)->first = cur->field.next; \
|
||||||
|
cur->field.next = NULL; \
|
||||||
|
if ((head)->last == cur) \
|
||||||
|
(head)->last = NULL; \
|
||||||
|
} \
|
||||||
|
cur; \
|
||||||
|
})
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Removes a specific entry from a list.
|
||||||
|
\param head This is a pointer to the list head structure
|
||||||
|
\param elm This is a pointer to the entry to be removed.
|
||||||
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
||||||
|
used to link entries of this list together.
|
||||||
|
\warning The removed entry is \b not freed nor modified in any way.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_REMOVE(head, elm, field) do { \
|
||||||
|
if ((head)->first == (elm)) { \
|
||||||
|
(head)->first = (elm)->field.next; \
|
||||||
|
if ((head)->last == (elm)) \
|
||||||
|
(head)->last = NULL; \
|
||||||
|
} else { \
|
||||||
|
typeof(elm) curelm = (head)->first; \
|
||||||
|
while (curelm && (curelm->field.next != (elm))) \
|
||||||
|
curelm = curelm->field.next; \
|
||||||
|
if (curelm) { \
|
||||||
|
curelm->field.next = (elm)->field.next; \
|
||||||
|
if ((head)->last == (elm)) \
|
||||||
|
(head)->last = curelm; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
(elm)->field.next = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* _ASTERISK_LINKEDLISTS_H */
|
@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -f ${1}/.version ]; then
|
||||||
|
cat ${1}.version
|
||||||
|
elif [ -f ${1}/.svnrevision ]; then
|
||||||
|
echo SVN-`cat ${1}/.svnbranch`-r`cat ${1}/.svnrevision`
|
||||||
|
elif [ -d .svn ]; then
|
||||||
|
PARTS=`LANG=C svn info ${1} | grep URL | awk '{print $2;}' | sed -e 's:^.*/svn/menuselect/::' | sed -e 's:/: :g'`
|
||||||
|
BRANCH=0
|
||||||
|
TEAM=0
|
||||||
|
|
||||||
|
REV=`svnversion -c ${1} | cut -d: -f2`
|
||||||
|
|
||||||
|
if [ "${PARTS}" = "trunk" ]
|
||||||
|
then
|
||||||
|
echo SVN-'trunk'-r${REV}
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
for PART in $PARTS
|
||||||
|
do
|
||||||
|
if [ ${BRANCH} != 0 ]
|
||||||
|
then
|
||||||
|
RESULT="${RESULT}-${PART}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${TEAM} != 0 ]
|
||||||
|
then
|
||||||
|
RESULT="${RESULT}-${PART}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${PART}" = "branches" ]
|
||||||
|
then
|
||||||
|
BRANCH=1
|
||||||
|
RESULT="branch"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${PART}" = "tags" ]
|
||||||
|
then
|
||||||
|
BRANCH=1
|
||||||
|
RESULT="tag"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${PART}" = "team" ]
|
||||||
|
then
|
||||||
|
TEAM=1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo SVN-${RESULT##-}-r${REV}
|
||||||
|
fi
|
@ -0,0 +1,26 @@
|
|||||||
|
# NOTE: Names of _INCLUDE and _LIB entries in this file must be
|
||||||
|
# the exact uppercase equivalents of the names used for
|
||||||
|
# dependencies in menuselect for the same package.
|
||||||
|
|
||||||
|
CC=@CC@
|
||||||
|
|
||||||
|
OSARCH=@HOST_OS@
|
||||||
|
MENUSELECT_DEBUG=@MENUSELECT_DEBUG@
|
||||||
|
|
||||||
|
# The frontend can use curses, ncurses, newt or gtk2
|
||||||
|
|
||||||
|
CURSES_INCLUDE=@CURSES_INCLUDE@
|
||||||
|
CURSES_LIB=@CURSES_LIB@
|
||||||
|
|
||||||
|
GTK2_INCLUDE=@GTK2_INCLUDE@
|
||||||
|
GTK2_LIB=@GTK2_LIB@
|
||||||
|
|
||||||
|
NCURSES_INCLUDE=@NCURSES_INCLUDE@
|
||||||
|
NCURSES_LIB=@NCURSES_LIB@
|
||||||
|
|
||||||
|
NEWT_INCLUDE=@NEWT_INCLUDE@
|
||||||
|
NEWT_LIB=@NEWT_LIB@
|
||||||
|
|
||||||
|
LIBXML2_INCLUDE=@LIBXML2_INCLUDE@
|
||||||
|
LIBXML2_LIB=@LIBXML2_LIB@
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- An open source telephony toolkit.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005-2006, Russell Bryant
|
||||||
|
*
|
||||||
|
* Russell Bryant <russell@digium.com>
|
||||||
|
*
|
||||||
|
* See http://www.asterisk.org for more information about
|
||||||
|
* the Asterisk project. Please do not directly contact
|
||||||
|
* any of the maintainers of this project for assistance;
|
||||||
|
* the project provides a web site, mailing lists and IRC
|
||||||
|
* channels for your use.
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License Version 2. See the LICENSE file
|
||||||
|
* at the top of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief public data structures and defaults for menuselect
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MENUSELECT_H
|
||||||
|
#define MENUSELECT_H
|
||||||
|
|
||||||
|
#include "linkedlists.h"
|
||||||
|
|
||||||
|
#define OUTPUT_MAKEOPTS_DEFAULT "menuselect.makeopts"
|
||||||
|
#define OUTPUT_MAKEDEPS_DEFAULT "menuselect.makedeps"
|
||||||
|
#define MENUSELECT_DEPS "build_tools/menuselect-deps"
|
||||||
|
|
||||||
|
struct member;
|
||||||
|
|
||||||
|
struct reference {
|
||||||
|
/*! the name of the dependency */
|
||||||
|
const char *name;
|
||||||
|
/*! the display name of the dependency */
|
||||||
|
const char *displayname;
|
||||||
|
/*! if this dependency is a member, not an external object */
|
||||||
|
struct member *member;
|
||||||
|
/*! if this package was found */
|
||||||
|
unsigned char met:1;
|
||||||
|
/*! for linking */
|
||||||
|
AST_LIST_ENTRY(reference) list;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum failure_types {
|
||||||
|
NO_FAILURE = 0,
|
||||||
|
SOFT_FAILURE = 1,
|
||||||
|
HARD_FAILURE = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
AST_LIST_HEAD_NOLOCK(reference_list, reference);
|
||||||
|
|
||||||
|
struct member {
|
||||||
|
/*! What will be sent to the makeopts file */
|
||||||
|
const char *name;
|
||||||
|
/*! Display name if known */
|
||||||
|
const char *displayname;
|
||||||
|
/*! Default setting */
|
||||||
|
const char *defaultenabled;
|
||||||
|
/*! Delete these file(s) if this member changes */
|
||||||
|
const char *remove_on_change;
|
||||||
|
/*! Touch these file(s) if this member changes */
|
||||||
|
const char *touch_on_change;
|
||||||
|
const char *support_level;
|
||||||
|
const char *replacement;
|
||||||
|
/*! This module is currently selected */
|
||||||
|
unsigned int enabled:1;
|
||||||
|
/*! This module was enabled when the config was loaded */
|
||||||
|
unsigned int was_enabled:1;
|
||||||
|
/*! This module has failed dependencies */
|
||||||
|
unsigned int depsfailed:2;
|
||||||
|
/*! This module has failed conflicts */
|
||||||
|
unsigned int conflictsfailed:2;
|
||||||
|
/*! This module's 'enabled' flag was changed by a default only */
|
||||||
|
unsigned int was_defaulted:1;
|
||||||
|
/*! This module is a dependency, and if it is selected then
|
||||||
|
we have included it in the MENUSELECT_BUILD_DEPS line
|
||||||
|
in the output file */
|
||||||
|
unsigned int build_deps_output:1;
|
||||||
|
/*! This module should never be enabled automatically, but only
|
||||||
|
* when explicitly set. */
|
||||||
|
unsigned int explicitly_enabled_only:1;
|
||||||
|
/*! This isn't actually a module! It's a separator, and it should
|
||||||
|
* be passed over for many of the usual purposes associated with members. */
|
||||||
|
unsigned int is_separator:1;
|
||||||
|
/*! dependencies of this module */
|
||||||
|
struct reference_list deps;
|
||||||
|
/*! conflicts of this module */
|
||||||
|
struct reference_list conflicts;
|
||||||
|
/*! optional packages used by this module */
|
||||||
|
struct reference_list uses;
|
||||||
|
/*! for making a list of modules */
|
||||||
|
AST_LIST_ENTRY(member) list;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum support_level_values {
|
||||||
|
SUPPORT_CORE = 0,
|
||||||
|
SUPPORT_EXTENDED = 1,
|
||||||
|
SUPPORT_DEPRECATED = 2,
|
||||||
|
SUPPORT_UNSPECIFIED = 3,
|
||||||
|
SUPPORT_COUNT = 4, /* Keep this item at the end of the list. Tracks total number of support levels. */
|
||||||
|
};
|
||||||
|
|
||||||
|
AST_LIST_HEAD_NOLOCK(support_level_bucket, member);
|
||||||
|
|
||||||
|
struct category {
|
||||||
|
/*! Workspace for building support levels */
|
||||||
|
struct support_level_bucket buckets[SUPPORT_COUNT];
|
||||||
|
/*! the Makefile variable */
|
||||||
|
const char *name;
|
||||||
|
/*! the name displayed in the menu */
|
||||||
|
const char *displayname;
|
||||||
|
/*! Delete these file(s) if anything in this category changes */
|
||||||
|
const char *remove_on_change;
|
||||||
|
/*! Touch these file(s) if anything in this category changes */
|
||||||
|
const char *touch_on_change;
|
||||||
|
/*! Output what is selected, as opposed to not selected */
|
||||||
|
unsigned int positive_output:1;
|
||||||
|
/*! All choices in this category are mutually exclusive */
|
||||||
|
unsigned int exclusive:1;
|
||||||
|
/*! the list of possible values to be set in this variable */
|
||||||
|
AST_LIST_HEAD_NOLOCK(, member) members;
|
||||||
|
/*! for linking */
|
||||||
|
AST_LIST_ENTRY(category) list;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern AST_LIST_HEAD_NOLOCK(categories, category) categories;
|
||||||
|
|
||||||
|
extern const char *menu_name;
|
||||||
|
|
||||||
|
/*! This is implemented by the frontend */
|
||||||
|
int run_menu(void);
|
||||||
|
|
||||||
|
int count_categories(void);
|
||||||
|
|
||||||
|
int count_members(struct category *cat);
|
||||||
|
|
||||||
|
/*! \brief Toggle a member of a category at the specified index to enabled/disabled */
|
||||||
|
void toggle_enabled_index(struct category *cat, int index);
|
||||||
|
|
||||||
|
void toggle_enabled(struct member *mem);
|
||||||
|
|
||||||
|
/*! \brief Set a member of a category at the specified index to enabled */
|
||||||
|
void set_enabled(struct category *cat, int index);
|
||||||
|
/*! \brief Set a member of a category at the specified index to not enabled */
|
||||||
|
void clear_enabled(struct category *cat, int index);
|
||||||
|
|
||||||
|
/*! \brief Enable/Disable all members of a category as long as dependencies have been met and no conflicts are found */
|
||||||
|
void set_all(struct category *cat, int val);
|
||||||
|
|
||||||
|
/*! \brief returns non-zero if the string is not defined, or has zero length */
|
||||||
|
static inline int strlen_zero(const char *s)
|
||||||
|
{
|
||||||
|
return (!s || (*s == '\0'));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MENUSELECT_H */
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,358 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include "menuselect.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/*! The row name */
|
||||||
|
COLUMN_NAME,
|
||||||
|
/*! Whether this row is enabled */
|
||||||
|
COLUMN_SELECTED,
|
||||||
|
/*! Dependencies */
|
||||||
|
COLUMN_DEPS,
|
||||||
|
/*! Optional dependencies */
|
||||||
|
COLUMN_USES,
|
||||||
|
/*! Conflicts */
|
||||||
|
COLUMN_CNFS,
|
||||||
|
/*! Number of columns, must be the last element in the enum */
|
||||||
|
NUM_COLUMNS,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void handle_save(GtkWidget *w, gpointer data);
|
||||||
|
static void handle_about(GtkWidget *w, gpointer data);
|
||||||
|
static void handle_quit(GtkWidget *w, gpointer data);
|
||||||
|
|
||||||
|
static GtkItemFactoryEntry menu_items[] = {
|
||||||
|
{ "/_File", NULL, NULL, 0, "<Branch>" },
|
||||||
|
{ "/File/_Save And Quit", "<control>S", handle_save, 0, "<StockItem>", GTK_STOCK_SAVE },
|
||||||
|
{ "/File/sep1", NULL, NULL, 0, "<Separator>" },
|
||||||
|
{ "/File/_Quit", "<CTRL>Q", handle_quit, 0, "<StockItem>", GTK_STOCK_QUIT },
|
||||||
|
{ "/_Help", NULL, NULL, 0, "<LastBranch>" },
|
||||||
|
{ "/_Help/About", NULL, handle_about, 0, "<Item>" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
|
||||||
|
|
||||||
|
static GtkTreeView *tree;
|
||||||
|
static GtkWidget *window;
|
||||||
|
|
||||||
|
/* 0, save ... non-zero, don't save */
|
||||||
|
static int main_res = 1;
|
||||||
|
static int change_made = 0;
|
||||||
|
|
||||||
|
static void handle_save(GtkWidget *w, gpointer data)
|
||||||
|
{
|
||||||
|
main_res = 0;
|
||||||
|
gtk_main_quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_about(GtkWidget *w, gpointer data)
|
||||||
|
{
|
||||||
|
GtkWidget *dialog;
|
||||||
|
|
||||||
|
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
|
||||||
|
"GMenuselect - http://www.asterisk.org/\n"
|
||||||
|
"Russell Bryant <russell@digium.com>\n"
|
||||||
|
"Copyright (C) 2007\n");
|
||||||
|
|
||||||
|
gtk_dialog_run(GTK_DIALOG(dialog));
|
||||||
|
gtk_widget_destroy(dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_quit(GtkWidget *widget, gpointer data)
|
||||||
|
{
|
||||||
|
gtk_main_quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroy(GtkWidget *widget, gpointer data)
|
||||||
|
{
|
||||||
|
GtkWidget *dialog;
|
||||||
|
gint response;
|
||||||
|
|
||||||
|
if (!main_res || !change_made) {
|
||||||
|
gtk_main_quit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Save before quit?");
|
||||||
|
response = gtk_dialog_run(GTK_DIALOG(dialog));
|
||||||
|
gtk_widget_destroy(dialog);
|
||||||
|
|
||||||
|
if (response == GTK_RESPONSE_YES)
|
||||||
|
main_res = 0;
|
||||||
|
|
||||||
|
gtk_main_quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void toggled_handler(GtkCellRendererToggle *renderer, gchar *path, gpointer data)
|
||||||
|
{
|
||||||
|
gchar *cat_num_str, *mem_num_str;
|
||||||
|
int cat_num, mem_num;
|
||||||
|
int i = 0;
|
||||||
|
struct category *cat;
|
||||||
|
struct member *mem;
|
||||||
|
GtkTreeStore *store = data;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
GtkTreeIter cat_iter, mem_iter;
|
||||||
|
|
||||||
|
mem_num_str = alloca(strlen(path)) + 1;
|
||||||
|
strcpy(mem_num_str, path);
|
||||||
|
cat_num_str = strsep(&mem_num_str, ":");
|
||||||
|
|
||||||
|
if (!mem_num_str || !*mem_num_str)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cat_num = atoi(cat_num_str);
|
||||||
|
mem_num = atoi(mem_num_str);
|
||||||
|
|
||||||
|
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||||
|
if (i == cat_num)
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (!cat)
|
||||||
|
return;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||||
|
if (i == mem_num)
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (!mem)
|
||||||
|
return;
|
||||||
|
|
||||||
|
toggle_enabled(mem);
|
||||||
|
|
||||||
|
model = gtk_tree_view_get_model(tree);
|
||||||
|
|
||||||
|
gtk_tree_model_get_iter_first(model, &cat_iter);
|
||||||
|
for (i = 0; i < cat_num; i++) {
|
||||||
|
if (!gtk_tree_model_iter_next(model, &cat_iter))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i != cat_num)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!gtk_tree_model_iter_children(model, &mem_iter, &cat_iter))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < mem_num; i++) {
|
||||||
|
if (!gtk_tree_model_iter_next(model, &mem_iter))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i != mem_num)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gtk_tree_store_set(store, &mem_iter, COLUMN_SELECTED, mem->enabled, -1);
|
||||||
|
|
||||||
|
change_made = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void row_activated_handler(GtkTreeView *treeview, GtkTreePath *path,
|
||||||
|
GtkTreeViewColumn *col, gpointer data)
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
GtkTreeStore *store = data;
|
||||||
|
gchar *name;
|
||||||
|
struct category *cat;
|
||||||
|
struct member *mem;
|
||||||
|
|
||||||
|
model = gtk_tree_view_get_model(treeview);
|
||||||
|
|
||||||
|
if (!gtk_tree_model_get_iter(model, &iter, path))
|
||||||
|
return;
|
||||||
|
|
||||||
|
gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, -1);
|
||||||
|
|
||||||
|
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||||
|
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||||
|
if (strcmp(name, mem->name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
toggle_enabled(mem);
|
||||||
|
gtk_tree_store_set(store, &iter, COLUMN_SELECTED, mem->enabled, -1);
|
||||||
|
change_made = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mem)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *get_menubar_menu(GtkWidget *window)
|
||||||
|
{
|
||||||
|
GtkItemFactory *item_factory;
|
||||||
|
GtkAccelGroup *accel_group;
|
||||||
|
|
||||||
|
/* Make an accelerator group (shortcut keys) */
|
||||||
|
accel_group = gtk_accel_group_new();
|
||||||
|
|
||||||
|
/* Make an ItemFactory (that makes a menubar) */
|
||||||
|
item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>",
|
||||||
|
accel_group);
|
||||||
|
|
||||||
|
/* This function generates the menu items. Pass the item factory,
|
||||||
|
the number of items in the array, the array itself, and any
|
||||||
|
callback data for the the menu items. */
|
||||||
|
gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL);
|
||||||
|
|
||||||
|
/* Attach the new accelerator group to the window. */
|
||||||
|
gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
|
||||||
|
|
||||||
|
/* Finally, return the actual menu bar created by the item factory. */
|
||||||
|
return gtk_item_factory_get_widget(item_factory, "<main>");
|
||||||
|
}
|
||||||
|
|
||||||
|
int run_menu(void)
|
||||||
|
{
|
||||||
|
int argc = 0;
|
||||||
|
char **argv = NULL;
|
||||||
|
GtkWidget *s_window;
|
||||||
|
GtkCellRenderer *renderer;
|
||||||
|
GtkTreeViewColumn *column;
|
||||||
|
GtkTreeStore *store;
|
||||||
|
struct category *cat;
|
||||||
|
struct member *mem;
|
||||||
|
GtkWidget *main_vbox;
|
||||||
|
GtkWidget *menubar;
|
||||||
|
|
||||||
|
gtk_init(&argc, &argv);
|
||||||
|
|
||||||
|
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||||
|
gtk_widget_set_size_request(window, 640, 480);
|
||||||
|
gtk_window_set_title(GTK_WINDOW(window), "GMenuselect");
|
||||||
|
|
||||||
|
main_vbox = gtk_vbox_new(FALSE, 1);
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1);
|
||||||
|
gtk_container_add(GTK_CONTAINER(window), main_vbox);
|
||||||
|
|
||||||
|
menubar = get_menubar_menu(window);
|
||||||
|
gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
s_window = gtk_scrolled_window_new(NULL, NULL);
|
||||||
|
|
||||||
|
g_signal_connect(G_OBJECT(window), "delete_event",
|
||||||
|
G_CALLBACK(delete_event), NULL);
|
||||||
|
g_signal_connect(G_OBJECT(window), "destroy",
|
||||||
|
G_CALLBACK(destroy), NULL);
|
||||||
|
|
||||||
|
store = gtk_tree_store_new(NUM_COLUMNS,
|
||||||
|
G_TYPE_STRING, /* COLUMN_NAME */
|
||||||
|
G_TYPE_BOOLEAN, /* COLUMN_SELECTED */
|
||||||
|
G_TYPE_STRING, /* COLUMN_DEPS */
|
||||||
|
G_TYPE_STRING, /* COLUMN_USES */
|
||||||
|
G_TYPE_STRING); /* COLUMN_CNFS */
|
||||||
|
|
||||||
|
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||||
|
GtkTreeIter iter, iter2;
|
||||||
|
gtk_tree_store_append(store, &iter, NULL);
|
||||||
|
gtk_tree_store_set(store, &iter,
|
||||||
|
COLUMN_NAME, cat->displayname,
|
||||||
|
COLUMN_SELECTED, TRUE,
|
||||||
|
-1);
|
||||||
|
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||||
|
char name_buf[64];
|
||||||
|
char dep_buf[64] = "";
|
||||||
|
char use_buf[64] = "";
|
||||||
|
char cnf_buf[64] = "";
|
||||||
|
struct reference *dep;
|
||||||
|
struct reference *use;
|
||||||
|
struct reference *cnf;
|
||||||
|
|
||||||
|
AST_LIST_TRAVERSE(&mem->deps, dep, list) {
|
||||||
|
strncat(dep_buf, dep->displayname, sizeof(dep_buf) - strlen(dep_buf) - 1);
|
||||||
|
strncat(dep_buf, dep->member ? "(M)" : "(E)", sizeof(dep_buf) - strlen(dep_buf) - 1);
|
||||||
|
if (AST_LIST_NEXT(dep, list))
|
||||||
|
strncat(dep_buf, ", ", sizeof(dep_buf) - strlen(dep_buf) - 1);
|
||||||
|
}
|
||||||
|
AST_LIST_TRAVERSE(&mem->uses, use, list) {
|
||||||
|
strncat(use_buf, use->displayname, sizeof(use_buf) - strlen(use_buf) - 1);
|
||||||
|
if (AST_LIST_NEXT(use, list))
|
||||||
|
strncat(use_buf, ", ", sizeof(use_buf) - strlen(use_buf) - 1);
|
||||||
|
}
|
||||||
|
AST_LIST_TRAVERSE(&mem->conflicts, cnf, list) {
|
||||||
|
strncat(cnf_buf, cnf->displayname, sizeof(cnf_buf) - strlen(cnf_buf) - 1);
|
||||||
|
strncat(cnf_buf, cnf->member ? "(M)" : "(E)", sizeof(cnf_buf) - strlen(cnf_buf) - 1);
|
||||||
|
if (AST_LIST_NEXT(cnf, list))
|
||||||
|
strncat(cnf_buf, ", ", sizeof(cnf_buf) - strlen(cnf_buf) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mem->is_separator) {
|
||||||
|
snprintf(name_buf, sizeof(name_buf), "--- %s ---", mem->name);
|
||||||
|
} else {
|
||||||
|
snprintf(name_buf, sizeof(name_buf), "%s", mem->name);
|
||||||
|
}
|
||||||
|
if (mem->depsfailed == HARD_FAILURE)
|
||||||
|
strncat(name_buf, " (Failed Deps.)", sizeof(name_buf) - strlen(name_buf) - 1);
|
||||||
|
if (mem->conflictsfailed == HARD_FAILURE)
|
||||||
|
strncat(name_buf, " (In Conflict)", sizeof(name_buf) - strlen(name_buf) - 1);
|
||||||
|
|
||||||
|
gtk_tree_store_append(store, &iter2, &iter);
|
||||||
|
gtk_tree_store_set(store, &iter2,
|
||||||
|
COLUMN_NAME, name_buf,
|
||||||
|
COLUMN_SELECTED, mem->enabled,
|
||||||
|
COLUMN_DEPS, dep_buf,
|
||||||
|
COLUMN_USES, use_buf,
|
||||||
|
COLUMN_CNFS, cnf_buf,
|
||||||
|
-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tree = (GtkTreeView *) gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
|
||||||
|
|
||||||
|
#if GTK_CHECK_VERSION(2,10,0)
|
||||||
|
gtk_tree_view_set_enable_tree_lines(tree, TRUE);
|
||||||
|
gtk_tree_view_set_grid_lines(tree, GTK_TREE_VIEW_GRID_LINES_BOTH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
renderer = gtk_cell_renderer_text_new();
|
||||||
|
column = gtk_tree_view_column_new_with_attributes("Name",
|
||||||
|
renderer, "text", COLUMN_NAME, NULL);
|
||||||
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||||
|
|
||||||
|
renderer = gtk_cell_renderer_toggle_new();
|
||||||
|
column = gtk_tree_view_column_new_with_attributes("Selected",
|
||||||
|
renderer, "active", COLUMN_SELECTED, NULL);
|
||||||
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||||
|
g_signal_connect(renderer, "toggled", (GCallback) toggled_handler, store);
|
||||||
|
|
||||||
|
renderer = gtk_cell_renderer_text_new();
|
||||||
|
column = gtk_tree_view_column_new_with_attributes("Depends On",
|
||||||
|
renderer, "text", COLUMN_DEPS, NULL);
|
||||||
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||||
|
|
||||||
|
renderer = gtk_cell_renderer_text_new();
|
||||||
|
column = gtk_tree_view_column_new_with_attributes("Can Use",
|
||||||
|
renderer, "text", COLUMN_USES, NULL);
|
||||||
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||||
|
|
||||||
|
renderer = gtk_cell_renderer_text_new();
|
||||||
|
column = gtk_tree_view_column_new_with_attributes("Conflicts With",
|
||||||
|
renderer, "text", COLUMN_CNFS, NULL);
|
||||||
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
|
||||||
|
|
||||||
|
g_signal_connect(tree, "row-activated", (GCallback) row_activated_handler, store);
|
||||||
|
|
||||||
|
gtk_container_add(GTK_CONTAINER(s_window), GTK_WIDGET(tree));
|
||||||
|
|
||||||
|
gtk_box_pack_end(GTK_BOX(main_vbox), s_window, TRUE, TRUE, 0);
|
||||||
|
|
||||||
|
gtk_widget_show_all(window);
|
||||||
|
|
||||||
|
gtk_main();
|
||||||
|
|
||||||
|
return main_res;
|
||||||
|
}
|
@ -0,0 +1,427 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- An open source telephony toolkit.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Sean Bright
|
||||||
|
*
|
||||||
|
* Sean Bright <sean.bright@gmail.com>
|
||||||
|
*
|
||||||
|
* See http://www.asterisk.org for more information about
|
||||||
|
* the Asterisk project. Please do not directly contact
|
||||||
|
* any of the maintainers of this project for assistance;
|
||||||
|
* the project provides a web site, mailing lists and IRC
|
||||||
|
* channels for your use.
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License Version 2. See the LICENSE file
|
||||||
|
* at the top of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \author Sean Bright <sean.bright@gmail.com>
|
||||||
|
*
|
||||||
|
* \brief newt frontend for selection maintenance
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <newt.h>
|
||||||
|
|
||||||
|
#include "menuselect.h"
|
||||||
|
|
||||||
|
#define MIN_X 80
|
||||||
|
#define MIN_Y 21
|
||||||
|
|
||||||
|
#define MIN(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a > __b) ? __b : __a);})
|
||||||
|
#define MAX(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a < __b) ? __b : __a);})
|
||||||
|
|
||||||
|
extern int changes_made;
|
||||||
|
|
||||||
|
static newtComponent rootOptions;
|
||||||
|
static newtComponent subOptions;
|
||||||
|
|
||||||
|
static newtComponent memberNameTextbox;
|
||||||
|
static newtComponent dependsLabel;
|
||||||
|
static newtComponent usesLabel;
|
||||||
|
static newtComponent conflictsLabel;
|
||||||
|
static newtComponent supportLevelLabel;
|
||||||
|
static newtComponent dependsDataTextbox;
|
||||||
|
static newtComponent usesDataTextbox;
|
||||||
|
static newtComponent conflictsDataTextbox;
|
||||||
|
static newtComponent supportLevelDataTextbox;
|
||||||
|
|
||||||
|
static newtComponent exitButton;
|
||||||
|
static newtComponent saveAndExitButton;
|
||||||
|
|
||||||
|
static void build_members_menu(int overlay);
|
||||||
|
static void root_menu_callback(newtComponent component, void *data);
|
||||||
|
|
||||||
|
static void toggle_all_options(int select)
|
||||||
|
{
|
||||||
|
struct category *cat = newtListboxGetCurrent(rootOptions);
|
||||||
|
|
||||||
|
set_all(cat, select);
|
||||||
|
|
||||||
|
/* Redraw */
|
||||||
|
build_members_menu(1);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void toggle_selected_option()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct member *mem = newtListboxGetCurrent(subOptions);
|
||||||
|
|
||||||
|
toggle_enabled(mem);
|
||||||
|
|
||||||
|
/* Redraw */
|
||||||
|
build_members_menu(1);
|
||||||
|
|
||||||
|
/* Select the next item in the list */
|
||||||
|
for (i = 0; i < newtListboxItemCount(subOptions); i++) {
|
||||||
|
struct member *cur;
|
||||||
|
|
||||||
|
newtListboxGetEntry(subOptions, i, NULL, (void **) &cur);
|
||||||
|
|
||||||
|
if (cur == mem) {
|
||||||
|
i = MIN(i + 1, newtListboxItemCount(subOptions) - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newtListboxSetCurrent(subOptions, i);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void reset_display()
|
||||||
|
{
|
||||||
|
newtTextboxSetText(memberNameTextbox, "");
|
||||||
|
newtTextboxSetText(dependsDataTextbox, "");
|
||||||
|
newtTextboxSetText(usesDataTextbox, "");
|
||||||
|
newtTextboxSetText(conflictsDataTextbox, "");
|
||||||
|
newtTextboxSetText(supportLevelDataTextbox, "");
|
||||||
|
newtRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void display_member_info(struct member *mem)
|
||||||
|
{
|
||||||
|
char buffer[128] = { 0 };
|
||||||
|
|
||||||
|
struct reference *dep;
|
||||||
|
struct reference *con;
|
||||||
|
struct reference *uses;
|
||||||
|
|
||||||
|
reset_display();
|
||||||
|
|
||||||
|
if (mem->displayname) {
|
||||||
|
newtTextboxSetText(memberNameTextbox, mem->displayname);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AST_LIST_EMPTY(&mem->deps)) {
|
||||||
|
if (mem->is_separator) {
|
||||||
|
newtTextboxSetText(dependsDataTextbox, "");
|
||||||
|
} else {
|
||||||
|
newtTextboxSetText(dependsDataTextbox, "N/A");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
strcpy(buffer, "");
|
||||||
|
AST_LIST_TRAVERSE(&mem->deps, dep, list) {
|
||||||
|
strncat(buffer, dep->displayname, sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
strncat(buffer, dep->member ? "(M)" : "(E)", sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
if (AST_LIST_NEXT(dep, list))
|
||||||
|
strncat(buffer, ", ", sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
}
|
||||||
|
newtTextboxSetText(dependsDataTextbox, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AST_LIST_EMPTY(&mem->uses)) {
|
||||||
|
if (mem->is_separator) {
|
||||||
|
newtTextboxSetText(usesDataTextbox, "");
|
||||||
|
} else {
|
||||||
|
newtTextboxSetText(usesDataTextbox, "N/A");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
strcpy(buffer, "");
|
||||||
|
AST_LIST_TRAVERSE(&mem->uses, uses, list) {
|
||||||
|
strncat(buffer, uses->displayname, sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
strncat(buffer, uses->member ? "(M)" : "(E)", sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
if (AST_LIST_NEXT(uses, list))
|
||||||
|
strncat(buffer, ", ", sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
}
|
||||||
|
newtTextboxSetText(usesDataTextbox, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AST_LIST_EMPTY(&mem->conflicts)) {
|
||||||
|
if (!mem->is_separator) {
|
||||||
|
newtTextboxSetText(conflictsDataTextbox, "N/A");
|
||||||
|
} else {
|
||||||
|
newtTextboxSetText(conflictsDataTextbox, "");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
strcpy(buffer, "");
|
||||||
|
AST_LIST_TRAVERSE(&mem->conflicts, con, list) {
|
||||||
|
strncat(buffer, con->displayname, sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
strncat(buffer, con->member ? "(M)" : "(E)", sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
if (AST_LIST_NEXT(con, list))
|
||||||
|
strncat(buffer, ", ", sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
}
|
||||||
|
newtTextboxSetText(conflictsDataTextbox, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
{ /* Support Level */
|
||||||
|
snprintf(buffer, sizeof(buffer), "%s", mem->support_level);
|
||||||
|
if (mem->replacement && *mem->replacement) {
|
||||||
|
char buf2[64];
|
||||||
|
snprintf(buf2, sizeof(buf2), ", Replaced by: %s", mem->replacement);
|
||||||
|
strncat(buffer, buf2, sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
}
|
||||||
|
if (mem->is_separator) {
|
||||||
|
newtTextboxSetText(supportLevelDataTextbox, "");
|
||||||
|
} else {
|
||||||
|
newtTextboxSetText(supportLevelDataTextbox, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void build_members_menu(int overlay)
|
||||||
|
{
|
||||||
|
struct category *cat;
|
||||||
|
struct member *mem;
|
||||||
|
char buf[64];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if (!overlay) {
|
||||||
|
reset_display();
|
||||||
|
newtListboxClear(subOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
cat = newtListboxGetCurrent(rootOptions);
|
||||||
|
|
||||||
|
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||||
|
|
||||||
|
if ((mem->depsfailed == HARD_FAILURE) || (mem->conflictsfailed == HARD_FAILURE)) {
|
||||||
|
snprintf(buf, sizeof(buf), "XXX %s", mem->name);
|
||||||
|
} else if (mem->is_separator) {
|
||||||
|
snprintf(buf, sizeof(buf), " --- %s ---", mem->name);
|
||||||
|
} else if (mem->depsfailed == SOFT_FAILURE) {
|
||||||
|
snprintf(buf, sizeof(buf), "<%s> %s", mem->enabled ? "*" : " ", mem->name);
|
||||||
|
} else if (mem->conflictsfailed == SOFT_FAILURE) {
|
||||||
|
snprintf(buf, sizeof(buf), "(%s) %s", mem->enabled ? "*" : " ", mem->name);
|
||||||
|
} else {
|
||||||
|
snprintf(buf, sizeof(buf), "[%s] %s", mem->enabled ? "*" : " ", mem->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (overlay) {
|
||||||
|
newtListboxSetEntry(subOptions, i, buf);
|
||||||
|
} else {
|
||||||
|
newtListboxAppendEntry(subOptions, buf, mem);
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!overlay) {
|
||||||
|
display_member_info(AST_LIST_FIRST(&cat->members));
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void build_main_menu()
|
||||||
|
{
|
||||||
|
struct category *cat;
|
||||||
|
char buf[64];
|
||||||
|
int i = 1;
|
||||||
|
|
||||||
|
newtListboxClear(rootOptions);
|
||||||
|
|
||||||
|
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||||
|
if (!strlen_zero(cat->displayname))
|
||||||
|
snprintf(buf, sizeof(buf), " %s ", cat->displayname);
|
||||||
|
else
|
||||||
|
snprintf(buf, sizeof(buf), " %s ", cat->name);
|
||||||
|
|
||||||
|
newtListboxAppendEntry(rootOptions, buf, cat);
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void category_menu_callback(newtComponent component, void *data)
|
||||||
|
{
|
||||||
|
display_member_info(newtListboxGetCurrent(subOptions));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void root_menu_callback(newtComponent component, void *data)
|
||||||
|
{
|
||||||
|
build_members_menu(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int run_confirmation_dialog(int *result)
|
||||||
|
{
|
||||||
|
int res = newtWinTernary("Are You Sure?", "Discard changes & Exit", "Save & Exit", "Cancel",
|
||||||
|
"It appears you have made some changes, and you have opted to Quit "
|
||||||
|
"without saving these changes. Please choose \"Discard changes & Exit\" to exit "
|
||||||
|
"without saving; Choose \"Cancel\" to cancel your decision to quit, and keep "
|
||||||
|
"working in menuselect, or choose \"Save & Exit\" to save your changes, and exit.");
|
||||||
|
|
||||||
|
switch (res) {
|
||||||
|
case 1:
|
||||||
|
/* Discard and exit */
|
||||||
|
*result = -1;
|
||||||
|
return 1;
|
||||||
|
case 2:
|
||||||
|
/* Save and exit */
|
||||||
|
*result = 0;
|
||||||
|
return 1;
|
||||||
|
case 3:
|
||||||
|
/* They either chose "No" or they hit F12 */
|
||||||
|
default:
|
||||||
|
*result = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int run_menu(void)
|
||||||
|
{
|
||||||
|
struct newtExitStruct es;
|
||||||
|
newtComponent form;
|
||||||
|
int x = 0, y = 0, res = 0;
|
||||||
|
|
||||||
|
newtInit();
|
||||||
|
newtCls();
|
||||||
|
newtGetScreenSize(&x, &y);
|
||||||
|
|
||||||
|
if (x < MIN_X || y < MIN_Y) {
|
||||||
|
newtFinished();
|
||||||
|
fprintf(stderr, "Terminal must be at least %d x %d.\n", MIN_X, MIN_Y);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
newtPushHelpLine(" <ENTER> toggles selection | <F12> saves & exits | <ESC> exits without save");
|
||||||
|
newtRefresh();
|
||||||
|
|
||||||
|
newtCenteredWindow(x - 8, y - 7, menu_name);
|
||||||
|
form = newtForm(NULL, NULL, 0);
|
||||||
|
|
||||||
|
/* F8 for select all */
|
||||||
|
newtFormAddHotKey(form, NEWT_KEY_F8);
|
||||||
|
|
||||||
|
/* F7 for deselect all */
|
||||||
|
newtFormAddHotKey(form, NEWT_KEY_F7);
|
||||||
|
|
||||||
|
newtFormSetTimer(form, 200);
|
||||||
|
|
||||||
|
rootOptions = newtListbox(2, 1, y - 15, 0);
|
||||||
|
newtListboxSetWidth(rootOptions, 34);
|
||||||
|
newtFormAddComponent(form, rootOptions);
|
||||||
|
newtComponentAddCallback(rootOptions, root_menu_callback, NULL);
|
||||||
|
|
||||||
|
subOptions = newtListbox(38, 1, y - 15, NEWT_FLAG_SCROLL | NEWT_FLAG_RETURNEXIT);
|
||||||
|
newtListboxSetWidth(subOptions, x - 47);
|
||||||
|
newtFormAddComponent(form, subOptions);
|
||||||
|
newtComponentAddCallback(subOptions, category_menu_callback, NULL);
|
||||||
|
|
||||||
|
memberNameTextbox = newtTextbox(2, y - 13, x - 10, 1, 0);
|
||||||
|
dependsLabel = newtLabel(2, y - 11, " Depends on:");
|
||||||
|
usesLabel = newtLabel(2, y - 10, " Can use:");
|
||||||
|
conflictsLabel = newtLabel(2, y - 9, "Conflicts with:");
|
||||||
|
supportLevelLabel = newtLabel(2, y - 8, " Support Level:");
|
||||||
|
dependsDataTextbox = newtTextbox(18, y - 11, x - 27, 1, 0);
|
||||||
|
usesDataTextbox = newtTextbox(18, y - 10, x - 27, 1, 0);
|
||||||
|
conflictsDataTextbox = newtTextbox(18, y - 9, x - 27, 1, 0);
|
||||||
|
supportLevelDataTextbox = newtTextbox(18, y - 8, x - 27, 1, 0);
|
||||||
|
|
||||||
|
exitButton = newtButton(x - 23, y - 11, " Exit ");
|
||||||
|
saveAndExitButton = newtButton(x - 43, y - 11, " Save & Exit ");
|
||||||
|
|
||||||
|
newtFormAddComponents(
|
||||||
|
form,
|
||||||
|
memberNameTextbox,
|
||||||
|
dependsLabel,
|
||||||
|
dependsDataTextbox,
|
||||||
|
usesLabel,
|
||||||
|
usesDataTextbox,
|
||||||
|
conflictsLabel,
|
||||||
|
conflictsDataTextbox,
|
||||||
|
supportLevelLabel,
|
||||||
|
supportLevelDataTextbox,
|
||||||
|
saveAndExitButton,
|
||||||
|
exitButton,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
build_main_menu();
|
||||||
|
|
||||||
|
root_menu_callback(rootOptions, AST_LIST_FIRST(&categories));
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
do {
|
||||||
|
newtFormRun(form, &es);
|
||||||
|
} while (es.reason == NEWT_EXIT_TIMER);
|
||||||
|
|
||||||
|
if (es.reason == NEWT_EXIT_HOTKEY) {
|
||||||
|
int done = 1;
|
||||||
|
|
||||||
|
switch (es.u.key) {
|
||||||
|
case NEWT_KEY_F12:
|
||||||
|
res = 0;
|
||||||
|
break;
|
||||||
|
case NEWT_KEY_F7:
|
||||||
|
toggle_all_options(0);
|
||||||
|
done = 0;
|
||||||
|
break;
|
||||||
|
case NEWT_KEY_F8:
|
||||||
|
toggle_all_options(1);
|
||||||
|
done = 0;
|
||||||
|
break;
|
||||||
|
case NEWT_KEY_ESCAPE:
|
||||||
|
if (changes_made) {
|
||||||
|
done = run_confirmation_dialog(&res);
|
||||||
|
} else {
|
||||||
|
res = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
done = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (done) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (es.reason == NEWT_EXIT_COMPONENT) {
|
||||||
|
if (es.u.co == saveAndExitButton) {
|
||||||
|
res = 0;
|
||||||
|
break;
|
||||||
|
} else if (es.u.co == exitButton) {
|
||||||
|
int done = 1;
|
||||||
|
|
||||||
|
if (changes_made) {
|
||||||
|
done = run_confirmation_dialog(&res);
|
||||||
|
} else {
|
||||||
|
res = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (done) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (es.u.co == subOptions) {
|
||||||
|
toggle_selected_option();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
reset_display();
|
||||||
|
newtFormDestroy(form);
|
||||||
|
newtPopWindow();
|
||||||
|
newtPopHelpLine();
|
||||||
|
newtCls();
|
||||||
|
newtFinished();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- An open source telephony toolkit.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 - 2006, Russell Bryant
|
||||||
|
*
|
||||||
|
* Russell Bryant <russell@digium.com>
|
||||||
|
*
|
||||||
|
* See http://www.asterisk.org for more information about
|
||||||
|
* the Asterisk project. Please do not directly contact
|
||||||
|
* any of the maintainers of this project for assistance;
|
||||||
|
* the project provides a web site, mailing lists and IRC
|
||||||
|
* channels for your use.
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License Version 2. See the LICENSE file
|
||||||
|
* at the top of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \author Russell Bryant <russell@digium.com>
|
||||||
|
*
|
||||||
|
* \brief Menu stub
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "menuselect.h"
|
||||||
|
|
||||||
|
int run_menu(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "**************************************************\n");
|
||||||
|
fprintf(stderr, "*** Install ncurses to use the menu interface! ***\n");
|
||||||
|
fprintf(stderr, "**************************************************\n");
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
@ -0,0 +1,360 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Common stub for a few missing GNU programs while installing.
|
||||||
|
|
||||||
|
scriptversion=2005-06-08.21
|
||||||
|
|
||||||
|
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
|
||||||
|
# Free Software Foundation, Inc.
|
||||||
|
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
# 02110-1301, USA.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
run=:
|
||||||
|
|
||||||
|
# In the cases where this matters, `missing' is being run in the
|
||||||
|
# srcdir already.
|
||||||
|
if test -f configure.ac; then
|
||||||
|
configure_ac=configure.ac
|
||||||
|
else
|
||||||
|
configure_ac=configure.in
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg="missing on your system"
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
--run)
|
||||||
|
# Try to run requested program, and just exit if it succeeds.
|
||||||
|
run=
|
||||||
|
shift
|
||||||
|
"$@" && exit 0
|
||||||
|
# Exit code 63 means version mismatch. This often happens
|
||||||
|
# when the user try to use an ancient version of a tool on
|
||||||
|
# a file that requires a minimum version. In this case we
|
||||||
|
# we should proceed has if the program had been absent, or
|
||||||
|
# if --run hadn't been passed.
|
||||||
|
if test $? = 63; then
|
||||||
|
run=:
|
||||||
|
msg="probably too old"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||||
|
error status if there is no known handling for PROGRAM.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
--run try to run the given command, and emulate it if it fails
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal touch file \`aclocal.m4'
|
||||||
|
autoconf touch file \`configure'
|
||||||
|
autoheader touch file \`config.h.in'
|
||||||
|
automake touch all \`Makefile.in' files
|
||||||
|
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
flex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
help2man touch the output file
|
||||||
|
lex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
makeinfo touch the output file
|
||||||
|
tar try tar, gnutar, gtar, then tar without non-portable flags
|
||||||
|
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||||
|
echo "missing $scriptversion (GNU Automake)"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo 1>&2 "$0: Unknown \`$1' option"
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Now exit if we have it, but it failed. Also exit now if we
|
||||||
|
# don't have it and --version was passed (most likely to detect
|
||||||
|
# the program).
|
||||||
|
case "$1" in
|
||||||
|
lex|yacc)
|
||||||
|
# Not GNU programs, they don't have --version.
|
||||||
|
;;
|
||||||
|
|
||||||
|
tar)
|
||||||
|
if test -n "$run"; then
|
||||||
|
echo 1>&2 "ERROR: \`tar' requires --run"
|
||||||
|
exit 1
|
||||||
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||||
|
# We have it, but it failed.
|
||||||
|
exit 1
|
||||||
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
|
# Could not run --version or --help. This is probably someone
|
||||||
|
# running `$TOOL --version' or `$TOOL --help' to check whether
|
||||||
|
# $TOOL exists and not knowing $TOOL uses missing.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If it does not exist, or fails to run (possibly an outdated version),
|
||||||
|
# try to emulate it.
|
||||||
|
case "$1" in
|
||||||
|
aclocal*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Automake' and \`Perl' packages. Grab them from
|
||||||
|
any GNU archive site."
|
||||||
|
touch aclocal.m4
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoconf)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`${configure_ac}'. You might want to install the
|
||||||
|
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
||||||
|
archive site."
|
||||||
|
touch configure
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoheader)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
||||||
|
from any GNU archive site."
|
||||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
||||||
|
test -z "$files" && files="config.h"
|
||||||
|
touch_files=
|
||||||
|
for f in $files; do
|
||||||
|
case "$f" in
|
||||||
|
*:*) touch_files="$touch_files "`echo "$f" |
|
||||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
||||||
|
*) touch_files="$touch_files $f.in";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
touch $touch_files
|
||||||
|
;;
|
||||||
|
|
||||||
|
automake*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
||||||
|
You might want to install the \`Automake' and \`Perl' packages.
|
||||||
|
Grab them from any GNU archive site."
|
||||||
|
find . -type f -name Makefile.am -print |
|
||||||
|
sed 's/\.am$/.in/' |
|
||||||
|
while read f; do touch "$f"; done
|
||||||
|
;;
|
||||||
|
|
||||||
|
autom4te)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, but is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them.
|
||||||
|
You can get \`$1' as part of \`Autoconf' from any GNU
|
||||||
|
archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo "#! /bin/sh"
|
||||||
|
echo "# Created by GNU Automake missing as a replacement of"
|
||||||
|
echo "# $ $@"
|
||||||
|
echo "exit 0"
|
||||||
|
chmod +x $file
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
bison|yacc)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' $msg. You should only need it if
|
||||||
|
you modified a \`.y' file. You may need the \`Bison' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Bison' from any GNU archive site."
|
||||||
|
rm -f y.tab.c y.tab.h
|
||||||
|
if [ $# -ne 1 ]; then
|
||||||
|
eval LASTARG="\${$#}"
|
||||||
|
case "$LASTARG" in
|
||||||
|
*.y)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
||||||
|
if [ -f "$SRCFILE" ]; then
|
||||||
|
cp "$SRCFILE" y.tab.c
|
||||||
|
fi
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
||||||
|
if [ -f "$SRCFILE" ]; then
|
||||||
|
cp "$SRCFILE" y.tab.h
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if [ ! -f y.tab.h ]; then
|
||||||
|
echo >y.tab.h
|
||||||
|
fi
|
||||||
|
if [ ! -f y.tab.c ]; then
|
||||||
|
echo 'main() { return 0; }' >y.tab.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
lex|flex)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.l' file. You may need the \`Flex' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Flex' from any GNU archive site."
|
||||||
|
rm -f lex.yy.c
|
||||||
|
if [ $# -ne 1 ]; then
|
||||||
|
eval LASTARG="\${$#}"
|
||||||
|
case "$LASTARG" in
|
||||||
|
*.l)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
||||||
|
if [ -f "$SRCFILE" ]; then
|
||||||
|
cp "$SRCFILE" lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if [ ! -f lex.yy.c ]; then
|
||||||
|
echo 'main() { return 0; }' >lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
help2man)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a dependency of a manual page. You may need the
|
||||||
|
\`Help2man' package in order for those modifications to take
|
||||||
|
effect. You can get \`Help2man' from any GNU archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
||||||
|
if test -z "$file"; then
|
||||||
|
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
|
||||||
|
fi
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo ".ab help2man is required to generate this page"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
makeinfo)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.texi' or \`.texinfo' file, or any other file
|
||||||
|
indirectly affecting the aspect of the manual. The spurious
|
||||||
|
call might also be the consequence of using a buggy \`make' (AIX,
|
||||||
|
DU, IRIX). You might want to install the \`Texinfo' package or
|
||||||
|
the \`GNU make' package. Grab either from any GNU archive site."
|
||||||
|
# The file to touch is that specified with -o ...
|
||||||
|
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
||||||
|
if test -z "$file"; then
|
||||||
|
# ... or it is the one specified with @setfilename ...
|
||||||
|
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||||
|
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
|
||||||
|
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||||
|
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||||
|
fi
|
||||||
|
# If the file does not exist, the user really needs makeinfo;
|
||||||
|
# let's fail without touching anything.
|
||||||
|
test -f $file || exit 1
|
||||||
|
touch $file
|
||||||
|
;;
|
||||||
|
|
||||||
|
tar)
|
||||||
|
shift
|
||||||
|
|
||||||
|
# We have already tried tar in the generic part.
|
||||||
|
# Look for gnutar/gtar before invocation to avoid ugly error
|
||||||
|
# messages.
|
||||||
|
if (gnutar --version > /dev/null 2>&1); then
|
||||||
|
gnutar "$@" && exit 0
|
||||||
|
fi
|
||||||
|
if (gtar --version > /dev/null 2>&1); then
|
||||||
|
gtar "$@" && exit 0
|
||||||
|
fi
|
||||||
|
firstarg="$1"
|
||||||
|
if shift; then
|
||||||
|
case "$firstarg" in
|
||||||
|
*o*)
|
||||||
|
firstarg=`echo "$firstarg" | sed s/o//`
|
||||||
|
tar "$firstarg" "$@" && exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case "$firstarg" in
|
||||||
|
*h*)
|
||||||
|
firstarg=`echo "$firstarg" | sed s/h//`
|
||||||
|
tar "$firstarg" "$@" && exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
||||||
|
You may want to install GNU tar or Free paxutils, or check the
|
||||||
|
command line arguments."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, and is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them. Check the \`README' file,
|
||||||
|
it often tells you about the needed prerequisites for installing
|
||||||
|
this package. You may also peek at any GNU archive site, in case
|
||||||
|
some other package would contain this missing \`$1' program."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-end: "$"
|
||||||
|
# End:
|
@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* Asterisk -- An open source telephony toolkit.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999 - 2006, Digium, Inc.
|
||||||
|
*
|
||||||
|
* See http://www.asterisk.org for more information about
|
||||||
|
* the Asterisk project. Please do not directly contact
|
||||||
|
* any of the maintainers of this project for assistance;
|
||||||
|
* the project provides a web site, mailing lists and IRC
|
||||||
|
* channels for your use.
|
||||||
|
*
|
||||||
|
* This program is free software, distributed under the terms of
|
||||||
|
* the GNU General Public License Version 2. See the LICENSE file
|
||||||
|
* at the top of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! \file
|
||||||
|
*
|
||||||
|
* \brief Compatibility functions for strsep and strtoq missing on Solaris
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "autoconfig.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_ALLOCA_H
|
||||||
|
#include <alloca.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRSEP
|
||||||
|
char *strsep(char **str, const char *delims)
|
||||||
|
{
|
||||||
|
char *token;
|
||||||
|
|
||||||
|
if (!*str) {
|
||||||
|
/* No more tokens */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
token = *str;
|
||||||
|
while (**str != '\0') {
|
||||||
|
if (strchr(delims, **str)) {
|
||||||
|
**str = '\0';
|
||||||
|
(*str)++;
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
(*str)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* There is no other token */
|
||||||
|
*str = NULL;
|
||||||
|
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_SETENV
|
||||||
|
int setenv(const char *name, const char *value, int overwrite)
|
||||||
|
{
|
||||||
|
unsigned char *buf;
|
||||||
|
int buflen;
|
||||||
|
|
||||||
|
buflen = strlen(name) + strlen(value) + 2;
|
||||||
|
buf = alloca(buflen);
|
||||||
|
|
||||||
|
if (!overwrite && getenv(name))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
snprintf(buf, buflen, "%s=%s", name, value);
|
||||||
|
|
||||||
|
return putenv(buf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_UNSETENV
|
||||||
|
int unsetenv(const char *name)
|
||||||
|
{
|
||||||
|
return setenv(name, "", 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRCASESTR
|
||||||
|
static char *upper(const char *orig, char *buf, int bufsize)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (i < (bufsize - 1) && orig[i]) {
|
||||||
|
buf[i] = toupper(orig[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[i] = '\0';
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *strcasestr(const char *haystack, const char *needle)
|
||||||
|
{
|
||||||
|
char *u1, *u2;
|
||||||
|
int u1len = strlen(haystack) + 1, u2len = strlen(needle) + 1;
|
||||||
|
|
||||||
|
u1 = alloca(u1len);
|
||||||
|
u2 = alloca(u2len);
|
||||||
|
if (u1 && u2) {
|
||||||
|
char *offset;
|
||||||
|
if (u2len > u1len) {
|
||||||
|
/* Needle bigger than haystack */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
offset = strstr(upper(haystack, u1, u1len), upper(needle, u2, u2len));
|
||||||
|
if (offset) {
|
||||||
|
/* Return the offset into the original string */
|
||||||
|
return ((char *)((unsigned long)haystack + (unsigned long)(offset - u1)));
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* !HAVE_STRCASESTR */
|
||||||
|
|
||||||
|
#ifndef HAVE_STRNLEN
|
||||||
|
size_t strnlen(const char *s, size_t n)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
for (len = 0; len < n; len++)
|
||||||
|
if (s[len] == '\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
#endif /* !HAVE_STRNLEN */
|
||||||
|
|
||||||
|
#if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
|
||||||
|
char *strndup(const char *s, size_t n)
|
||||||
|
{
|
||||||
|
size_t len = strnlen(s, n);
|
||||||
|
char *new = malloc(len + 1);
|
||||||
|
|
||||||
|
if (!new)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
new[len] = '\0';
|
||||||
|
return memcpy(new, s, len);
|
||||||
|
}
|
||||||
|
#endif /* !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC) */
|
||||||
|
|
||||||
|
#if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
|
||||||
|
int vasprintf(char **strp, const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
va_list ap2;
|
||||||
|
char s;
|
||||||
|
|
||||||
|
*strp = NULL;
|
||||||
|
va_copy(ap2, ap);
|
||||||
|
size = vsnprintf(&s, 1, fmt, ap2);
|
||||||
|
va_end(ap2);
|
||||||
|
*strp = malloc(size + 1);
|
||||||
|
if (!*strp)
|
||||||
|
return -1;
|
||||||
|
vsnprintf(*strp, size + 1, fmt, ap);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
#endif /* !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Based on Code from bsd-asprintf from OpenSSH
|
||||||
|
* Copyright (c) 2004 Darren Tucker.
|
||||||
|
*
|
||||||
|
* Based originally on asprintf.c from OpenBSD:
|
||||||
|
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
|
||||||
|
int asprintf(char **str, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
*str = NULL;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
ret = vasprintf(str, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
|
||||||
|
|
||||||
|
#ifndef HAVE_GETLOADAVG
|
||||||
|
#ifdef linux
|
||||||
|
/*! \brief Alternative method of getting load avg on Linux only */
|
||||||
|
int getloadavg(double *list, int nelem)
|
||||||
|
{
|
||||||
|
FILE *LOADAVG;
|
||||||
|
double avg[3] = { 0.0, 0.0, 0.0 };
|
||||||
|
int i, res = -1;
|
||||||
|
|
||||||
|
if ((LOADAVG = fopen("/proc/loadavg", "r"))) {
|
||||||
|
fscanf(LOADAVG, "%lf %lf %lf", &avg[0], &avg[1], &avg[2]);
|
||||||
|
res = 0;
|
||||||
|
fclose(LOADAVG);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; (i < nelem) && (i < 3); i++) {
|
||||||
|
list[i] = avg[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#else /* !linux */
|
||||||
|
/*! \brief Return something that won't cancel the call, but still return -1, in case
|
||||||
|
* we correct the implementation to check return value */
|
||||||
|
int getloadavg(double *list, int nelem)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nelem; i++) {
|
||||||
|
list[i] = 0.1;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif /* linux */
|
||||||
|
#endif /* !HAVE_GETLOADAVG */
|
@ -0,0 +1,52 @@
|
|||||||
|
ASOUND=1
|
||||||
|
CRYPTO=1
|
||||||
|
CURL=1
|
||||||
|
DAHDI=1
|
||||||
|
FREETDS=1
|
||||||
|
GMIME=1
|
||||||
|
GNU_LD=1
|
||||||
|
GSM=1
|
||||||
|
GTK2=1
|
||||||
|
GTK=0
|
||||||
|
H323=0
|
||||||
|
HOARD=0
|
||||||
|
ICONV=1
|
||||||
|
IKSEMEL=1
|
||||||
|
IMAP_TK=1
|
||||||
|
ISDNNET=0
|
||||||
|
IXJUSER=1
|
||||||
|
JACK=1
|
||||||
|
LDAP=1
|
||||||
|
LTDL=1
|
||||||
|
LUA=0
|
||||||
|
MISDN=0
|
||||||
|
NBS=0
|
||||||
|
NETSNMP=0
|
||||||
|
NEWT=1
|
||||||
|
OGG=1
|
||||||
|
OPENH323=0
|
||||||
|
OSPTK=1
|
||||||
|
OSSAUDIO=1
|
||||||
|
PGSQL=1
|
||||||
|
POPT=1
|
||||||
|
PORTAUDIO=1
|
||||||
|
PRI=0
|
||||||
|
RESAMPLE=0
|
||||||
|
AIS=0
|
||||||
|
RADIUS=1
|
||||||
|
SPANDSP=0
|
||||||
|
SPEEX=1
|
||||||
|
SPEEXDSP=1
|
||||||
|
SPEEX_PREPROCESS=1
|
||||||
|
SQLITE3=1
|
||||||
|
SQLITE=1
|
||||||
|
SS7=0
|
||||||
|
SSL=1
|
||||||
|
SUPPSERV=0
|
||||||
|
TONEZONE=1
|
||||||
|
UNIXODBC=1
|
||||||
|
USB=1
|
||||||
|
VORBIS=1
|
||||||
|
VPBAPI=0
|
||||||
|
WINARCH=0
|
||||||
|
ZLIB=1
|
@ -0,0 +1,716 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<menu name="Asterisk Module and Build Option Selection">
|
||||||
|
<category name="MENUSELECT_APPS" displayname="Applications" remove_on_change="apps/modules.link">
|
||||||
|
<member name="app_adsiprog" displayname="Asterisk ADSI Programming Application" remove_on_change="apps/app_adsiprog.o apps/app_adsiprog.so">
|
||||||
|
<depend>res_adsi</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_alarmreceiver" displayname="Alarm Receiver for Asterisk" remove_on_change="apps/app_alarmreceiver.o apps/app_alarmreceiver.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_amd" displayname="Answering Machine Detection Application" remove_on_change="apps/app_amd.o apps/app_amd.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_authenticate" displayname="Authentication Application" remove_on_change="apps/app_authenticate.o apps/app_authenticate.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_cdr" displayname="Tell Asterisk to not maintain a CDR for the current call" remove_on_change="apps/app_cdr.o apps/app_cdr.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_chanisavail" displayname="Check channel availability" remove_on_change="apps/app_chanisavail.o apps/app_chanisavail.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_channelredirect" displayname="Redirects a given channel to a dialplan target" remove_on_change="apps/app_channelredirect.o apps/app_channelredirect.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_chanspy" displayname="Listen to the audio of an active channel" remove_on_change="apps/app_chanspy.o apps/app_chanspy.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_controlplayback" displayname="Control Playback Application" remove_on_change="apps/app_controlplayback.o apps/app_controlplayback.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_dahdibarge" displayname="Barge in on DAHDI channel application" remove_on_change="apps/app_dahdibarge.o apps/app_dahdibarge.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_dahdiras" displayname="DAHDI ISDN Remote Access Server" remove_on_change="apps/app_dahdiras.o apps/app_dahdiras.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_dahdiscan" displayname="Scan DAHDI channels application" remove_on_change="apps/app_dahdiscan.o apps/app_dahdiscan.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_db" displayname="Database Access Functions" remove_on_change="apps/app_db.o apps/app_db.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_dial" displayname="Dialing Application" remove_on_change="apps/app_dial.o apps/app_dial.so">
|
||||||
|
<depend>chan_local</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_dictate" displayname="Virtual Dictation Machine" remove_on_change="apps/app_dictate.o apps/app_dictate.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_directed_pickup" displayname="Directed Call Pickup Application" remove_on_change="apps/app_directed_pickup.o apps/app_directed_pickup.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_directory" displayname="Extension Directory" remove_on_change="apps/app_directory.o apps/app_directory.so">
|
||||||
|
<depend>app_voicemail</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_disa" displayname="DISA (Direct Inward System Access) Application" remove_on_change="apps/app_disa.o apps/app_disa.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_dumpchan" displayname="Dump Info About The Calling Channel" remove_on_change="apps/app_dumpchan.o apps/app_dumpchan.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_echo" displayname="Simple Echo Application" remove_on_change="apps/app_echo.o apps/app_echo.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_exec" displayname="Executes dialplan applications" remove_on_change="apps/app_exec.o apps/app_exec.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_externalivr" displayname="External IVR Interface Application" remove_on_change="apps/app_externalivr.o apps/app_externalivr.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_fax" displayname="Simple FAX Application" remove_on_change="apps/app_fax.o apps/app_fax.so">
|
||||||
|
<depend>spandsp</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_festival" displayname="Simple Festival Interface" remove_on_change="apps/app_festival.o apps/app_festival.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_flash" displayname="Flash channel application" remove_on_change="apps/app_flash.o apps/app_flash.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_followme" displayname="Find-Me/Follow-Me Application" remove_on_change="apps/app_followme.o apps/app_followme.so">
|
||||||
|
<depend>chan_local</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_forkcdr" displayname="Fork The CDR into 2 separate entities" remove_on_change="apps/app_forkcdr.o apps/app_forkcdr.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_getcpeid" displayname="Get ADSI CPE ID" remove_on_change="apps/app_getcpeid.o apps/app_getcpeid.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_ices" displayname="Encode and Stream via icecast and ices" remove_on_change="apps/app_ices.o apps/app_ices.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_image" displayname="Image Transmission Application" remove_on_change="apps/app_image.o apps/app_image.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_ivrdemo" displayname="IVR Demo Application" remove_on_change="apps/app_ivrdemo.o apps/app_ivrdemo.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="app_jack" displayname="JACK Interface" remove_on_change="apps/app_jack.o apps/app_jack.so">
|
||||||
|
<depend>jack</depend>
|
||||||
|
<depend name="resample">libresample</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_macro" displayname="Extension Macros" remove_on_change="apps/app_macro.o apps/app_macro.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_meetme" displayname="MeetMe conference bridge" remove_on_change="apps/app_meetme.o apps/app_meetme.so">
|
||||||
|
<depend>dahdi</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_milliwatt" displayname="Digital Milliwatt (mu-law) Test Application" remove_on_change="apps/app_milliwatt.o apps/app_milliwatt.so">
|
||||||
|
<depend>res_indications</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_minivm" displayname="Mini VoiceMail (A minimal Voicemail e-mail System)" remove_on_change="apps/app_minivm.o apps/app_minivm.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_mixmonitor" displayname="Mixed Audio Monitoring Application" remove_on_change="apps/app_mixmonitor.o apps/app_mixmonitor.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_morsecode" displayname="Morse code" remove_on_change="apps/app_morsecode.o apps/app_morsecode.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_mp3" displayname="Silly MP3 Application" remove_on_change="apps/app_mp3.o apps/app_mp3.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_nbscat" displayname="Silly NBS Stream Application" remove_on_change="apps/app_nbscat.o apps/app_nbscat.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_osplookup" displayname="Open Settlement Protocol Applications" remove_on_change="apps/app_osplookup.o apps/app_osplookup.so">
|
||||||
|
<depend>osptk</depend>
|
||||||
|
<depend>ssl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_page" displayname="Page Multiple Phones" remove_on_change="apps/app_page.o apps/app_page.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
<depend>app_meetme</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_parkandannounce" displayname="Call Parking and Announce Application" remove_on_change="apps/app_parkandannounce.o apps/app_parkandannounce.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_playback" displayname="Sound File Playback Application" remove_on_change="apps/app_playback.o apps/app_playback.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_privacy" displayname="Require phone number to be entered, if no CallerID sent" remove_on_change="apps/app_privacy.o apps/app_privacy.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_queue" displayname="True Call Queueing" remove_on_change="apps/app_queue.o apps/app_queue.so">
|
||||||
|
<depend>res_monitor</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_read" displayname="Read Variable Application" remove_on_change="apps/app_read.o apps/app_read.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_readexten" displayname="Read and evaluate extension validity" remove_on_change="apps/app_readexten.o apps/app_readexten.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_readfile" displayname="Stores output of file into a variable" remove_on_change="apps/app_readfile.o apps/app_readfile.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_record" displayname="Trivial Record Application" remove_on_change="apps/app_record.o apps/app_record.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_rpt" displayname="Radio Repeater/Remote Base Application" remove_on_change="apps/app_rpt.o apps/app_rpt.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
<depend>tonezone</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="app_sayunixtime" displayname="Say time" remove_on_change="apps/app_sayunixtime.o apps/app_sayunixtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_senddtmf" displayname="Send DTMF digits Application" remove_on_change="apps/app_senddtmf.o apps/app_senddtmf.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_sendtext" displayname="Send Text Applications" remove_on_change="apps/app_sendtext.o apps/app_sendtext.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_setcallerid" displayname="Set CallerID Presentation Application" remove_on_change="apps/app_setcallerid.o apps/app_setcallerid.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_skel" displayname="Skeleton (sample) Application" remove_on_change="apps/app_skel.o apps/app_skel.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="app_sms" displayname="SMS/PSTN handler" remove_on_change="apps/app_sms.o apps/app_sms.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_softhangup" displayname="Hangs up the requested channel" remove_on_change="apps/app_softhangup.o apps/app_softhangup.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_speech_utils" displayname="Dialplan Speech Applications" remove_on_change="apps/app_speech_utils.o apps/app_speech_utils.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_stack" displayname="Dialplan subroutines (Gosub, Return, etc)" remove_on_change="apps/app_stack.o apps/app_stack.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_system" displayname="Generic System() application" remove_on_change="apps/app_system.o apps/app_system.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_talkdetect" displayname="Playback with Talk Detection" remove_on_change="apps/app_talkdetect.o apps/app_talkdetect.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_test" displayname="Interface Test Application" remove_on_change="apps/app_test.o apps/app_test.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_transfer" displayname="Transfers a caller to another extension" remove_on_change="apps/app_transfer.o apps/app_transfer.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_url" displayname="Send URL Applications" remove_on_change="apps/app_url.o apps/app_url.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_userevent" displayname="Custom User Event Application" remove_on_change="apps/app_userevent.o apps/app_userevent.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_verbose" displayname="Send verbose output" remove_on_change="apps/app_verbose.o apps/app_verbose.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_voicemail" displayname="Comedian Mail (Voicemail System)" remove_on_change="apps/app_voicemail.o apps/app_voicemail.so">
|
||||||
|
<depend>res_smdi</depend>
|
||||||
|
</member>
|
||||||
|
<member name="app_waitforring" displayname="Waits until first ring after time" remove_on_change="apps/app_waitforring.o apps/app_waitforring.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_waitforsilence" displayname="Wait For Silence" remove_on_change="apps/app_waitforsilence.o apps/app_waitforsilence.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_waituntil" displayname="Wait until specified time" remove_on_change="apps/app_waituntil.o apps/app_waituntil.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_while" displayname="While Loops and Conditional Execution" remove_on_change="apps/app_while.o apps/app_while.so">
|
||||||
|
</member>
|
||||||
|
<member name="app_zapateller" displayname="Block Telemarketers with Special Information Tone" remove_on_change="apps/app_zapateller.o apps/app_zapateller.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CDR" displayname="Call Detail Recording" remove_on_change="cdr/modules.link">
|
||||||
|
<member name="cdr_adaptive_odbc" displayname="Adaptive ODBC CDR backend" remove_on_change="cdr/cdr_adaptive_odbc.o cdr/cdr_adaptive_odbc.so">
|
||||||
|
<depend name="unixODBC">unixodbc</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_csv" displayname="Comma Separated Values CDR Backend" remove_on_change="cdr/cdr_csv.o cdr/cdr_csv.so">
|
||||||
|
</member>
|
||||||
|
<member name="cdr_custom" displayname="Customizable Comma Separated Values CDR Backend" remove_on_change="cdr/cdr_custom.o cdr/cdr_custom.so">
|
||||||
|
</member>
|
||||||
|
<member name="cdr_manager" displayname="Asterisk Manager Interface CDR Backend" remove_on_change="cdr/cdr_manager.o cdr/cdr_manager.so">
|
||||||
|
</member>
|
||||||
|
<member name="cdr_odbc" displayname="ODBC CDR Backend" remove_on_change="cdr/cdr_odbc.o cdr/cdr_odbc.so">
|
||||||
|
<depend name="unixodbc">unixODBC</depend>
|
||||||
|
<depend name="ltdl">libtool-ltdl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_pgsql" displayname="PostgreSQL CDR Backend" remove_on_change="cdr/cdr_pgsql.o cdr/cdr_pgsql.so">
|
||||||
|
<depend name="pgsql">PostgreSQL</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_radius" displayname="RADIUS CDR Backend" remove_on_change="cdr/cdr_radius.o cdr/cdr_radius.so">
|
||||||
|
<depend>radius</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_sqlite3_custom" displayname="SQLite3 Custom CDR Module" remove_on_change="cdr/cdr_sqlite3_custom.o cdr/cdr_sqlite3_custom.so">
|
||||||
|
<depend>sqlite3</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_sqlite" displayname="SQLite CDR Backend" remove_on_change="cdr/cdr_sqlite.o cdr/cdr_sqlite.so">
|
||||||
|
<depend>sqlite</depend>
|
||||||
|
</member>
|
||||||
|
<member name="cdr_tds" displayname="FreeTDS CDR Backend" remove_on_change="cdr/cdr_tds.o cdr/cdr_tds.so">
|
||||||
|
<depend name="freetds">FreeTDS</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CHANNELS" displayname="Channel Drivers" remove_on_change="channels/modules.link">
|
||||||
|
<member name="chan_agent" displayname="Agent Proxy Channel" remove_on_change="channels/chan_agent.o channels/chan_agent.so">
|
||||||
|
<depend>chan_local</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_alsa" displayname="ALSA Console Channel Driver" remove_on_change="channels/chan_alsa.o channels/chan_alsa.so">
|
||||||
|
<depend>asound</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_console" displayname="Console Channel Driver" remove_on_change="channels/chan_console.o channels/chan_console.so">
|
||||||
|
<depend>portaudio</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_dahdi" displayname="DAHDI Telephony" remove_on_change="channels/chan_dahdi.o channels/chan_dahdi.so">
|
||||||
|
<depend>res_smdi</depend>
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
<depend>tonezone</depend>
|
||||||
|
<use>pri</use>
|
||||||
|
<use>ss7</use>
|
||||||
|
</member>
|
||||||
|
<member name="chan_features" displayname="Feature Proxy Channel" remove_on_change="channels/chan_features.o channels/chan_features.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="chan_gtalk" displayname="Gtalk Channel Driver" remove_on_change="channels/chan_gtalk.o channels/chan_gtalk.so">
|
||||||
|
<depend>iksemel</depend>
|
||||||
|
<depend>res_jabber</depend>
|
||||||
|
<use>openssl</use>
|
||||||
|
</member>
|
||||||
|
<member name="chan_h323" displayname="The NuFone Network's OpenH323 Channel Driver" remove_on_change="channels/chan_h323.o channels/chan_h323.so">
|
||||||
|
<depend>openh323</depend>
|
||||||
|
<defaultenabled>yes</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="chan_iax2" displayname="Inter Asterisk eXchange (Ver 2)" remove_on_change="channels/chan_iax2.o channels/chan_iax2.so">
|
||||||
|
<use>crypto</use>
|
||||||
|
</member>
|
||||||
|
<member name="chan_jingle" displayname="Jingle Channel Driver" remove_on_change="channels/chan_jingle.o channels/chan_jingle.so">
|
||||||
|
<depend>iksemel</depend>
|
||||||
|
<depend>res_jabber</depend>
|
||||||
|
<use>openssl</use>
|
||||||
|
</member>
|
||||||
|
<member name="chan_local" displayname="Local Proxy Channel (Note: used internally by other modules)" remove_on_change="channels/chan_local.o channels/chan_local.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_mgcp" displayname="Media Gateway Control Protocol (MGCP)" remove_on_change="channels/chan_mgcp.o channels/chan_mgcp.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_misdn" displayname="Channel driver for mISDN Support (BRI/PRI)" remove_on_change="channels/chan_misdn.o channels/chan_misdn.so">
|
||||||
|
<depend>isdnnet</depend>
|
||||||
|
<depend>misdn</depend>
|
||||||
|
<depend>suppserv</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_nbs" displayname="Network Broadcast Sound Support" remove_on_change="channels/chan_nbs.o channels/chan_nbs.so">
|
||||||
|
<depend>nbs</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_oss" displayname="OSS Console Channel Driver" remove_on_change="channels/chan_oss.o channels/chan_oss.so">
|
||||||
|
<depend>ossaudio</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_phone" displayname="Linux Telephony API Support" remove_on_change="channels/chan_phone.o channels/chan_phone.so">
|
||||||
|
<depend>ixjuser</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_sip" displayname="Session Initiation Protocol (SIP)" remove_on_change="channels/chan_sip.o channels/chan_sip.so">
|
||||||
|
<depend>chan_local</depend>
|
||||||
|
</member>
|
||||||
|
<member name="chan_skinny" displayname="Skinny Client Control Protocol (Skinny)" remove_on_change="channels/chan_skinny.o channels/chan_skinny.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_unistim" displayname="UNISTIM Protocol (USTM)" remove_on_change="channels/chan_unistim.o channels/chan_unistim.so">
|
||||||
|
</member>
|
||||||
|
<member name="chan_usbradio" displayname="usb Console Channel Driver" remove_on_change="channels/chan_usbradio.o channels/chan_usbradio.so">
|
||||||
|
<depend>ossaudio</depend>
|
||||||
|
<depend>usb</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="chan_vpb" displayname="Voicetronix API driver" remove_on_change="channels/chan_vpb.oo channels/chan_vpb.so">
|
||||||
|
<depend>vpbapi</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CODECS" displayname="Codec Translators" remove_on_change="codecs/modules.link">
|
||||||
|
<member name="codec_adpcm" displayname="Adaptive Differential PCM Coder/Decoder" remove_on_change="codecs/codec_adpcm.o codecs/codec_adpcm.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_alaw" displayname="A-law Coder/Decoder" remove_on_change="codecs/codec_alaw.o codecs/codec_alaw.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_a_mu" displayname="A-law and Mulaw direct Coder/Decoder" remove_on_change="codecs/codec_a_mu.o codecs/codec_a_mu.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_dahdi" displayname="Generic DAHDI Transcoder Codec Translator" remove_on_change="codecs/codec_dahdi.o codecs/codec_dahdi.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
</member>
|
||||||
|
<member name="codec_g722" displayname="ITU G.722-64kbps G722 Transcoder" remove_on_change="codecs/codec_g722.o codecs/codec_g722.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_g726" displayname="ITU G.726-32kbps G726 Transcoder" remove_on_change="codecs/codec_g726.o codecs/codec_g726.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_gsm" displayname="GSM Coder/Decoder" remove_on_change="codecs/codec_gsm.o codecs/codec_gsm.so">
|
||||||
|
<depend>gsm</depend>
|
||||||
|
</member>
|
||||||
|
<member name="codec_ilbc" displayname="iLBC Coder/Decoder" remove_on_change="codecs/codec_ilbc.o codecs/codec_ilbc.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="codec_lpc10" displayname="LPC10 2.4kbps Coder/Decoder" remove_on_change="codecs/codec_lpc10.o codecs/codec_lpc10.so">
|
||||||
|
</member>
|
||||||
|
<member name="codec_resample" displayname="SLIN Resampling Codec" remove_on_change="codecs/codec_resample.o codecs/codec_resample.so">
|
||||||
|
<depend>resample</depend>
|
||||||
|
</member>
|
||||||
|
<member name="codec_speex" displayname="Speex Coder/Decoder" remove_on_change="codecs/codec_speex.o codecs/codec_speex.so">
|
||||||
|
<depend>speex</depend>
|
||||||
|
<depend>speex_preprocess</depend>
|
||||||
|
<use>speexdsp</use>
|
||||||
|
</member>
|
||||||
|
<member name="codec_ulaw" displayname="mu-Law Coder/Decoder" remove_on_change="codecs/codec_ulaw.o codecs/codec_ulaw.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_FORMATS" displayname="Format Interpreters" remove_on_change="formats/modules.link">
|
||||||
|
<member name="format_g723" displayname="G.723.1 Simple Timestamp File Format" remove_on_change="formats/format_g723.o formats/format_g723.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_g726" displayname="Raw G.726 (16/24/32/40kbps) data" remove_on_change="formats/format_g726.o formats/format_g726.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_g729" displayname="Raw G729 data" remove_on_change="formats/format_g729.o formats/format_g729.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_gsm" displayname="Raw GSM data" remove_on_change="formats/format_gsm.o formats/format_gsm.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_h263" displayname="Raw H.263 data" remove_on_change="formats/format_h263.o formats/format_h263.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_h264" displayname="Raw H.264 data" remove_on_change="formats/format_h264.o formats/format_h264.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_ilbc" displayname="Raw iLBC data" remove_on_change="formats/format_ilbc.o formats/format_ilbc.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_jpeg" displayname="JPEG (Joint Picture Experts Group) Image Format" remove_on_change="formats/format_jpeg.o formats/format_jpeg.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_ogg_vorbis" displayname="OGG/Vorbis audio" remove_on_change="formats/format_ogg_vorbis.o formats/format_ogg_vorbis.so">
|
||||||
|
<depend>vorbis</depend>
|
||||||
|
<depend>ogg</depend>
|
||||||
|
</member>
|
||||||
|
<member name="format_pcm" displayname="Raw/Sun uLaw/ALaw 8KHz (PCM,PCMA,AU), G.722 16Khz" remove_on_change="formats/format_pcm.o formats/format_pcm.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_sln16" displayname="Raw Signed Linear 16KHz Audio support (SLN16)" remove_on_change="formats/format_sln16.o formats/format_sln16.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_sln" displayname="Raw Signed Linear Audio support (SLN)" remove_on_change="formats/format_sln.o formats/format_sln.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_vox" displayname="Dialogic VOX (ADPCM) File Format" remove_on_change="formats/format_vox.o formats/format_vox.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_wav" displayname="Microsoft WAV format (8000Hz Signed Linear)" remove_on_change="formats/format_wav.o formats/format_wav.so">
|
||||||
|
</member>
|
||||||
|
<member name="format_wav_gsm" displayname="Microsoft WAV format (Proprietary GSM)" remove_on_change="formats/format_wav_gsm.o formats/format_wav_gsm.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_FUNCS" displayname="Dialplan Functions" remove_on_change="funcs/modules.link">
|
||||||
|
<member name="func_base64" displayname="base64 encode/decode dialplan functions" remove_on_change="funcs/func_base64.o funcs/func_base64.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_blacklist" displayname="Look up Caller*ID name/number from blacklist database" remove_on_change="funcs/func_blacklist.o funcs/func_blacklist.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_callerid" displayname="Caller ID related dialplan functions" remove_on_change="funcs/func_callerid.o funcs/func_callerid.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_cdr" displayname="Call Detail Record (CDR) dialplan function" remove_on_change="funcs/func_cdr.o funcs/func_cdr.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_channel" displayname="Channel information dialplan functions" remove_on_change="funcs/func_channel.o funcs/func_channel.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_config" displayname="Asterisk configuration file variable access" remove_on_change="funcs/func_config.o funcs/func_config.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_curl" displayname="Load external URL" remove_on_change="funcs/func_curl.o funcs/func_curl.so">
|
||||||
|
<depend>curl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="func_cut" displayname="Cut out information from a string" remove_on_change="funcs/func_cut.o funcs/func_cut.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_db" displayname="Database (astdb) related dialplan functions" remove_on_change="funcs/func_db.o funcs/func_db.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_devstate" displayname="Gets or sets a device state in the dialplan" remove_on_change="funcs/func_devstate.o funcs/func_devstate.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_dialgroup" displayname="Dialgroup dialplan function" remove_on_change="funcs/func_dialgroup.o funcs/func_dialgroup.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_dialplan" displayname="Dialplan Context/Extension/Priority Checking Functions" remove_on_change="funcs/func_dialplan.o funcs/func_dialplan.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_enum" displayname="ENUM related dialplan functions" remove_on_change="funcs/func_enum.o funcs/func_enum.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_env" displayname="Environment/filesystem dialplan functions" remove_on_change="funcs/func_env.o funcs/func_env.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_extstate" displayname="Gets an extension's state in the dialplan" remove_on_change="funcs/func_extstate.o funcs/func_extstate.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_global" displayname="Variable dialplan functions" remove_on_change="funcs/func_global.o funcs/func_global.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_groupcount" displayname="Channel group dialplan functions" remove_on_change="funcs/func_groupcount.o funcs/func_groupcount.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_iconv" displayname="Charset conversions" remove_on_change="funcs/func_iconv.o funcs/func_iconv.so">
|
||||||
|
<depend>iconv</depend>
|
||||||
|
</member>
|
||||||
|
<member name="func_lock" displayname="Dialplan mutexes" remove_on_change="funcs/func_lock.o funcs/func_lock.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_logic" displayname="Logical dialplan functions" remove_on_change="funcs/func_logic.o funcs/func_logic.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_math" displayname="Mathematical dialplan function" remove_on_change="funcs/func_math.o funcs/func_math.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_md5" displayname="MD5 digest dialplan functions" remove_on_change="funcs/func_md5.o funcs/func_md5.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_module" displayname="Checks if Asterisk module is loaded in memory" remove_on_change="funcs/func_module.o funcs/func_module.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_odbc" displayname="ODBC lookups" remove_on_change="funcs/func_odbc.o funcs/func_odbc.so">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
<depend>ltdl</depend>
|
||||||
|
<depend>res_odbc</depend>
|
||||||
|
</member>
|
||||||
|
<member name="func_rand" displayname="Random number dialplan function" remove_on_change="funcs/func_rand.o funcs/func_rand.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_realtime" displayname="Read/Write/Store/Destroy values from a RealTime repository" remove_on_change="funcs/func_realtime.o funcs/func_realtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_sha1" displayname="SHA-1 computation dialplan function" remove_on_change="funcs/func_sha1.o funcs/func_sha1.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_shell" displayname="Returns the output of a shell command" remove_on_change="funcs/func_shell.o funcs/func_shell.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_speex" displayname="Noise reduction and Automatic Gain Control (AGC)" remove_on_change="funcs/func_speex.o funcs/func_speex.so">
|
||||||
|
<depend>speex</depend>
|
||||||
|
<depend>speex_preprocess</depend>
|
||||||
|
<use>speexdsp</use>
|
||||||
|
</member>
|
||||||
|
<member name="func_strings" displayname="String handling dialplan functions" remove_on_change="funcs/func_strings.o funcs/func_strings.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_sysinfo" displayname="System information related functions" remove_on_change="funcs/func_sysinfo.o funcs/func_sysinfo.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_timeout" displayname="Channel timeout dialplan functions" remove_on_change="funcs/func_timeout.o funcs/func_timeout.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_uri" displayname="URI encode/decode dialplan functions" remove_on_change="funcs/func_uri.o funcs/func_uri.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_version" displayname="Get Asterisk Version/Build Info" remove_on_change="funcs/func_version.o funcs/func_version.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_vmcount" displayname="Indicator for whether a voice mailbox has messages in a given folder." remove_on_change="funcs/func_vmcount.o funcs/func_vmcount.so">
|
||||||
|
</member>
|
||||||
|
<member name="func_volume" displayname="Technology independent volume control" remove_on_change="funcs/func_volume.o funcs/func_volume.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_PBX" displayname="PBX Modules" remove_on_change="pbx/modules.link">
|
||||||
|
<member name="pbx_ael" displayname="Asterisk Extension Language Compiler" remove_on_change="pbx/pbx_ael.o pbx/pbx_ael.so">
|
||||||
|
<depend>res_ael_share</depend>
|
||||||
|
</member>
|
||||||
|
<member name="pbx_config" displayname="Text Extension Configuration" remove_on_change="pbx/pbx_config.o pbx/pbx_config.so">
|
||||||
|
</member>
|
||||||
|
<member name="pbx_dundi" displayname="Distributed Universal Number Discovery (DUNDi)" remove_on_change="pbx/pbx_dundi.o pbx/pbx_dundi.so">
|
||||||
|
<depend>zlib</depend>
|
||||||
|
<use>crypto</use>
|
||||||
|
</member>
|
||||||
|
<member name="pbx_gtkconsole" displayname="GTK Console" remove_on_change="pbx/pbx_gtkconsole.o pbx/pbx_gtkconsole.so">
|
||||||
|
<depend>gtk</depend>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="pbx_loopback" displayname="Loopback Switch" remove_on_change="pbx/pbx_loopback.o pbx/pbx_loopback.so">
|
||||||
|
</member>
|
||||||
|
<member name="pbx_lua" displayname="Lua PBX Switch" remove_on_change="pbx/pbx_lua.o pbx/pbx_lua.so">
|
||||||
|
<depend>lua</depend>
|
||||||
|
</member>
|
||||||
|
<member name="pbx_realtime" displayname="Realtime Switch" remove_on_change="pbx/pbx_realtime.o pbx/pbx_realtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="pbx_spool" displayname="Outgoing Spool Support" remove_on_change="pbx/pbx_spool.o pbx/pbx_spool.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_RES" displayname="Resource Modules" remove_on_change="res/modules.link">
|
||||||
|
<member name="res_adsi" displayname="ADSI Resource" remove_on_change="res/res_adsi.o res/res_adsi.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_ael_share" displayname="share-able code for AEL" remove_on_change="res/res_ael_share.o res/res_ael_share.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_agi" displayname="Asterisk Gateway Interface (AGI)" remove_on_change="res/res_agi.o res/res_agi.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_ais" displayname="SAForum AIS" remove_on_change="res/res_ais.o res/res_ais.so">
|
||||||
|
<depend>ais</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_clioriginate" displayname="Call origination from the CLI" remove_on_change="res/res_clioriginate.o res/res_clioriginate.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_config_curl" displayname="Realtime Curl configuration" remove_on_change="res/res_config_curl.o res/res_config_curl.so">
|
||||||
|
<depend>curl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_config_ldap" displayname="LDAP realtime interface" remove_on_change="res/res_config_ldap.o res/res_config_ldap.so">
|
||||||
|
<depend>ldap</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_config_odbc" displayname="Realtime ODBC configuration" remove_on_change="res/res_config_odbc.o res/res_config_odbc.so">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
<depend>ltdl</depend>
|
||||||
|
<depend>res_odbc</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_config_pgsql" displayname="PostgreSQL RealTime Configuration Driver" remove_on_change="res/res_config_pgsql.o res/res_config_pgsql.so">
|
||||||
|
<depend>pgsql</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_config_sqlite" displayname="Realtime SQLite configuration" remove_on_change="res/res_config_sqlite.o res/res_config_sqlite.so">
|
||||||
|
<depend>sqlite</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_convert" displayname="File format conversion CLI command" remove_on_change="res/res_convert.o res/res_convert.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_crypto" displayname="Cryptographic Digital Signatures" remove_on_change="res/res_crypto.o res/res_crypto.so">
|
||||||
|
<depend>ssl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_curl" displayname="cURL Resource Module" remove_on_change="res/res_curl.o res/res_curl.so">
|
||||||
|
<depend>curl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_http_post" displayname="HTTP POST support" remove_on_change="res/res_http_post.o res/res_http_post.so">
|
||||||
|
<depend>gmime</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_indications" displayname="Region-specific tones" remove_on_change="res/res_indications.o res/res_indications.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_jabber" displayname="AJI - Asterisk Jabber Interface" remove_on_change="res/res_jabber.o res/res_jabber.so">
|
||||||
|
<depend>iksemel</depend>
|
||||||
|
<use>openssl</use>
|
||||||
|
</member>
|
||||||
|
<member name="res_limit" displayname="Resource limits" remove_on_change="res/res_limit.o res/res_limit.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_monitor" displayname="Call Monitoring Resource" remove_on_change="res/res_monitor.o res/res_monitor.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_musiconhold" displayname="Music On Hold Resource" remove_on_change="res/res_musiconhold.o res/res_musiconhold.so">
|
||||||
|
<conflict>win32</conflict>
|
||||||
|
<use>dahdi</use>
|
||||||
|
</member>
|
||||||
|
<member name="res_odbc" displayname="ODBC resource" remove_on_change="res/res_odbc.o res/res_odbc.so">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
<depend>ltdl</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_phoneprov" displayname="HTTP Phone Provisioning" remove_on_change="res/res_phoneprov.o res/res_phoneprov.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_realtime" displayname="Realtime Data Lookup/Rewrite" remove_on_change="res/res_realtime.o res/res_realtime.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_smdi" displayname="Simplified Message Desk Interface (SMDI) Resource" remove_on_change="res/res_smdi.o res/res_smdi.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_snmp" displayname="SNMP [Sub]Agent for Asterisk" remove_on_change="res/res_snmp.o res/res_snmp.so">
|
||||||
|
<depend>netsnmp</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_speech" displayname="Generic Speech Recognition API" remove_on_change="res/res_speech.o res/res_speech.so">
|
||||||
|
</member>
|
||||||
|
<member name="res_timing_dahdi" displayname="DAHDI Timing Interface" remove_on_change="res/res_timing_dahdi.o res/res_timing_dahdi.so">
|
||||||
|
<depend name="dahdi">DAHDI</depend>
|
||||||
|
</member>
|
||||||
|
<member name="res_timing_pthread" displayname="pthread Timing Interface" remove_on_change="res/res_timing_pthread.o res/res_timing_pthread.so">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_TEST" displayname="Test Modules" remove_on_change="tests/modules.link">
|
||||||
|
<member name="test_dlinklists" displayname="Test Doubly-Linked Lists" remove_on_change="tests/test_dlinklists.o tests/test_dlinklists.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="test_skel" displayname="Skeleton (sample) Test" remove_on_change="tests/test_skel.o tests/test_skel.so">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CFLAGS" displayname="Compiler Flags" positive_output="yes" remove_on_change=".lastclean">
|
||||||
|
<member name="DONT_OPTIMIZE" displayname="Disable Optimizations by the Compiler">
|
||||||
|
</member>
|
||||||
|
<member name="DEBUG_THREADS" displayname="Enable Thread Debugging">
|
||||||
|
</member>
|
||||||
|
<member name="STATIC_BUILD" displayname="Build static binaries">
|
||||||
|
</member>
|
||||||
|
<member name="LOADABLE_MODULES" displayname="Runtime module loading">
|
||||||
|
<defaultenabled>yes</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="LOW_MEMORY" displayname="Optimize for Low Memory Usage">
|
||||||
|
</member>
|
||||||
|
<member name="USE_HOARD_ALLOCATOR" displayname="Use the Hoard Memory Allocator instead of the default system one">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
<depend>hoard</depend>
|
||||||
|
</member>
|
||||||
|
<member name="LOTS_OF_SPANS" displayname="More than 32 DAHDI spans">
|
||||||
|
</member>
|
||||||
|
<member name="RADIO_RELAX" displayname="Relax DTMF for Radio Applications">
|
||||||
|
</member>
|
||||||
|
<member name="G711_NEW_ALGORITHM" displayname="Use the NEW ulaw/alaw codecs (slower, but cleaner)">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="G711_REDUCED_BRANCHING" displayname="New ulaw/alaw codec, reduced branching (might help it run faster in some architectures)">
|
||||||
|
<defaultenabled>yes</defaultenabled>
|
||||||
|
<depend>G711_NEW_ALGORITHM</depend>
|
||||||
|
</member>
|
||||||
|
<member name="TEST_CODING_TABLES" displayname="New ulaw/alaw codec, turn on table tests on init">
|
||||||
|
<depend>G711_NEW_ALGORITHM</depend>
|
||||||
|
</member>
|
||||||
|
<member name="TEST_TANDEM_TRANSCODING" displayname="New ulaw/alaw codec, turn on transcoding tests on init">
|
||||||
|
<depend>G711_NEW_ALGORITHM</depend>
|
||||||
|
</member>
|
||||||
|
<member name="DEBUG_CHANNEL_LOCKS" displayname="Debug Channel Locking">
|
||||||
|
</member>
|
||||||
|
<member name="MALLOC_DEBUG" displayname="Keep Track of Memory Allocations">
|
||||||
|
</member>
|
||||||
|
<member name="BUSYDETECT_TONEONLY" displayname="Enable additional comparision of only the tone duration not the silence part">
|
||||||
|
<conflict>BUSYDETECT_COMPARE_TONE_AND_SILENCE</conflict>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="BUSYDETECT_COMPARE_TONE_AND_SILENCE" displayname="Assume that tone and silence have the same duration">
|
||||||
|
<conflict>BUSYDETECT_TONEONLY</conflict>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="BUSYDETECT_DEBUG" displayname="Enable additional busy detection debugging">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="IAX_OLD_FIND" displayname="Use the old, slow method of searching for IAX callnos">
|
||||||
|
</member>
|
||||||
|
<member name="INTEGER_CALLERID" displayname="Use the (less accurate) integer-based method for decoding FSK tones (for embedded systems)">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_OPTS_app_voicemail" displayname="Voicemail Build Options" positive_output="yes" remove_on_change="apps/app_voicemail.o apps/app_directory.o">
|
||||||
|
<member name="ODBC_STORAGE" displayname="Storage of Voicemail using ODBC">
|
||||||
|
<depend>unixodbc</depend>
|
||||||
|
<depend>ltdl</depend>
|
||||||
|
<conflict>IMAP_STORAGE</conflict>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="IMAP_STORAGE" displayname="Storage of Voicemail using IMAP4">
|
||||||
|
<depend>imap_tk</depend>
|
||||||
|
<conflict>ODBC_STORAGE</conflict>
|
||||||
|
<use>ssl</use>
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CFLAGS" displayname="Compiler Flags" positive_output="yes" remove_on_change=".lastclean">
|
||||||
|
<member name="RADIO_RTX" displayname="Build RTX/DTX Radio Programming">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
<depend>chan_usbradio</depend>
|
||||||
|
</member>
|
||||||
|
<member name="RADIO_XPMRX" displayname="Build Experimental Radio Protocols">
|
||||||
|
<defaultenabled>no</defaultenabled>
|
||||||
|
<depend>chan_usbradio</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CFLAGS" displayname="Compiler Flags - Development">
|
||||||
|
<member name="MTX_PROFILE" displayname="Enable Code Profiling Using TSC Counters">
|
||||||
|
</member>
|
||||||
|
<member name="DEBUG_SCHEDULER" displayname="Enable Scheduler Debugging Output">
|
||||||
|
</member>
|
||||||
|
<member name="DEBUG_THREADLOCALS" displayname="Enable Thread-Local-Storage Debugging">
|
||||||
|
</member>
|
||||||
|
<member name="DETECT_DEADLOCKS" displayname="Detect Deadlocks">
|
||||||
|
<depend>DEBUG_THREADS</depend>
|
||||||
|
</member>
|
||||||
|
<member name="DUMP_SCHEDULER" displayname="Dump Scheduler Contents for Debugging">
|
||||||
|
</member>
|
||||||
|
<member name="TRACE_FRAMES" displayname="Trace Frame Allocations">
|
||||||
|
</member>
|
||||||
|
<member name="DO_CRASH" displayname="Crash on fatal errors">
|
||||||
|
</member>
|
||||||
|
<member name="THREAD_CRASH" displayname="Crash on mutex errors">
|
||||||
|
</member>
|
||||||
|
<member name="CHANNEL_TRACE" displayname="Enable CHANNEL(trace) function">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_EMBED" displayname="Module Embedding" positive_output="yes" remove_on_change="main/asterisk">
|
||||||
|
<member name="APPS" displayname="Applications" remove_on_change="apps/*.o">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
<member name="CDR" displayname="Call Detail Recording" remove_on_change="cdr/*.o">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
<member name="CHANNELS" displayname="Channels" remove_on_change="channels/*.o channels/misdn/*.o">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
<member name="CODECS" displayname="Coders/Decoders" remove_on_change="codecs/*.o codecs/gsm/src/*.o codecs/ilbc/*.o codecs/lpc10/*.o codecs/gsm/lib/libgsm.a codecs/lpc10/liblpc10.a codecs/ilbc/libilbc.a codecs/g722/libg722.a">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
<member name="FORMATS" displayname="File Formats" remove_on_change="formats/*.o">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
<member name="FUNCS" displayname="Dialplan Functions" remove_on_change="funcs/*.o">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
<member name="PBX" displayname="PBX Functionality" remove_on_change="pbx/*.o pbx/ael/*.o">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
<member name="RES" displayname="Resource Modules" remove_on_change="res/*.o res/snmp/*.o">
|
||||||
|
<depend>gnu_ld</depend>
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_CORE_SOUNDS" displayname="Core Sound Packages" positive_output="yes">
|
||||||
|
<member name="CORE-SOUNDS-EN-WAV" displayname="English, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-ULAW" displayname="English, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-ALAW" displayname="English, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-GSM" displayname="English, GSM format" >
|
||||||
|
<defaultenabled>yes</defaultenabled>
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-G729" displayname="English, G.729 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-G722" displayname="English, G.722 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-EN-SLN16" displayname="English, Signed-linear 16kHz format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-WAV" displayname="Spanish, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-ULAW" displayname="Spanish, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-ALAW" displayname="Spanish, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-GSM" displayname="Spanish, GSM format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-G729" displayname="Spanish, G.729 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-G722" displayname="Spanish, G.722 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-ES-SLN16" displayname="Spanish, Signed-linear 16kHz format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-WAV" displayname="French, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-ULAW" displayname="French, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-ALAW" displayname="French, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-GSM" displayname="French, GSM format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-G729" displayname="French, G.729 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-G722" displayname="French, G.722 format">
|
||||||
|
</member>
|
||||||
|
<member name="CORE-SOUNDS-FR-SLN16" displayname="French, Signed-linear 16kHz format">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
<category name="MENUSELECT_EXTRA_SOUNDS" displayname="Extras Sound Packages" positive_output="yes">
|
||||||
|
<member name="EXTRA-SOUNDS-EN-WAV" displayname="English, WAV format">
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-ULAW" displayname="English, mu-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-ALAW" displayname="English, a-Law format">
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-GSM" displayname="English, GSM format" >
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-G729" displayname="English, G.729 format">
|
||||||
|
</member>
|
||||||
|
<member name="EXTRA-SOUNDS-EN-G722" displayname="English, G.722 format">
|
||||||
|
</member>
|
||||||
|
</category>
|
||||||
|
</menu>
|
Loading…
Reference in new issue