Merge branch 'master' of ssh://git.freeswitch.org:222/freeswitch
This commit is contained in:
commit
36f1e5e2bb
|
@ -0,0 +1,2 @@
|
||||||
|
*.1
|
||||||
|
*.html
|
|
@ -0,0 +1,155 @@
|
||||||
|
freeswitch(1) -- scalable multi-protocol softswitch
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
## SYNOPSIS
|
||||||
|
|
||||||
|
`freeswitch` [<options>]
|
||||||
|
|
||||||
|
## DESCRIPTION
|
||||||
|
|
||||||
|
`freeswitch` is a high-performance softswitch that supports many kinds
|
||||||
|
of telephony applications. It's commonly used as a PBX with SIP
|
||||||
|
endpoints.
|
||||||
|
|
||||||
|
`freeswitch` expects a set of configuration files to exist in
|
||||||
|
/etc/freeswitch. Example configurations can be found in
|
||||||
|
/usr/share/freeswitch/conf.
|
||||||
|
|
||||||
|
`freeswitch` is a modular system and modules can be loaded at runtime.
|
||||||
|
|
||||||
|
`freeswitch` is started in the foreground by default but can also be
|
||||||
|
started as a daemon.
|
||||||
|
|
||||||
|
## OPTIONS
|
||||||
|
|
||||||
|
* `-h`:
|
||||||
|
Show inline help.
|
||||||
|
|
||||||
|
* `-version`:
|
||||||
|
Print the version and exit.
|
||||||
|
|
||||||
|
* `-nf`:
|
||||||
|
Stay in the foreground (default unless `-nc` is specified).
|
||||||
|
|
||||||
|
* `-reincarnate`:
|
||||||
|
Restart the switch in the event of an uncontrolled exit.
|
||||||
|
|
||||||
|
* `-reincarnate-reexec`:
|
||||||
|
Like `-reincarnate` but cause the switch binary to be run again
|
||||||
|
with execv.
|
||||||
|
|
||||||
|
* `-u` <user>:
|
||||||
|
Run setuid after starting the switch.
|
||||||
|
|
||||||
|
* `-g` <group>:
|
||||||
|
Run setgid after starting the switch.
|
||||||
|
|
||||||
|
* `-core`:
|
||||||
|
Cause the switch to dump a core when crashing; you'll need to
|
||||||
|
ensure your system ulimits allow this, and if you've set `-u` or
|
||||||
|
`-g` you may also need to run:
|
||||||
|
|
||||||
|
sysctl -w fs.suid_dumpable=1
|
||||||
|
|
||||||
|
* `-rp`:
|
||||||
|
Enable realtime priority.
|
||||||
|
|
||||||
|
* `-lp`:
|
||||||
|
Enable low priority.
|
||||||
|
|
||||||
|
* `-np`:
|
||||||
|
Enable normal priority.
|
||||||
|
|
||||||
|
* `-vg`:
|
||||||
|
Run under Valgrind.
|
||||||
|
|
||||||
|
* `-nosql`:
|
||||||
|
Disable the use of SQL for internal switch operations.
|
||||||
|
|
||||||
|
* `-heavy-timer`:
|
||||||
|
Use a more expensive system timer that may be more accurate, but
|
||||||
|
note this may also impose heavier loads on your system.
|
||||||
|
|
||||||
|
* `-nonat`:
|
||||||
|
When the switch starts, it runs checks to determine if it is
|
||||||
|
behind NAT; this flag disables these checks.
|
||||||
|
|
||||||
|
* `-nonatmap`:
|
||||||
|
Disable automatic NAT port mapping.
|
||||||
|
|
||||||
|
* `-nocal`:
|
||||||
|
When the switch starts, it calibrates itself to deviations in the
|
||||||
|
system clock; this flag disables this calibration.
|
||||||
|
|
||||||
|
* `-nort`:
|
||||||
|
Disable use of clock_realtime.
|
||||||
|
|
||||||
|
* `-stop`:
|
||||||
|
Stop the switch if running in the background.
|
||||||
|
|
||||||
|
* `-nc`:
|
||||||
|
Disable the interactive console and cause the switch to go into
|
||||||
|
the background unless `-nf` is also specified.
|
||||||
|
|
||||||
|
* `-ncwait`:
|
||||||
|
Like `-nc` but cause the parent process to wait until the switch
|
||||||
|
is started before exiting.
|
||||||
|
|
||||||
|
* `-c`:
|
||||||
|
Enable the interactive console and stay in the foreground (this is
|
||||||
|
the default).
|
||||||
|
|
||||||
|
* `-base` <basedir>:
|
||||||
|
Set the prefix directory.
|
||||||
|
|
||||||
|
* `-cfgname` <filename>:
|
||||||
|
Set the pathname to the main configuration file.
|
||||||
|
|
||||||
|
* `-conf` <directory>:
|
||||||
|
Set the directory for configuration files.
|
||||||
|
|
||||||
|
* `-log` <directory>:
|
||||||
|
Set the directory for log files.
|
||||||
|
|
||||||
|
* `-run` <directory>:
|
||||||
|
Set the directory for temporary runtime files.
|
||||||
|
|
||||||
|
* `-db` <directory>:
|
||||||
|
Set the directory for internal database files.
|
||||||
|
|
||||||
|
* `-mod` <directory>:
|
||||||
|
Set the directory for runtime modules.
|
||||||
|
|
||||||
|
* `-htdocs` <directory>:
|
||||||
|
Set the directory for htdocs.
|
||||||
|
|
||||||
|
* `-scripts` <directory>:
|
||||||
|
Set the directory for call control scripts.
|
||||||
|
|
||||||
|
* `-temp` <directory>:
|
||||||
|
Set the directory for temporary files.
|
||||||
|
|
||||||
|
* `-grammar` <directory>:
|
||||||
|
Set the directory for grammar files.
|
||||||
|
|
||||||
|
* `-recordings` <directory>:
|
||||||
|
Set the directory for call recordings.
|
||||||
|
|
||||||
|
* `-storage` <directory>:
|
||||||
|
Set the directory for voicemail storage.
|
||||||
|
|
||||||
|
* `-sounds` <directory>:
|
||||||
|
Set the directory for sound files.
|
||||||
|
|
||||||
|
## AUTHORS
|
||||||
|
|
||||||
|
FreeSWITCH was originally developed by `Anthony Minessale II
|
||||||
|
<anthm@freeswitch.org>` with continued development by Anthony and a
|
||||||
|
team of active contributors.
|
||||||
|
|
||||||
|
This man page and the packaging for Debian was written by `Travis
|
||||||
|
Cross <tc@traviscross.com>`.
|
||||||
|
|
||||||
|
## SEE ALSO
|
||||||
|
|
||||||
|
sysctl(8), ulimit(1posix)
|
|
@ -238,7 +238,7 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ALIGNMENT (8)
|
#define ALIGNMENT (8)
|
||||||
#define ALIGN(n) (size_t)(((n) + (ALIGNMENT - 1)) & (size_t)~(ALIGNMENT - 1))
|
#define __ALIGN(n) (size_t)(((n) + (ALIGNMENT - 1)) & (size_t)~(ALIGNMENT - 1))
|
||||||
#define SIZEBITS (sizeof (unsigned) * 8 - 1)
|
#define SIZEBITS (sizeof (unsigned) * 8 - 1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -478,7 +478,7 @@ void *sub_alloc(su_home_t *home,
|
||||||
sub->sub_preload && size <= sub->sub_prsize) {
|
sub->sub_preload && size <= sub->sub_prsize) {
|
||||||
/* Use preloaded memory */
|
/* Use preloaded memory */
|
||||||
size_t prused = sub->sub_prused + size + MEMCHECK_EXTRA;
|
size_t prused = sub->sub_prused + size + MEMCHECK_EXTRA;
|
||||||
prused = ALIGN(prused);
|
prused = __ALIGN(prused);
|
||||||
if (prused <= sub->sub_prsize) {
|
if (prused <= sub->sub_prsize) {
|
||||||
preload = (char *)sub->sub_preload + sub->sub_prused;
|
preload = (char *)sub->sub_preload + sub->sub_prused;
|
||||||
sub->sub_prused = (unsigned)prused;
|
sub->sub_prused = (unsigned)prused;
|
||||||
|
@ -1313,7 +1313,7 @@ void su_home_preload(su_home_t *home, isize_t n, isize_t isize)
|
||||||
size_t size;
|
size_t size;
|
||||||
void *preload;
|
void *preload;
|
||||||
|
|
||||||
size = n * ALIGN(isize);
|
size = n * __ALIGN(isize);
|
||||||
if (size > 65535) /* We have 16 bits... */
|
if (size > 65535) /* We have 16 bits... */
|
||||||
size = 65535 & (ALIGNMENT - 1);
|
size = 65535 & (ALIGNMENT - 1);
|
||||||
|
|
||||||
|
@ -1334,13 +1334,13 @@ su_home_t *su_home_auto(void *area, isize_t size)
|
||||||
{
|
{
|
||||||
su_home_t *home;
|
su_home_t *home;
|
||||||
su_block_t *sub;
|
su_block_t *sub;
|
||||||
size_t homesize = ALIGN(sizeof *home);
|
size_t homesize = __ALIGN(sizeof *home);
|
||||||
size_t subsize = ALIGN(offsetof(su_block_t, sub_nodes[SUB_N_AUTO]));
|
size_t subsize = __ALIGN(offsetof(su_block_t, sub_nodes[SUB_N_AUTO]));
|
||||||
size_t prepsize;
|
size_t prepsize;
|
||||||
|
|
||||||
char *p = area;
|
char *p = area;
|
||||||
|
|
||||||
prepsize = homesize + subsize + (ALIGN((intptr_t)p) - (intptr_t)p);
|
prepsize = homesize + subsize + (__ALIGN((intptr_t)p) - (intptr_t)p);
|
||||||
|
|
||||||
if (area == NULL || size < prepsize)
|
if (area == NULL || size < prepsize)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1443,11 +1443,11 @@ void *su_realloc(su_home_t *home, void *data, isize_t size)
|
||||||
|
|
||||||
p = (char *)data - home->suh_blocks->sub_preload;
|
p = (char *)data - home->suh_blocks->sub_preload;
|
||||||
p += sua->sua_size + MEMCHECK_EXTRA;
|
p += sua->sua_size + MEMCHECK_EXTRA;
|
||||||
p = ALIGN(p);
|
p = __ALIGN(p);
|
||||||
|
|
||||||
if (p == sub->sub_prused) {
|
if (p == sub->sub_prused) {
|
||||||
size_t p2 = (char *)data - sub->sub_preload + size + MEMCHECK_EXTRA;
|
size_t p2 = (char *)data - sub->sub_preload + size + MEMCHECK_EXTRA;
|
||||||
p2 = ALIGN(p2);
|
p2 = __ALIGN(p2);
|
||||||
if (p2 <= sub->sub_prsize) {
|
if (p2 <= sub->sub_prsize) {
|
||||||
/* Extend/reduce existing preload */
|
/* Extend/reduce existing preload */
|
||||||
if (sub->sub_stats) {
|
if (sub->sub_stats) {
|
||||||
|
@ -1840,7 +1840,7 @@ void su_home_stats_alloc(su_block_t *sub, void *p, void *preload,
|
||||||
{
|
{
|
||||||
su_home_stat_t *hs = sub->sub_stats;
|
su_home_stat_t *hs = sub->sub_stats;
|
||||||
|
|
||||||
size_t rsize = ALIGN(size);
|
size_t rsize = __ALIGN(size);
|
||||||
|
|
||||||
hs->hs_rehash += (sub->sub_n != hs->hs_blocksize);
|
hs->hs_rehash += (sub->sub_n != hs->hs_blocksize);
|
||||||
hs->hs_blocksize = sub->sub_n;
|
hs->hs_blocksize = sub->sub_n;
|
||||||
|
@ -1869,7 +1869,7 @@ void su_home_stats_free(su_block_t *sub, void *p, void *preload,
|
||||||
{
|
{
|
||||||
su_home_stat_t *hs = sub->sub_stats;
|
su_home_stat_t *hs = sub->sub_stats;
|
||||||
|
|
||||||
size_t rsize = ALIGN(size);
|
size_t rsize = __ALIGN(size);
|
||||||
|
|
||||||
if (preload) {
|
if (preload) {
|
||||||
hs->hs_frees.hsf_preload++;
|
hs->hs_frees.hsf_preload++;
|
||||||
|
|
|
@ -393,7 +393,7 @@ octet_string_set_to_zero(uint8_t *s, int len);
|
||||||
# define be64_to_cpu(x) bswap_64((x))
|
# define be64_to_cpu(x) bswap_64((x))
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(HAVE_X86) && !defined(__FreeBSD__)
|
#if defined(__GNUC__) && defined(HAVE_X86) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
|
||||||
/* Fall back. */
|
/* Fall back. */
|
||||||
static inline uint32_t be32_to_cpu(uint32_t v) {
|
static inline uint32_t be32_to_cpu(uint32_t v) {
|
||||||
/* optimized for x86. */
|
/* optimized for x86. */
|
||||||
|
|
|
@ -3160,6 +3160,10 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_chan
|
||||||
}
|
}
|
||||||
switch_mutex_unlock(channel->state_mutex);
|
switch_mutex_unlock(channel->state_mutex);
|
||||||
|
|
||||||
|
if (switch_channel_test_flag(channel, CF_LEG_HOLDING)) {
|
||||||
|
switch_channel_mark_hold(channel, SWITCH_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
return channel->state;
|
return channel->state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -647,7 +647,9 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session_a), SWITCH_LOG_DEBUG, "BRIDGE THREAD DONE [%s]\n", switch_channel_get_name(chan_a));
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session_a), SWITCH_LOG_DEBUG, "BRIDGE THREAD DONE [%s]\n", switch_channel_get_name(chan_a));
|
||||||
switch_channel_clear_flag(chan_a, CF_BRIDGED);
|
switch_channel_clear_flag(chan_a, CF_BRIDGED);
|
||||||
|
|
||||||
if (switch_channel_test_flag(chan_a, CF_LEG_HOLDING) && switch_channel_ready(chan_b) && switch_channel_get_state(chan_b) != CS_PARK) {
|
if (switch_channel_test_flag(chan_a, CF_LEG_HOLDING)) {
|
||||||
|
|
||||||
|
if (switch_channel_ready(chan_b) && switch_channel_get_state(chan_b) != CS_PARK) {
|
||||||
const char *ext = switch_channel_get_variable(chan_a, "hold_hangup_xfer_exten");
|
const char *ext = switch_channel_get_variable(chan_a, "hold_hangup_xfer_exten");
|
||||||
|
|
||||||
switch_channel_stop_broadcast(chan_b);
|
switch_channel_stop_broadcast(chan_b);
|
||||||
|
@ -661,7 +663,8 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
|
||||||
} else {
|
} else {
|
||||||
switch_channel_set_variable(chan_b, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE, ext);
|
switch_channel_set_variable(chan_b, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE, ext);
|
||||||
}
|
}
|
||||||
switch_channel_clear_flag(chan_a, CF_LEG_HOLDING);
|
}
|
||||||
|
switch_channel_mark_hold(chan_a, SWITCH_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (switch_channel_test_flag(chan_a, CF_INTERCEPTED)) {
|
if (switch_channel_test_flag(chan_a, CF_INTERCEPTED)) {
|
||||||
|
|
Loading…
Reference in New Issue