<p>Michael Bradeen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/19571">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">app_osplookup: Remove deprecated module.<br><br>ASTERISK-30302<br><br>Change-Id: I2268189646fa0b587675d8619322818143172474<br>---<br>D apps/app_osplookup.c<br>D autoconf/ast_check_osptk.m4<br>M build_tools/menuselect-deps.in<br>M configure<br>M configure.ac<br>M contrib/scripts/install_prereq<br>A doc/UPGRADE-staging/app_osplookup_removal.txt<br>M include/asterisk/autoconfig.h.in<br>M makeopts.in<br>M menuselect/example_menuselect-tree<br>M menuselect/test/build_tools/menuselect-deps<br>M menuselect/test/menuselect-tree<br>12 files changed, 18 insertions(+), 3,437 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/71/19571/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/app_osplookup.c b/apps/app_osplookup.c</span><br><span>deleted file mode 100644</span><br><span>index f80324f..0000000</span><br><span>--- a/apps/app_osplookup.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,3173 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Asterisk -- An open source telephony toolkit.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 1999 - 2006, Digium, Inc.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Mark Spencer <markster@digium.com></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * See http://www.asterisk.org for more information about</span><br><span style="color: hsl(0, 100%, 40%);">- * the Asterisk project. Please do not directly contact</span><br><span style="color: hsl(0, 100%, 40%);">- * any of the maintainers of this project for assistance;</span><br><span style="color: hsl(0, 100%, 40%);">- * the project provides a web site, mailing lists and IRC</span><br><span style="color: hsl(0, 100%, 40%);">- * channels for your use.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software, distributed under the terms of</span><br><span style="color: hsl(0, 100%, 40%);">- * the GNU General Public License Version 2. See the LICENSE file</span><br><span style="color: hsl(0, 100%, 40%);">- * at the top of the source tree.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \file</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Open Settlement Protocol (OSP) Applications</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \author Mark Spencer <markster@digium.com></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \extref The OSP Toolkit: http://www.transnexus.com</span><br><span style="color: hsl(0, 100%, 40%);">- * \extref OpenSSL http://www.openssl.org</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * \ingroup applications</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*** MODULEINFO</span><br><span style="color: hsl(0, 100%, 40%);">-       <depend>osptk</depend></span><br><span style="color: hsl(0, 100%, 40%);">-      <depend>openssl</depend></span><br><span style="color: hsl(0, 100%, 40%);">-    <defaultenabled>no</defaultenabled></span><br><span style="color: hsl(0, 100%, 40%);">- <support_level>deprecated</support_level></span><br><span style="color: hsl(0, 100%, 40%);">-   <deprecated_in>19</deprecated_in></span><br><span style="color: hsl(0, 100%, 40%);">-   <removed_in>21</removed_in></span><br><span style="color: hsl(0, 100%, 40%);">- ***/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osp/osp.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osp/osputils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osp/ospb64.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/paths.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/lock.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/config.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/utils.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/causes.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/channel.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/app.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/module.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/pbx.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "asterisk/cli.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*** DOCUMENTATION</span><br><span style="color: hsl(0, 100%, 40%);">-     <application name="OSPAuth" language="en_US"></span><br><span style="color: hsl(0, 100%, 40%);">-         <synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-                        OSP Authentication.</span><br><span style="color: hsl(0, 100%, 40%);">-             </synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-               <syntax></span><br><span style="color: hsl(0, 100%, 40%);">-                  <parameter name="provider"></span><br><span style="color: hsl(0, 100%, 40%);">-                             <para>The name of the provider that authenticates the call.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                  </parameter></span><br><span style="color: hsl(0, 100%, 40%);">-                      <parameter name="options"></span><br><span style="color: hsl(0, 100%, 40%);">-                              <para>Reserverd.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                     </parameter></span><br><span style="color: hsl(0, 100%, 40%);">-              </syntax></span><br><span style="color: hsl(0, 100%, 40%);">-         <description></span><br><span style="color: hsl(0, 100%, 40%);">-                     <para>Authenticate a call by OSP.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                    <para>Input variables:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                       <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPINPEERIP"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The last hop IP address.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINTOKEN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The inbound OSP token.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                         </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                   <para>Output variables:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                      <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPINHANDLE"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The inbound call OSP transaction handle.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINTIMELIMIT"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The inbound call duration limit in seconds.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                   <para>This application sets the following channel variable upon completion:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                  <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPAUTHSTATUS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The status of OSPAuth attempt as a text string, one of</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <value name="SUCCESS" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <value name="FAILED" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <value name="ERROR" /></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-           </description></span><br><span style="color: hsl(0, 100%, 40%);">-            <see-also></span><br><span style="color: hsl(0, 100%, 40%);">-                        <ref type="application">OSPLookup</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                   <ref type="application">OSPNext</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                     <ref type="application">OSPFinish</ref></span><br><span style="color: hsl(0, 100%, 40%);">-           </see-also></span><br><span style="color: hsl(0, 100%, 40%);">-       </application></span><br><span style="color: hsl(0, 100%, 40%);">-    <application name="OSPLookup" language="en_US"></span><br><span style="color: hsl(0, 100%, 40%);">-               <synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-                        Lookup destination by OSP.</span><br><span style="color: hsl(0, 100%, 40%);">-              </synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-               <syntax></span><br><span style="color: hsl(0, 100%, 40%);">-                  <parameter name="exten" required="true"></span><br><span style="color: hsl(0, 100%, 40%);">-                              <para>The exten of the call.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                 </parameter></span><br><span style="color: hsl(0, 100%, 40%);">-                      <parameter name="provider"></span><br><span style="color: hsl(0, 100%, 40%);">-                             <para>The name of the provider that is used to route the call.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                       </parameter></span><br><span style="color: hsl(0, 100%, 40%);">-                      <parameter name="options"></span><br><span style="color: hsl(0, 100%, 40%);">-                              <enumlist></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <enum name="h"></span><br><span style="color: hsl(0, 100%, 40%);">-                                         <para>generate H323 call id for the outbound call</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                    </enum></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <enum name="s"></span><br><span style="color: hsl(0, 100%, 40%);">-                                         <para>generate SIP call id for the outbound call. Have not been implemented</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                  </enum></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <enum name="i"></span><br><span style="color: hsl(0, 100%, 40%);">-                                         <para>generate IAX call id for the outbound call. Have not been implemented</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                  </enum></span><br><span style="color: hsl(0, 100%, 40%);">-                           </enumlist></span><br><span style="color: hsl(0, 100%, 40%);">-                       </parameter></span><br><span style="color: hsl(0, 100%, 40%);">-              </syntax></span><br><span style="color: hsl(0, 100%, 40%);">-         <description></span><br><span style="color: hsl(0, 100%, 40%);">-                     <para>Looks up destination via OSP.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                  <para>Input variables:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                       <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPINACTUALSRC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The actual source device IP address in indirect mode.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINPEERIP"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The last hop IP address.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINTECH"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The inbound channel technology for the call.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINHANDLE"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The inbound call OSP transaction handle.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINTIMELIMIT"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The inbound call duration limit in seconds.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINNETWORKID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The inbound source network ID.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                         </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINNPRN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The inbound routing number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINNPCIC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The inbound carrier identification code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINNPDI"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The inbound number portability database dip indicator.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                         </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINSPID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The inbound service provider identity.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                         </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINOCN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                      <para>The inbound operator company number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINSPN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                      <para>The inbound service provider name.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                             </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINALTSPN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The inbound alternate service provider name.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINMCC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                      <para>The inbound mobile country code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINMNC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                      <para>The inbound mobile network code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINTOHOST"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The inbound To header host part.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINRPIDUSER"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The inbound Remote-Party-ID header user part.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINPAIUSER"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The inbound P-Asserted-Identify header user part.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINDIVUSER"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The inbound Diversion header user part.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINDIVHOST"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The inbound Diversion header host part.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINPCIUSER"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The inbound P-Charge-Info header user part.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINCUSTOMINFOn"></span><br><span style="color: hsl(0, 100%, 40%);">-                                      <para>The inbound custom information, where <literal>n</literal> is the index beginning with <literal>1</literal></span><br><span style="color: hsl(0, 100%, 40%);">-                                 upto <literal>8</literal>.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                             </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                   <para>Output variables:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                      <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPOUTHANDLE"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound call OSP transaction handle.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTTECH"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound channel technology for the call.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPDESTINATION"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The outbound destination IP address.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLING"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The outbound calling number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLED"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound called number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNETWORKID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <para>The outbound destination network ID.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNPRN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound routing number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNPCIC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The outbound carrier identification code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNPDI"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound number portability database dip indicator.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTSPID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound service provider identity.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTOCN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound operator company number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTSPN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound service provider name.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTALTSPN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound alternate service provider name.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTMCC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound mobile country code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTMNC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound mobile network code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTTOKEN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The outbound OSP token.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPDESTREMAILS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The number of remained destinations.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTTIMELIMIT"></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <para>The outbound call duration limit in seconds.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLIDTYPES"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound Call-ID types.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound Call-ID. Only for H.323.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPDIALSTR"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound Dial command string.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                   <para>This application sets the following channel variable upon completion:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                  <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPLOOKUPSTATUS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <para>The status of OSPLookup attempt as a text string, one of</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <value name="SUCCESS" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <value name="FAILED" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <value name="ERROR" /></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-           </description></span><br><span style="color: hsl(0, 100%, 40%);">-            <see-also></span><br><span style="color: hsl(0, 100%, 40%);">-                        <ref type="application">OSPAuth</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                     <ref type="application">OSPNext</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                     <ref type="application">OSPFinish</ref></span><br><span style="color: hsl(0, 100%, 40%);">-           </see-also></span><br><span style="color: hsl(0, 100%, 40%);">-       </application></span><br><span style="color: hsl(0, 100%, 40%);">-    <application name="OSPNext" language="en_US"></span><br><span style="color: hsl(0, 100%, 40%);">-         <synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-                        Lookup next destination by OSP.</span><br><span style="color: hsl(0, 100%, 40%);">-         </synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-               <description></span><br><span style="color: hsl(0, 100%, 40%);">-                     <para>Looks up the next destination via OSP.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                 <para>Input variables:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                       <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPINHANDLE"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The inbound call OSP transaction handle.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTHANDLE"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound call OSP transaction handle.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINTIMELIMIT"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The inbound call duration limit in seconds.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLIDTYPES"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound Call-ID types.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPDESTREMAILS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The number of remained destinations.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                   <para>Output variables:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                      <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPOUTTECH"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound channel technology.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPDESTINATION"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The destination IP address.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLING"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The outbound calling number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLED"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound called number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNETWORKID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <para>The outbound destination network ID.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNPRN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound routing number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNPCIC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The outbound carrier identification code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTNPDI"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound number portability database dip indicator.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTSPID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound service provider identity.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTOCN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound operator company number.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTSPN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound service provider name.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTALTSPN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound alternate service provider name.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTMCC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound mobile country code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTMNC"></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <para>The outbound mobile network code.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTTOKEN"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The outbound OSP token.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPDESTREMAILS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The number of remained destinations.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTTIMELIMIT"></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <para>The outbound call duration limit in seconds.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                           </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTCALLID"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound Call-ID. Only for H.323.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPDIALSTR"></span><br><span style="color: hsl(0, 100%, 40%);">-                                    <para>The outbound Dial command string.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                   <para>This application sets the following channel variable upon completion:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                  <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPNEXTSTATUS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The status of the OSPNext attempt as a text string, one of</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                     <value name="SUCCESS" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <value name="FAILED" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <value name="ERROR" /></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-           </description></span><br><span style="color: hsl(0, 100%, 40%);">-            <see-also></span><br><span style="color: hsl(0, 100%, 40%);">-                        <ref type="application">OSPAuth</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                     <ref type="application">OSPLookup</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                   <ref type="application">OSPFinish</ref></span><br><span style="color: hsl(0, 100%, 40%);">-           </see-also></span><br><span style="color: hsl(0, 100%, 40%);">-       </application></span><br><span style="color: hsl(0, 100%, 40%);">-    <application name="OSPFinish" language="en_US"></span><br><span style="color: hsl(0, 100%, 40%);">-               <synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-                        Report OSP entry.</span><br><span style="color: hsl(0, 100%, 40%);">-               </synopsis></span><br><span style="color: hsl(0, 100%, 40%);">-               <syntax></span><br><span style="color: hsl(0, 100%, 40%);">-                  <parameter name="cause"></span><br><span style="color: hsl(0, 100%, 40%);">-                                <para>Hangup cause.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                  </parameter></span><br><span style="color: hsl(0, 100%, 40%);">-                      <parameter name="options"></span><br><span style="color: hsl(0, 100%, 40%);">-                              <para>Reserved.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                      </parameter></span><br><span style="color: hsl(0, 100%, 40%);">-              </syntax></span><br><span style="color: hsl(0, 100%, 40%);">-         <description></span><br><span style="color: hsl(0, 100%, 40%);">-                     <para>Report call state.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                     <para>Input variables:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                       <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPINHANDLE"></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <para>The inbound call OSP transaction handle.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                               </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTHANDLE"></span><br><span style="color: hsl(0, 100%, 40%);">-                                  <para>The outbound call OSP transaction handle.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                              </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPAUTHSTATUS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The OSPAuth status.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPLOOKUPSTATUS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <para>The OSPLookup status.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPNEXTSTATUS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The OSPNext status.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                            </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPINAUDIOQOS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <para>The inbound call leg audio QoS string.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                         </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                               <variable name="OSPOUTAUDIOQOS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <para>The outbound call leg audio QoS string.</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                   <para>This application sets the following channel variable upon completion:</para></span><br><span style="color: hsl(0, 100%, 40%);">-                  <variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-                            <variable name="OSPFINISHSTATUS"></span><br><span style="color: hsl(0, 100%, 40%);">-                                       <para>The status of the OSPFinish attempt as a text string, one of</para></span><br><span style="color: hsl(0, 100%, 40%);">-                                   <value name="SUCCESS" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                        <value name="FAILED" /></span><br><span style="color: hsl(0, 100%, 40%);">-                                 <value name="ERROR" /></span><br><span style="color: hsl(0, 100%, 40%);">-                          </variable></span><br><span style="color: hsl(0, 100%, 40%);">-                       </variablelist></span><br><span style="color: hsl(0, 100%, 40%);">-           </description></span><br><span style="color: hsl(0, 100%, 40%);">-            <see-also></span><br><span style="color: hsl(0, 100%, 40%);">-                        <ref type="application">OSPAuth</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                     <ref type="application">OSPLookup</ref></span><br><span style="color: hsl(0, 100%, 40%);">-                   <ref type="application">OSPNext</ref></span><br><span style="color: hsl(0, 100%, 40%);">-             </see-also></span><br><span style="color: hsl(0, 100%, 40%);">-       </application></span><br><span style="color: hsl(0, 100%, 40%);">- ***/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Return statuses */</span><br><span style="color: hsl(0, 100%, 40%);">-#define AST_OSP_SUCCESS       ((char*)"SUCCESS")    /* Return status, success */</span><br><span style="color: hsl(0, 100%, 40%);">-#define AST_OSP_FAILED      ((char*)"FAILED")     /* Return status, failed */</span><br><span style="color: hsl(0, 100%, 40%);">-#define AST_OSP_ERROR        ((char*)"ERROR")      /* Return status, error */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Buffer Sizes */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_INTSTR         ((unsigned int)16)                      /* OSP signed/unsigned int string buffer size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_NORSTR         ((unsigned int)256)                     /* OSP normal string buffer size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_KEYSTR              ((unsigned int)1024)            /* OSP certificate string buffer size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_TOKSTR         ((unsigned int)4096)            /* OSP token string buffer size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_TECHSTR      ((unsigned int)32)                      /* OSP signed/unsigned int string buffer size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_UUID           ((unsigned int)16)                      /* UUID size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_UUIDSTR ((unsigned int)36)                      /* UUID string size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_QOSSTR           ((unsigned int)1024)            /* QoS string buffer size */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIZE_OUTSTR             ((unsigned int)288)             /* OSP out size for osp_convert_inout */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Call ID Type*/</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_CALLID_UNDEF       ((unsigned int)0)                       /* Undefined */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_CALLID_SIP           ((unsigned int)(1 << 0))  /* SIP */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_CALLID_H323                ((unsigned int)(1 << 1))  /* H.323 */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_CALLID_IAX               ((unsigned int)(1 << 2))  /* IAX2 */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_CALLID_MAXNUM     ((unsigned int)3)                       /* Max number of call ID types */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Supported Destination Protocols */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_PROT_SIP          ((const char*)"SIP")          /* SIP protocol name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_PROT_H323            ((const char*)"H323")         /* H.323 Q.931 protocol name*/</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_PROT_IAX              ((const char*)"IAX")          /* IAX2 protocol name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_PROT_SKYPE          ((const char*)"SKYPE")                /* Skype protocol name */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP supported Destination Tech */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_TECH_SIP               ((const char*)"SIP")          /* SIP tech name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_TECH_H323                ((const char*)"H323")         /* OH323 tech name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_TECH_IAX               ((const char*)"IAX2")         /* IAX2 tech name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_TECH_SKYPE              ((const char*)"SKYPE")                /* Skype tech name */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* SIP OSP header field name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SIP_HEADER              ((const char*)"P-OSP-Auth-Token")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Authentication Policy */</span><br><span style="color: hsl(0, 100%, 40%);">-enum osp_authpolicy {</span><br><span style="color: hsl(0, 100%, 40%);">- OSP_AUTH_NO = 0,        /* Accept any call */</span><br><span style="color: hsl(0, 100%, 40%);">-   OSP_AUTH_YES,           /* Accept call with valid OSP token or without OSP token */</span><br><span style="color: hsl(0, 100%, 40%);">-     OSP_AUTH_EXC            /* Only accept call with valid OSP token */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Work Mode */</span><br><span style="color: hsl(0, 100%, 40%);">-enum osp_workmode {</span><br><span style="color: hsl(0, 100%, 40%);">-     OSP_MODE_DIRECT= 0,     /* Direct */</span><br><span style="color: hsl(0, 100%, 40%);">-    OSP_MODE_INDIRECT       /* Indirect */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Service Type */</span><br><span style="color: hsl(0, 100%, 40%);">-enum osp_srvtype {</span><br><span style="color: hsl(0, 100%, 40%);">-        OSP_SRV_VOICE = 0,      /* Normal voice service */</span><br><span style="color: hsl(0, 100%, 40%);">-      OSP_SRV_NPQUERY         /* Ported number query service */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Constants */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_OK                                    ((int)1)                                        /* OSP function call successful */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_FAILED                            ((int)0)                                        /* OSP function call failed */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_ERROR                         ((int)-1)                                       /* OSP function call error */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_AST_OK                         ((int)0)                                        /* Asterisk function call successful */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_AST_ERROR                    ((int)-1)                                       /* Asterisk function call error */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_INVALID_HANDLE            ((int)-1)                                       /* Invalid OSP handle, provider, transaction etc. */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_CONFIG_FILE                     ((const char*)"osp.conf")     /* OSP configuration file name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_GENERAL_CAT                        ((const char*)"general")      /* OSP global configuration context name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_PROVIDER             ((const char*)"default")      /* OSP default provider context name */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MAX_CERTS                    ((unsigned int)10)                      /* OSP max number of cacerts */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MAX_SPOINTS                  ((unsigned int)10)                      /* OSP max number of service points */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_MAXCONNECT                ((unsigned int)20)                      /* OSP default max_connections */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MIN_MAXCONNECT             ((unsigned int)1)                       /* OSP min max_connections */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MAX_MAXCONNECT         ((unsigned int)1000)            /* OSP max max_connections */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_RETRYDELAY         ((unsigned int)0)                       /* OSP default retry delay */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MIN_RETRYDELAY         ((unsigned int)0)                       /* OSP min retry delay */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MAX_RETRYDELAY             ((unsigned int)10)                      /* OSP max retry delay */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_RETRYLIMIT             ((unsigned int)2)                       /* OSP default retry times */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MIN_RETRYLIMIT         ((unsigned int)0)                       /* OSP min retry times */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MAX_RETRYLIMIT             ((unsigned int)100)                     /* OSP max retry times */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_TIMEOUT                        ((unsigned int)500)                     /* OSP default timeout in ms */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MIN_TIMEOUT                  ((unsigned int)200)                     /* OSP min timeout in ms */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MAX_TIMEOUT                      ((unsigned int)10000)           /* OSP max timeout in ms */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_AUTHPOLICY           OSP_AUTH_YES                            /* OSP default auth policy, yes */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_AUDIT_URL                 ((const char*)"localhost")    /* OSP default Audit URL */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_LOCAL_VALIDATION ((int)1)                                        /* Validate OSP token locally */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_SSL_LIFETIME                ((unsigned int)300)                     /* SSL life time, in seconds */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_HTTP_PERSISTENCE     ((int)1)                                        /* In seconds */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_CUSTOMER_ID                 ((const char*)"")                     /* OSP customer ID */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEVICE_ID                      ((const char*)"")                     /* OSP device ID */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_MAXDESTS             ((unsigned int)12)                      /* OSP default max number of destinations */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_TIMELIMIT           ((unsigned int)0)                       /* OSP default duration limit, no limit */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_PROTOCOL              OSP_PROT_SIP                            /* OSP default signaling protocol, SIP */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_WORKMODE               OSP_MODE_DIRECT                         /* OSP default work mode, direct */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_SRVTYPE                      OSP_SRV_VOICE                           /* OSP default service type, voice */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_MAX_CUSTOMINFO         ((unsigned int)8)                       /* OSP max number of custom info */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_INTSTATS             ((int)-1)                                       /* OSP default int statistic */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSP_DEF_FLOATSTATS               ((float)-1)                                     /* OSP default float statistic */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Provider */</span><br><span style="color: hsl(0, 100%, 40%);">-struct osp_provider {</span><br><span style="color: hsl(0, 100%, 40%);">-        OSPTPROVHANDLE handle;                                                  /* OSP provider handle */</span><br><span style="color: hsl(0, 100%, 40%);">-       char name[OSP_SIZE_NORSTR];                                             /* OSP provider context name */</span><br><span style="color: hsl(0, 100%, 40%);">- char privatekey[OSP_SIZE_NORSTR];                               /* OSP private key file name */</span><br><span style="color: hsl(0, 100%, 40%);">- char localcert[OSP_SIZE_NORSTR];                                /* OSP local cert file name */</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int canum;                                                             /* Number of cacerts */</span><br><span style="color: hsl(0, 100%, 40%);">- char cacerts[OSP_MAX_CERTS][OSP_SIZE_NORSTR];   /* Cacert file names */</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int spnum;                                                             /* Number of service points */</span><br><span style="color: hsl(0, 100%, 40%);">-  char spoints[OSP_MAX_SPOINTS][OSP_SIZE_NORSTR]; /* Service point URLs */</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int maxconnect;                                                /* Max number of connections */</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int retrydelay;                                                /* Retry delay */</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int retrylimit;                                                /* Retry limit */</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int timeout;                                                   /* Timeout in ms */</span><br><span style="color: hsl(0, 100%, 40%);">-     char source[OSP_SIZE_NORSTR];                                   /* IP of self */</span><br><span style="color: hsl(0, 100%, 40%);">-        enum osp_authpolicy authpolicy;                                 /* OSP authentication policy */</span><br><span style="color: hsl(0, 100%, 40%);">- const char* defprotocol;                                                /* OSP default signaling protocol */</span><br><span style="color: hsl(0, 100%, 40%);">-    enum osp_workmode workmode;                                             /* OSP work mode */</span><br><span style="color: hsl(0, 100%, 40%);">-     enum osp_srvtype srvtype;                                               /* OSP service type */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osp_provider* next;                                              /* Pointer to next OSP provider */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Call ID */</span><br><span style="color: hsl(0, 100%, 40%);">-struct osp_callid {</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned char buf[OSP_SIZE_NORSTR];             /* Call ID string */</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int len;                                               /* Call ID length */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Number Portability Data */</span><br><span style="color: hsl(0, 100%, 40%);">-struct osp_npdata {</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* rn;                                                 /* Rounding Number */</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* cic;                                                /* Carrier Identification Code */</span><br><span style="color: hsl(0, 100%, 40%);">-       int npdi;                                                               /* NP Database Dip Indicator */</span><br><span style="color: hsl(0, 100%, 40%);">- const char* opname[OSPC_OPNAME_NUMBER]; /* Operator Names */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* SIP Header Parameters */</span><br><span style="color: hsl(0, 100%, 40%);">-struct osp_headers {</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* rpiduser;                                   /* Remote-Party-ID header user info */</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* paiuser;                                    /* P-Asserted-Identity header user info */</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* divuser;                                    /* Diversion header user info */</span><br><span style="color: hsl(0, 100%, 40%);">-        const char* divhost;                                    /* Diversion header host info */</span><br><span style="color: hsl(0, 100%, 40%);">-        const char* pciuser;                                    /* P-Charge-Info header user info */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Application In/Output Results */</span><br><span style="color: hsl(0, 100%, 40%);">-struct osp_results {</span><br><span style="color: hsl(0, 100%, 40%);">-       int inhandle;                                                                           /* Inbound transaction handle */</span><br><span style="color: hsl(0, 100%, 40%);">-        int outhandle;                                                                          /* Outbound transaction handle */</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int intimelimit;                                                       /* Inbound duration limit */</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int outtimelimit;                                                      /* Outbound duration limit */</span><br><span style="color: hsl(0, 100%, 40%);">-   char intech[OSP_SIZE_TECHSTR];                                          /* Inbound Asterisk TECH string */</span><br><span style="color: hsl(0, 100%, 40%);">-      char outtech[OSP_SIZE_TECHSTR];                                         /* Outbound Asterisk TECH string */</span><br><span style="color: hsl(0, 100%, 40%);">-     char dest[OSP_SIZE_NORSTR];                                                     /* Outbound destination IP address */</span><br><span style="color: hsl(0, 100%, 40%);">-   char calling[OSP_SIZE_NORSTR];                                          /* Outbound calling number, may be translated */</span><br><span style="color: hsl(0, 100%, 40%);">-        char called[OSP_SIZE_NORSTR];                                           /* Outbound called number, may be translated */</span><br><span style="color: hsl(0, 100%, 40%);">- char token[OSP_SIZE_TOKSTR];                                            /* Outbound OSP token */</span><br><span style="color: hsl(0, 100%, 40%);">-        char networkid[OSP_SIZE_NORSTR];                                        /* Outbound network ID */</span><br><span style="color: hsl(0, 100%, 40%);">-       char nprn[OSP_SIZE_NORSTR];                                                     /* Outbound NP routing number */</span><br><span style="color: hsl(0, 100%, 40%);">-        char npcic[OSP_SIZE_NORSTR];                                            /* Outbound NP carrier identification code */</span><br><span style="color: hsl(0, 100%, 40%);">-   int npdi;                                                                                       /* Outbound NP database dip indicator */</span><br><span style="color: hsl(0, 100%, 40%);">-        char opname[OSPC_OPNAME_NUMBER][OSP_SIZE_NORSTR];       /* Outbound Operator names */</span><br><span style="color: hsl(0, 100%, 40%);">-   unsigned int numdests;                                                          /* Number of remain outbound destinations */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osp_callid outcallid;                                            /* Outbound call ID */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Call Leg */</span><br><span style="color: hsl(0, 100%, 40%);">-enum osp_callleg {</span><br><span style="color: hsl(0, 100%, 40%);">-    OSP_CALL_INBOUND,       /* Inbound call leg */</span><br><span style="color: hsl(0, 100%, 40%);">-  OSP_CALL_OUTBOUND       /* Outbound call leg */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Media Stream Direction */</span><br><span style="color: hsl(0, 100%, 40%);">-enum osp_direction {</span><br><span style="color: hsl(0, 100%, 40%);">-   OSP_DIR_RX = 0,         /* Receive */</span><br><span style="color: hsl(0, 100%, 40%);">-   OSP_DIR_TX,                     /* Send */</span><br><span style="color: hsl(0, 100%, 40%);">-      OSP_DIR_NUMBER          /* Number of directions */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Metrics */</span><br><span style="color: hsl(0, 100%, 40%);">-struct osp_metrics {</span><br><span style="color: hsl(0, 100%, 40%);">-       int value;                      /* Value */</span><br><span style="color: hsl(0, 100%, 40%);">-     float min;                      /* Minimum */</span><br><span style="color: hsl(0, 100%, 40%);">-   float max;                      /* Maximum */</span><br><span style="color: hsl(0, 100%, 40%);">-   float avg;                      /* Average */</span><br><span style="color: hsl(0, 100%, 40%);">-   float sdev;                     /* Standard deviation */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Module Global Variables */</span><br><span style="color: hsl(0, 100%, 40%);">-AST_MUTEX_DEFINE_STATIC(osp_lock);                                                   /* Lock of OSP provider list */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_initialized = 0;                                                          /* Init flag */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_hardware = 0;                                                             /* Hardware acceleration flag */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_security = 0;                                                            /* Using security features flag */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct osp_provider* osp_providers = NULL;                     /* OSP provider list */</span><br><span style="color: hsl(0, 100%, 40%);">-static unsigned int osp_tokenformat = TOKEN_ALGO_SIGNED; /* Token format supported */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP default certificates */</span><br><span style="color: hsl(0, 100%, 40%);">-const char* B64PKey = "MIIBOgIBAAJBAK8t5l+PUbTC4lvwlNxV5lpl+2dwSZGW46dowTe6y133XyVEwNiiRma2YNk3xKs/TJ3Wl9Wpns2SYEAJsFfSTukCAwEAAQJAPz13vCm2GmZ8Zyp74usTxLCqSJZNyMRLHQWBM0g44Iuy4wE3vpi7Wq+xYuSOH2mu4OddnxswCP4QhaXVQavTAQIhAOBVCKXtppEw9UaOBL4vW0Ed/6EA/1D8hDW6St0h7EXJAiEAx+iRmZKhJD6VT84dtX5ZYNVk3j3dAcIOovpzUj9a0CECIEduTCapmZQ5xqAEsLXuVlxRtQgLTUD4ZxDElPn8x0MhAiBE2HlcND0+qDbvtwJQQOUzDgqg5xk3w8capboVdzAlQQIhAMC+lDL7+gDYkNAft5Mu+NObJmQs4Cr+DkDFsKqoxqrm";</span><br><span style="color: hsl(0, 100%, 40%);">-const char* B64LCert = "MIIBeTCCASMCEHqkOHVRRWr+1COq3CR/xsowDQYJKoZIhvcNAQEEBQAwOzElMCMGA1UEAxMcb3NwdGVzdHNlcnZlci50cmFuc25leHVzLmNvbTESMBAGA1UEChMJT1NQU2VydmVyMB4XDTA1MDYyMzAwMjkxOFoXDTA2MDYyNDAwMjkxOFowRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCvLeZfj1G0wuJb8JTcVeZaZftncEmRluOnaME3ustd918lRMDYokZmtmDZN8SrP0yd1pfVqZ7NkmBACbBX0k7pAgMBAAEwDQYJKoZIhvcNAQEEBQADQQDnV8QNFVVJx/+7IselU0wsepqMurivXZzuxOmTEmTVDzCJx1xhA8jd3vGAj7XDIYiPub1PV23eY5a2ARJuw5w9";</span><br><span style="color: hsl(0, 100%, 40%);">-const char* B64CACert = "MIIBYDCCAQoCAQEwDQYJKoZIhvcNAQEEBQAwOzElMCMGA1UEAxMcb3NwdGVzdHNlcnZlci50cmFuc25leHVzLmNvbTESMBAGA1UEChMJT1NQU2VydmVyMB4XDTAyMDIwNDE4MjU1MloXDTEyMDIwMzE4MjU1MlowOzElMCMGA1UEAxMcb3NwdGVzdHNlcnZlci50cmFuc25leHVzLmNvbTESMBAGA1UEChMJT1NQU2VydmVyMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAPGeGwV41EIhX0jEDFLRXQhDEr50OUQPq+f55VwQd0TQNts06BP29+UiNdRW3c3IRHdZcJdC1Cg68ME9cgeq0h8CAwEAATANBgkqhkiG9w0BAQQFAANBAGkzBSj1EnnmUxbaiG1N4xjIuLAWydun7o3bFk2tV8dBIhnuh445obYyk1EnQ27kI7eACCILBZqi2MHDOIMnoN0=";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Client Wrapper APIs */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Create OSP provider handle according to configuration</span><br><span style="color: hsl(0, 100%, 40%);">- * \param cfg OSP configuration</span><br><span style="color: hsl(0, 100%, 40%);">- * \param name OSP provider context name</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Success, OSP_FAILED Failed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_create_provider(</span><br><span style="color: hsl(0, 100%, 40%);">-     struct ast_config* cfg,</span><br><span style="color: hsl(0, 100%, 40%);">- const char* name)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct ast_variable* var;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osp_provider* provider;</span><br><span style="color: hsl(0, 100%, 40%);">-  OSPTPRIVATEKEY privatekey;</span><br><span style="color: hsl(0, 100%, 40%);">-      OSPT_CERT localcert;</span><br><span style="color: hsl(0, 100%, 40%);">-    OSPT_CERT cacerts[OSP_MAX_CERTS];</span><br><span style="color: hsl(0, 100%, 40%);">-       const OSPT_CERT* pcacerts[OSP_MAX_CERTS];</span><br><span style="color: hsl(0, 100%, 40%);">-       const char* pspoints[OSP_MAX_SPOINTS];</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned char privatekeydata[OSP_SIZE_KEYSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned char localcertdata[OSP_SIZE_KEYSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   unsigned char cacertdata[OSP_SIZE_KEYSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-      int i, num, error = OSPC_ERR_NO_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!(provider = ast_calloc(1, sizeof(*provider)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_log(LOG_ERROR, "Out of memory\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* ast_calloc has set 0 in provider */</span><br><span style="color: hsl(0, 100%, 40%);">-  provider->handle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_copy_string(provider->name, name, sizeof(provider->name));</span><br><span style="color: hsl(0, 100%, 40%);">-    snprintf(provider->privatekey, sizeof(provider->privatekey), "%s/%s-privatekey.pem", ast_config_AST_KEY_DIR, name);</span><br><span style="color: hsl(0, 100%, 40%);">-     snprintf(provider->localcert, sizeof(provider->localcert), "%s/%s-localcert.pem", ast_config_AST_KEY_DIR, name);</span><br><span style="color: hsl(0, 100%, 40%);">-        snprintf(provider->cacerts[0], sizeof(provider->cacerts[0]), "%s/%s-cacert_0.pem", ast_config_AST_KEY_DIR, name);</span><br><span style="color: hsl(0, 100%, 40%);">-       provider->maxconnect = OSP_DEF_MAXCONNECT;</span><br><span style="color: hsl(0, 100%, 40%);">-   provider->retrydelay = OSP_DEF_RETRYDELAY;</span><br><span style="color: hsl(0, 100%, 40%);">-   provider->retrylimit = OSP_DEF_RETRYLIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-   provider->timeout = OSP_DEF_TIMEOUT;</span><br><span style="color: hsl(0, 100%, 40%);">- provider->authpolicy = OSP_DEF_AUTHPOLICY;</span><br><span style="color: hsl(0, 100%, 40%);">-   provider->defprotocol = OSP_DEF_PROTOCOL;</span><br><span style="color: hsl(0, 100%, 40%);">-    provider->workmode = OSP_DEF_WORKMODE;</span><br><span style="color: hsl(0, 100%, 40%);">-       provider->srvtype = OSP_DEF_SRVTYPE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (var = ast_variable_browse(cfg, name); var != NULL; var = var->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!strcasecmp(var->name, "privatekey")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (osp_security) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             if (var->value[0] == '/') {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  ast_copy_string(provider->privatekey, var->value, sizeof(provider->privatekey));</span><br><span style="color: hsl(0, 100%, 40%);">-                               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        snprintf(provider->privatekey, sizeof(provider->privatekey), "%s/%s", ast_config_AST_KEY_DIR, var->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                           }</span><br><span style="color: hsl(0, 100%, 40%);">-                               ast_debug(1, "OSP: privatekey '%s'\n", provider->privatekey);</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "localcert")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (osp_security) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             if (var->value[0] == '/') {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  ast_copy_string(provider->localcert, var->value, sizeof(provider->localcert));</span><br><span style="color: hsl(0, 100%, 40%);">-                         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        snprintf(provider->localcert, sizeof(provider->localcert), "%s/%s", ast_config_AST_KEY_DIR, var->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(0, 100%, 40%);">-                               ast_debug(1, "OSP: localcert '%s'\n", provider->localcert);</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "cacert")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (osp_security) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             if (provider->canum < OSP_MAX_CERTS) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                    if (var->value[0] == '/') {</span><br><span style="color: hsl(0, 100%, 40%);">-                                          ast_copy_string(provider->cacerts[provider->canum], var->value, sizeof(provider->cacerts[provider->canum]));</span><br><span style="color: hsl(0, 100%, 40%);">-                                     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                snprintf(provider->cacerts[provider->canum], sizeof(provider->cacerts[provider->canum]), "%s/%s", ast_config_AST_KEY_DIR, var->value);</span><br><span style="color: hsl(0, 100%, 40%);">-                                 }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       ast_debug(1, "OSP: cacerts[%d]: '%s'\n", provider->canum, provider->cacerts[provider->canum]);</span><br><span style="color: hsl(0, 100%, 40%);">-                                       provider->canum++;</span><br><span style="color: hsl(0, 100%, 40%);">-                           } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        ast_log(LOG_WARNING, "OSP: Too many CA Certificates at line %d\n", var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                           }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "servicepoint")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (provider->spnum < OSP_MAX_SPOINTS) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          ast_copy_string(provider->spoints[provider->spnum], var->value, sizeof(provider->spoints[provider->spnum]));</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_debug(1, "OSP: servicepoint[%d]: '%s'\n", provider->spnum, provider->spoints[provider->spnum]);</span><br><span style="color: hsl(0, 100%, 40%);">-                          provider->spnum++;</span><br><span style="color: hsl(0, 100%, 40%);">-                   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: Too many Service Points at line %d\n", var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "maxconnect")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if ((sscanf(var->value, "%30d", &num) == 1) && (num >= OSP_MIN_MAXCONNECT) && (num <= OSP_MAX_MAXCONNECT)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             provider->maxconnect = num;</span><br><span style="color: hsl(0, 100%, 40%);">-                          ast_debug(1, "OSP: maxconnect '%d'\n", num);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: maxconnect should be an integer from %d to %d, not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     OSP_MIN_MAXCONNECT, OSP_MAX_MAXCONNECT, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "retrydelay")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if ((sscanf(var->value, "%30d", &num) == 1) && (num >= OSP_MIN_RETRYDELAY) && (num <= OSP_MAX_RETRYDELAY)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             provider->retrydelay = num;</span><br><span style="color: hsl(0, 100%, 40%);">-                          ast_debug(1, "OSP: retrydelay '%d'\n", num);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: retrydelay should be an integer from %d to %d, not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     OSP_MIN_RETRYDELAY, OSP_MAX_RETRYDELAY, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "retrylimit")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if ((sscanf(var->value, "%30d", &num) == 1) && (num >= OSP_MIN_RETRYLIMIT) && (num <= OSP_MAX_RETRYLIMIT)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             provider->retrylimit = num;</span><br><span style="color: hsl(0, 100%, 40%);">-                          ast_debug(1, "OSP: retrylimit '%d'\n", num);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: retrylimit should be an integer from %d to %d, not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     OSP_MIN_RETRYLIMIT, OSP_MAX_RETRYLIMIT, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "timeout")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if ((sscanf(var->value, "%30d", &num) == 1) && (num >= OSP_MIN_TIMEOUT) && (num <= OSP_MAX_TIMEOUT)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           provider->timeout = num;</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_debug(1, "OSP: timeout '%d'\n", num);</span><br><span style="color: hsl(0, 100%, 40%);">-                     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: timeout should be an integer from %d to %d, not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                        OSP_MIN_TIMEOUT, OSP_MAX_TIMEOUT, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "source")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_copy_string(provider->source, var->value, sizeof(provider->source));</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_debug(1, "OSP: source '%s'\n", provider->source);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcasecmp(var->name, "authpolicy")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if ((sscanf(var->value, "%30d", &num) == 1) && ((num == OSP_AUTH_NO) || (num == OSP_AUTH_YES) || (num == OSP_AUTH_EXC))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             provider->authpolicy = num;</span><br><span style="color: hsl(0, 100%, 40%);">-                          ast_debug(1, "OSP: authpolicy '%d'\n", num);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: authpolicy should be %d, %d or %d, not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                 OSP_AUTH_NO, OSP_AUTH_YES, OSP_AUTH_EXC, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "defprotocol")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (!strcasecmp(var->value, OSP_PROT_SIP)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         provider->defprotocol = OSP_PROT_SIP;</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_debug(1, "OSP: default protocol SIP\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strcasecmp(var->value, OSP_PROT_H323)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         provider->defprotocol = OSP_PROT_H323;</span><br><span style="color: hsl(0, 100%, 40%);">-                               ast_debug(1, "OSP: default protocol H.323\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strcasecmp(var->value, OSP_PROT_IAX)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          provider->defprotocol = OSP_PROT_IAX;</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_debug(1, "OSP: default protocol IAX\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strcasecmp(var->value, OSP_PROT_SKYPE)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                provider->defprotocol = OSP_PROT_SKYPE;</span><br><span style="color: hsl(0, 100%, 40%);">-                              ast_debug(1, "OSP: default protocol Skype\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: default protocol should be %s, %s, %s or %s not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                        OSP_PROT_SIP, OSP_PROT_H323, OSP_PROT_IAX, OSP_PROT_SKYPE, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "workmode")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   if ((sscanf(var->value, "%30d", &num) == 1) && ((num == OSP_MODE_DIRECT) || (num == OSP_MODE_INDIRECT))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             provider->workmode = num;</span><br><span style="color: hsl(0, 100%, 40%);">-                            ast_debug(1, "OSP: workmode '%d'\n", num);</span><br><span style="color: hsl(0, 100%, 40%);">-                    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: workmode should be %d or %d, not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                       OSP_MODE_DIRECT, OSP_MODE_INDIRECT, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcasecmp(var->name, "servicetype")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if ((sscanf(var->value, "%30d", &num) == 1) && ((num == OSP_SRV_VOICE) || (num == OSP_SRV_NPQUERY))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         provider->srvtype = num;</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_debug(1, "OSP: servicetype '%d'\n", num);</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "OSP: servicetype should be %d or %d, not '%s' at line %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                    OSP_SRV_VOICE, OSP_SRV_NPQUERY, var->value, var->lineno);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (provider->canum == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-          provider->canum = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < provider->spnum; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           pspoints[i] = provider->spoints[i];</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (osp_security) {</span><br><span style="color: hsl(0, 100%, 40%);">-             privatekey.PrivateKeyData = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-               privatekey.PrivateKeyLength = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                localcert.CertData = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-              localcert.CertDataLength = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           for (i = 0; i < provider->canum; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   cacerts[i].CertData = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                     cacerts[i].CertDataLength = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((error = OSPPUtilLoadPEMPrivateKey((unsigned char*)provider->privatekey, &privatekey)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_log(LOG_WARNING, "OSP: Unable to load privatekey '%s', error '%d'\n", provider->privatekey, error);</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if ((error = OSPPUtilLoadPEMCert((unsigned char*)provider->localcert, &localcert)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_log(LOG_WARNING, "OSP: Unable to load localcert '%s', error '%d'\n", provider->localcert, error);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        for (i = 0; i < provider->canum; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           if ((error = OSPPUtilLoadPEMCert((unsigned char*)provider->cacerts[i], &cacerts[i])) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     ast_log(LOG_WARNING, "OSP: Unable to load cacert '%s', error '%d'\n", provider->cacerts[i], error);</span><br><span style="color: hsl(0, 100%, 40%);">-                                        break;</span><br><span style="color: hsl(0, 100%, 40%);">-                          } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        pcacerts[i] = &cacerts[i];</span><br><span style="color: hsl(0, 100%, 40%);">-                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                privatekey.PrivateKeyData = privatekeydata;</span><br><span style="color: hsl(0, 100%, 40%);">-             privatekey.PrivateKeyLength = sizeof(privatekeydata);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           localcert.CertData = localcertdata;</span><br><span style="color: hsl(0, 100%, 40%);">-             localcert.CertDataLength = sizeof(localcertdata);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               cacerts[0].CertData = cacertdata;</span><br><span style="color: hsl(0, 100%, 40%);">-               cacerts[0].CertDataLength = sizeof(cacertdata);</span><br><span style="color: hsl(0, 100%, 40%);">-         pcacerts[0] = &cacerts[0];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if ((error = OSPPBase64Decode(B64PKey, strlen(B64PKey), privatekey.PrivateKeyData, &privatekey.PrivateKeyLength)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_log(LOG_WARNING, "OSP: Unable to decode private key, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if ((error = OSPPBase64Decode(B64LCert, strlen(B64LCert), localcert.CertData, &localcert.CertDataLength)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    ast_log(LOG_WARNING, "OSP: Unable to decode local cert, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if ((error = OSPPBase64Decode(B64CACert, strlen(B64CACert), cacerts[0].CertData, &cacerts[0].CertDataLength)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_log(LOG_WARNING, "OSP: Unable to decode cacert, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (error == OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-               error = OSPPProviderNew(provider->spnum,</span><br><span style="color: hsl(0, 100%, 40%);">-                     pspoints,</span><br><span style="color: hsl(0, 100%, 40%);">-                       NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                   OSP_AUDIT_URL,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &privatekey,</span><br><span style="color: hsl(0, 100%, 40%);">-                        &localcert,</span><br><span style="color: hsl(0, 100%, 40%);">-                 provider->canum,</span><br><span style="color: hsl(0, 100%, 40%);">-                     pcacerts,</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSP_LOCAL_VALIDATION,</span><br><span style="color: hsl(0, 100%, 40%);">-                   OSP_SSL_LIFETIME,</span><br><span style="color: hsl(0, 100%, 40%);">-                       provider->maxconnect,</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSP_HTTP_PERSISTENCE,</span><br><span style="color: hsl(0, 100%, 40%);">-                   provider->retrydelay,</span><br><span style="color: hsl(0, 100%, 40%);">-                        provider->retrylimit,</span><br><span style="color: hsl(0, 100%, 40%);">-                        provider->timeout,</span><br><span style="color: hsl(0, 100%, 40%);">-                   OSP_CUSTOMER_ID,</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSP_DEVICE_ID,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &provider->handle);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (error != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_log(LOG_WARNING, "OSP: Unable to create provider '%s', error '%d'\n", name, error);</span><br><span style="color: hsl(0, 100%, 40%);">-                       res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-                } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_debug(1, "OSP: provider '%s'\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_mutex_lock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-                  provider->next = osp_providers;</span><br><span style="color: hsl(0, 100%, 40%);">-                      osp_providers = provider;</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_mutex_unlock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-                        res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (osp_security) {</span><br><span style="color: hsl(0, 100%, 40%);">-             for (i = 0; i < provider->canum; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (cacerts[i].CertData) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              ast_free(cacerts[i].CertData);</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (localcert.CertData) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_free(localcert.CertData);</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (privatekey.PrivateKeyData) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_free(privatekey.PrivateKeyData);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (res != OSP_OK) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_free(provider);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Get OSP provider by name</span><br><span style="color: hsl(0, 100%, 40%);">- * \param name OSP provider context name</span><br><span style="color: hsl(0, 100%, 40%);">- * \param provider OSP provider structure</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Success, OSP_FAILED Failed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_get_provider(</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* name,</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osp_provider** provider)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        int res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osp_provider* p;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- *provider = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_mutex_lock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-  for (p = osp_providers; p != NULL; p = p->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcasecmp(p->name, name)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    *provider = p;</span><br><span style="color: hsl(0, 100%, 40%);">-                  ast_debug(1, "OSP: find provider '%s'\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">-                      res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_mutex_unlock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Create OSP transaction handle</span><br><span style="color: hsl(0, 100%, 40%);">- * \param name OSP provider context name</span><br><span style="color: hsl(0, 100%, 40%);">- * \param trans OSP transaction handle, output</span><br><span style="color: hsl(0, 100%, 40%);">- * \param source Source of provider, output</span><br><span style="color: hsl(0, 100%, 40%);">- * \param srcsize Size of source buffer, in</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSK_OK Success, OSK_FAILED Failed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_create_transaction(</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* name,</span><br><span style="color: hsl(0, 100%, 40%);">-       int* trans,</span><br><span style="color: hsl(0, 100%, 40%);">-     char* source,</span><br><span style="color: hsl(0, 100%, 40%);">-   unsigned int srcsize)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  int res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osp_provider* provider;</span><br><span style="color: hsl(0, 100%, 40%);">-  int error;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if ((trans == NULL) || (source == NULL) || (srcsize <= 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       *trans = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-    *source = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ast_mutex_lock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-  for (provider = osp_providers; provider; provider = provider->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!strcasecmp(provider->name, name)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     error = OSPPTransactionNew(provider->handle, trans);</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (error == OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               ast_debug(1, "OSP: transaction '%d'\n", *trans);</span><br><span style="color: hsl(0, 100%, 40%);">-                              ast_copy_string(source, provider->source, srcsize);</span><br><span style="color: hsl(0, 100%, 40%);">-                          ast_debug(1, "OSP: source '%s'\n", source);</span><br><span style="color: hsl(0, 100%, 40%);">-                           res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-                   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                *trans = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                            ast_debug(1, "OSP: Unable to create transaction handle, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-                                *source = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                         res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_mutex_unlock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Convert "address:port" to "[x.x.x.x]:port" or "hostname:port" format</span><br><span style="color: hsl(0, 100%, 40%);">- * \param src Source address string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param dest Destination address string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param destsize Size of dest buffer</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static void osp_convert_inout(</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* src,</span><br><span style="color: hsl(0, 100%, 40%);">-        char* dest,</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int destsize)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct in_addr inp;</span><br><span style="color: hsl(0, 100%, 40%);">-     char buffer[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   char* port;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if ((dest != NULL) && (destsize > 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!ast_strlen_zero(src)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    ast_copy_string(buffer, src, sizeof(buffer));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   if((port = strchr(buffer, ':')) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              *port = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                           port++;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (inet_pton(AF_INET, buffer, &inp) == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                if (port != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     snprintf(dest, destsize, "[%s]:%s", buffer, port);</span><br><span style="color: hsl(0, 100%, 40%);">-                            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        snprintf(dest, destsize, "[%s]", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(0, 100%, 40%);">-                               dest[destsize - 1] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_copy_string(dest, src, destsize);</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        *dest = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Convert "[x.x.x.x]:port" or "hostname:prot" to "address:port" format</span><br><span style="color: hsl(0, 100%, 40%);">- * \param src Source address string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param dest Destination address string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param destsize Size of dest buffer</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static void osp_convert_outin(</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* src,</span><br><span style="color: hsl(0, 100%, 40%);">-        char* dest,</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int destsize)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- char buffer[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   char* end;</span><br><span style="color: hsl(0, 100%, 40%);">-      char* port;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if ((dest != NULL) && (destsize > 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!ast_strlen_zero(src)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    ast_copy_string(buffer, src, sizeof(buffer));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (buffer[0] == '[') {</span><br><span style="color: hsl(0, 100%, 40%);">-                         if((port = strchr(buffer + 1, ':')) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  *port = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                                   port++;</span><br><span style="color: hsl(0, 100%, 40%);">-                         }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                               if ((end = strchr(buffer + 1, ']')) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  *end = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                               if (port != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     snprintf(dest, destsize, "%s:%s", buffer + 1, port);</span><br><span style="color: hsl(0, 100%, 40%);">-                                  dest[destsize - 1] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        ast_copy_string(dest, buffer + 1, destsize);</span><br><span style="color: hsl(0, 100%, 40%);">-                            }</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_copy_string(dest, src, destsize);</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        *dest = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Validate OSP token of inbound call</span><br><span style="color: hsl(0, 100%, 40%);">- * \param trans OSP transaction handle</span><br><span style="color: hsl(0, 100%, 40%);">- * \param source Source of inbound call</span><br><span style="color: hsl(0, 100%, 40%);">- * \param destination Destination of inbound call</span><br><span style="color: hsl(0, 100%, 40%);">- * \param calling Calling number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param called Called number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param token OSP token, may be empty</span><br><span style="color: hsl(0, 100%, 40%);">- * \param timelimit Call duration limit, output</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Success, OSP_FAILED Failed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_validate_token(</span><br><span style="color: hsl(0, 100%, 40%);">-       int trans,</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* source,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* destination,</span><br><span style="color: hsl(0, 100%, 40%);">-        const char* calling,</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* called,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* token,</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int* timelimit)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        int tokenlen;</span><br><span style="color: hsl(0, 100%, 40%);">-   unsigned char tokenstr[OSP_SIZE_TOKSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-        char src[OSP_SIZE_OUTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-      char dest[OSP_SIZE_OUTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int authorised;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int dummy = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- int error;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (timelimit == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       tokenlen = ast_base64decode(tokenstr, token, strlen(token));</span><br><span style="color: hsl(0, 100%, 40%);">-    osp_convert_inout(source, src, sizeof(src));</span><br><span style="color: hsl(0, 100%, 40%);">-    osp_convert_inout(destination, dest, sizeof(dest));</span><br><span style="color: hsl(0, 100%, 40%);">-     error = OSPPTransactionValidateAuthorisation(trans,</span><br><span style="color: hsl(0, 100%, 40%);">-             src,</span><br><span style="color: hsl(0, 100%, 40%);">-            dest,</span><br><span style="color: hsl(0, 100%, 40%);">-           NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           calling ? calling : "",</span><br><span style="color: hsl(0, 100%, 40%);">-               OSPC_NFORMAT_E164,</span><br><span style="color: hsl(0, 100%, 40%);">-              called,</span><br><span style="color: hsl(0, 100%, 40%);">-         OSPC_NFORMAT_E164,</span><br><span style="color: hsl(0, 100%, 40%);">-              0,</span><br><span style="color: hsl(0, 100%, 40%);">-              NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           tokenlen,</span><br><span style="color: hsl(0, 100%, 40%);">-               (char*)tokenstr,</span><br><span style="color: hsl(0, 100%, 40%);">-                &authorised,</span><br><span style="color: hsl(0, 100%, 40%);">-                timelimit,</span><br><span style="color: hsl(0, 100%, 40%);">-              &dummy,</span><br><span style="color: hsl(0, 100%, 40%);">-             NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           osp_tokenformat);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (error != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_log(LOG_WARNING, "OSP: Unable to validate inbound token, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-           *timelimit = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (authorised) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: Authorised\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: Unauthorised\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Choose min duration limit</span><br><span style="color: hsl(0, 100%, 40%);">- * \param in Inbound duration limit</span><br><span style="color: hsl(0, 100%, 40%);">- * \param out Outbound duration limit</span><br><span style="color: hsl(0, 100%, 40%);">- * \return min duration limit</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static unsigned int osp_choose_timelimit(</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int in,</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int out)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      if (in == OSP_DEF_TIMELIMIT) {</span><br><span style="color: hsl(0, 100%, 40%);">-          return out;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if (out == OSP_DEF_TIMELIMIT) {</span><br><span style="color: hsl(0, 100%, 40%);">-          return in;</span><br><span style="color: hsl(0, 100%, 40%);">-      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                return in < out ? in : out;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Choose min duration limit</span><br><span style="color: hsl(0, 100%, 40%);">- * \param provider OSP provider</span><br><span style="color: hsl(0, 100%, 40%);">- * \param calling Calling number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param called Called number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param destination Destination IP in '[x.x.x.x]' format</span><br><span style="color: hsl(0, 100%, 40%);">- * \param tokenlen OSP token length</span><br><span style="color: hsl(0, 100%, 40%);">- * \param token OSP token</span><br><span style="color: hsl(0, 100%, 40%);">- * \param reason Failure reason, output</span><br><span style="color: hsl(0, 100%, 40%);">- * \param results OSP lookup results, in/output</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Success, OSP_FAILED Failed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_check_destination(</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osp_provider* provider,</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* calling,</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* called,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* destination,</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int tokenlen,</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* token,</span><br><span style="color: hsl(0, 100%, 40%);">-      OSPEFAILREASON* reason,</span><br><span style="color: hsl(0, 100%, 40%);">- struct osp_results* results)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        OSPE_DEST_OSPENABLED enabled;</span><br><span style="color: hsl(0, 100%, 40%);">-   OSPE_PROTOCOL_NAME protocol;</span><br><span style="color: hsl(0, 100%, 40%);">-    char dest[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-     OSPE_OPERATOR_NAME type;</span><br><span style="color: hsl(0, 100%, 40%);">-        int error;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if ((provider == NULL) || (reason == NULL) || (results == NULL)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((error = OSPPTransactionIsDestOSPEnabled(results->outhandle, &enabled)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSP: Unable to get destination OSP version, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-              *reason = OSPC_FAIL_NORMAL_UNSPECIFIED;</span><br><span style="color: hsl(0, 100%, 40%);">-         return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (enabled == OSPC_DOSP_FALSE) {</span><br><span style="color: hsl(0, 100%, 40%);">-               results->token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_base64encode(results->token, (const unsigned char*)token, tokenlen, sizeof(results->token) - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((error = OSPPTransactionGetDestinationNetworkId(results->outhandle, sizeof(results->networkid), results->networkid)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: Unable to get destination network ID, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-               results->networkid[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       error = OSPPTransactionGetNumberPortabilityParameters(results->outhandle,</span><br><span style="color: hsl(0, 100%, 40%);">-            sizeof(results->nprn),</span><br><span style="color: hsl(0, 100%, 40%);">-               results->nprn,</span><br><span style="color: hsl(0, 100%, 40%);">-               sizeof(results->npcic),</span><br><span style="color: hsl(0, 100%, 40%);">-              results->npcic,</span><br><span style="color: hsl(0, 100%, 40%);">-              &results->npdi);</span><br><span style="color: hsl(0, 100%, 40%);">- if (error != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: Unable to get number portability parameters, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-                results->nprn[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-             results->npcic[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-            results->npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          error = OSPPTransactionGetOperatorName(results->outhandle, type, sizeof(results->opname[type]), results->opname[type]);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (error != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_debug(1, "OSP: Unable to get operator name of type '%d', error '%d'\n", type, error);</span><br><span style="color: hsl(0, 100%, 40%);">-                     results->opname[type][0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((error = OSPPTransactionGetDestProtocol(results->outhandle, &protocol)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSP: Unable to get destination protocol, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-         *reason = OSPC_FAIL_NORMAL_UNSPECIFIED;</span><br><span style="color: hsl(0, 100%, 40%);">-         results->token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-            results->networkid[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results->nprn[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-             results->npcic[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-            results->npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  results->opname[type][0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-   osp_convert_outin(destination, dest, sizeof(dest));</span><br><span style="color: hsl(0, 100%, 40%);">-     switch(protocol) {</span><br><span style="color: hsl(0, 100%, 40%);">-      case OSPC_PROTNAME_SIP:</span><br><span style="color: hsl(0, 100%, 40%);">-         ast_debug(1, "OSP: protocol SIP\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_copy_string(results->outtech, OSP_TECH_SIP, sizeof(results->outtech));</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_copy_string(results->dest, dest, sizeof(results->dest));</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_copy_string(results->calling, calling, sizeof(results->calling));</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_copy_string(results->called, called, sizeof(results->called));</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSPC_PROTNAME_Q931:</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: protocol Q.931\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_copy_string(results->outtech, OSP_TECH_H323, sizeof(results->outtech));</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_copy_string(results->dest, dest, sizeof(results->dest));</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_copy_string(results->calling, calling, sizeof(results->calling));</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_copy_string(results->called, called, sizeof(results->called));</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSPC_PROTNAME_IAX:</span><br><span style="color: hsl(0, 100%, 40%);">-         ast_debug(1, "OSP: protocol IAX\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_copy_string(results->outtech, OSP_TECH_IAX, sizeof(results->outtech));</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_copy_string(results->dest, dest, sizeof(results->dest));</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_copy_string(results->calling, calling, sizeof(results->calling));</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_copy_string(results->called, called, sizeof(results->called));</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSPC_PROTNAME_SKYPE:</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: protocol Skype\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_copy_string(results->outtech, OSP_TECH_SKYPE, sizeof(results->outtech));</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_copy_string(results->dest, dest, sizeof(results->dest));</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_copy_string(results->calling, calling, sizeof(results->calling));</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_copy_string(results->called, called, sizeof(results->called));</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSPC_PROTNAME_UNDEFINED:</span><br><span style="color: hsl(0, 100%, 40%);">-   case OSPC_PROTNAME_UNKNOWN:</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_debug(1, "OSP: unknown/undefined protocol '%d'\n", protocol);</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_debug(1, "OSP: use default protocol '%s'\n", provider->defprotocol);</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_copy_string(results->outtech, provider->defprotocol, sizeof(results->outtech));</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_copy_string(results->dest, dest, sizeof(results->dest));</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_copy_string(results->calling, calling, sizeof(results->calling));</span><br><span style="color: hsl(0, 100%, 40%);">-             ast_copy_string(results->called, called, sizeof(results->called));</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSPC_PROTNAME_LRQ:</span><br><span style="color: hsl(0, 100%, 40%);">- case OSPC_PROTNAME_T37:</span><br><span style="color: hsl(0, 100%, 40%);">- case OSPC_PROTNAME_T38:</span><br><span style="color: hsl(0, 100%, 40%);">- case OSPC_PROTNAME_SMPP:</span><br><span style="color: hsl(0, 100%, 40%);">-        case OSPC_PROTNAME_XMPP:</span><br><span style="color: hsl(0, 100%, 40%);">-        default:</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_WARNING, "OSP: unsupported protocol '%d'\n", protocol);</span><br><span style="color: hsl(0, 100%, 40%);">-           *reason = OSPC_FAIL_PROTOCOL_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-             results->token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-            results->networkid[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results->nprn[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-             results->npcic[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-            results->npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  results->opname[type][0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Convert Asterisk status to TC code</span><br><span style="color: hsl(0, 100%, 40%);">- * \param cause Asterisk hangup cause</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP TC code</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static OSPEFAILREASON asterisk2osp(</span><br><span style="color: hsl(0, 100%, 40%);">-    int cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return (OSPEFAILREASON)cause;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Authentication function</span><br><span style="color: hsl(0, 100%, 40%);">- * \param name OSP provider context name</span><br><span style="color: hsl(0, 100%, 40%);">- * \param trans OSP transaction handle, output</span><br><span style="color: hsl(0, 100%, 40%);">- * \param source Source of inbound call</span><br><span style="color: hsl(0, 100%, 40%);">- * \param calling Calling number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param called Called number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param token OSP token, may be empty</span><br><span style="color: hsl(0, 100%, 40%);">- * \param timelimit Call duration limit, output</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Authenricated, OSP_FAILED Unauthenticated, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_auth(</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* name,</span><br><span style="color: hsl(0, 100%, 40%);">-       int* trans,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* source,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* calling,</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* called,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* token,</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int* timelimit)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osp_provider* provider = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   char dest[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if ((trans == NULL) || (timelimit == NULL)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       *trans = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-    *timelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if ((res = osp_get_provider(name, &provider)) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: Unabe to find OSP provider '%s'\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">-         return res;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       switch (provider->authpolicy) {</span><br><span style="color: hsl(0, 100%, 40%);">-      case OSP_AUTH_NO:</span><br><span style="color: hsl(0, 100%, 40%);">-               res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSP_AUTH_EXC:</span><br><span style="color: hsl(0, 100%, 40%);">-              if (ast_strlen_zero(token)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if ((res = osp_create_transaction(name, trans, dest, sizeof(dest))) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_debug(1, "OSP: Unable to generate transaction handle\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                 *trans = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if((res = osp_validate_token(*trans, source, dest, calling, called, token, timelimit)) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSPPTransactionRecordFailure(*trans, OSPC_FAIL_CALL_REJECTED);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSP_AUTH_YES:</span><br><span style="color: hsl(0, 100%, 40%);">-      default:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (ast_strlen_zero(token)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-           } else if ((res = osp_create_transaction(name, trans, dest, sizeof(dest))) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_debug(1, "OSP: Unable to generate transaction handle\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                 *trans = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if((res = osp_validate_token(*trans, source, dest, calling, called, token, timelimit)) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSPPTransactionRecordFailure(*trans, OSPC_FAIL_CALL_REJECTED);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Create a UUID</span><br><span style="color: hsl(0, 100%, 40%);">- * \param uuid UUID buffer</span><br><span style="color: hsl(0, 100%, 40%);">- * \param bufsize UUID buffer size</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSK_OK Created, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_create_uuid(</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned char* uuid,</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int* bufsize)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int i, res;</span><br><span style="color: hsl(0, 100%, 40%);">-     long int tmp[OSP_SIZE_UUID / sizeof(long int)];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if ((uuid != NULL) && (*bufsize >= OSP_SIZE_UUID)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         for (i = 0; i < OSP_SIZE_UUID / sizeof(long int); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     tmp[i] = ast_random();</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               memcpy(uuid, tmp, OSP_SIZE_UUID);</span><br><span style="color: hsl(0, 100%, 40%);">-               *bufsize = OSP_SIZE_UUID;</span><br><span style="color: hsl(0, 100%, 40%);">-               res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief UUID to string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param uuid UUID</span><br><span style="color: hsl(0, 100%, 40%);">- * \param buffer String buffer</span><br><span style="color: hsl(0, 100%, 40%);">- * \param bufsize String buffer size</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Successed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_uuid2str(</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned char* uuid,</span><br><span style="color: hsl(0, 100%, 40%);">-    char* buffer,</span><br><span style="color: hsl(0, 100%, 40%);">-   unsigned int bufsize)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  int res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((uuid != NULL) && (bufsize > OSP_SIZE_UUIDSTR)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                snprintf(buffer, bufsize, "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-"</span><br><span style="color: hsl(0, 100%, 40%);">-                                      "%02hhx%02hhx-%02hhx%02hhx-"</span><br><span style="color: hsl(0, 100%, 40%);">-                                          "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",</span><br><span style="color: hsl(0, 100%, 40%);">-                     uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],</span><br><span style="color: hsl(0, 100%, 40%);">-                 uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);</span><br><span style="color: hsl(0, 100%, 40%);">-          res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Create a call ID according to the type</span><br><span style="color: hsl(0, 100%, 40%);">- * \param type Call ID type</span><br><span style="color: hsl(0, 100%, 40%);">- * \param callid Call ID buffer</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSK_OK Created, OSP_FAILED Not create, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_create_callid(</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int type,</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osp_callid* callid)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (callid == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       callid->len = sizeof(callid->buf);</span><br><span style="color: hsl(0, 100%, 40%);">-        switch (type) {</span><br><span style="color: hsl(0, 100%, 40%);">- case OSP_CALLID_H323:</span><br><span style="color: hsl(0, 100%, 40%);">-           res = osp_create_uuid(callid->buf, &callid->len);</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSP_CALLID_SIP:</span><br><span style="color: hsl(0, 100%, 40%);">-    case OSP_CALLID_IAX:</span><br><span style="color: hsl(0, 100%, 40%);">-            res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((res != OSP_OK) && (callid->len != 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         callid->buf[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-               callid->len = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Lookup function</span><br><span style="color: hsl(0, 100%, 40%);">- * \param name OSP provider context name</span><br><span style="color: hsl(0, 100%, 40%);">- * \param callidtypes Call ID types</span><br><span style="color: hsl(0, 100%, 40%);">- * \param actualsrc Actual source device in indirect mode</span><br><span style="color: hsl(0, 100%, 40%);">- * \param srcdev Source device of outbound call</span><br><span style="color: hsl(0, 100%, 40%);">- * \param calling Calling number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param called Called number</span><br><span style="color: hsl(0, 100%, 40%);">- * \param snetid Source network ID</span><br><span style="color: hsl(0, 100%, 40%);">- * \param np NP parameters</span><br><span style="color: hsl(0, 100%, 40%);">- * \param headers SIP header parameters</span><br><span style="color: hsl(0, 100%, 40%);">- * \param cinfo Custom info</span><br><span style="color: hsl(0, 100%, 40%);">- * \param results Lookup results</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Found , OSP_FAILED No route, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_lookup(</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* name,</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int callidtypes,</span><br><span style="color: hsl(0, 100%, 40%);">-       const char* actualsrc,</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* srcdev,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* calling,</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* called,</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* snetid,</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osp_npdata* np,</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osp_headers* headers,</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* cinfo[],</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osp_results* results)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osp_provider* provider = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   OSPE_PROTOCOL_NAME protocol;</span><br><span style="color: hsl(0, 100%, 40%);">-    char source[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   char callingnum[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-       char callednum[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-        char destination[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-      char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int tokenlen;</span><br><span style="color: hsl(0, 100%, 40%);">-  char token[OSP_SIZE_TOKSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-    char src[OSP_SIZE_OUTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-      char dev[OSP_SIZE_OUTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-      char host[OSP_SIZE_OUTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int i, type;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osp_callid callid;</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int callidnum;</span><br><span style="color: hsl(0, 100%, 40%);">- OSPT_CALL_ID* callids[OSP_CALLID_MAXNUM];</span><br><span style="color: hsl(0, 100%, 40%);">-       char dest[OSP_SIZE_OUTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* preferred[2] = { NULL };</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int dummy = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- OSPEFAILREASON reason;</span><br><span style="color: hsl(0, 100%, 40%);">-  int error;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (results == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       osp_convert_inout(results->dest, dest, sizeof(dest));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        results->outhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-     results->outtech[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-  results->calling[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-  results->called[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-   results->token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-    results->networkid[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-        results->nprn[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-     results->npcic[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-    results->npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          results->opname[type][0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       results->numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       results->outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if ((res = osp_get_provider(name, &provider)) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: Unabe to find OSP provider '%s'\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">-         return res;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((res = osp_create_transaction(name, &results->outhandle, source, sizeof(source))) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         ast_debug(1, "OSP: Unable to generate transaction handle\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         results->outhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NORMAL_UNSPECIFIED);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!strcasecmp(results->intech, OSP_TECH_SIP)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            protocol = OSPC_PROTNAME_SIP;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (!strcasecmp(results->intech, OSP_TECH_H323)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            protocol = OSPC_PROTNAME_Q931;</span><br><span style="color: hsl(0, 100%, 40%);">-  } else if (!strcasecmp(results->intech, OSP_TECH_IAX)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             protocol = OSPC_PROTNAME_IAX;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (!strcasecmp(results->intech, OSP_TECH_SKYPE)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           protocol = OSPC_PROTNAME_SKYPE;</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                protocol = OSPC_PROTNAME_SIP;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       OSPPTransactionSetProtocol(results->outhandle, OSPC_PROTTYPE_SOURCE, protocol);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!ast_strlen_zero(snetid)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         OSPPTransactionSetNetworkIds(results->outhandle, snetid, "");</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       OSPPTransactionSetNumberPortability(results->outhandle, np->rn, np->cic, np->npdi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          OSPPTransactionSetOperatorName(results->outhandle, type, np->opname[type]);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    OSPPTransactionSetRemotePartyId(results->outhandle, OSPC_NFORMAT_E164, headers->rpiduser);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSPPTransactionSetAssertedId(results->outhandle, OSPC_NFORMAT_E164, headers->paiuser);</span><br><span style="color: hsl(0, 100%, 40%);">-   osp_convert_inout(headers->divhost, host, sizeof(host));</span><br><span style="color: hsl(0, 100%, 40%);">-     OSPPTransactionSetDiversion(results->outhandle, headers->divuser, host);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSPPTransactionSetChargeInfo(results->outhandle, OSPC_NFORMAT_E164, headers->pciuser);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (cinfo != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-            for (i = 0; i < OSP_MAX_CUSTOMINFO; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (!ast_strlen_zero(cinfo[i])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               OSPPTransactionSetCustomInfo(results->outhandle, i, cinfo[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_copy_string(callednum, called, sizeof(callednum));</span><br><span style="color: hsl(0, 100%, 40%);">-  if((tmp = strchr(callednum, ';')) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-            *tmp = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       callidnum = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  callids[0] = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < OSP_CALLID_MAXNUM; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            type = 1 << i;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (callidtypes & type) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   error = osp_create_callid(type, &callid);</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (error == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               callids[callidnum] = OSPPCallIdNew(callid.len, callid.buf);</span><br><span style="color: hsl(0, 100%, 40%);">-                             callidnum++;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (provider->workmode == OSP_MODE_INDIRECT) {</span><br><span style="color: hsl(0, 100%, 40%);">-               osp_convert_inout(srcdev, src, sizeof(src));</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ast_strlen_zero(actualsrc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       osp_convert_inout(srcdev, dev, sizeof(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        osp_convert_inout(actualsrc, dev, sizeof(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                osp_convert_inout(source, src, sizeof(src));</span><br><span style="color: hsl(0, 100%, 40%);">-            osp_convert_inout(srcdev, dev, sizeof(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (provider->srvtype == OSP_SRV_NPQUERY) {</span><br><span style="color: hsl(0, 100%, 40%);">-          OSPPTransactionSetServiceType(results->outhandle, OSPC_SERVICE_NPQUERY);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!ast_strlen_zero(dest)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   preferred[0] = dest;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               results->numdests = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                OSPPTransactionSetServiceType(results->outhandle, OSPC_SERVICE_VOICE);</span><br><span style="color: hsl(0, 100%, 40%);">-               results->numdests = OSP_DEF_MAXDESTS;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       error = OSPPTransactionRequestAuthorisation(results->outhandle,</span><br><span style="color: hsl(0, 100%, 40%);">-              src,</span><br><span style="color: hsl(0, 100%, 40%);">-            dev,</span><br><span style="color: hsl(0, 100%, 40%);">-            calling ? calling : "",</span><br><span style="color: hsl(0, 100%, 40%);">-               OSPC_NFORMAT_E164,</span><br><span style="color: hsl(0, 100%, 40%);">-              callednum,</span><br><span style="color: hsl(0, 100%, 40%);">-              OSPC_NFORMAT_E164,</span><br><span style="color: hsl(0, 100%, 40%);">-              NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           callidnum,</span><br><span style="color: hsl(0, 100%, 40%);">-              callids,</span><br><span style="color: hsl(0, 100%, 40%);">-                preferred,</span><br><span style="color: hsl(0, 100%, 40%);">-              &results->numdests,</span><br><span style="color: hsl(0, 100%, 40%);">-              &dummy,</span><br><span style="color: hsl(0, 100%, 40%);">-             NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 0; i < callidnum; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            OSPPCallIdDelete(&callids[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (error != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_log(LOG_WARNING, "OSP: Unable to request authorization, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-            results->numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NORMAL_UNSPECIFIED);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!results->numdests) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: No more destination\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NO_ROUTE_TO_DEST);</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       results->outcallid.len = sizeof(results->outcallid.buf);</span><br><span style="color: hsl(0, 100%, 40%);">-  tokenlen = sizeof(token);</span><br><span style="color: hsl(0, 100%, 40%);">-       error = OSPPTransactionGetFirstDestination(results->outhandle,</span><br><span style="color: hsl(0, 100%, 40%);">-               0,</span><br><span style="color: hsl(0, 100%, 40%);">-              NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           &results->outtimelimit,</span><br><span style="color: hsl(0, 100%, 40%);">-          &results->outcallid.len,</span><br><span style="color: hsl(0, 100%, 40%);">-         results->outcallid.buf,</span><br><span style="color: hsl(0, 100%, 40%);">-              sizeof(callednum),</span><br><span style="color: hsl(0, 100%, 40%);">-              callednum,</span><br><span style="color: hsl(0, 100%, 40%);">-              sizeof(callingnum),</span><br><span style="color: hsl(0, 100%, 40%);">-             callingnum,</span><br><span style="color: hsl(0, 100%, 40%);">-             sizeof(destination),</span><br><span style="color: hsl(0, 100%, 40%);">-            destination,</span><br><span style="color: hsl(0, 100%, 40%);">-            0,</span><br><span style="color: hsl(0, 100%, 40%);">-              NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           &tokenlen,</span><br><span style="color: hsl(0, 100%, 40%);">-          token);</span><br><span style="color: hsl(0, 100%, 40%);">- if (error != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: Unable to get first route, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-          results->numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               results->outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-           if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NO_ROUTE_TO_DEST);</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       results->numdests--;</span><br><span style="color: hsl(0, 100%, 40%);">- results->outtimelimit = osp_choose_timelimit(results->intimelimit, results->outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_debug(1, "OSP: outtimelimit '%d'\n", results->outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-   ast_debug(1, "OSP: calling '%s'\n", callingnum);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSP: called '%s'\n", callednum);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSP: destination '%s'\n", destination);</span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(1, "OSP: token size '%d'\n", tokenlen);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if ((res = osp_check_destination(provider, callingnum, callednum, destination, tokenlen, token, &reason, results)) > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                return OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!results->numdests) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: No more destination\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           results->outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-           OSPPTransactionRecordFailure(results->outhandle, reason);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NO_ROUTE_TO_DEST);</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       while(results->numdests) {</span><br><span style="color: hsl(0, 100%, 40%);">-           results->outcallid.len = sizeof(results->outcallid.buf);</span><br><span style="color: hsl(0, 100%, 40%);">-          tokenlen = sizeof(token);</span><br><span style="color: hsl(0, 100%, 40%);">-               error = OSPPTransactionGetNextDestination(results->outhandle,</span><br><span style="color: hsl(0, 100%, 40%);">-                        reason,</span><br><span style="color: hsl(0, 100%, 40%);">-                 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                      NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                   NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                   &results->outtimelimit,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &results->outcallid.len,</span><br><span style="color: hsl(0, 100%, 40%);">-                 results->outcallid.buf,</span><br><span style="color: hsl(0, 100%, 40%);">-                      sizeof(callednum),</span><br><span style="color: hsl(0, 100%, 40%);">-                      callednum,</span><br><span style="color: hsl(0, 100%, 40%);">-                      sizeof(callingnum),</span><br><span style="color: hsl(0, 100%, 40%);">-                     callingnum,</span><br><span style="color: hsl(0, 100%, 40%);">-                     sizeof(destination),</span><br><span style="color: hsl(0, 100%, 40%);">-                    destination,</span><br><span style="color: hsl(0, 100%, 40%);">-                    0,</span><br><span style="color: hsl(0, 100%, 40%);">-                      NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                   &tokenlen,</span><br><span style="color: hsl(0, 100%, 40%);">-                  token);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (error == OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       results->numdests--;</span><br><span style="color: hsl(0, 100%, 40%);">-                 results->outtimelimit = osp_choose_timelimit(results->intimelimit, results->outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_debug(1, "OSP: outtimelimit '%d'\n", results->outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_debug(1, "OSP: calling '%s'\n", callingnum);</span><br><span style="color: hsl(0, 100%, 40%);">-                      ast_debug(1, "OSP: called '%s'\n", callednum);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_debug(1, "OSP: destination '%s'\n", destination);</span><br><span style="color: hsl(0, 100%, 40%);">-                 ast_debug(1, "OSP: token size '%d'\n", tokenlen);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     if ((res = osp_check_destination(provider, callingnum, callednum, destination, tokenlen, token, &reason, results)) > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!results->numdests) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_debug(1, "OSP: No more destination\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                           OSPPTransactionRecordFailure(results->outhandle, reason);</span><br><span style="color: hsl(0, 100%, 40%);">-                            if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NO_ROUTE_TO_DEST);</span><br><span style="color: hsl(0, 100%, 40%);">-                         }</span><br><span style="color: hsl(0, 100%, 40%);">-                               res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-                               break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_debug(1, "OSP: Unable to get route, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-                        results->numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       results->outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NORMAL_UNSPECIFIED);</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-                        break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Lookup Next function</span><br><span style="color: hsl(0, 100%, 40%);">- * \param name OSP provider name</span><br><span style="color: hsl(0, 100%, 40%);">- * \param cause Asterisk hangup cause</span><br><span style="color: hsl(0, 100%, 40%);">- * \param results Lookup results, in/output</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Found , OSP_FAILED No route, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_next(</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* name,</span><br><span style="color: hsl(0, 100%, 40%);">-       int cause,</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osp_results* results)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osp_provider* provider = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   char calling[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-  char called[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   char dest[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int tokenlen;</span><br><span style="color: hsl(0, 100%, 40%);">-  char token[OSP_SIZE_TOKSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-    OSPEFAILREASON reason;</span><br><span style="color: hsl(0, 100%, 40%);">-  OSPE_OPERATOR_NAME type;</span><br><span style="color: hsl(0, 100%, 40%);">-        int error;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (results == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_log(LOG_ERROR, "Invalid parameters\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       results->outtech[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-  results->dest[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-     results->calling[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-  results->called[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-   results->token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-    results->networkid[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-        results->nprn[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-     results->npcic[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-    results->npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          results->opname[type][0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       results->outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if ((res = osp_get_provider(name, &provider)) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: Unabe to find OSP provider '%s'\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">-         return res;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (results->outhandle == OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSP: Transaction handle undefined\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          results->numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NORMAL_UNSPECIFIED);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       reason = asterisk2osp(cause);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!results->numdests) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: No more destination\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           OSPPTransactionRecordFailure(results->outhandle, reason);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NO_ROUTE_TO_DEST);</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       while(results->numdests) {</span><br><span style="color: hsl(0, 100%, 40%);">-           results->outcallid.len = sizeof(results->outcallid.buf);</span><br><span style="color: hsl(0, 100%, 40%);">-          tokenlen = sizeof(token);</span><br><span style="color: hsl(0, 100%, 40%);">-               error = OSPPTransactionGetNextDestination(</span><br><span style="color: hsl(0, 100%, 40%);">-                      results->outhandle,</span><br><span style="color: hsl(0, 100%, 40%);">-                  reason,</span><br><span style="color: hsl(0, 100%, 40%);">-                 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                      NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                   NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                   &results->outtimelimit,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &results->outcallid.len,</span><br><span style="color: hsl(0, 100%, 40%);">-                 results->outcallid.buf,</span><br><span style="color: hsl(0, 100%, 40%);">-                      sizeof(called),</span><br><span style="color: hsl(0, 100%, 40%);">-                 called,</span><br><span style="color: hsl(0, 100%, 40%);">-                 sizeof(calling),</span><br><span style="color: hsl(0, 100%, 40%);">-                        calling,</span><br><span style="color: hsl(0, 100%, 40%);">-                        sizeof(dest),</span><br><span style="color: hsl(0, 100%, 40%);">-                   dest,</span><br><span style="color: hsl(0, 100%, 40%);">-                   0,</span><br><span style="color: hsl(0, 100%, 40%);">-                      NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                   &tokenlen,</span><br><span style="color: hsl(0, 100%, 40%);">-                  token);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (error == OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       results->numdests--;</span><br><span style="color: hsl(0, 100%, 40%);">-                 results->outtimelimit = osp_choose_timelimit(results->intimelimit, results->outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_debug(1, "OSP: outtimelimit '%d'\n", results->outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_debug(1, "OSP: calling '%s'\n", calling);</span><br><span style="color: hsl(0, 100%, 40%);">-                 ast_debug(1, "OSP: called '%s'\n", called);</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_debug(1, "OSP: destination '%s'\n", dest);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_debug(1, "OSP: token size '%d'\n", tokenlen);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     if ((res = osp_check_destination(provider, calling, called, dest, tokenlen, token, &reason, results)) > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-                           break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!results->numdests) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_debug(1, "OSP: No more destination\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                           OSPPTransactionRecordFailure(results->outhandle, reason);</span><br><span style="color: hsl(0, 100%, 40%);">-                            if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                       OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NO_ROUTE_TO_DEST);</span><br><span style="color: hsl(0, 100%, 40%);">-                         }</span><br><span style="color: hsl(0, 100%, 40%);">-                               res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-                               break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_debug(1, "OSP: Unable to get route, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-                        results->token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                    results->numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       results->outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (results->inhandle != OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               OSPPTransactionRecordFailure(results->inhandle, OSPC_FAIL_NORMAL_UNSPECIFIED);</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-                        break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Get integer from variable string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param vstr Variable string</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_DEF_INTSTATS Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_get_varint(</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* vstr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-      int value = OSP_DEF_INTSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!ast_strlen_zero(vstr)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if ((tmp = strchr(vstr, '=')) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        tmp++;</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (sscanf(tmp, "%30d", &value) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           value = OSP_DEF_INTSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return value;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Get float from variable string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param vstr Variable string</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_DEF_FLOATSTATS Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static float osp_get_varfloat(</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* vstr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-      float value = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ast_strlen_zero(vstr)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if ((tmp = strchr(vstr, '=')) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        tmp++;</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (sscanf(tmp, "%30f", &value) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           value = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return value;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief Report QoS</span><br><span style="color: hsl(0, 100%, 40%);">- * \param trans OSP in/outbound transaction handle</span><br><span style="color: hsl(0, 100%, 40%);">- * \param leg Inbound/outbound</span><br><span style="color: hsl(0, 100%, 40%);">- * \param qos QoS string</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Success, OSP_FAILED Failed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_report_qos(</span><br><span style="color: hsl(0, 100%, 40%);">- int trans,</span><br><span style="color: hsl(0, 100%, 40%);">-      enum osp_callleg leg,</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* qos)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       int res = OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-   enum osp_direction dir;</span><br><span style="color: hsl(0, 100%, 40%);">- char buffer[OSP_SIZE_NORSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-      char* item;</span><br><span style="color: hsl(0, 100%, 40%);">-     int totalpackets[OSP_DIR_NUMBER];</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osp_metrics lost[OSP_DIR_NUMBER];</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osp_metrics jitter[OSP_DIR_NUMBER];</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osp_metrics rtt;</span><br><span style="color: hsl(0, 100%, 40%);">- int value;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!ast_strlen_zero(qos)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            for (dir = OSP_DIR_RX; dir < OSP_DIR_NUMBER; dir++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        totalpackets[dir] = OSP_DEF_INTSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               for (dir = OSP_DIR_RX; dir < OSP_DIR_NUMBER; dir++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        lost[dir].value = OSP_DEF_INTSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                     lost[dir].min = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                     lost[dir].max = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                     lost[dir].avg = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                     lost[dir].sdev = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               for (dir = OSP_DIR_RX; dir < OSP_DIR_NUMBER; dir++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        jitter[dir].value = OSP_DEF_INTSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                   jitter[dir].min = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                   jitter[dir].max = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                   jitter[dir].avg = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-                   jitter[dir].sdev = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               rtt.value = OSP_DEF_INTSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-           rtt.min = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-           rtt.max = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-           rtt.avg = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-           rtt.sdev = OSP_DEF_FLOATSTATS;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_copy_string(buffer, qos, sizeof(buffer));</span><br><span style="color: hsl(0, 100%, 40%);">-           for (item = strtok_r(buffer, ";", &tmp); item; item = strtok_r(NULL, ";", &tmp)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (!strncasecmp(item, "rxcount", strlen("rxcount"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             totalpackets[OSP_DIR_RX] = osp_get_varint(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "txcount", strlen("txcount"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              totalpackets[OSP_DIR_TX] = osp_get_varint(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "lp", strlen("lp"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                lost[OSP_DIR_RX].value = osp_get_varint(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "minrxlost", strlen("minrxlost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          lost[OSP_DIR_RX].min = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "maxrxlost", strlen("maxrxlost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          lost[OSP_DIR_RX].max = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "avgrxlost", strlen("avgrxlost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          lost[OSP_DIR_RX].avg = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "stdevrxlost", strlen("stdevrxlost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              lost[OSP_DIR_RX].sdev = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else if (!strncasecmp(item, "rlp", strlen("rlp"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              lost[OSP_DIR_TX].value = osp_get_varint(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "reported_minlost", strlen("reported_minlost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            lost[OSP_DIR_TX].min = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "reported_maxlost", strlen("reported_maxlost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            lost[OSP_DIR_TX].max = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "reported_avglost", strlen("reported_avglost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            lost[OSP_DIR_TX].avg = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                  } else if (!strncasecmp(item, "reported_stdevlost", strlen("reported_stdevlost"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                lost[OSP_DIR_TX].sdev = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else if (!strncasecmp(item, "rxjitter", strlen("rxjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            jitter[OSP_DIR_RX].value = osp_get_varint(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "minrxjitter", strlen("minrxjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              jitter[OSP_DIR_RX].min = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "maxrxjitter", strlen("maxrxjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              jitter[OSP_DIR_RX].max = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "avgrxjitter", strlen("avgjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                jitter[OSP_DIR_RX].avg = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "stdevrxjitter", strlen("stdevjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            jitter[OSP_DIR_RX].sdev = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else if (!strncasecmp(item, "txjitter", strlen("txjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            jitter[OSP_DIR_TX].value = osp_get_varint(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "reported_minjitter", strlen("reported_minjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                jitter[OSP_DIR_TX].min = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "reported_maxjitter", strlen("reported_maxjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                jitter[OSP_DIR_TX].max = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "reported_avgjitter", strlen("reported_avgjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                jitter[OSP_DIR_TX].avg = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                        } else if (!strncasecmp(item, "reported_stdevjitter", strlen("reported_stdevjitter"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            jitter[OSP_DIR_TX].sdev = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else if (!strncasecmp(item, "rtt", strlen("rtt"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              rtt.value = osp_get_varint(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else if (!strncasecmp(item, "minrtt", strlen("minrtt"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                rtt.min = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else if (!strncasecmp(item, "maxrtt", strlen("maxrtt"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                rtt.max = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else if (!strncasecmp(item, "avgrtt", strlen("avgrtt"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                rtt.avg = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else if (!strncasecmp(item, "stdevrtt", strlen("stdevrtt"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            rtt.sdev = osp_get_varfloat(item);</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: call leg '%d'\n", leg);</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: rxcount '%d'\n", totalpackets[OSP_DIR_RX]);</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: txcount '%d'\n", totalpackets[OSP_DIR_TX]);</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: lp '%d'\n",lost[OSP_DIR_RX].value);</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: minrxlost '%f'\n", lost[OSP_DIR_RX].min);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_debug(1, "OSP: maxrxlost '%f'\n", lost[OSP_DIR_RX].max);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_debug(1, "OSP: avgrxlost '%f'\n", lost[OSP_DIR_RX].avg);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_debug(1, "OSP: stdevrxlost '%f'\n", lost[OSP_DIR_RX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: rlp '%d'\n", lost[OSP_DIR_TX].value);</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSP: reported_minlost '%f'\n", lost[OSP_DIR_TX].min);</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_debug(1, "OSP: reported_maxlost '%f'\n", lost[OSP_DIR_TX].max);</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_debug(1, "OSP: reported_avglost '%f'\n", lost[OSP_DIR_TX].avg);</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_debug(1, "OSP: reported_stdevlost '%f'\n", lost[OSP_DIR_TX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: rxjitter '%d'\n", jitter[OSP_DIR_RX].value);</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: minrxjitter '%f'\n", jitter[OSP_DIR_RX].min);</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSP: maxrxjitter '%f'\n", jitter[OSP_DIR_RX].max);</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSP: avgrxjitter '%f'\n", jitter[OSP_DIR_RX].avg);</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSP: stdevrxjitter '%f'\n", jitter[OSP_DIR_RX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_debug(1, "OSP: txjitter '%d'\n", jitter[OSP_DIR_TX].value);</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: reported_minjitter '%f'\n", jitter[OSP_DIR_TX].min);</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: reported_maxjitter '%f'\n", jitter[OSP_DIR_TX].max);</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: reported_avgjitter '%f'\n", jitter[OSP_DIR_TX].avg);</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: reported_stdevjitter '%f'\n", jitter[OSP_DIR_TX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_debug(1, "OSP: rtt '%d'\n", rtt.value);</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_debug(1, "OSP: minrtt '%f'\n", rtt.min);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_debug(1, "OSP: maxrtt '%f'\n", rtt.max);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_debug(1, "OSP: avgrtt '%f'\n", rtt.avg);</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_debug(1, "OSP: stdevrtt '%f'\n", rtt.sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if (leg == OSP_CALL_INBOUND) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  OSPPTransactionSetPackets(trans, OSPC_SMETRIC_RTP, OSPC_SDIR_SRCREP, totalpackets[OSP_DIR_RX]);</span><br><span style="color: hsl(0, 100%, 40%);">-                 OSPPTransactionSetPackets(trans, OSPC_SMETRIC_RTCP, OSPC_SDIR_DESTREP, totalpackets[OSP_DIR_TX]);</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (lost[OSP_DIR_RX].value >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           value = lost[OSP_DIR_RX].value;</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                value = (int)lost[OSP_DIR_RX].avg;</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionSetLost(trans, OSPC_SMETRIC_RTP, OSPC_SDIR_SRCREP, value, OSP_DEF_INTSTATS);</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (lost[OSP_DIR_TX].value >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           value = lost[OSP_DIR_TX].value;</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                value = (int)lost[OSP_DIR_TX].avg;</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionSetLost(trans, OSPC_SMETRIC_RTCP, OSPC_SDIR_DESTREP, value, OSP_DEF_INTSTATS);</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (jitter[OSP_DIR_RX].value >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         value = jitter[OSP_DIR_RX].value;</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                value = (int)jitter[OSP_DIR_RX].avg;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionSetJitter(trans,</span><br><span style="color: hsl(0, 100%, 40%);">-                         OSPC_SMETRIC_RTP,</span><br><span style="color: hsl(0, 100%, 40%);">-                               OSPC_SDIR_SRCREP,</span><br><span style="color: hsl(0, 100%, 40%);">-                               OSP_DEF_INTSTATS,</span><br><span style="color: hsl(0, 100%, 40%);">-                               (int)jitter[OSP_DIR_RX].min,</span><br><span style="color: hsl(0, 100%, 40%);">-                            (int)jitter[OSP_DIR_RX].max,</span><br><span style="color: hsl(0, 100%, 40%);">-                            value, jitter[OSP_DIR_RX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (jitter[OSP_DIR_TX].value >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         value = jitter[OSP_DIR_TX].value;</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                value = (int)jitter[OSP_DIR_TX].avg;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionSetJitter(trans, OSPC_SMETRIC_RTCP, OSPC_SDIR_DESTREP,</span><br><span style="color: hsl(0, 100%, 40%);">-                           OSP_DEF_INTSTATS, (int)jitter[OSP_DIR_TX].min, (int)jitter[OSP_DIR_TX].max, value, jitter[OSP_DIR_TX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSPPTransactionSetPackets(trans, OSPC_SMETRIC_RTP, OSPC_SDIR_DESTREP, totalpackets[OSP_DIR_RX]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSPPTransactionSetPackets(trans, OSPC_SMETRIC_RTCP, OSPC_SDIR_SRCREP, totalpackets[OSP_DIR_TX]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSPPTransactionSetLost(trans, OSPC_SMETRIC_RTP, OSPC_SDIR_DESTREP, lost[OSP_DIR_RX].value, OSP_DEF_INTSTATS);</span><br><span style="color: hsl(0, 100%, 40%);">-                   OSPPTransactionSetLost(trans, OSPC_SMETRIC_RTCP, OSPC_SDIR_SRCREP, lost[OSP_DIR_TX].value, OSP_DEF_INTSTATS);</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (jitter[OSP_DIR_RX].value >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         value = jitter[OSP_DIR_RX].value;</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                value = (int)jitter[OSP_DIR_RX].avg;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionSetJitter(trans,</span><br><span style="color: hsl(0, 100%, 40%);">-                         OSPC_SMETRIC_RTP,</span><br><span style="color: hsl(0, 100%, 40%);">-                               OSPC_SDIR_DESTREP,</span><br><span style="color: hsl(0, 100%, 40%);">-                              OSP_DEF_INTSTATS,</span><br><span style="color: hsl(0, 100%, 40%);">-                               (int)jitter[OSP_DIR_RX].min,</span><br><span style="color: hsl(0, 100%, 40%);">-                            (int)jitter[OSP_DIR_RX].max,</span><br><span style="color: hsl(0, 100%, 40%);">-                            value,</span><br><span style="color: hsl(0, 100%, 40%);">-                          jitter[OSP_DIR_RX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (jitter[OSP_DIR_TX].value >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         value = jitter[OSP_DIR_TX].value;</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                value = (int)jitter[OSP_DIR_TX].avg;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPTransactionSetJitter(trans,</span><br><span style="color: hsl(0, 100%, 40%);">-                         OSPC_SMETRIC_RTCP,</span><br><span style="color: hsl(0, 100%, 40%);">-                              OSPC_SDIR_SRCREP,</span><br><span style="color: hsl(0, 100%, 40%);">-                               OSP_DEF_INTSTATS,</span><br><span style="color: hsl(0, 100%, 40%);">-                               (int)jitter[OSP_DIR_TX].min,</span><br><span style="color: hsl(0, 100%, 40%);">-                            (int)jitter[OSP_DIR_TX].max,</span><br><span style="color: hsl(0, 100%, 40%);">-                            value,</span><br><span style="color: hsl(0, 100%, 40%);">-                          jitter[OSP_DIR_TX].sdev);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Finish function</span><br><span style="color: hsl(0, 100%, 40%);">- * \param trans OSP in/outbound transaction handle</span><br><span style="color: hsl(0, 100%, 40%);">- * \param recorded If failure reason has been recorded</span><br><span style="color: hsl(0, 100%, 40%);">- * \param cause Asterisk hangup cause</span><br><span style="color: hsl(0, 100%, 40%);">- * \param start Call start time</span><br><span style="color: hsl(0, 100%, 40%);">- * \param connect Call connect time</span><br><span style="color: hsl(0, 100%, 40%);">- * \param end Call end time</span><br><span style="color: hsl(0, 100%, 40%);">- * \param release Who release first, 0 source, 1 destination</span><br><span style="color: hsl(0, 100%, 40%);">- * \param inqos Inbound QoS string</span><br><span style="color: hsl(0, 100%, 40%);">- * \param outqos Outbound QoS string</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_OK Success, OSP_FAILED Failed, OSP_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_finish(</span><br><span style="color: hsl(0, 100%, 40%);">-  int trans,</span><br><span style="color: hsl(0, 100%, 40%);">-      int recorded,</span><br><span style="color: hsl(0, 100%, 40%);">-   int cause,</span><br><span style="color: hsl(0, 100%, 40%);">-      time_t start,</span><br><span style="color: hsl(0, 100%, 40%);">-   time_t connect,</span><br><span style="color: hsl(0, 100%, 40%);">- time_t end,</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int release,</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* inqos,</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* outqos)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        OSPEFAILREASON reason;</span><br><span style="color: hsl(0, 100%, 40%);">-  time_t alert = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned isPddInfoPresent = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned pdd = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int dummy = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- int error;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (trans == OSP_INVALID_HANDLE) {</span><br><span style="color: hsl(0, 100%, 40%);">-              return OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       OSPPTransactionSetRoleInfo(trans, OSPC_RSTATE_STOP, OSPC_RFORMAT_OSP, OSPC_RVENDOR_ASTERISK);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!recorded) {</span><br><span style="color: hsl(0, 100%, 40%);">-                reason = asterisk2osp(cause);</span><br><span style="color: hsl(0, 100%, 40%);">-           OSPPTransactionRecordFailure(trans, reason);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       osp_report_qos(trans, OSP_CALL_INBOUND, inqos);</span><br><span style="color: hsl(0, 100%, 40%);">- osp_report_qos(trans, OSP_CALL_OUTBOUND, outqos);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       error = OSPPTransactionReportUsage(trans,</span><br><span style="color: hsl(0, 100%, 40%);">-               difftime(end, connect),</span><br><span style="color: hsl(0, 100%, 40%);">-         start,</span><br><span style="color: hsl(0, 100%, 40%);">-          end,</span><br><span style="color: hsl(0, 100%, 40%);">-            alert,</span><br><span style="color: hsl(0, 100%, 40%);">-          connect,</span><br><span style="color: hsl(0, 100%, 40%);">-                isPddInfoPresent,</span><br><span style="color: hsl(0, 100%, 40%);">-               pdd,</span><br><span style="color: hsl(0, 100%, 40%);">-            release,</span><br><span style="color: hsl(0, 100%, 40%);">-                NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-           OSP_DEF_INTSTATS,</span><br><span style="color: hsl(0, 100%, 40%);">-               OSP_DEF_INTSTATS,</span><br><span style="color: hsl(0, 100%, 40%);">-               OSP_DEF_INTSTATS,</span><br><span style="color: hsl(0, 100%, 40%);">-               OSP_DEF_INTSTATS,</span><br><span style="color: hsl(0, 100%, 40%);">-               &dummy,</span><br><span style="color: hsl(0, 100%, 40%);">-             NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (error == OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: Usage reported\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_debug(1, "OSP: Unable to report usage, error '%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-             res = OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       OSPPTransactionDelete(trans);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Application APIs */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Application OSPAuth</span><br><span style="color: hsl(0, 100%, 40%);">- * \param chan Channel</span><br><span style="color: hsl(0, 100%, 40%);">- * \param data Parameter</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_AST_OK Success, OSP_AST_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int ospauth_exec(</span><br><span style="color: hsl(0, 100%, 40%);">-   struct ast_channel *chan,</span><br><span style="color: hsl(0, 100%, 40%);">-       const char *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        const char* provider = OSP_DEF_PROVIDER;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct varshead* headp;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_var_t* current;</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* source = "";</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* token = "";</span><br><span style="color: hsl(0, 100%, 40%);">-       int handle;</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int timelimit;</span><br><span style="color: hsl(0, 100%, 40%);">- char buffer[OSP_SIZE_INTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* status;</span><br><span style="color: hsl(0, 100%, 40%);">-     char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      AST_DECLARE_APP_ARGS(args,</span><br><span style="color: hsl(0, 100%, 40%);">-              AST_APP_ARG(provider);</span><br><span style="color: hsl(0, 100%, 40%);">-          AST_APP_ARG(options);</span><br><span style="color: hsl(0, 100%, 40%);">-   );</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      tmp = ast_strdupa(data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_STANDARD_APP_ARGS(args, tmp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ast_strlen_zero(args.provider)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          provider = args.provider;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPAuth: provider '%s'\n", provider);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   headp = ast_channel_varshead(chan);</span><br><span style="color: hsl(0, 100%, 40%);">-     AST_LIST_TRAVERSE(headp, current, entries) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcmp(ast_var_name(current), "OSPINPEERIP")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  source = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if (!strcmp(ast_var_name(current), "OSPINTOKEN")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    token = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPAuth: source '%s'\n", source);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPAuth: token size '%zd'\n", strlen(token));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   res = osp_auth(provider, &handle, source,</span><br><span style="color: hsl(0, 100%, 40%);">-           S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL),</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_channel_exten(chan), token, &timelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (res > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               status = AST_OSP_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                timelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!res) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     status = AST_OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-                } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        status = AST_OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       snprintf(buffer, sizeof(buffer), "%d", handle);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPINHANDLE", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPAuth: OSPINHANDLE '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-  snprintf(buffer, sizeof(buffer), "%d", timelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-    pbx_builtin_setvar_helper(chan, "OSPINTIMELIMIT", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPAuth: OSPINTIMELIMIT '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPAUTHSTATUS", status);</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_debug(1, "OSPAuth: %s\n", status);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if(res != OSP_OK) {</span><br><span style="color: hsl(0, 100%, 40%);">-             res = OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                res = OSP_AST_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Application OSPLookup</span><br><span style="color: hsl(0, 100%, 40%);">- * \param chan Channel</span><br><span style="color: hsl(0, 100%, 40%);">- * \param data Parameter</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_AST_OK Success, OSP_AST_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osplookup_exec(</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_channel* chan,</span><br><span style="color: hsl(0, 100%, 40%);">-       const char * data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        const char* provider = OSP_DEF_PROVIDER;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int callidtypes = OSP_CALLID_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct varshead* headp;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_var_t* current;</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* actualsrc = "";</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* srcdev = "";</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* snetid = "";</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osp_npdata np;</span><br><span style="color: hsl(0, 100%, 40%);">-   OSPE_OPERATOR_NAME type;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osp_headers headers;</span><br><span style="color: hsl(0, 100%, 40%);">-     unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">- const char* cinfo[OSP_MAX_CUSTOMINFO] = { NULL };</span><br><span style="color: hsl(0, 100%, 40%);">-       char buffer[OSP_SIZE_TOKSTR + strlen(": ") + strlen(OSP_SIP_HEADER)];</span><br><span style="color: hsl(0, 100%, 40%);">- struct osp_results results;</span><br><span style="color: hsl(0, 100%, 40%);">-     const char* status;</span><br><span style="color: hsl(0, 100%, 40%);">-     char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      AST_DECLARE_APP_ARGS(args,</span><br><span style="color: hsl(0, 100%, 40%);">-              AST_APP_ARG(exten);</span><br><span style="color: hsl(0, 100%, 40%);">-             AST_APP_ARG(provider);</span><br><span style="color: hsl(0, 100%, 40%);">-          AST_APP_ARG(options);</span><br><span style="color: hsl(0, 100%, 40%);">-   );</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (ast_strlen_zero(data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_log(LOG_WARNING, "OSPLookup: Arg required, OSPLookup(exten[,provider[,options]])\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             return OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       tmp = ast_strdupa(data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_STANDARD_APP_ARGS(args, tmp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: exten '%s'\n", args.exten);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!ast_strlen_zero(args.provider)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          provider = args.provider;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPlookup: provider '%s'\n", provider);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (args.options) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (strchr(args.options, 'h')) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        callidtypes |= OSP_CALLID_H323;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (strchr(args.options, 's')) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        callidtypes |= OSP_CALLID_SIP;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (strchr(args.options, 'i')) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        callidtypes |= OSP_CALLID_IAX;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: call id types '%d'\n", callidtypes);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- results.inhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-  results.intimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-        results.dest[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- np.rn = "";</span><br><span style="color: hsl(0, 100%, 40%);">-   np.cic = "";</span><br><span style="color: hsl(0, 100%, 40%);">-  np.npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          np.opname[type] = "";</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       headers.rpiduser = "";</span><br><span style="color: hsl(0, 100%, 40%);">-        headers.paiuser = "";</span><br><span style="color: hsl(0, 100%, 40%);">- headers.divuser = "";</span><br><span style="color: hsl(0, 100%, 40%);">- headers.divhost = "";</span><br><span style="color: hsl(0, 100%, 40%);">- headers.pciuser = "";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- headp = ast_channel_varshead(chan);</span><br><span style="color: hsl(0, 100%, 40%);">-     AST_LIST_TRAVERSE(headp, current, entries) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcmp(ast_var_name(current), "OSPINACTUALSRC")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       actualsrc = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-             } else if (!strcmp(ast_var_name(current), "OSPINPEERIP")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   srcdev = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if (!strcmp(ast_var_name(current), "OSPINTECH")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_copy_string(results.intech, ast_var_value(current), sizeof(results.intech));</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if (!strcmp(ast_var_name(current), "OSPINHANDLE")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (sscanf(ast_var_value(current), "%30d", &results.inhandle) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             results.inhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINTIMELIMIT")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (sscanf(ast_var_value(current), "%30d", &results.intimelimit) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          results.intimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINNETWORKID")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        snetid = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if (!strcmp(ast_var_name(current), "OSPINNPRN")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     np.rn = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-         } else if (!strcmp(ast_var_name(current), "OSPINNPCIC")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    np.cic = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if (!strcmp(ast_var_name(current), "OSPINNPDI")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (ast_true(ast_var_value(current))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         np.npdi = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINSPID")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     np.opname[OSPC_OPNAME_SPID] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-           } else if (!strcmp(ast_var_name(current), "OSPINOCN")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      np.opname[OSPC_OPNAME_OCN] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (!strcmp(ast_var_name(current), "OSPINSPN")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      np.opname[OSPC_OPNAME_SPN] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (!strcmp(ast_var_name(current), "OSPINALTSPN")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   np.opname[OSPC_OPNAME_ALTSPN] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-         } else if (!strcmp(ast_var_name(current), "OSPINMCC")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      np.opname[OSPC_OPNAME_MCC] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (!strcmp(ast_var_name(current), "OSPINMNC")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      np.opname[OSPC_OPNAME_MNC] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (!strcmp(ast_var_name(current), "OSPINTOHOST")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_copy_string(results.dest, ast_var_value(current), sizeof(results.dest));</span><br><span style="color: hsl(0, 100%, 40%);">-            } else if (!strcmp(ast_var_name(current), "OSPINRPIDUSER")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 headers.rpiduser = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINPAIUSER")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  headers.paiuser = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINDIVUSER")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  headers.divuser = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINDIVHOST")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  headers.divhost = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINPCIUSER")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  headers.pciuser = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO1")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[0] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO2")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[1] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO3")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[2] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO4")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[3] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO5")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[4] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO6")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[5] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO7")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[6] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else if (!strcmp(ast_var_name(current), "OSPINCUSTOMINFO8")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      cinfo[7] = ast_var_value(current);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: actual source device '%s'\n", actualsrc);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPLookup: source device '%s'\n", srcdev);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPINTECH '%s'\n", results.intech);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPLookup: OSPINHANDLE '%d'\n", results.inhandle);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPINTIMELIMIT '%d'\n", results.intimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPINNETWORKID '%s'\n", snetid);</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_debug(1, "OSPLookup: OSPINNPRN '%s'\n", np.rn);</span><br><span style="color: hsl(0, 100%, 40%);">-   ast_debug(1, "OSPLookup: OSPINNPCIC '%s'\n", np.cic);</span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(1, "OSPLookup: OSPINNPDI '%d'\n", np.npdi);</span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(1, "OSPLookup: OSPINSPID '%s'\n", np.opname[OSPC_OPNAME_SPID]);</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_debug(1, "OSPLookup: OSPINOCN '%s'\n", np.opname[OSPC_OPNAME_OCN]);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: OSPINSPN '%s'\n", np.opname[OSPC_OPNAME_SPN]);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: OSPINALTSPN '%s'\n", np.opname[OSPC_OPNAME_ALTSPN]);</span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(1, "OSPLookup: OSPINMCC '%s'\n", np.opname[OSPC_OPNAME_MCC]);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: OSPINMNC '%s'\n", np.opname[OSPC_OPNAME_MNC]);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: OSPINTOHOST '%s'\n", results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPLookup: OSPINRPIDUSER '%s'\n", headers.rpiduser);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPLookup: OSPINPAIUSER '%s'\n", headers.paiuser);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPINDIVUSER '%s'\n", headers.divuser);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPINDIVHOST'%s'\n", headers.divhost);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: OSPINPCIUSER '%s'\n", headers.pciuser);</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < OSP_MAX_CUSTOMINFO; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!ast_strlen_zero(cinfo[i])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_debug(1, "OSPLookup: OSPINCUSTOMINFO%d '%s'\n", i, cinfo[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ast_autoservice_start(chan) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               return OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       res = osp_lookup(provider, callidtypes, actualsrc, srcdev,</span><br><span style="color: hsl(0, 100%, 40%);">-              S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL),</span><br><span style="color: hsl(0, 100%, 40%);">-          args.exten, snetid, &np, &headers, cinfo, &results);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (res > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               status = AST_OSP_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                results.outtech[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-              results.dest[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-         results.calling[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-              results.called[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-               results.token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results.networkid[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-            results.nprn[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-         results.npcic[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results.npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  results.opname[type][0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               results.numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           results.outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-               results.outcallid.buf[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results.outcallid.len = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!res) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     status = AST_OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-                } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        status = AST_OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       snprintf(buffer, sizeof(buffer), "%d", results.outhandle);</span><br><span style="color: hsl(0, 100%, 40%);">-    pbx_builtin_setvar_helper(chan, "OSPOUTHANDLE", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPOUTHANDLE '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPOUTTECH", results.outtech);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPLookup: OSPOUTTECH '%s'\n", results.outtech);</span><br><span style="color: hsl(0, 100%, 40%);">-        pbx_builtin_setvar_helper(chan, "OSPDESTINATION", results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPDESTINATION '%s'\n", results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPOUTCALLING", results.calling);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPLookup: OSPOUTCALLING '%s'\n", results.calling);</span><br><span style="color: hsl(0, 100%, 40%);">-     pbx_builtin_setvar_helper(chan, "OSPOUTCALLED", results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPOUTCALLED '%s'\n", results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPOUTNETWORKID", results.networkid);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTNETWORKID '%s'\n", results.networkid);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTNPRN", results.nprn);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPLookup: OSPOUTNPRN '%s'\n", results.nprn);</span><br><span style="color: hsl(0, 100%, 40%);">-   pbx_builtin_setvar_helper(chan, "OSPOUTNPCIC", results.npcic);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTNPCIC '%s'\n", results.npcic);</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(buffer, sizeof(buffer), "%d", results.npdi);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTNPDI", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTNPDI'%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-  pbx_builtin_setvar_helper(chan, "OSPOUTSPID", results.opname[OSPC_OPNAME_SPID]);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPOUTSPID '%s'\n", results.opname[OSPC_OPNAME_SPID]);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPOUTOCN", results.opname[OSPC_OPNAME_OCN]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTOCN '%s'\n", results.opname[OSPC_OPNAME_OCN]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTSPN", results.opname[OSPC_OPNAME_SPN]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTSPN '%s'\n", results.opname[OSPC_OPNAME_SPN]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTALTSPN", results.opname[OSPC_OPNAME_ALTSPN]);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPLookup: OSPOUTALTSPN '%s'\n", results.opname[OSPC_OPNAME_ALTSPN]);</span><br><span style="color: hsl(0, 100%, 40%);">-   pbx_builtin_setvar_helper(chan, "OSPOUTMCC", results.opname[OSPC_OPNAME_MCC]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTMCC '%s'\n", results.opname[OSPC_OPNAME_MCC]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTMNC", results.opname[OSPC_OPNAME_MNC]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTMNC '%s'\n", results.opname[OSPC_OPNAME_MNC]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTTOKEN", results.token);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTTOKEN size '%zd'\n", strlen(results.token));</span><br><span style="color: hsl(0, 100%, 40%);">-   snprintf(buffer, sizeof(buffer), "%d", results.numdests);</span><br><span style="color: hsl(0, 100%, 40%);">-     pbx_builtin_setvar_helper(chan, "OSPDESTREMAILS", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPLookup: OSPDESTREMAILS '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-     snprintf(buffer, sizeof(buffer), "%d", results.outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTTIMELIMIT", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-   ast_debug(1, "OSPLookup: OSPOUTTIMELIMIT '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-    snprintf(buffer, sizeof(buffer), "%d", callidtypes);</span><br><span style="color: hsl(0, 100%, 40%);">-  pbx_builtin_setvar_helper(chan, "OSPOUTCALLIDTYPES", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(1, "OSPLookup: OSPOUTCALLIDTYPES '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-  pbx_builtin_setvar_helper(chan, "OSPLOOKUPSTATUS", status);</span><br><span style="color: hsl(0, 100%, 40%);">-   ast_debug(1, "OSPLookup: %s\n", status);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!strcasecmp(results.outtech, OSP_TECH_SIP)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               snprintf(buffer, sizeof(buffer), "%s/%s@%s", results.outtech, results.called, results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-          pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!ast_strlen_zero(results.token)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  snprintf(buffer, sizeof(buffer), "%s: %s", OSP_SIP_HEADER, results.token);</span><br><span style="color: hsl(0, 100%, 40%);">-                    pbx_builtin_setvar_helper(chan, "_SIPADDHEADER", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_debug(1, "OSPLookup: SIPADDHEADER size '%zd'\n", strlen(buffer));</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (!strcasecmp(results.outtech, OSP_TECH_H323)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((callidtypes & OSP_CALLID_H323) && (results.outcallid.len != 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      osp_uuid2str(results.outcallid.buf, buffer, sizeof(buffer));</span><br><span style="color: hsl(0, 100%, 40%);">-            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        buffer[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               pbx_builtin_setvar_helper(chan, "OSPOUTCALLID", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-              snprintf(buffer, sizeof(buffer), "%s/%s@%s", results.outtech, results.called, results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-          pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (!strcasecmp(results.outtech, OSP_TECH_IAX)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                snprintf(buffer, sizeof(buffer), "%s/%s/%s", results.outtech, results.dest, results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-          pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (!strcasecmp(results.outtech, OSP_TECH_SKYPE)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              snprintf(buffer, sizeof(buffer), "%s/%s", results.outtech, results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-           pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ast_autoservice_stop(chan) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                return OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if(res != OSP_OK) {</span><br><span style="color: hsl(0, 100%, 40%);">-             res = OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                res = OSP_AST_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Application OSPNext</span><br><span style="color: hsl(0, 100%, 40%);">- * \param chan Channel</span><br><span style="color: hsl(0, 100%, 40%);">- * \param data Parameter</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_AST_OK Success, OSP_AST_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int ospnext_exec(</span><br><span style="color: hsl(0, 100%, 40%);">-     struct ast_channel* chan,</span><br><span style="color: hsl(0, 100%, 40%);">-       const char * data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int res;</span><br><span style="color: hsl(0, 100%, 40%);">-        const char* provider = OSP_DEF_PROVIDER;</span><br><span style="color: hsl(0, 100%, 40%);">-        int cause = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct varshead* headp;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_var_t* current;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osp_results results;</span><br><span style="color: hsl(0, 100%, 40%);">-     OSPE_OPERATOR_NAME type;</span><br><span style="color: hsl(0, 100%, 40%);">-        char buffer[OSP_SIZE_TOKSTR + strlen(": ") + strlen(OSP_SIP_HEADER)];</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int callidtypes = OSP_CALLID_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-    const char* status;</span><br><span style="color: hsl(0, 100%, 40%);">-     char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      AST_DECLARE_APP_ARGS(args,</span><br><span style="color: hsl(0, 100%, 40%);">-              AST_APP_ARG(cause);</span><br><span style="color: hsl(0, 100%, 40%);">-             AST_APP_ARG(provider);</span><br><span style="color: hsl(0, 100%, 40%);">-          AST_APP_ARG(options);</span><br><span style="color: hsl(0, 100%, 40%);">-   );</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (ast_strlen_zero(data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_log(LOG_WARNING, "OSPNext: Arg required, OSPNext(cause[,provider[,options]])\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       tmp = ast_strdupa(data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_STANDARD_APP_ARGS(args, tmp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ast_strlen_zero(args.cause) && sscanf(args.cause, "%30d", &cause) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-            cause = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPNext: cause '%d'\n", cause);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!ast_strlen_zero(args.provider)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          provider = args.provider;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPlookup: provider '%s'\n", provider);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- results.inhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-  results.outhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">- results.intimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-        results.numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   headp = ast_channel_varshead(chan);</span><br><span style="color: hsl(0, 100%, 40%);">-     AST_LIST_TRAVERSE(headp, current, entries) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcmp(ast_var_name(current), "OSPINHANDLE")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (sscanf(ast_var_value(current), "%30d", &results.inhandle) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             results.inhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPOUTHANDLE")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (sscanf(ast_var_value(current), "%30d", &results.outhandle) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            results.outhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINTIMELIMIT")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (sscanf(ast_var_value(current), "%30d", &results.intimelimit) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          results.intimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPOUTCALLIDTYPES")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (sscanf(ast_var_value(current), "%30d", &callidtypes) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          callidtypes = OSP_CALLID_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPDESTREMAILS")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (sscanf(ast_var_value(current), "%30d", &results.numdests) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             results.numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPNext: OSPINHANDLE '%d'\n", results.inhandle);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPNext: OSPOUTHANDLE '%d'\n", results.outhandle);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPNext: OSPINTIMELIMIT '%d'\n", results.intimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPNext: OSPOUTCALLIDTYPES '%d'\n", callidtypes);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPNext: OSPDESTREMAILS '%d'\n", results.numdests);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if ((res = osp_next(provider, cause, &results)) > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           status = AST_OSP_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                results.outtech[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-              results.dest[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-         results.calling[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-              results.called[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-               results.token[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results.networkid[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-            results.nprn[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-         results.npcic[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results.npdi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  results.opname[type][0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               results.numdests = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           results.outtimelimit = OSP_DEF_TIMELIMIT;</span><br><span style="color: hsl(0, 100%, 40%);">-               results.outcallid.buf[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-                results.outcallid.len = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!res) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     status = AST_OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-                } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        status = AST_OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPOUTTECH", results.outtech);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPNext: OSPOUTTECH '%s'\n", results.outtech);</span><br><span style="color: hsl(0, 100%, 40%);">-  pbx_builtin_setvar_helper(chan, "OSPDESTINATION", results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPNext: OSPDESTINATION '%s'\n", results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTCALLING", results.calling);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPNext: OSPOUTCALLING '%s'\n", results.calling);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPOUTCALLED", results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPNext: OSPOUTCALLED'%s'\n", results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-  pbx_builtin_setvar_helper(chan, "OSPOUTNETWORKID", results.networkid);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTNETWORKID '%s'\n", results.networkid);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTNPRN", results.nprn);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPLookup: OSPOUTNPRN '%s'\n", results.nprn);</span><br><span style="color: hsl(0, 100%, 40%);">-   pbx_builtin_setvar_helper(chan, "OSPOUTNPCIC", results.npcic);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTNPCIC '%s'\n", results.npcic);</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(buffer, sizeof(buffer), "%d", results.npdi);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTNPDI", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTNPDI'%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-  pbx_builtin_setvar_helper(chan, "OSPOUTSPID", results.opname[OSPC_OPNAME_SPID]);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPLookup: OSPOUTSPID '%s'\n", results.opname[OSPC_OPNAME_SPID]);</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPOUTOCN", results.opname[OSPC_OPNAME_OCN]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTOCN '%s'\n", results.opname[OSPC_OPNAME_OCN]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTSPN", results.opname[OSPC_OPNAME_SPN]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTSPN '%s'\n", results.opname[OSPC_OPNAME_SPN]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTALTSPN", results.opname[OSPC_OPNAME_ALTSPN]);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPLookup: OSPOUTALTSPN '%s'\n", results.opname[OSPC_OPNAME_ALTSPN]);</span><br><span style="color: hsl(0, 100%, 40%);">-   pbx_builtin_setvar_helper(chan, "OSPOUTMCC", results.opname[OSPC_OPNAME_MCC]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTMCC '%s'\n", results.opname[OSPC_OPNAME_MCC]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTMNC", results.opname[OSPC_OPNAME_MNC]);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPLookup: OSPOUTMNC '%s'\n", results.opname[OSPC_OPNAME_MNC]);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTTOKEN", results.token);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_debug(1, "OSPNext: OSPOUTTOKEN size '%zd'\n", strlen(results.token));</span><br><span style="color: hsl(0, 100%, 40%);">-     snprintf(buffer, sizeof(buffer), "%d", results.numdests);</span><br><span style="color: hsl(0, 100%, 40%);">-     pbx_builtin_setvar_helper(chan, "OSPDESTREMAILS", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPNext: OSPDESTREMAILS '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-       snprintf(buffer, sizeof(buffer), "%d", results.outtimelimit);</span><br><span style="color: hsl(0, 100%, 40%);">- pbx_builtin_setvar_helper(chan, "OSPOUTTIMELIMIT", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-   ast_debug(1, "OSPNext: OSPOUTTIMELIMIT '%s'\n", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-      pbx_builtin_setvar_helper(chan, "OSPNEXTSTATUS", status);</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_debug(1, "OSPNext: %s\n", status);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!strcasecmp(results.outtech, OSP_TECH_SIP)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               snprintf(buffer, sizeof(buffer), "%s/%s@%s", results.outtech, results.called, results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-          pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!ast_strlen_zero(results.token)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  snprintf(buffer, sizeof(buffer), "%s: %s", OSP_SIP_HEADER, results.token);</span><br><span style="color: hsl(0, 100%, 40%);">-                    pbx_builtin_setvar_helper(chan, "_SIPADDHEADER", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_debug(1, "OSPLookup: SIPADDHEADER size '%zd'\n", strlen(buffer));</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (!strcasecmp(results.outtech, OSP_TECH_H323)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((callidtypes & OSP_CALLID_H323) && (results.outcallid.len != 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      osp_uuid2str(results.outcallid.buf, buffer, sizeof(buffer));</span><br><span style="color: hsl(0, 100%, 40%);">-            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        buffer[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               pbx_builtin_setvar_helper(chan, "OSPOUTCALLID", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-              snprintf(buffer, sizeof(buffer), "%s/%s@%s", results.outtech, results.called, results.dest);</span><br><span style="color: hsl(0, 100%, 40%);">-          pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (!strcasecmp(results.outtech, OSP_TECH_IAX)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                snprintf(buffer, sizeof(buffer), "%s/%s/%s", results.outtech, results.dest, results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-          pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (!strcasecmp(results.outtech, OSP_TECH_SKYPE)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              snprintf(buffer, sizeof(buffer), "%s/%s", results.outtech, results.called);</span><br><span style="color: hsl(0, 100%, 40%);">-           pbx_builtin_setvar_helper(chan, "OSPDIALSTR", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if(res != OSP_OK) {</span><br><span style="color: hsl(0, 100%, 40%);">-             res = OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                res = OSP_AST_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief OSP Application OSPFinish</span><br><span style="color: hsl(0, 100%, 40%);">- * \param chan Channel</span><br><span style="color: hsl(0, 100%, 40%);">- * \param data Parameter</span><br><span style="color: hsl(0, 100%, 40%);">- * \return OSP_AST_OK Success, OSP_AST_ERROR Error</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int ospfinished_exec(</span><br><span style="color: hsl(0, 100%, 40%);">-       struct ast_channel* chan,</span><br><span style="color: hsl(0, 100%, 40%);">-       const char * data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int res = OSP_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-       int cause = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct varshead* headp;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_var_t* current;</span><br><span style="color: hsl(0, 100%, 40%);">-      int inhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-      int outhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-     int recorded = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       time_t start = 0, connect = 0, end = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int release;</span><br><span style="color: hsl(0, 100%, 40%);">-   char buffer[OSP_SIZE_INTSTR];</span><br><span style="color: hsl(0, 100%, 40%);">-   char inqos[OSP_SIZE_QOSSTR] = { 0 };</span><br><span style="color: hsl(0, 100%, 40%);">-    char outqos[OSP_SIZE_QOSSTR] = { 0 };</span><br><span style="color: hsl(0, 100%, 40%);">-   const char* status;</span><br><span style="color: hsl(0, 100%, 40%);">-     char* tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      AST_DECLARE_APP_ARGS(args,</span><br><span style="color: hsl(0, 100%, 40%);">-              AST_APP_ARG(cause);</span><br><span style="color: hsl(0, 100%, 40%);">-             AST_APP_ARG(options);</span><br><span style="color: hsl(0, 100%, 40%);">-   );</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      tmp = ast_strdupa(data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_STANDARD_APP_ARGS(args, tmp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       headp = ast_channel_varshead(chan);</span><br><span style="color: hsl(0, 100%, 40%);">-     AST_LIST_TRAVERSE(headp, current, entries) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcmp(ast_var_name(current), "OSPINHANDLE")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (sscanf(ast_var_value(current), "%30d", &inhandle) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             inhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPOUTHANDLE")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (sscanf(ast_var_value(current), "%30d", &outhandle) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            outhandle = OSP_INVALID_HANDLE;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!recorded &&</span><br><span style="color: hsl(0, 100%, 40%);">-                 (!strcmp(ast_var_name(current), "OSPAUTHSTATUS") ||</span><br><span style="color: hsl(0, 100%, 40%);">-                   !strcmp(ast_var_name(current), "OSPLOOKUPSTATUS") ||</span><br><span style="color: hsl(0, 100%, 40%);">-                  !strcmp(ast_var_name(current), "OSPNEXTSTATUS")))</span><br><span style="color: hsl(0, 100%, 40%);">-             {</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (strcmp(ast_var_value(current), AST_OSP_SUCCESS)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          recorded = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(ast_var_name(current), "OSPINAUDIOQOS")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 ast_copy_string(inqos, ast_var_value(current), sizeof(inqos));</span><br><span style="color: hsl(0, 100%, 40%);">-          } else if (!strcmp(ast_var_name(current), "OSPOUTAUDIOQOS")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_copy_string(outqos, ast_var_value(current), sizeof(outqos));</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPFinish: OSPINHANDLE '%d'\n", inhandle);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPFinish: OSPOUTHANDLE '%d'\n", outhandle);</span><br><span style="color: hsl(0, 100%, 40%);">-    ast_debug(1, "OSPFinish: recorded '%d'\n", recorded);</span><br><span style="color: hsl(0, 100%, 40%);">- ast_debug(1, "OSPFinish: OSPINAUDIOQOS '%s'\n", inqos);</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPFinish: OSPOUTAUDIOQOS '%s'\n", outqos);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!ast_strlen_zero(args.cause) && sscanf(args.cause, "%30d", &cause) != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-            cause = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPFinish: cause '%d'\n", cause);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ast_tvzero(ast_channel_creationtime(chan))) {</span><br><span style="color: hsl(0, 100%, 40%);">-              start = ast_channel_creationtime(chan).tv_sec;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ast_tvzero(ast_channel_answertime(chan))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                connect = ast_channel_answertime(chan).tv_sec;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (connect) {</span><br><span style="color: hsl(0, 100%, 40%);">-          end = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                end = connect;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSPFinish: start '%ld'\n", start);</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_debug(1, "OSPFinish: connect '%ld'\n", connect);</span><br><span style="color: hsl(0, 100%, 40%);">-  ast_debug(1, "OSPFinish: end '%ld'\n", end);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  release = ast_check_hangup(chan) ? 0 : 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (osp_finish(outhandle, recorded, cause, start, connect, end, release, inqos, outqos) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ast_debug(1, "OSPFinish: Unable to report usage for outbound call\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       switch (cause) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case AST_CAUSE_NORMAL_CLEARING:</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                cause = AST_CAUSE_NO_ROUTE_DESTINATION;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (osp_finish(inhandle, recorded, cause, start, connect, end, release, inqos, outqos) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSPFinish: Unable to report usage for inbound call\n");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       snprintf(buffer, sizeof(buffer), "%d", OSP_INVALID_HANDLE);</span><br><span style="color: hsl(0, 100%, 40%);">-   pbx_builtin_setvar_helper(chan, "OSPOUTHANDLE", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-      pbx_builtin_setvar_helper(chan, "OSPINHANDLE", buffer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (res > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               status = AST_OSP_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (!res) {</span><br><span style="color: hsl(0, 100%, 40%);">-              status = AST_OSP_FAILED;</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                status = AST_OSP_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       pbx_builtin_setvar_helper(chan, "OSPFINISHSTATUS", status);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if(res != OSP_OK) {</span><br><span style="color: hsl(0, 100%, 40%);">-             res = OSP_AST_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                res = OSP_AST_OK;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSP Module APIs */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_unload(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osp_provider* provider;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osp_provider* next;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (osp_initialized) {</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_mutex_lock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-          for (provider = osp_providers; provider; provider = next) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     next = provider->next;</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSPPProviderDelete(provider->handle, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_free(provider);</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               osp_providers = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_mutex_unlock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                OSPPCleanup();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          osp_tokenformat = TOKEN_ALGO_SIGNED;</span><br><span style="color: hsl(0, 100%, 40%);">-            osp_security = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               osp_hardware = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               osp_initialized = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int osp_load(int reload)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      const char* cvar;</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int ivar;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct ast_config* cfg;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };</span><br><span style="color: hsl(0, 100%, 40%);">-     int error = OSPC_ERR_NO_ERROR;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if ((cfg = ast_config_load(OSP_CONFIG_FILE, config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (cfg == CONFIG_STATUS_FILEINVALID) {</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_log(LOG_ERROR, "Config file %s is in an invalid format.  Aborting.\n", OSP_CONFIG_FILE);</span><br><span style="color: hsl(0, 100%, 40%);">-          return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (cfg) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (reload) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   osp_unload();</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((cvar = ast_variable_retrieve(cfg, OSP_GENERAL_CAT, "accelerate")) && ast_true(cvar)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   if ((error = OSPPInit(1)) != OSPC_ERR_NO_ERROR) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               ast_log(LOG_WARNING, "OSP: Unable to enable hardware acceleration, error='%d'\n", error);</span><br><span style="color: hsl(0, 100%, 40%);">-                             OSPPInit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-                    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                osp_hardware = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSPPInit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: osp_hardware '%d'\n", osp_hardware);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((cvar = ast_variable_retrieve(cfg, OSP_GENERAL_CAT, "securityfeatures")) && ast_true(cvar)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     osp_security = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: osp_security '%d'\n", osp_security);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((cvar = ast_variable_retrieve(cfg, OSP_GENERAL_CAT, "tokenformat"))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if ((sscanf(cvar, "%30d", &ivar) == 1) &&</span><br><span style="color: hsl(0, 100%, 40%);">-                         ((ivar == TOKEN_ALGO_SIGNED) || (ivar == TOKEN_ALGO_UNSIGNED) || (ivar == TOKEN_ALGO_BOTH)))</span><br><span style="color: hsl(0, 100%, 40%);">-                    {</span><br><span style="color: hsl(0, 100%, 40%);">-                               osp_tokenformat = ivar;</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_log(LOG_WARNING, "tokenformat should be an integer from %d, %d or %d, not '%s'\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                        TOKEN_ALGO_SIGNED, TOKEN_ALGO_UNSIGNED, TOKEN_ALGO_BOTH, cvar);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_debug(1, "OSP: osp_tokenformat '%d'\n", osp_tokenformat);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         for (cvar = ast_category_browse(cfg, NULL); cvar != NULL; cvar = ast_category_browse(cfg, cvar)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (strcasecmp(cvar, OSP_GENERAL_CAT)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                osp_create_provider(cfg, cvar);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               osp_initialized = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            ast_config_destroy(cfg);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_log(LOG_WARNING, "OSP: Unable to find configuration. OSP support disabled\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_debug(1, "OSP: osp_initialized '%d'\n", osp_initialized);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *handle_cli_osp_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  int found = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osp_provider* provider;</span><br><span style="color: hsl(0, 100%, 40%);">-  const char* name = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        const char* tokenalgo;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (cmd) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case CLI_INIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          e->command = "osp show";</span><br><span style="color: hsl(0, 100%, 40%);">-           e->usage =</span><br><span style="color: hsl(0, 100%, 40%);">-                   "Usage: osp show\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                   "       Displays information on Open Settlement Protocol support\n";</span><br><span style="color: hsl(0, 100%, 40%);">-          return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    case CLI_GENERATE:</span><br><span style="color: hsl(0, 100%, 40%);">-              return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((a->argc < 2) || (a->argc > 3)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               return CLI_SHOWUSAGE;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (a->argc > 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-                name = a->argv[2];</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!name) {</span><br><span style="color: hsl(0, 100%, 40%);">-            switch (osp_tokenformat) {</span><br><span style="color: hsl(0, 100%, 40%);">-              case TOKEN_ALGO_BOTH:</span><br><span style="color: hsl(0, 100%, 40%);">-                   tokenalgo = "Both";</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case TOKEN_ALGO_UNSIGNED:</span><br><span style="color: hsl(0, 100%, 40%);">-                       tokenalgo = "Unsigned";</span><br><span style="color: hsl(0, 100%, 40%);">-                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case TOKEN_ALGO_SIGNED:</span><br><span style="color: hsl(0, 100%, 40%);">-         default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        tokenalgo = "Signed";</span><br><span style="color: hsl(0, 100%, 40%);">-                 break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               ast_cli(a->fd, "OSP: %s/%s/%s/%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       osp_initialized ? "Initialized" : "Uninitialized",</span><br><span style="color: hsl(0, 100%, 40%);">-                  osp_hardware ? "Accelerated" : "Normal",</span><br><span style="color: hsl(0, 100%, 40%);">-                    osp_security ? "Enabled" : "Disabled",</span><br><span style="color: hsl(0, 100%, 40%);">-                      tokenalgo);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_mutex_lock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-  for (provider = osp_providers; provider; provider = provider->next) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!name || !strcasecmp(provider->name, name)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (found) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            ast_cli(a->fd, "\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_cli(a->fd, " == OSP Provider '%s' == \n", provider->name);</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (osp_security) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             ast_cli(a->fd, "Local Private Key: %s\n", provider->privatekey);</span><br><span style="color: hsl(0, 100%, 40%);">-                                ast_cli(a->fd, "Local Certificate: %s\n", provider->localcert);</span><br><span style="color: hsl(0, 100%, 40%);">-                         for (i = 0; i < provider->canum; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   ast_cli(a->fd, "CA Certificate %d:  %s\n", i + 1, provider->cacerts[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-                                }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       for (i = 0; i < provider->spnum; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           ast_cli(a->fd, "Service Point %d:   %s\n", i + 1, provider->spoints[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_cli(a->fd, "Max Connections:   %d\n", provider->maxconnect);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_cli(a->fd, "Retry Delay:       %d seconds\n", provider->retrydelay);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_cli(a->fd, "Retry Limit:       %d\n", provider->retrylimit);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_cli(a->fd, "Timeout:           %d milliseconds\n", provider->timeout);</span><br><span style="color: hsl(0, 100%, 40%);">-                      ast_cli(a->fd, "Source:            %s\n", strlen(provider->source) ? provider->source : "<unspecified>");</span><br><span style="color: hsl(0, 100%, 40%);">-                    ast_cli(a->fd, "Auth Policy        %d\n", provider->authpolicy);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_cli(a->fd, "Default protocol   %s\n", provider->defprotocol);</span><br><span style="color: hsl(0, 100%, 40%);">-                       ast_cli(a->fd, "Work mode          %d\n", provider->workmode);</span><br><span style="color: hsl(0, 100%, 40%);">-                  ast_cli(a->fd, "Service type       %d\n", provider->srvtype);</span><br><span style="color: hsl(0, 100%, 40%);">-                   ast_cli(a->fd, "OSP Handle:        %d\n", provider->handle);</span><br><span style="color: hsl(0, 100%, 40%);">-                    found++;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ast_mutex_unlock(&osp_lock);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!found) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (name) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     ast_cli(a->fd, "Unable to find OSP provider '%s'\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ast_cli(a->fd, "No OSP providers configured\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return CLI_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSPAuth() dialplan application */</span><br><span style="color: hsl(0, 100%, 40%);">-static const char app1[] = "OSPAuth";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSPLookup() dialplan application */</span><br><span style="color: hsl(0, 100%, 40%);">-static const char app2[] = "OSPLookup";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSPNext() dialplan application */</span><br><span style="color: hsl(0, 100%, 40%);">-static const char app3[] = "OSPNext";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* OSPFinish() dialplan application */</span><br><span style="color: hsl(0, 100%, 40%);">-static const char app4[] = "OSPFinish";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct ast_cli_entry cli_osp[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-       AST_CLI_DEFINE(handle_cli_osp_show, "Displays OSF information")</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int load_module(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        int res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!osp_load(0))</span><br><span style="color: hsl(0, 100%, 40%);">-               return AST_MODULE_LOAD_DECLINE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ast_cli_register_multiple(cli_osp, sizeof(cli_osp) / sizeof(struct ast_cli_entry));</span><br><span style="color: hsl(0, 100%, 40%);">-     res = ast_register_application_xml(app1, ospauth_exec);</span><br><span style="color: hsl(0, 100%, 40%);">- res |= ast_register_application_xml(app2, osplookup_exec);</span><br><span style="color: hsl(0, 100%, 40%);">-      res |= ast_register_application_xml(app3, ospnext_exec);</span><br><span style="color: hsl(0, 100%, 40%);">-        res |= ast_register_application_xml(app4, ospfinished_exec);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int unload_module(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        res = ast_unregister_application(app4);</span><br><span style="color: hsl(0, 100%, 40%);">- res |= ast_unregister_application(app3);</span><br><span style="color: hsl(0, 100%, 40%);">-        res |= ast_unregister_application(app2);</span><br><span style="color: hsl(0, 100%, 40%);">-        res |= ast_unregister_application(app1);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_cli_unregister_multiple(cli_osp, sizeof(cli_osp) / sizeof(struct ast_cli_entry));</span><br><span style="color: hsl(0, 100%, 40%);">-   osp_unload();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int reload(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    osp_load(1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Open Settlement Protocol Applications",</span><br><span style="color: hsl(0, 100%, 40%);">-     .support_level = AST_MODULE_SUPPORT_DEPRECATED,</span><br><span style="color: hsl(0, 100%, 40%);">- .load = load_module,</span><br><span style="color: hsl(0, 100%, 40%);">-    .unload = unload_module,</span><br><span style="color: hsl(0, 100%, 40%);">-        .reload = reload,</span><br><span style="color: hsl(0, 100%, 40%);">-);</span><br><span>diff --git a/autoconf/ast_check_osptk.m4 b/autoconf/ast_check_osptk.m4</span><br><span>deleted file mode 100644</span><br><span>index e42ec0e..0000000</span><br><span>--- a/autoconf/ast_check_osptk.m4</span><br><span>+++ /dev/null</span><br><span>@@ -1,66 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-dnl</span><br><span style="color: hsl(0, 100%, 40%);">-dnl @synopsis AST_CHECK_OSPTK([REQ_VER_MAJOR],[REQ_VER_MINOR],[REQ_VER_BUGFIX])</span><br><span style="color: hsl(0, 100%, 40%);">-dnl</span><br><span style="color: hsl(0, 100%, 40%);">-dnl @summary check for existence of OSP Toolkit package</span><br><span style="color: hsl(0, 100%, 40%);">-dnl</span><br><span style="color: hsl(0, 100%, 40%);">-dnl This macro check for existence of OSP Toolkit package by checking osp/osp.h</span><br><span style="color: hsl(0, 100%, 40%);">-dnl header file, OSPPInit function and OSP Toolkit version.</span><br><span style="color: hsl(0, 100%, 40%);">-dnl</span><br><span style="color: hsl(0, 100%, 40%);">-AC_DEFUN([AST_CHECK_OSPTK],</span><br><span style="color: hsl(0, 100%, 40%);">-[</span><br><span style="color: hsl(0, 100%, 40%);">- # if OSPTK has not been checked and is not excluded</span><br><span style="color: hsl(0, 100%, 40%);">-     if test "x${PBX_OSPTK}" != "x1" -a "${USE_OSPTK}" != "no"; then</span><br><span style="color: hsl(0, 100%, 40%);">-         # if --with-osptk=DIR has been specified, use it.</span><br><span style="color: hsl(0, 100%, 40%);">-               if test "x${OSPTK_DIR}" != "x"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                        osptk_cflags="-I${OSPTK_DIR}/include"</span><br><span style="color: hsl(0, 100%, 40%);">-                 osptk_ldflags="-L${OSPTK_DIR}/lib"</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-                    osptk_cflags=""</span><br><span style="color: hsl(0, 100%, 40%);">-                       osptk_ldflags=""</span><br><span style="color: hsl(0, 100%, 40%);">-              fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              # check for the header</span><br><span style="color: hsl(0, 100%, 40%);">-          osptk_saved_cppflags="${CPPFLAGS}"</span><br><span style="color: hsl(0, 100%, 40%);">-            CPPFLAGS="${CPPFLAGS} ${osptk_cflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-                AC_CHECK_HEADER([osp/osp.h], [osptk_header_found=yes], [osptk_header_found=no])</span><br><span style="color: hsl(0, 100%, 40%);">-         CPPFLAGS="${osptk_saved_cppflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            # check for the library</span><br><span style="color: hsl(0, 100%, 40%);">-         if test "${osptk_header_found}" = "yes"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                       osptk_extralibs="-lssl -lcrypto"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                      AC_CHECK_LIB([osptk], [OSPPInit], [osptk_library_found=yes], [osptk_library_found=no], ${osptk_ldflags} ${osptk_extralibs})</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     # check OSP Toolkit version</span><br><span style="color: hsl(0, 100%, 40%);">-                     if test "${osptk_library_found}" = "yes"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                              AC_MSG_CHECKING(if OSP Toolkit version is compatible with app_osplookup)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                                osptk_saved_cppflags="${CPPFLAGS}"</span><br><span style="color: hsl(0, 100%, 40%);">-                            CPPFLAGS="${CPPFLAGS} ${osptk_cflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-                                AC_RUN_IFELSE(</span><br><span style="color: hsl(0, 100%, 40%);">-                                  [AC_LANG_SOURCE([[</span><br><span style="color: hsl(0, 100%, 40%);">-                                              #include <osp/osp.h></span><br><span style="color: hsl(0, 100%, 40%);">-                                              int main(void) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        int ver = OSP_CLIENT_TOOLKIT_VERSION_MAJOR * 10000 + OSP_CLIENT_TOOLKIT_VERSION_MINOR * 100 + OSP_CLIENT_TOOLKIT_VERSION_BUGFIX;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        int req = $1 * 10000 + $2 * 100 + $3;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   return (ver < req) ? 1 : 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       ]])],</span><br><span style="color: hsl(0, 100%, 40%);">-                                   [osptk_compatible=yes],</span><br><span style="color: hsl(0, 100%, 40%);">-                                 [osptk_compatible=no]</span><br><span style="color: hsl(0, 100%, 40%);">-                           )</span><br><span style="color: hsl(0, 100%, 40%);">-                               CPPFLAGS="${osptk_saved_cppflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                            if test "${osptk_compatible}" = "yes"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                                 AC_MSG_RESULT(yes)</span><br><span style="color: hsl(0, 100%, 40%);">-                                      PBX_OSPTK=1</span><br><span style="color: hsl(0, 100%, 40%);">-                                     OSPTK_INCLUDE="${osptk_cflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-                                       OSPTK_LIB="${osptk_ldflags} -losptk ${osptk_extralibs}"</span><br><span style="color: hsl(0, 100%, 40%);">-                                       AC_DEFINE_UNQUOTED([HAVE_OSPTK], 1, [Define this to indicate the ${OSPTK_DESCRIP} library])</span><br><span style="color: hsl(0, 100%, 40%);">-                             else</span><br><span style="color: hsl(0, 100%, 40%);">-                                    AC_MSG_RESULT(no)</span><br><span style="color: hsl(0, 100%, 40%);">-                               fi</span><br><span style="color: hsl(0, 100%, 40%);">-                      fi</span><br><span style="color: hsl(0, 100%, 40%);">-              fi</span><br><span style="color: hsl(0, 100%, 40%);">-      fi</span><br><span style="color: hsl(0, 100%, 40%);">-])</span><br><span>diff --git a/build_tools/menuselect-deps.in b/build_tools/menuselect-deps.in</span><br><span>index b97341d..9a07214 100644</span><br><span>--- a/build_tools/menuselect-deps.in</span><br><span>+++ b/build_tools/menuselect-deps.in</span><br><span>@@ -42,7 +42,6 @@</span><br><span> OGG=@PBX_OGG@</span><br><span> OPUS=@PBX_OPUS@</span><br><span> OPUSFILE=@PBX_OPUSFILE@</span><br><span style="color: hsl(0, 100%, 40%);">-OSPTK=@PBX_OSPTK@</span><br><span> PGSQL=@PBX_PGSQL@</span><br><span> PJPROJECT=@PBX_PJPROJECT@</span><br><span> POPT=@PBX_POPT@</span><br><span>diff --git a/configure b/configure</span><br><span>index 168d791..9c8e89c 100755</span><br><span>--- a/configure</span><br><span>+++ b/configure</span><br><span>@@ -1013,10 +1013,6 @@</span><br><span> PGSQL_DIR</span><br><span> PGSQL_INCLUDE</span><br><span> PGSQL_LIB</span><br><span style="color: hsl(0, 100%, 40%);">-PBX_OSPTK</span><br><span style="color: hsl(0, 100%, 40%);">-OSPTK_DIR</span><br><span style="color: hsl(0, 100%, 40%);">-OSPTK_INCLUDE</span><br><span style="color: hsl(0, 100%, 40%);">-OSPTK_LIB</span><br><span> PBX_OPUSFILE</span><br><span> OPUSFILE_DIR</span><br><span> OPUSFILE_INCLUDE</span><br><span>@@ -1428,7 +1424,6 @@</span><br><span> with_openr2</span><br><span> with_opus</span><br><span> with_opusfile</span><br><span style="color: hsl(0, 100%, 40%);">-with_osptk</span><br><span> with_postgres</span><br><span> with_beanstalk</span><br><span> with_pjproject</span><br><span>@@ -2199,7 +2194,6 @@</span><br><span>   --with-openr2=PATH      use MFR2 files in PATH</span><br><span>   --with-opus=PATH        use Opus files in PATH</span><br><span>   --with-opusfile=PATH    use Opusfile files in PATH</span><br><span style="color: hsl(0, 100%, 40%);">-  --with-osptk=PATH       use OSP Toolkit files in PATH</span><br><span>   --with-postgres=PATH    use PostgreSQL files in PATH</span><br><span>   --with-beanstalk=PATH   use Beanstalk Job Queue files in PATH</span><br><span>   --with-pjproject=PATH   use PJPROJECT files in PATH</span><br><span>@@ -12857,39 +12851,6 @@</span><br><span> </span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    OSPTK_DESCRIP="OSP Toolkit"</span><br><span style="color: hsl(0, 100%, 40%);">-    OSPTK_OPTION="osptk"</span><br><span style="color: hsl(0, 100%, 40%);">-    PBX_OSPTK=0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-# Check whether --with-osptk was given.</span><br><span style="color: hsl(0, 100%, 40%);">-if test ${with_osptk+y}</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-  withval=$with_osptk;</span><br><span style="color: hsl(0, 100%, 40%);">- case ${withval} in</span><br><span style="color: hsl(0, 100%, 40%);">-      n|no)</span><br><span style="color: hsl(0, 100%, 40%);">-   USE_OSPTK=no</span><br><span style="color: hsl(0, 100%, 40%);">-    # -1 is a magic value used by menuselect to know that the package</span><br><span style="color: hsl(0, 100%, 40%);">-       # was disabled, other than 'not found'</span><br><span style="color: hsl(0, 100%, 40%);">-  PBX_OSPTK=-1</span><br><span style="color: hsl(0, 100%, 40%);">-    ;;</span><br><span style="color: hsl(0, 100%, 40%);">-      y|ye|yes)</span><br><span style="color: hsl(0, 100%, 40%);">-       ac_mandatory_list="${ac_mandatory_list} OSPTK"</span><br><span style="color: hsl(0, 100%, 40%);">-        ;;</span><br><span style="color: hsl(0, 100%, 40%);">-      *)</span><br><span style="color: hsl(0, 100%, 40%);">-      OSPTK_DIR="${withval}"</span><br><span style="color: hsl(0, 100%, 40%);">-        ac_mandatory_list="${ac_mandatory_list} OSPTK"</span><br><span style="color: hsl(0, 100%, 40%);">-        ;;</span><br><span style="color: hsl(0, 100%, 40%);">-      esac</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     PGSQL_DESCRIP="PostgreSQL"</span><br><span>     PGSQL_OPTION="postgres"</span><br><span>     PBX_PGSQL=0</span><br><span>@@ -32853,138 +32814,6 @@</span><br><span> fi</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-if test "$PBX_OPENSSL" = "1";</span><br><span style="color: hsl(0, 100%, 40%);">-then</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   # if OSPTK has not been checked and is not excluded</span><br><span style="color: hsl(0, 100%, 40%);">-     if test "x${PBX_OSPTK}" != "x1" -a "${USE_OSPTK}" != "no"; then</span><br><span style="color: hsl(0, 100%, 40%);">-         # if --with-osptk=DIR has been specified, use it.</span><br><span style="color: hsl(0, 100%, 40%);">-               if test "x${OSPTK_DIR}" != "x"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                        osptk_cflags="-I${OSPTK_DIR}/include"</span><br><span style="color: hsl(0, 100%, 40%);">-                 osptk_ldflags="-L${OSPTK_DIR}/lib"</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-                    osptk_cflags=""</span><br><span style="color: hsl(0, 100%, 40%);">-                       osptk_ldflags=""</span><br><span style="color: hsl(0, 100%, 40%);">-              fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              # check for the header</span><br><span style="color: hsl(0, 100%, 40%);">-          osptk_saved_cppflags="${CPPFLAGS}"</span><br><span style="color: hsl(0, 100%, 40%);">-            CPPFLAGS="${CPPFLAGS} ${osptk_cflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-                ac_fn_c_check_header_compile "$LINENO" "osp/osp.h" "ac_cv_header_osp_osp_h" "$ac_includes_default"</span><br><span style="color: hsl(0, 100%, 40%);">-if test "x$ac_cv_header_osp_osp_h" = xyes</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-  osptk_header_found=yes</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-  osptk_header_found=no</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                CPPFLAGS="${osptk_saved_cppflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            # check for the library</span><br><span style="color: hsl(0, 100%, 40%);">-         if test "${osptk_header_found}" = "yes"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                       osptk_extralibs="-lssl -lcrypto"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OSPPInit in -losptk" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf %s "checking for OSPPInit in -losptk... " >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-if test ${ac_cv_lib_osptk_OSPPInit+y}</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-  printf %s "(cached) " >&6</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-  ac_check_lib_save_LIBS=$LIBS</span><br><span style="color: hsl(0, 100%, 40%);">-LIBS="-losptk ${osptk_ldflags} ${osptk_extralibs} $LIBS"</span><br><span style="color: hsl(0, 100%, 40%);">-cat confdefs.h - <<_ACEOF >conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-/* end confdefs.h.  */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Override any GCC internal prototype to avoid an error.</span><br><span style="color: hsl(0, 100%, 40%);">-   Use char because int might match the return type of a GCC</span><br><span style="color: hsl(0, 100%, 40%);">-   builtin and then its argument prototype would still apply.  */</span><br><span style="color: hsl(0, 100%, 40%);">-char OSPPInit ();</span><br><span style="color: hsl(0, 100%, 40%);">-int</span><br><span style="color: hsl(0, 100%, 40%);">-main (void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-return OSPPInit ();</span><br><span style="color: hsl(0, 100%, 40%);">-  ;</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-_ACEOF</span><br><span style="color: hsl(0, 100%, 40%);">-if ac_fn_c_try_link "$LINENO"</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-  ac_cv_lib_osptk_OSPPInit=yes</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-  ac_cv_lib_osptk_OSPPInit=no</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-rm -f core conftest.err conftest.$ac_objext conftest.beam \</span><br><span style="color: hsl(0, 100%, 40%);">-    conftest$ac_exeext conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-LIBS=$ac_check_lib_save_LIBS</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_osptk_OSPPInit" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "$ac_cv_lib_osptk_OSPPInit" >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-if test "x$ac_cv_lib_osptk_OSPPInit" = xyes</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-  osptk_library_found=yes</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-  osptk_library_found=no</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     # check OSP Toolkit version</span><br><span style="color: hsl(0, 100%, 40%);">-                     if test "${osptk_library_found}" = "yes"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                              { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if OSP Toolkit version is compatible with app_osplookup" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf %s "checking if OSP Toolkit version is compatible with app_osplookup... " >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                          osptk_saved_cppflags="${CPPFLAGS}"</span><br><span style="color: hsl(0, 100%, 40%);">-                            CPPFLAGS="${CPPFLAGS} ${osptk_cflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-                                if test "$cross_compiling" = yes</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}</span><br><span style="color: hsl(0, 100%, 40%);">-as_fn_error $? "cannot run test program while cross compiling</span><br><span style="color: hsl(0, 100%, 40%);">-See \`config.log' for more details" "$LINENO" 5; }</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-/* end confdefs.h.  */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                                            #include <osp/osp.h></span><br><span style="color: hsl(0, 100%, 40%);">-                                              int main(void) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        int ver = OSP_CLIENT_TOOLKIT_VERSION_MAJOR * 10000 + OSP_CLIENT_TOOLKIT_VERSION_MINOR * 100 + OSP_CLIENT_TOOLKIT_VERSION_BUGFIX;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        int req = 4 * 10000 + 0 * 100 + 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      return (ver < req) ? 1 : 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-_ACEOF</span><br><span style="color: hsl(0, 100%, 40%);">-if ac_fn_c_try_run "$LINENO"</span><br><span style="color: hsl(0, 100%, 40%);">-then :</span><br><span style="color: hsl(0, 100%, 40%);">-  osptk_compatible=yes</span><br><span style="color: hsl(0, 100%, 40%);">-else $as_nop</span><br><span style="color: hsl(0, 100%, 40%);">-  osptk_compatible=no</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \</span><br><span style="color: hsl(0, 100%, 40%);">-  conftest.$ac_objext conftest.beam conftest.$ac_ext</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                                CPPFLAGS="${osptk_saved_cppflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                            if test "${osptk_compatible}" = "yes"; then</span><br><span style="color: hsl(0, 100%, 40%);">-                                 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "yes" >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-                                  PBX_OSPTK=1</span><br><span style="color: hsl(0, 100%, 40%);">-                                     OSPTK_INCLUDE="${osptk_cflags}"</span><br><span style="color: hsl(0, 100%, 40%);">-                                       OSPTK_LIB="${osptk_ldflags} -losptk ${osptk_extralibs}"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "#define HAVE_OSPTK 1" >>confdefs.h</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                            else</span><br><span style="color: hsl(0, 100%, 40%);">-                                    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5</span><br><span style="color: hsl(0, 100%, 40%);">-printf "%s\n" "no" >&6; }</span><br><span style="color: hsl(0, 100%, 40%);">-                            fi</span><br><span style="color: hsl(0, 100%, 40%);">-                      fi</span><br><span style="color: hsl(0, 100%, 40%);">-              fi</span><br><span style="color: hsl(0, 100%, 40%);">-      fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> if test "x${PBX_SRTP}" != "x1" -a "${USE_SRTP}" != "no"; then</span><br><span>    pbxlibdir=""</span><br><span>    # if --with-SRTP=DIR has been specified, use it.</span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>index b7a206d..1188771 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -568,7 +568,6 @@</span><br><span> AST_EXT_LIB_SETUP([OPENR2], [MFR2], [openr2])</span><br><span> AST_EXT_LIB_SETUP([OPUS], [Opus], [opus])</span><br><span> AST_EXT_LIB_SETUP([OPUSFILE], [Opusfile], [opusfile])</span><br><span style="color: hsl(0, 100%, 40%);">-AST_EXT_LIB_SETUP([OSPTK], [OSP Toolkit], [osptk])</span><br><span> AST_EXT_LIB_SETUP([PGSQL], [PostgreSQL], [postgres])</span><br><span> AST_EXT_LIB_SETUP([BEANSTALK], [Beanstalk Job Queue], [beanstalk])</span><br><span> </span><br><span>@@ -2684,11 +2683,6 @@</span><br><span> AC_CHECK_LIB([crypt], [crypt_r],</span><br><span>     [AC_DEFINE([HAVE_CRYPT_R], [1], [Define to 1 if you have the 'crypt_r' function.])])</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-if test "$PBX_OPENSSL" = "1";</span><br><span style="color: hsl(0, 100%, 40%);">-then</span><br><span style="color: hsl(0, 100%, 40%);">-        AST_CHECK_OSPTK([4], [0], [0])</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> AST_EXT_LIB_CHECK([SRTP], [srtp2], [srtp_init], [srtp2/srtp.h], [], [], [2])</span><br><span> AST_EXT_LIB_CHECK_SHARED([SRTP], [srtp2], [srtp_init], [srtp2/srtp.h], [], [], [], [</span><br><span>     AC_MSG_WARN([***])</span><br><span>diff --git a/contrib/scripts/install_prereq b/contrib/scripts/install_prereq</span><br><span>index b9c7321..590ada5 100755</span><br><span>--- a/contrib/scripts/install_prereq</span><br><span>+++ b/contrib/scripts/install_prereq</span><br><span>@@ -25,7 +25,7 @@</span><br><span> # Asterisk: for addons:</span><br><span> PACKAGES_DEBIAN="$PACKAGES_DEBIAN libspeex-dev libspeexdsp-dev libogg-dev libvorbis-dev libasound2-dev portaudio19-dev libcurl4-openssl-dev xmlstarlet bison flex"</span><br><span> PACKAGES_DEBIAN="$PACKAGES_DEBIAN libpq-dev unixodbc-dev libneon27-dev libgmime-2.6-dev libgmime-3.0-dev liblua5.2-dev liburiparser-dev libxslt1-dev libssl-dev"</span><br><span style="color: hsl(0, 100%, 40%);">-PACKAGES_DEBIAN="$PACKAGES_DEBIAN libmysqlclient-dev libbluetooth-dev libradcli-dev freetds-dev libosptk-dev libjack-jackd2-dev bash libcap-dev"</span><br><span style="color: hsl(120, 100%, 40%);">+PACKAGES_DEBIAN="$PACKAGES_DEBIAN libmysqlclient-dev libbluetooth-dev libradcli-dev freetds-dev libjack-jackd2-dev bash libcap-dev"</span><br><span> PACKAGES_DEBIAN="$PACKAGES_DEBIAN libsnmp-dev libiksemel-dev libcorosync-common-dev libcpg-dev libcfg-dev libnewt-dev libpopt-dev libical-dev libspandsp-dev"</span><br><span> PACKAGES_DEBIAN="$PACKAGES_DEBIAN libresample1-dev libc-client2007e-dev binutils-dev libsrtp0-dev libsrtp2-dev libgsm1-dev doxygen graphviz zlib1g-dev libldap2-dev"</span><br><span> PACKAGES_DEBIAN="$PACKAGES_DEBIAN libcodec2-dev libfftw3-dev libsndfile1-dev libunbound-dev"</span><br><span>diff --git a/doc/UPGRADE-staging/app_osplookup_removal.txt b/doc/UPGRADE-staging/app_osplookup_removal.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..6900e49</span><br><span>--- /dev/null</span><br><span>+++ b/doc/UPGRADE-staging/app_osplookup_removal.txt</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: app_osplookup</span><br><span style="color: hsl(120, 100%, 40%);">+Master-Only: True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This module was deprecated in Asterisk 19</span><br><span style="color: hsl(120, 100%, 40%);">+and is now being removed in accordance with</span><br><span style="color: hsl(120, 100%, 40%);">+the Asterisk Module Deprecation policy.</span><br><span>diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in</span><br><span>index 3c6b42f..a86d168 100644</span><br><span>--- a/include/asterisk/autoconfig.h.in</span><br><span>+++ b/include/asterisk/autoconfig.h.in</span><br><span>@@ -580,9 +580,6 @@</span><br><span> /* Define to 1 if you have the Opusfile library. */</span><br><span> #undef HAVE_OPUSFILE</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Define this to indicate the ${OSPTK_DESCRIP} library */</span><br><span style="color: hsl(0, 100%, 40%);">-#undef HAVE_OSPTK</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Define to 1 if your system defines the file flag O_EVTONLY in fcntl.h */</span><br><span> #undef HAVE_O_EVTONLY</span><br><span> </span><br><span>diff --git a/makeopts.in b/makeopts.in</span><br><span>index 4f3778f..0f6cb91 100644</span><br><span>--- a/makeopts.in</span><br><span>+++ b/makeopts.in</span><br><span>@@ -224,9 +224,6 @@</span><br><span> OPUSFILE_INCLUDE=@OPUSFILE_INCLUDE@</span><br><span> OPUSFILE_LIB=@OPUSFILE_LIB@</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-OSPTK_INCLUDE=@OSPTK_INCLUDE@</span><br><span style="color: hsl(0, 100%, 40%);">-OSPTK_LIB=@OSPTK_LIB@</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> PGSQL_INCLUDE=@PGSQL_INCLUDE@</span><br><span> PGSQL_LIB=@PGSQL_LIB@</span><br><span> </span><br><span>diff --git a/menuselect/example_menuselect-tree b/menuselect/example_menuselect-tree</span><br><span>index 0b703e6..b7115ab 100644</span><br><span>--- a/menuselect/example_menuselect-tree</span><br><span>+++ b/menuselect/example_menuselect-tree</span><br><span>@@ -77,10 +77,6 @@</span><br><span>             </member></span><br><span>              <member name="app_mp3" displayname="Silly MP3 Application" remove_on_change="apps/app_mp3.o apps/app_mp3.so"></span><br><span>            </member></span><br><span style="color: hsl(0, 100%, 40%);">-         <member name="app_osplookup" displayname="Open Settlement Protocol Applications" remove_on_change="apps/app_osplookup.o apps/app_osplookup.so"></span><br><span style="color: hsl(0, 100%, 40%);">-     <depend>libosptk</depend></span><br><span style="color: hsl(0, 100%, 40%);">-   <depend>ssl</depend></span><br><span style="color: hsl(0, 100%, 40%);">-                </member></span><br><span>              <member name="app_page" displayname="Page Multiple Phones" remove_on_change="apps/app_page.o apps/app_page.so"></span><br><span>  <depend>zaptel</depend></span><br><span>          </member></span><br><span>@@ -374,10 +370,6 @@</span><br><span>               <member name="res_odbc" displayname="ODBC Resource" remove_on_change="res/res_odbc.o res/res_odbc.so"></span><br><span>   <depend>unixodbc</depend></span><br><span>                </member></span><br><span style="color: hsl(0, 100%, 40%);">-         <member name="res_osp" displayname="Open Settlement Protocol Support" remove_on_change="res/res_osp.o res/res_osp.so"></span><br><span style="color: hsl(0, 100%, 40%);">-      <depend>libosptk</depend></span><br><span style="color: hsl(0, 100%, 40%);">-   <depend>ssl</depend></span><br><span style="color: hsl(0, 100%, 40%);">-                </member></span><br><span>              <member name="res_smdi" displayname="Asterisk Simplified Message Desk Interface (SMDI) Module" remove_on_change="res/res_smdi.o res/res_smdi.so"></span><br><span>                </member></span><br><span>              <member name="res_snmp" displayname="SNMP [Sub]Agent for Asterisk" remove_on_change="res/res_snmp.o res/res_snmp.so"></span><br><span>diff --git a/menuselect/test/build_tools/menuselect-deps b/menuselect/test/build_tools/menuselect-deps</span><br><span>index a705549..1566cf8 100644</span><br><span>--- a/menuselect/test/build_tools/menuselect-deps</span><br><span>+++ b/menuselect/test/build_tools/menuselect-deps</span><br><span>@@ -25,7 +25,6 @@</span><br><span> NEWT=1</span><br><span> OGG=1</span><br><span> OPENH323=0</span><br><span style="color: hsl(0, 100%, 40%);">-OSPTK=1</span><br><span> OSSAUDIO=1</span><br><span> PGSQL=1</span><br><span> POPT=1</span><br><span>diff --git a/menuselect/test/menuselect-tree b/menuselect/test/menuselect-tree</span><br><span>index 3710278..d2f5df7 100644</span><br><span>--- a/menuselect/test/menuselect-tree</span><br><span>+++ b/menuselect/test/menuselect-tree</span><br><span>@@ -88,10 +88,6 @@</span><br><span> </member></span><br><span> <member name="app_mp3" displayname="Silly MP3 Application" remove_on_change="apps/app_mp3.o apps/app_mp3.so"></span><br><span> </member></span><br><span style="color: hsl(0, 100%, 40%);">-<member name="app_osplookup" displayname="Open Settlement Protocol Applications" remove_on_change="apps/app_osplookup.o apps/app_osplookup.so"></span><br><span style="color: hsl(0, 100%, 40%);">-   <depend>osptk</depend></span><br><span style="color: hsl(0, 100%, 40%);">-      <depend>ssl</depend></span><br><span style="color: hsl(0, 100%, 40%);">-</member></span><br><span> <member name="app_page" displayname="Page Multiple Phones" remove_on_change="apps/app_page.o apps/app_page.so"></span><br><span>       <depend name="dahdi">DAHDI</depend></span><br><span>    <depend>app_meetme</depend></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/19571">change 19571</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/19571"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2268189646fa0b587675d8619322818143172474 </div>
<div style="display:none"> Gerrit-Change-Number: 19571 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Michael Bradeen <mbradeen@sangoma.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>