[asterisk-commits] irroot: branch irroot/patches r334444 - /team/irroot/patches/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sun Sep 4 07:22:33 CDT 2011
Author: irroot
Date: Sun Sep 4 07:22:23 2011
New Revision: 334444
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=334444
Log:
Round robin routing fix for chan_misdn
Deadlock fix for app_queue
GWtimeout option fixup for res_fax
Modified:
team/irroot/patches/distrotech-trunk.patch
Modified: team/irroot/patches/distrotech-trunk.patch
URL: http://svnview.digium.com/svn/asterisk/team/irroot/patches/distrotech-trunk.patch?view=diff&rev=334444&r1=334443&r2=334444
==============================================================================
--- team/irroot/patches/distrotech-trunk.patch (original)
+++ team/irroot/patches/distrotech-trunk.patch Sun Sep 4 07:22:23 2011
@@ -1,7 +1,7 @@
Index: channels/chan_sip.c
===================================================================
---- channels/chan_sip.c (.../trunk) (revision 333507)
-+++ channels/chan_sip.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- channels/chan_sip.c (.../trunk) (revision 334442)
++++ channels/chan_sip.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -5489,17 +5489,23 @@
if (p->rtp && !p->srtp && setup_srtp(&p->srtp) < 0) {
@@ -88,7 +88,7 @@
}
if (udptlportno == -1) {
-@@ -11096,14 +11118,25 @@
+@@ -11097,14 +11119,25 @@
}
}
@@ -116,7 +116,7 @@
*a_crypto = sdp_crypto_attrib(srtp->crypto);
}
-@@ -11271,7 +11304,7 @@
+@@ -11272,7 +11305,7 @@
/* Ok, we need video. Let's add what we need for video and set codecs.
Video is handled differently than audio since we can not transcode. */
if (needvideo) {
@@ -125,7 +125,7 @@
ast_str_append(&m_video, 0, "m=video %d RTP/%s", ast_sockaddr_port(&vdest),
v_a_crypto ? "SAVP" : "AVP");
-@@ -11288,7 +11321,7 @@
+@@ -11289,7 +11322,7 @@
if (needtext) {
if (sipdebug_text)
ast_verbose("Lets set up the text sdp\n");
@@ -134,7 +134,7 @@
ast_str_append(&m_text, 0, "m=text %d RTP/%s", ast_sockaddr_port(&tdest),
t_a_crypto ? "SAVP" : "AVP");
if (debug) { /* XXX should I use tdest below ? */
-@@ -11301,7 +11334,7 @@
+@@ -11302,7 +11335,7 @@
/* We break with the "recommendation" and send our IP, in order that our
peer doesn't have to ast_gethostbyname() us */
@@ -143,7 +143,7 @@
ast_str_append(&m_audio, 0, "m=audio %d RTP/%s", ast_sockaddr_port(&dest),
a_crypto ? "SAVP" : "AVP");
-@@ -22962,7 +22995,8 @@
+@@ -22982,7 +23015,8 @@
transmit_response_with_t38_sdp(p, "200 OK", req, (reinvite ? XMIT_RELIABLE : (req->ignore ? XMIT_UNRELIABLE : XMIT_CRITICAL)));
} else if ((p->t38.state == T38_DISABLED) || (p->t38.state == T38_REJECTED)) {
/* If this is not a re-invite or something to ignore - it's critical */
@@ -153,7 +153,7 @@
ast_log(LOG_WARNING, "Target does not support required crypto\n");
transmit_response_reliable(p, "488 Not Acceptable Here (crypto)", req);
} else {
-@@ -27132,6 +27166,11 @@
+@@ -27160,6 +27194,11 @@
int duplicate = 0;
/* remove leading/trailing whitespace from mailbox string */
mbox = ast_strip(mbox);
@@ -165,7 +165,7 @@
strsep(&context, "@");
if (ast_strlen_zero(mbox)) {
-@@ -27604,7 +27643,15 @@
+@@ -27632,7 +27671,15 @@
} else if (!strcasecmp(v->name, "use_q850_reason")) {
ast_set2_flag(&peer->flags[1], ast_true(v->value), SIP_PAGE2_Q850_REASON);
} else if (!strcasecmp(v->name, "encryption")) {
@@ -182,7 +182,7 @@
} else if (!strcasecmp(v->name, "snom_aoc_enabled")) {
ast_set2_flag(&peer->flags[2], ast_true(v->value), SIP_PAGE3_SNOM_AOC);
}
-@@ -29542,7 +29589,7 @@
+@@ -29570,7 +29617,7 @@
return FALSE;
}
@@ -191,10 +191,125 @@
return FALSE;
}
+Index: channels/chan_misdn.c
+===================================================================
+--- channels/chan_misdn.c (.../trunk) (revision 334442)
++++ channels/chan_misdn.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
+@@ -7873,64 +7873,63 @@
+ }
+
+ if (rr) {
+- int robin_channel = rr->channel;
+ int port_start;
+- int next_chan = 1;
++ int bchan_start;
++ int port_up;
++ int check;
++ int maxbchans;
+
+- do {
+- port_start = 0;
+- for (port = misdn_cfg_get_next_port_spin(rr->port); port > 0 && port != port_start;
+- port = misdn_cfg_get_next_port_spin(port)) {
++ if (!rr->port) {
++ rr->port = misdn_cfg_get_next_port_spin(0);
++ }
+
+- if (!port_start) {
+- port_start = port;
+- }
++ if (!rr->channel) {
++ rr->channel = 1;
++ }
+
+- if (port >= port_start) {
+- next_chan = 1;
+- }
++ bchan_start = rr->channel;
++ port_start = rr->port;
++ do {
++ misdn_cfg_get(rr->port, MISDN_CFG_GROUPNAME, cfg_group, sizeof(cfg_group));
++ if (strcasecmp(cfg_group, group)) {
++ rr->port = misdn_cfg_get_next_port_spin(rr->port);
++ rr->channel = 1;
++ continue;
++ }
+
+- if (port <= port_start && next_chan) {
+- int maxbchans = misdn_lib_get_maxchans(port);
++ misdn_cfg_get(rr->port, MISDN_CFG_PMP_L1_CHECK, &check, sizeof(check));
++ port_up = misdn_lib_port_up(rr->port, check);
+
+- if (++robin_channel >= maxbchans) {
+- robin_channel = 1;
+- }
+- next_chan = 0;
+- }
++ if (!port_up) {
++ chan_misdn_log(1, rr->port, "L1 is not Up on this Port\n");
++ rr->port = misdn_cfg_get_next_port_spin(rr->port);
++ rr->channel = 1;
++ } else if (port_up < 0) {
++ ast_log(LOG_WARNING, "This port (%d) is blocked\n", rr->port);
++ rr->port = misdn_cfg_get_next_port_spin(rr->port);
++ rr->channel = 1;
++ } else {
++ chan_misdn_log(4, rr->port, "portup\n");
++ maxbchans = misdn_lib_get_maxchans(rr->port);
+
+- misdn_cfg_get(port, MISDN_CFG_GROUPNAME, cfg_group, sizeof(cfg_group));
++ for (;rr->channel <= maxbchans;rr->channel++) {
++ chan_misdn_log(4, rr->port, "Checking channel %d\n", rr->channel);
+
+- if (!strcasecmp(cfg_group, group)) {
+- int port_up;
+- int check;
+-
+- misdn_cfg_get(port, MISDN_CFG_PMP_L1_CHECK, &check, sizeof(check));
+- port_up = misdn_lib_port_up(port, check);
+-
+- if (check && !port_up) {
+- chan_misdn_log(1, port, "L1 is not Up on this Port\n");
++ if ((newbc = misdn_lib_get_free_bc(rr->port, rr->channel, 0, 0))) {
++ chan_misdn_log(4, rr->port, " Success! Found port:%d channel:%d\n", newbc->port, newbc->channel);
++ rr->channel++;
++ break;
+ }
+-
+- if (check && port_up < 0) {
+- ast_log(LOG_WARNING, "This port (%d) is blocked\n", port);
+- }
+-
+- if (port_up > 0) {
+- newbc = misdn_lib_get_free_bc(port, robin_channel, 0, 0);
+- if (newbc) {
+- chan_misdn_log(4, port, " Success! Found port:%d channel:%d\n", newbc->port, newbc->channel);
+- if (port_up) {
+- chan_misdn_log(4, port, "portup:%d\n", port_up);
+- }
+- rr->port = newbc->port;
+- rr->channel = newbc->channel;
+- break;
+- }
+- }
+ }
++ if (!newbc || (rr->channel > maxbchans)) {
++ rr->port = misdn_cfg_get_next_port_spin(rr->port);
++ rr->channel = 1;
++ }
++
+ }
+- } while (!newbc && robin_channel != rr->channel);
++ } while (!newbc && (rr->port > 0) &&
++ ((rr->port != port_start) || ((rr->port == port_start) && (rr->channel < bchan_start))));
++
+ } else {
+ for (port = misdn_cfg_get_next_port(0); port > 0;
+ port = misdn_cfg_get_next_port(port)) {
Index: channels/sip/include/sip.h
===================================================================
---- channels/sip/include/sip.h (.../trunk) (revision 333507)
-+++ channels/sip/include/sip.h (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- channels/sip/include/sip.h (.../trunk) (revision 334442)
++++ channels/sip/include/sip.h (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -353,9 +353,11 @@
@@ -210,8 +325,8 @@
Index: channels/sip/include/sdp_crypto.h
===================================================================
---- channels/sip/include/sdp_crypto.h (.../trunk) (revision 333507)
-+++ channels/sip/include/sdp_crypto.h (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- channels/sip/include/sdp_crypto.h (.../trunk) (revision 334442)
++++ channels/sip/include/sdp_crypto.h (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -31,6 +31,7 @@
#include <asterisk/rtp_engine.h>
@@ -245,8 +360,8 @@
/*! \brief Return the a_crypto value of the sdp_crypto struct
Index: channels/sip/include/srtp.h
===================================================================
---- channels/sip/include/srtp.h (.../trunk) (revision 333507)
-+++ channels/sip/include/srtp.h (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- channels/sip/include/srtp.h (.../trunk) (revision 334442)
++++ channels/sip/include/srtp.h (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -34,6 +34,8 @@
#define SRTP_ENCR_OPTIONAL (1 << 1) /* SRTP encryption optional */
#define SRTP_CRYPTO_ENABLE (1 << 2)
@@ -258,8 +373,8 @@
struct sip_srtp {
Index: channels/sip/sdp_crypto.c
===================================================================
---- channels/sip/sdp_crypto.c (.../trunk) (revision 333507)
-+++ channels/sip/sdp_crypto.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- channels/sip/sdp_crypto.c (.../trunk) (revision 334442)
++++ channels/sip/sdp_crypto.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -32,6 +32,7 @@
#include "asterisk/options.h"
#include "asterisk/utils.h"
@@ -310,8 +425,8 @@
Index: channels/chan_local.c
===================================================================
---- channels/chan_local.c (.../trunk) (revision 333507)
-+++ channels/chan_local.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- channels/chan_local.c (.../trunk) (revision 334442)
++++ channels/chan_local.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -588,6 +588,7 @@
static int local_write(struct ast_channel *ast, struct ast_frame *f)
{
@@ -343,8 +458,8 @@
if (!ast_test_flag(p, LOCAL_ALREADY_MASQED)) {
Index: configure.ac
===================================================================
---- configure.ac (.../trunk) (revision 333507)
-+++ configure.ac (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- configure.ac (.../trunk) (revision 334442)
++++ configure.ac (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -1721,7 +1721,7 @@
AST_EXT_LIB_CHECK([SUPPSERV], [suppserv], [encodeFac], [mISDNuser/suppserv.h])
AST_C_DEFINE_CHECK([MISDN_FAC_RESULT], [Fac_RESULT], [mISDNuser/suppserv.h])
@@ -356,8 +471,8 @@
Index: apps/app_readexten.c
===================================================================
---- apps/app_readexten.c (.../trunk) (revision 333507)
-+++ apps/app_readexten.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- apps/app_readexten.c (.../trunk) (revision 334442)
++++ apps/app_readexten.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -96,24 +96,6 @@
</variablelist>
</description>
@@ -443,9 +558,38 @@
Index: apps/app_queue.c
===================================================================
---- apps/app_queue.c (.../trunk) (revision 333507)
-+++ apps/app_queue.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
-@@ -5100,8 +5100,26 @@
+--- apps/app_queue.c (.../trunk) (revision 334442)
++++ apps/app_queue.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
+@@ -4109,6 +4109,7 @@
+ struct ao2_iterator queue_iter;
+
+ if (shared_lastcall) {
++ ao2_lock(queues);
+ queue_iter = ao2_iterator_init(queues, 0);
+ while ((qtmp = ao2_t_iterator_next(&queue_iter, "Iterate through queues"))) {
+ ao2_lock(qtmp);
+@@ -4122,6 +4123,7 @@
+ queue_t_unref(qtmp, "Done with iterator");
+ }
+ ao2_iterator_destroy(&queue_iter);
++ ao2_unlock(queues);
+ } else {
+ ao2_lock(q);
+ time(&member->lastcall);
+@@ -4672,9 +4674,10 @@
+ orig = to;
+ ++qe->pending;
+ ao2_unlock(qe->parent);
++ if (need_weight) {
++ ao2_unlock(queues);
++ }
+ ring_one(qe, outgoing, &numbusies);
+- if (need_weight)
+- ao2_unlock(queues);
+ lpeer = wait_for_answer(qe, outgoing, &to, &digit, numbusies, ast_test_flag(&(bridge_config.features_caller), AST_FEATURE_DISCONNECT), forwardsallowed, update_connectedline);
+ /* The ast_channel_datastore_remove() function could fail here if the
+ * datastore was moved to another channel during a masquerade. If this is
+@@ -5100,8 +5103,26 @@
qe->handled++;
ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "CONNECT", "%ld|%s|%ld", (long) time(NULL) - qe->start, peer->uniqueid,
(long)(orig - to > 0 ? (orig - to) / 1000 : 0));
@@ -476,9 +620,9 @@
"Queue: %s\r\n"
Index: CHANGES
===================================================================
---- CHANGES (.../trunk) (revision 333507)
-+++ CHANGES (.../team/irroot/distrotech-customers-trunk) (revision 333507)
-@@ -201,6 +201,8 @@
+--- CHANGES (.../trunk) (revision 334442)
++++ CHANGES (.../team/irroot/distrotech-customers-trunk) (revision 334442)
+@@ -205,6 +205,8 @@
SIP Changes
-----------
* Add T38 support for REJECTED state where T.38 Negotiation is explicitly rejected.
@@ -489,8 +633,8 @@
-------------
Index: Makefile
===================================================================
---- Makefile (.../trunk) (revision 333507)
-+++ Makefile (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- Makefile (.../trunk) (revision 334442)
++++ Makefile (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -127,7 +127,7 @@
# Asterisk.conf is located in ASTETCDIR or by using the -C flag
# when starting Asterisk
@@ -502,8 +646,8 @@
# If you use Apache, you may determine by a grep 'DocumentRoot' of your httpd.conf file
Index: funcs/func_dialplan.c
===================================================================
---- funcs/func_dialplan.c (.../trunk) (revision 333507)
-+++ funcs/func_dialplan.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- funcs/func_dialplan.c (.../trunk) (revision 334442)
++++ funcs/func_dialplan.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -51,7 +51,24 @@
<para>This function returns <literal>1</literal> if the target exits. Otherwise, it returns <literal>0</literal>.</para>
</description>
@@ -600,9 +744,9 @@
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Dialplan Context/Extension/Priority Checking Functions");
Index: main/channel.c
===================================================================
---- main/channel.c (.../trunk) (revision 333507)
-+++ main/channel.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
-@@ -4925,6 +4925,11 @@
+--- main/channel.c (.../trunk) (revision 334442)
++++ main/channel.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
+@@ -4964,6 +4964,11 @@
apply_plc(chan, fr);
}
@@ -614,7 +758,7 @@
/* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
if (ast_format_cmp(&fr->subclass.format, &chan->rawwriteformat) != AST_FORMAT_CMP_NOT_EQUAL)
f = fr;
-@@ -7346,6 +7351,8 @@
+@@ -7418,6 +7423,8 @@
long time_left_ms=0;
char caller_warning = 0;
char callee_warning = 0;
@@ -623,7 +767,7 @@
*fo = NULL;
-@@ -7425,6 +7432,17 @@
+@@ -7497,6 +7504,17 @@
ast_indicate(c0, AST_CONTROL_SRCUPDATE);
ast_indicate(c1, AST_CONTROL_SRCUPDATE);
@@ -643,8 +787,8 @@
int to;
Index: configs/sip.conf.sample
===================================================================
---- configs/sip.conf.sample (.../trunk) (revision 333507)
-+++ configs/sip.conf.sample (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- configs/sip.conf.sample (.../trunk) (revision 334442)
++++ configs/sip.conf.sample (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -901,6 +901,9 @@
;encryption=no ; Whether to offer SRTP encrypted media (and only SRTP encrypted media)
; on outgoing calls to a peer. Calls will fail with HANGUPCAUSE=58 if
@@ -657,9 +801,9 @@
; For additional information on ARA, the Asterisk Realtime Architecture,
Index: res/res_fax.c
===================================================================
---- res/res_fax.c (.../trunk) (revision 333507)
-+++ res/res_fax.c (.../team/irroot/distrotech-customers-trunk) (revision 333507)
-@@ -228,10 +228,33 @@
+--- res/res_fax.c (.../trunk) (revision 334442)
++++ res/res_fax.c (.../team/irroot/distrotech-customers-trunk) (revision 334442)
+@@ -225,10 +225,33 @@
<ref type="application">SendFax</ref>
</see-also>
</function>
@@ -693,69 +837,7 @@
struct debug_info_history {
unsigned int consec_frames;
-@@ -2423,7 +2446,7 @@
- ast_dsp_set_faxmode(gateway->peer_dsp, DSP_FAXMODE_DETECT_V21);
-
- details->caps = AST_FAX_TECH_GATEWAY;
-- if (details->gateway_timeout && !(gateway->s = fax_session_reserve(details, &gateway->token))) {
-+ if (!(gateway->s = fax_session_reserve(details, &gateway->token))) {
- details->caps |= ~AST_FAX_TECH_GATEWAY;
- ast_log(LOG_ERROR, "Can't reserve a FAX session, gateway attempt failed.\n");
- ao2_ref(gateway, -1);
-@@ -2507,7 +2530,6 @@
-
- gateway->t38_state = T38_STATE_NEGOTIATING;
- gateway->timeout_start = ast_tvnow();
-- details->gateway_timeout = FAX_GATEWAY_TIMEOUT;
-
- ast_debug(1, "requesting T.38 for gateway session for %s\n", chan->name);
- return fp;
-@@ -2600,7 +2622,6 @@
- t38_parameters_ast_to_fax(&details->their_t38_parameters, control_params);
- gateway->t38_state = T38_STATE_UNKNOWN;
- gateway->timeout_start = ast_tvnow();
-- details->gateway_timeout = FAX_GATEWAY_TIMEOUT;
- ao2_ref(details, -1);
- return f;
- } else if (state == T38_STATE_UNAVAILABLE || state == T38_STATE_REJECTED) {
-@@ -2638,7 +2659,6 @@
- t38_parameters_ast_to_fax(&details->their_t38_parameters, control_params);
- gateway->t38_state = T38_STATE_UNKNOWN;
- gateway->timeout_start = ast_tvnow();
-- details->gateway_timeout = FAX_GATEWAY_TIMEOUT;
-
- ast_debug(1, "%s is attempting to negotiate T.38 after we already sent a negotiation request based on v21 preamble detection\n", active->name);
- ao2_ref(details, -1);
-@@ -2882,9 +2902,7 @@
- return f;
- }
-
-- if (details->gateway_timeout) {
-- gateway->timeout_start = ast_tvnow();
-- }
-+ gateway->timeout_start = ast_tvnow();
-
- /* we are bridged, change r/w formats to SLIN for v21 preamble
- * detection and T.30 */
-@@ -2904,14 +2922,14 @@
- gateway->bridged = 1;
- }
-
-- if (gateway->bridged && !ast_tvzero(gateway->timeout_start)) {
-+ if (details->gateway_timeout && gateway->bridged && !ast_tvzero(gateway->timeout_start)) {
- if (ast_tvdiff_ms(ast_tvnow(), gateway->timeout_start) > details->gateway_timeout) {
-- ast_debug(1, "no fax activity between %s and %s after %d ms, disabling gateway\n", chan->name, peer->name, FAX_GATEWAY_TIMEOUT);
-+ ast_debug(1, "no fax activity between %s and %s after %d ms, disabling gateway\n", chan->name, peer->name, details->gateway_timeout);
- ast_framehook_detach(chan, gateway->framehook);
- details->gateway_id = -1;
-
- ast_string_field_set(details, result, "FAILED");
-- ast_string_field_build(details, resultstr, "no fax activity after %d ms", FAX_GATEWAY_TIMEOUT);
-+ ast_string_field_build(details, resultstr, "no fax activity after %d ms", details->gateway_timeout);
- ast_string_field_set(details, error, "TIMEOUT");
- set_channel_variables(chan, details);
- ao2_ref(details, -1);
-@@ -3071,6 +3089,197 @@
+@@ -3068,6 +3091,197 @@
return gateway->framehook;
}
@@ -953,7 +1035,7 @@
/*! \brief hash callback for ao2 */
static int session_hash_cb(const void *obj, const int flags)
{
-@@ -3631,6 +3840,10 @@
+@@ -3630,6 +3844,10 @@
ast_log(LOG_WARNING, "failed to unregister '%s'\n", app_receivefax);
}
@@ -964,7 +1046,7 @@
if (fax_logger_level != -1) {
ast_logger_unregister_level("FAX");
}
-@@ -3671,8 +3884,12 @@
+@@ -3670,8 +3888,12 @@
return AST_MODULE_LOAD_DECLINE;
}
@@ -980,8 +1062,8 @@
return res;
Index: contrib/scripts/safe_asterisk
===================================================================
---- contrib/scripts/safe_asterisk (.../trunk) (revision 333507)
-+++ contrib/scripts/safe_asterisk (.../team/irroot/distrotech-customers-trunk) (revision 333507)
+--- contrib/scripts/safe_asterisk (.../trunk) (revision 334442)
++++ contrib/scripts/safe_asterisk (.../team/irroot/distrotech-customers-trunk) (revision 334442)
@@ -6,14 +6,14 @@
ASTVARLOGDIR=__ASTERISK_LOG_DIR__
@@ -1024,7 +1106,7 @@
Added: automerge
+ *
Added: svnmerge-integrated
- + /trunk:1-333438
+ + /trunk:1-334370
Added: automerge-email
+ gregory at distrotech.co.za
More information about the asterisk-commits
mailing list