diff --git a/docs/man/.gitignore b/docs/man/.gitignore new file mode 100644 index 0000000000..79a0cd25ae --- /dev/null +++ b/docs/man/.gitignore @@ -0,0 +1,2 @@ +*.1 +*.html diff --git a/docs/man/freeswitch.1.ronn b/docs/man/freeswitch.1.ronn new file mode 100644 index 0000000000..8022c93414 --- /dev/null +++ b/docs/man/freeswitch.1.ronn @@ -0,0 +1,155 @@ +freeswitch(1) -- scalable multi-protocol softswitch +=================================================== + +## SYNOPSIS + +`freeswitch` [] + +## 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` : + Run setuid after starting the switch. + + * `-g` : + 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` : + Set the prefix directory. + + * `-cfgname` : + Set the pathname to the main configuration file. + + * `-conf` : + Set the directory for configuration files. + + * `-log` : + Set the directory for log files. + + * `-run` : + Set the directory for temporary runtime files. + + * `-db` : + Set the directory for internal database files. + + * `-mod` : + Set the directory for runtime modules. + + * `-htdocs` : + Set the directory for htdocs. + + * `-scripts` : + Set the directory for call control scripts. + + * `-temp` : + Set the directory for temporary files. + + * `-grammar` : + Set the directory for grammar files. + + * `-recordings` : + Set the directory for call recordings. + + * `-storage` : + Set the directory for voicemail storage. + + * `-sounds` : + Set the directory for sound files. + +## AUTHORS + +FreeSWITCH was originally developed by `Anthony Minessale II +` with continued development by Anthony and a +team of active contributors. + +This man page and the packaging for Debian was written by `Travis +Cross `. + +## SEE ALSO + +sysctl(8), ulimit(1posix) diff --git a/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c b/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c index 0369e08b5c..005989bb75 100644 --- a/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c +++ b/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c @@ -238,7 +238,7 @@ enum { }; #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) typedef struct { @@ -478,7 +478,7 @@ void *sub_alloc(su_home_t *home, sub->sub_preload && size <= sub->sub_prsize) { /* Use preloaded memory */ size_t prused = sub->sub_prused + size + MEMCHECK_EXTRA; - prused = ALIGN(prused); + prused = __ALIGN(prused); if (prused <= sub->sub_prsize) { preload = (char *)sub->sub_preload + sub->sub_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; void *preload; - size = n * ALIGN(isize); + size = n * __ALIGN(isize); if (size > 65535) /* We have 16 bits... */ size = 65535 & (ALIGNMENT - 1); @@ -1334,13 +1334,13 @@ su_home_t *su_home_auto(void *area, isize_t size) { su_home_t *home; su_block_t *sub; - size_t homesize = ALIGN(sizeof *home); - size_t subsize = ALIGN(offsetof(su_block_t, sub_nodes[SUB_N_AUTO])); + size_t homesize = __ALIGN(sizeof *home); + size_t subsize = __ALIGN(offsetof(su_block_t, sub_nodes[SUB_N_AUTO])); size_t prepsize; 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) 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 += sua->sua_size + MEMCHECK_EXTRA; - p = ALIGN(p); + p = __ALIGN(p); if (p == sub->sub_prused) { size_t p2 = (char *)data - sub->sub_preload + size + MEMCHECK_EXTRA; - p2 = ALIGN(p2); + p2 = __ALIGN(p2); if (p2 <= sub->sub_prsize) { /* Extend/reduce existing preload */ 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; - size_t rsize = ALIGN(size); + size_t rsize = __ALIGN(size); hs->hs_rehash += (sub->sub_n != hs->hs_blocksize); 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; - size_t rsize = ALIGN(size); + size_t rsize = __ALIGN(size); if (preload) { hs->hs_frees.hsf_preload++; diff --git a/libs/srtp/crypto/include/datatypes.h b/libs/srtp/crypto/include/datatypes.h index 12e9ce99b6..cd137490ea 100644 --- a/libs/srtp/crypto/include/datatypes.h +++ b/libs/srtp/crypto/include/datatypes.h @@ -393,7 +393,7 @@ octet_string_set_to_zero(uint8_t *s, int len); # define be64_to_cpu(x) bswap_64((x)) #else -#if defined(__GNUC__) && defined(HAVE_X86) && !defined(__FreeBSD__) +#if defined(__GNUC__) && defined(HAVE_X86) && !defined(__FreeBSD__) && !defined(__OpenBSD__) /* Fall back. */ static inline uint32_t be32_to_cpu(uint32_t v) { /* optimized for x86. */ diff --git a/src/switch_channel.c b/src/switch_channel.c index 6e22b82d75..b32815aceb 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -3160,6 +3160,10 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_chan } switch_mutex_unlock(channel->state_mutex); + if (switch_channel_test_flag(channel, CF_LEG_HOLDING)) { + switch_channel_mark_hold(channel, SWITCH_FALSE); + } + if (!ok) { return channel->state; } diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index e81d4787c9..60c74e281b 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -647,21 +647,24 @@ 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_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) { - const char *ext = switch_channel_get_variable(chan_a, "hold_hangup_xfer_exten"); + if (switch_channel_test_flag(chan_a, CF_LEG_HOLDING)) { - switch_channel_stop_broadcast(chan_b); + 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"); - if (zstr(ext)) { - switch_call_cause_t cause = switch_channel_get_cause(chan_b); - if (cause == SWITCH_CAUSE_NONE) { - cause = SWITCH_CAUSE_NORMAL_CLEARING; + switch_channel_stop_broadcast(chan_b); + + if (zstr(ext)) { + switch_call_cause_t cause = switch_channel_get_cause(chan_b); + if (cause == SWITCH_CAUSE_NONE) { + cause = SWITCH_CAUSE_NORMAL_CLEARING; + } + switch_channel_hangup(chan_b, cause); + } else { + switch_channel_set_variable(chan_b, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE, ext); } - switch_channel_hangup(chan_b, cause); - } else { - 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)) {