<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][16021] </title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=16021">16021</a></dd>
<dt>Author</dt> <dd>mikej</dd>
<dt>Date</dt> <dd>2009-12-22 13:10:16 -0600 (Tue, 22 Dec 2009)</dd>
</dl>
<h3>Log Message</h3>
<pre>inital addition of libuuid to tree</pre>
<h3>Added Paths</h3>
<ul>
<li>freeswitch/trunk/libs/uuid/</li>
<li><a href="#freeswitchtrunklibsuuidAUTHORS">freeswitch/trunk/libs/uuid/AUTHORS</a></li>
<li><a href="#freeswitchtrunklibsuuidBINDINGS">freeswitch/trunk/libs/uuid/BINDINGS</a></li>
<li><a href="#freeswitchtrunklibsuuidChangeLog">freeswitch/trunk/libs/uuid/ChangeLog</a></li>
<li><a href="#freeswitchtrunklibsuuidHISTORY">freeswitch/trunk/libs/uuid/HISTORY</a></li>
<li><a href="#freeswitchtrunklibsuuidINSTALL">freeswitch/trunk/libs/uuid/INSTALL</a></li>
<li><a href="#freeswitchtrunklibsuuidMANIFEST">freeswitch/trunk/libs/uuid/MANIFEST</a></li>
<li><a href="#freeswitchtrunklibsuuidMakefilePL">freeswitch/trunk/libs/uuid/Makefile.PL</a></li>
<li><a href="#freeswitchtrunklibsuuidMakefilein">freeswitch/trunk/libs/uuid/Makefile.in</a></li>
<li><a href="#freeswitchtrunklibsuuidNEWS">freeswitch/trunk/libs/uuid/NEWS</a></li>
<li><a href="#freeswitchtrunklibsuuidOVERVIEW">freeswitch/trunk/libs/uuid/OVERVIEW</a></li>
<li><a href="#freeswitchtrunklibsuuidPORTING">freeswitch/trunk/libs/uuid/PORTING</a></li>
<li><a href="#freeswitchtrunklibsuuidREADME">freeswitch/trunk/libs/uuid/README</a></li>
<li><a href="#freeswitchtrunklibsuuidSEEALSO">freeswitch/trunk/libs/uuid/SEEALSO</a></li>
<li><a href="#freeswitchtrunklibsuuidTHANKS">freeswitch/trunk/libs/uuid/THANKS</a></li>
<li><a href="#freeswitchtrunklibsuuidTODO">freeswitch/trunk/libs/uuid/TODO</a></li>
<li><a href="#freeswitchtrunklibsuuidUSERS">freeswitch/trunk/libs/uuid/USERS</a></li>
<li><a href="#freeswitchtrunklibsuuidacincludem4">freeswitch/trunk/libs/uuid/acinclude.m4</a></li>
<li><a href="#freeswitchtrunklibsuuidconfighin">freeswitch/trunk/libs/uuid/config.h.in</a></li>
<li><a href="#freeswitchtrunklibsuuidconfigureac">freeswitch/trunk/libs/uuid/configure.ac</a></li>
<li>freeswitch/trunk/libs/uuid/perl/</li>
<li><a href="#freeswitchtrunklibsuuidperlMANIFEST">freeswitch/trunk/libs/uuid/perl/MANIFEST</a></li>
<li><a href="#freeswitchtrunklibsuuidperlMakefilePL">freeswitch/trunk/libs/uuid/perl/Makefile.PL</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuidpm">freeswitch/trunk/libs/uuid/perl/uuid.pm</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuidpod">freeswitch/trunk/libs/uuid/perl/uuid.pod</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuidtm">freeswitch/trunk/libs/uuid/perl/uuid.tm</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuidts">freeswitch/trunk/libs/uuid/perl/uuid.ts</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuidxs">freeswitch/trunk/libs/uuid/perl/uuid.xs</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuid_compatpm">freeswitch/trunk/libs/uuid/perl/uuid_compat.pm</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuid_compatpod">freeswitch/trunk/libs/uuid/perl/uuid_compat.pod</a></li>
<li><a href="#freeswitchtrunklibsuuidperluuid_compatts">freeswitch/trunk/libs/uuid/perl/uuid_compat.ts</a></li>
<li>freeswitch/trunk/libs/uuid/pgsql/</li>
<li><a href="#freeswitchtrunklibsuuidpgsqlMakefile">freeswitch/trunk/libs/uuid/pgsql/Makefile</a></li>
<li><a href="#freeswitchtrunklibsuuidpgsqluuidc">freeswitch/trunk/libs/uuid/pgsql/uuid.c</a></li>
<li><a href="#freeswitchtrunklibsuuidpgsqluuidsqlin">freeswitch/trunk/libs/uuid/pgsql/uuid.sql.in</a></li>
<li><a href="#freeswitchtrunklibsuuidpgsqluuidtxt">freeswitch/trunk/libs/uuid/pgsql/uuid.txt</a></li>
<li>freeswitch/trunk/libs/uuid/php/</li>
<li><a href="#freeswitchtrunklibsuuidphpMakefilelocal">freeswitch/trunk/libs/uuid/php/Makefile.local</a></li>
<li><a href="#freeswitchtrunklibsuuidphpconfigm4">freeswitch/trunk/libs/uuid/php/config.m4</a></li>
<li><a href="#freeswitchtrunklibsuuidphppackagexml">freeswitch/trunk/libs/uuid/php/package.xml</a></li>
<li><a href="#freeswitchtrunklibsuuidphpuuidc">freeswitch/trunk/libs/uuid/php/uuid.c</a></li>
<li><a href="#freeswitchtrunklibsuuidphpuuidphp4">freeswitch/trunk/libs/uuid/php/uuid.php4</a></li>
<li><a href="#freeswitchtrunklibsuuidphpuuidphp5">freeswitch/trunk/libs/uuid/php/uuid.php5</a></li>
<li><a href="#freeswitchtrunklibsuuidphpuuidts">freeswitch/trunk/libs/uuid/php/uuid.ts</a></li>
<li><a href="#freeswitchtrunklibsuuidshtool">freeswitch/trunk/libs/uuid/shtool</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid3">freeswitch/trunk/libs/uuid/uuid++.3</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidcc">freeswitch/trunk/libs/uuid/uuid++.cc</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidhh">freeswitch/trunk/libs/uuid/uuid++.hh</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidpod">freeswitch/trunk/libs/uuid/uuid++.pod</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidconfig1">freeswitch/trunk/libs/uuid/uuid-config.1</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidconfigin">freeswitch/trunk/libs/uuid/uuid-config.in</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidconfigpod">freeswitch/trunk/libs/uuid/uuid-config.pod</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid1">freeswitch/trunk/libs/uuid/uuid.1</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid3">freeswitch/trunk/libs/uuid/uuid.3</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidac">freeswitch/trunk/libs/uuid/uuid.ac</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidc">freeswitch/trunk/libs/uuid/uuid.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidhin">freeswitch/trunk/libs/uuid/uuid.h.in</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidpcin">freeswitch/trunk/libs/uuid/uuid.pc.in</a></li>
<li><a href="#freeswitchtrunklibsuuiduuidpod">freeswitch/trunk/libs/uuid/uuid.pod</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_ach">freeswitch/trunk/libs/uuid/uuid_ac.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_bmh">freeswitch/trunk/libs/uuid/uuid_bm.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_clic">freeswitch/trunk/libs/uuid/uuid_cli.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_clipod">freeswitch/trunk/libs/uuid/uuid_cli.pod</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_dcec">freeswitch/trunk/libs/uuid/uuid_dce.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_dceh">freeswitch/trunk/libs/uuid/uuid_dce.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_macc">freeswitch/trunk/libs/uuid/uuid_mac.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_mach">freeswitch/trunk/libs/uuid/uuid_mac.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_md5c">freeswitch/trunk/libs/uuid/uuid_md5.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_md5h">freeswitch/trunk/libs/uuid/uuid_md5.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_prngc">freeswitch/trunk/libs/uuid/uuid_prng.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_prngh">freeswitch/trunk/libs/uuid/uuid_prng.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_sha1c">freeswitch/trunk/libs/uuid/uuid_sha1.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_sha1h">freeswitch/trunk/libs/uuid/uuid_sha1.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_strc">freeswitch/trunk/libs/uuid/uuid_str.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_strh">freeswitch/trunk/libs/uuid/uuid_str.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_timec">freeswitch/trunk/libs/uuid/uuid_time.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_timeh">freeswitch/trunk/libs/uuid/uuid_time.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_ui128c">freeswitch/trunk/libs/uuid/uuid_ui128.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_ui128h">freeswitch/trunk/libs/uuid/uuid_ui128.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_ui64c">freeswitch/trunk/libs/uuid/uuid_ui64.c</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_ui64h">freeswitch/trunk/libs/uuid/uuid_ui64.h</a></li>
<li><a href="#freeswitchtrunklibsuuiduuid_versh">freeswitch/trunk/libs/uuid/uuid_vers.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunklibsuuidAUTHORS"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/AUTHORS (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/AUTHORS         (rev 0)
+++ freeswitch/trunk/libs/uuid/AUTHORS        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ AUTHORS
+
+ This is a list of authors who have written
+ or edited major parts of the OSSP uuid sources.
+
+ Ralf S. Engelschall <rse@engelschall.com>
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidBINDINGS"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/BINDINGS (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/BINDINGS         (rev 0)
+++ freeswitch/trunk/libs/uuid/BINDINGS        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+
+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ LANGUAGE BINDINGS
+
+ Various programming language bindings exist for OSSP uuid.
+ The following is the list of known bindings:
+
+ o C
+ (native API)
+
+ o C++
+ (addon API; part of the OSSP uuid distribution; see uuid++.* files)
+
+ o Perl
+ (addon API; part of the OSSP uuid distribution; see perl/ directory)
+
+ o PHP
+ (addon API; part of the OSSP uuid distribution; see php/ directory)
+
+ o PostgreSQL
+ (addon API; part of the OSSP uuid distribution; see pgsql/ directory)
+
+ o GNU Guile GEE (Scheme)
+ https://gna.org/projects/gee
+
+ o Chicken (Scheme)
+ http://www.call-with-current-continuation.org/eggs/uuid-ossp.html
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidChangeLog"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/ChangeLog (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/ChangeLog         (rev 0)
+++ freeswitch/trunk/libs/uuid/ChangeLog        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,624 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ CHANGELOG
+
+ This is a list of all changes to OSSP uuid.
+ For a more brief summary please have a look at the NEWS file.
+
+ Changes between 1.6.1 and 1.6.2 (21-Feb-2008 to 04-Jul-2008)
+
+ o Adjust "devtool.func" for latest GNU Libtool compatibility.
+ [Ralf S. Engelschall]
+
+ o Improve PRNG under Win32.
+ [Hiroshi Saito]
+
+ o Consistently annotate "RFC-XXXX" with "IETF" to clearly
+ indicate from which standards body this comes from.
+ [Ralf S. Engelschall]
+
+ o Resolve namespace conflicts of recently introduced time_xxx()
+ functions by using a propoer "uuid_" prefix.
+ [Ralf S. Engelschall]
+
+ o Remove unused "struct timezone" from time_gettimeofday() in
+ order to simplify portability.
+ [Ralf S. Engelschall]
+
+ o Add support for POSIX clock_gettime(3) in case the Unix/POSIX
+ gettimeofday(3) is not available.
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU autoconf 2.62.
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU libtool 2.2.4.
+ [Ralf S. Engelschall]
+
+ Changes between 1.6.0 and 1.6.1 (19-May-2007 to 21-Feb-2008)
+
+ o Port to Win32 API.
+ [Hiroshi Saito, Wu Yongwei, Ralf S. Engelschall]
+
+ o Adjust copyright messages for new year 2008.
+ [Ralf S. Engelschall]
+
+ o Fix __VA_COPY_USE_{CSP,CPP} fallback macros for va_copy.
+ [Mark A. Lindner <mark.a.lindner@gmail.com>]
+
+ o PostgreSQL bindings: use SET_VARSIZE() instead
+ of assigning to bytea->v_len under PostgreSQL >= 8.3
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU libtool 1.5.26
+ [Ralf S. Engelschall]
+
+ Changes between 1.5.1 and 1.6.0 (31-Jul-2006 to 19-May-2007)
+
+ o Expand unused "datarootdir" in Makefile.in and uuid-config.in to
+ make newer GNU autoconf versions happy.
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU shtool 2.0.7
+ [Ralf S. Engelschall]
+
+ o Make GNU autoconf procedure of PHP binding more robust by using
+ -Wl,-Bsymbolic only on platforms where uuid_create(3) actually
+ exists and where -Wl,-Bsymbolic is really accepted by the tool
+ chain. This especially unbreaks MacOS X.
+ [Ralf S. Engelschall]
+
+ o Fix "uuid_export" function in PHP bindings under
+ UUID_FMT_SIV, UUID_FMT_STR and UUID_FMT_TXT where the
+ NUL-termination character should be not passed back to PHP.
+ [Neil Caunt <retardis@gmail.com>, Ralf S. Engelschall]
+
+ o Adjust copyright messages for new year 2007.
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU autoconf 2.61
+ [Ralf S. Engelschall]
+
+ o Disable PostgreSQL "(CSTRING AS uuid)" and "(uuid AS CSTRING)"
+ CASTS as PostgreSQL 8.2 and higher explicitly disallow this.
+ [David Wheeler <david@kineticode.com>, Ralf S. Engelschall]
+
+ o Fix PostgreSQL bindings by mapping the correct DSO symbol
+ to the functions "uuid_send" and "uuid_recv".
+ [Ralf S. Engelschall]
+
+ o Silence PostgreSQL processing messages
+ [David Wheeler <david@kineticode.com>]
+
+ o Support MacOS X (aka Darwin) in PostgreSQL bindings by passing
+ a "-bundle_loader" option to the linker in order to resolve the
+ "undefined symbols" problem.
+ [David Wheeler <david@kineticode.com>, Ralf S. Engelschall]
+
+ o Pass the correct type to PostgreSQL's errmsg().
+ [David Wheeler <david@kineticode.com>, Ralf S. Engelschall]
+
+ o Added PostgreSQL 8.2 PG_MODULE_MAGIC support.
+ [David Wheeler <david@kineticode.com>]
+
+ o Fix the Data::UUID::to_b64string() function of the Perl backward
+ compatibility API: an empty string was not supplied as the EOL
+ marker to MIME::Base64::encode_base64() and hence the returned
+ string ended with a newline character (which in turn breaks many
+ applications using Data::UUID).
+ [Piotr Roszatycki <dexter@debian.org>]
+
+ o Change type of "data_ptr" argument in uuid_export() API signature
+ from "void **" to "void *" as there is unfortunately no
+ "generic pointer to pointer type" in ISO C (see also
+ http://c-faq.com/ptrs/genericpp.html) and "void **" is just a
+ "pointer to a 'void *'".
+
+ The "void **" especially had the nasty side-effect that it breaks
+ strict pointer aliasing rules of ISO C and hence would require
+ fiddling with temporary variables on all uuid_export() calls if
+ one would be 100% correct and avoid aliasing related compiler
+ warnings. Instead, as uuid_export() internally has to cast the
+ "data_ptr" to the particular expected type anyway, it is better
+ to have "data_ptr" just be a really generic "void *" in the API
+ signature.
+
+ Keep in mind that although this is an API change, it doesn't cause
+ any incompatibilities as the function still expects the same
+ "pointer to a pointer of a particular type". This expected pointer
+ is just now passed the more correct although less intuitive way.
+ [Hrvoje Niksic <hniksic@xemacs.org>, Ralf S. Engelschall]
+
+ o Optional DMALLOC based memory debugging support.
+ [Ralf S. Engelschall]
+
+ o Consistently include "uuid_ac.h" in all source files to have GNU
+ autoconf results and standard system defines available everywhere.
+ [Ralf S. Engelschall]
+
+ Changes between 1.5.0 and 1.5.1 (28-Jul-2006 to 31-Jul-2006)
+
+ o Use "MODULE_PATHNAME" instead of "@MODULE_PATHNAME@" in
+ uuid.sql.in to be more aligned to the PostgreSQL styles.
+ [Simon "janus" Dassow <janus@errornet.de>]
+
+ o Use the available variables $(LIB_NAME), $(DCE_NAME) and
+ $(CXX_NAME) more consistently in Makefile.in to allow packagers to
+ override the library name with less patching.
+ [Piotr Roszatycki <dexter@debian.org>]
+
+ o Fix the "make distclean" target of php/Makefile.local
+ to make sure the ".deps" file is not left over.
+ [Ralf S. Engelschall]
+
+ o Fix the tarball rolling procedure to make sure we
+ do not distribute binary files again. This now especially uses
+ a MANIFEST file which explicitly lists all files which form the
+ distribution tarball. We compare the tarball and the MANIFEST file
+ for differences in the "devtool dist" now.
+ [Ralf S. Engelschall]
+
+ Changes between 1.4.2 and 1.5.0 (13-Mar-2006 to 28-Jul-2006)
+
+ o Fixed potential memory leak in uuid_create() as spotted by SPLINT.
+ [Ralf S. Engelschall]
+
+ o Cleanup source code according to complains by SPLINT.
+ [Ralf S. Engelschall]
+
+ o Cleanup internal uuid_mac.h header.
+ [Ralf S. Engelschall]
+
+ o Numerous fixed to the error handling in the PostgreSQL bindings.
+ [Neil Conway <neilc@samurai.com>]
+
+ o Add Hash indexing support UUID data type of PostgreSQL bindings.
+ [Ralf S. Engelschall]
+
+ o Add comparison operators and B-Tree indexing support UUID data
+ type of PostgreSQL bindings.
+ [Roman Neuhauser <neuhauser@sigpipe.cz>]
+
+ o Fix PHP bindings: the wrong argument to uuid_create()
+ was forced to a reference
+ [Roman Neuhauser <neuhauser@sigpipe.cz>]
+
+ o Add full support for Single Integer Value (SIV) UUID representation
+ for both importing and exporting in C/C++/Perl/PHP APIs.
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU shtool 2.0.6 and GNU autoconf 2.60
+ [Ralf S. Engelschall]
+
+ o Added an "OVERVIEW" file which tries to give the "big picture"
+ about UUIDs and allows to survice during the nasty UUID bit fiddling.
+ [Ralf S. Engelschall]
+
+ o Replaced "clock_seq_and_reserved" with
+ "clock_seq_high_and_reserved" in uuid.pod to already reflect the
+ description in the forthcoming RFC.
+ [Ralf S. Engelschall]
+
+ o Speed up processing in uuid_str.c by reducing va_copy() calls from
+ two to just one per formatting.
+ [Ralf S. Engelschall]
+
+ Changes between 1.4.1 and 1.4.2 (07-Feb-2006 to 13-Mar-2006)
+
+ o Fix uuid_export() function by fixing the internal
+ uuid_s[ar]printf() functions which require the backup of va_list
+ arguments between subsequent processing.
+ [Ralf S. Engelschall, Thomas Lotterer <thomas@lotterer.net>]
+
+ o Fix Perl API's "export" function by not taking over NUL-termination
+ character under UUID_FMT_TXT.
+ [Thomas Lotterer <thomas@lotterer.net>]
+
+ o Declare "install", "uninstall" and "clean" make(1) targets
+ ".PHONY". This especially workarounds problems on case insensitive
+ filesystems (like MacOS X' filesystem) where the "INSTALL" document
+ conflicts with the "install" target.
+ [Ralf S. Engelschall, David Wheeler <david@kineticode.com>]
+
+ Changes between 1.4.0 and 1.4.1 (15-Jan-2006 to 07-Feb-2006)
+
+ o Upgrade to GNU shtool 2.0.5
+ [Ralf S. Engelschall]
+
+ o Apply workaround to uuid.h to avoid conflicts with
+ vendor UUID implementations where uuid_t (Darwin/MacOSX)
+ or uuid_create/uuid_compare (POSIX) might exist.
+ [Ralf S. Engelschall]
+
+ Changes between 1.3.2 and 1.4.0 (06-Dec-2005 to 15-Jan-2006)
+
+ o Created a top-level Perl ExtUtils::MakeMaker wrapper script
+ [Ralf S. Engelschall]
+
+ o Adjust copyright messages for new year 2006.
+ [Ralf S. Engelschall]
+
+ o Added experimental PostgreSQL bindings.
+ [Ralf S. Engelschall]
+
+ o Fixed documentation of uuid_make() function.
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU libtool 1.5.22
+ [Ralf S. Engelschall]
+
+ Changes between 1.3.1 and 1.3.2 (24-Sep-2005 to 06-Dec-2005)
+
+ o Cleaned up and speed optimized perl/uuid_compat.pm
+ (the Data::UUID compatibility module for Perl)
+ [David Wheeler <david@justatheory.com>]
+
+ o Upgrade to GNU shtool 2.0.3
+ [Ralf S. Engelschall]
+
+ o Consistently use "return" in uuid++.cc
+ [Ralf S. Engelschall]
+
+ Changes between 1.3.0 and 1.3.1 (02-Sep-2005 to 24-Sep-2005)
+
+ o Fix two incorrect casts, detected by compiling the C code
+ under C++ constraints.
+ [Ralf S. Engelschall]
+
+ o Remove a compiler warning in the PHP bindings.
+ [Ralf S. Engelschall]
+
+ o Plug memory leak in PRNG sub-library.
+ [Ralf S. Engelschall]
+
+ o Add VPATH/srcdir support for at the default
+ build procedure plus at least C++ and DCE build options.
+ [Ralf S. Engelschall]
+
+ Changes between 1.2.1 and 1.3.0 (30-Aug-2005 to 02-Sep-2005)
+
+ o Add an experimental PHP 4/5 language API binding which
+ can be enabled under build-time with opption --with-php.
+ [Ralf S. Engelschall]
+
+ o Upgrade to GNU libtool 1.5.20
+ [Ralf S. Engelschall]
+
+ o Add missing "const" in manual page.
+ [Ralf S. Engelschall]
+
+ o Add an experimental C++ API binding which can be
+ enabled under build-time with option --with-cxx.
+ [Ralf S. Engelschall]
+
+ o Cleanup the internals of the uuid_create() function and
+ add a new corresponding uuid_clone() API function.
+ [Ralf S. Engelschall]
+
+ o Cleanup some Makefile parts.
+ [Ralf S. Engelschall]
+
+ o Added a pkg-config(1) specification uuid.pc which is also
+ installed by default in addition to the old-style uuid-config tool.
+ [Ralf S. Engelschall]
+
+ o Added optional Data::UUID backward compatibility Perl API which can
+ be enabled with the build-time option --with-perl-compat.
+ [Piotr Roszatycki <dexter@debian.org>, Ralf S. Engelschall]
+
+ o Add a functionality-reduced TIE-style Perl API OSSP::uuid::tie,
+ intended for very high-level convenience programming.
+ [Ralf S. Engelschall]
+
+ o Reference the new officially published RFC 4122.
+ [Ralf S. Engelschall]
+
+ Changes between 1.2.0 and 1.2.1 (23-Jan-2005 to 30-Aug-2005)
+
+ o Add SEEALSO document which references all known
+ UUID implementations.
+ [Ralf S. Engelschall]
+
+ o Improve the PRNG in case no stronger system PRNG device is
+ available by passing time and rand(3) based entropy into the MD5
+ one-way hash function to achieve at least some sort of weaker PRN data.
+ [Ralf S. Engelschall]
+
+ o Fix MAC address determination under Solaris by using the result of
+ ioctl(...,SIOCGARP,...) only if arp_flags had ATF_COM set.
+ [Ralf S. Engelschall]
+
+ o Upgrade to GNU libtool 1.5.18 and GNU shtool 2.0.2.
+ [Ralf S. Engelschall]
+
+ o Cleanup the source code even more by following a large
+ set of FlexeLint's suggestions.
+ [Ralf S. Engelschall]
+
+ o Fixed generated "section" number in uuid-config(1).
+ [Piotr Roszatycki <dexter@debian.org>]
+
+ Changes between 1.1.2 and 1.2.0 (13-Jan-2005 to 23-Jan-2005)
+
+ o Added support for new version 5 UUIDs (name-based, SHA-1)
+ according to latest draft-mealling-uuid-urn-05.txt.
+ [Ralf S. Engelschall]
+
+ o Reference new ISO/IEC 9834-8:2004 / ITU-T Rec. X.667 2004 standard
+ and latest IETF draft-mealling-uuid-urn-05.txt.
+ [Ralf S. Engelschall]
+
+ Changes between 1.1.1 and 1.1.2 (18-Nov-2004 to 13-Jan-2005)
+
+ o Fix generation of v3 UUIDs by adding support for 64-bit platforms
+ to the underlying uuid_md5.c code (which internally is based on
+ the RFC reference code which in turn assumes a 32-bit environment).
+ [Ralf S. Engelschall, Piotr Roszatycki <Piotr_Roszatycki@netia.net.pl>]
+
+ o Optimize internal md5_store() function by directly finalizing MD5
+ calculation on buffer copy instead of finalizing original buffer
+ and having to restore it from the buffer copy.
+ [Ralf S. Engelschall]
+
+ o Adjust copyright messages for new year 2005.
+ [Ralf S. Engelschall]
+
+ o Do not rebuild the Perl API if there were no actual changes.
+ [Ralf S. Engelschall]
+
+ Changes between 1.1.0 and 1.1.1 (03-Nov-2004 to 18-Nov-2004)
+
+ o Apply the FreeBSD libc uuid_create() related workaround
+ in the Perl bindings also under FreeBSD 6.0-CURRENT.
+ [Ralf S. Engelschall]
+
+ o Fix --with-perl configure option processing: Perl is
+ only required if --with-perl is used although we search for Perl
+ always in order to provide the PERL variable substitution.
+ [Ralf S. Engelschall]
+
+ Changes between 1.0.4 and 1.1.0 (16-Oct-2004 to 03-Nov-2004)
+
+ o Add --with-perl configure option for optionally enabling
+ the Perl language bindings.
+ [Ralf S. Engelschall]
+
+ o Add Perl language bindings providing both a C-style and OO-style API.
+ [Ralf S. Engelschall]
+
+ Changes between 1.0.3 and 1.0.4 (15-Oct-2004 to 16-Oct-2004)
+
+ o Fix version detection from uuid_vers.h
+ [Ralf S. Engelschall]
+
+ Changes between 1.0.2 and 1.0.3 (12-Sep-2004 to 15-Oct-2004)
+
+ o Support configuring/building/installing from an arbitrary
+ directory via srcdir/top_srcdir/VPATH.
+ [David Lee <t.d.lee@durham.ac.uk>, Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU libtool 1.5.10.
+ [Ralf S. Engelschall]
+
+ Changes between 1.0.1 and 1.0.2 (16-Jul-2004 to 12-Sep-2004)
+
+ o Upgrade build environment to GNU libtool 1.5.8 and GNU shtool 2.0.1
+ [Ralf S. Engelschall]
+
+ Changes between 1.0.0 and 1.0.1 (16-Feb-2004 to 16-Jul-2004)
+
+ o Made documentation of uuid_export() more clear.
+ [Ralf S. Engelschall]
+
+ o Upgrade build environment to GNU libtool 1.5.6 and GNU shtool 2.0.0
+ [Ralf S. Engelschall]
+
+ o Remove some warnings occurring under GCC 3.5
+ [Ralf S. Engelschall]
+
+ Changes between 0.9.7 and 1.0.0 (13-Feb-2004 to 16-Feb-2004)
+
+ o Replace remaining (old) UUID_VERSIONX names with UUID_MAKE_VX
+ in the documentation (uuid.pod).
+ [Ralf S. Engelschall]
+
+ o Resolve namespace conflicts with GCC 3.4 internal pow10() and round()
+ functions within uuid_str.c.
+ [Ralf S. Engelschall]
+
+ o Fix buffer handling in "uuid_export(..., UUID_FMT_TXT, vp, ...)" in
+ case "vp" is not NULL.
+ [Fuyuki <fuyuki@nigredo.org>]
+
+ Changes between 0.9.6 and 0.9.7 (11-Feb-2004 to 13-Feb-2004)
+
+ o remove --with-rfc2518 option and functionality because
+ even the IETF/IESG has finally approved our report about the broken
+ random multicast MAC address generation in the standard (and
+ will fix it in new versions of the draft-mealling-uuid-urn). So,
+ finally get rid of this broken-by-design backward compatibility
+ functionality.
+ [Ralf S. Engelschall]
+
+ o Add support to uuid(1) CLI for decoding from stdin for
+ both binary and string representations.
+ [Ralf S. Engelschall]
+
+ o Add missing documentation entries for UUID_XXXX API constants and
+ uuid_version() function.
+ [Fuyuki <fuyuki@nigredo.org>]
+
+ o Adjust references for new draft-mealling-uuid-urn-02.txt.
+ [Fuyuki <fuyuki@nigredo.org>]
+
+ o Replaced overlooked references to old
+ uuid_{unpack,pack,parse,format,dump}() functions with their
+ current uuid_{import,export}() replacements.
+ [Fuyuki <fuyuki@nigredo.org>]
+
+ o Fixed "uuid -h" command.
+ [Fuyuki <fuyuki@nigredo.org>]
+
+ Changes between 0.9.5 and 0.9.6 (06-Feb-2004 to 11-Feb-2004)
+
+ o Added an experimental additional DCE 1.1 API for backward
+ compatibility with existing applications.
+ [Ralf S. Engelschall]
+
+ Changes between 0.9.4 and 0.9.5 (19-Jan-2004 to 06-Feb-2004)
+
+ o Fixed filedescriptor leak in the PRNG sub-API.
+ [Guerry Semones <guerry@tsunamiresearch.com>]
+
+ o Upgraded build environment to GNU libtool 1.5.2.
+ [Ralf S. Engelschall]
+
+ Changes between 0.9.3 and 0.9.4 (16-Jan-2004 to 19-Jan-2004)
+
+ o Include <string.h> in uuid.h because of size_t usage.
+ [Ralf S. Engelschall]
+
+ o INCOMPATIBILITY: Refactor the API and rename uuid_generate()
+ to uuid_make() and use a "uuid_t" pointer for the namespace
+ on UUID_VERSION3 generation. To allow access to the internal
+ pre-defined namespace UUIDs, provide a new uuid_load() function.
+ Because uuid_load() now also allows the loading of the "nil" UUID,
+ remove uuid_nil() from the API. After this second refactoring the
+ API is now the one we originally wished for the forthcoming version
+ 1.0 of OSSP uuid.
+ [Ralf S. Engelschall]
+
+ o INCOMPATIBILITY: rename UUID_VERSIONx to UUID_MAKE_Vx and
+ UUID_MCASTRND to UUID_MAKE_MC to be more consistent throughout API.
+ [Ralf S. Engelschall]
+
+ o Add version support to API via UUID_VERSION (compile-time)
+ and uuid_version() (link-time).
+ [Ralf S. Engelschall]
+
+ o INCOMPATIBILITY: Refactor the API by merging
+ uuid_{unpack,pack,parse,format,dump}() functions into unified
+ uuid_{import,export}() functions. This allows us to easily add
+ support for other formats (e.g. XML) in the future without having
+ the change the API in principle.
+ [Ralf S. Engelschall]
+
+ o Document what DCE 1.1 UUID versions exist and what they are
+ intended for.
+ [Ralf S. Engelschall]
+
+ o Cleanup the C code to also pass warning-free a C++ compiler.
+ [Ralf S. Engelschall]
+
+ o Support C++ by enclosing the C API declarations in
+ 'extern "C" {...}' within uuid.h.
+ [Guerry Semones <guerry@tsunamiresearch.com>]
+
+ o Improvide decoding in uuid_dump() by at least hex-dumping the
+ binary representation in case of v3, v4 and Nil UUIDs. Also,
+ annotate with better hints.
+ [Ralf S. Engelschall]
+
+ o Recognize special "Nil UUID" on decoding in uuid_dump().
+ [Ralf S. Engelschall]
+
+ Changes between 0.9.2 and 0.9.3 (15-Jan-2004 to 16-Jan-2004)
+
+ o Tested OSSP uuid on 16 particular Unix platforms and list
+ those in the new PORTING file.
+ [Ralf S. Engelschall]
+
+ o Fixed minor formatting bug in call to str_rsprintf().
+ [Ralf S. Engelschall]
+
+ o Fix syntax error in uuid.ac.
+ [Ralf S. Engelschall]
+
+ Changes between 0.9.1 and 0.9.2 (13-Jan-2004 to 15-Jan-2004)
+
+ o Provide both incorrect RFC2518-based and correct IEEE 802
+ multicast address generation. The default now is the correct
+ IEEE 802 multicast address generation but compile-time option
+ --with-rfc2518 selects the broken variant.
+ [Ralf S. Engelschall]
+
+ o Decode also the IEEE 802 MAC address local/global bit.
+ [Ralf S. Engelschall]
+
+ o Added missing documentation for uuid_dump().
+ [Ralf S. Engelschall]
+
+ o Fixed BM_POW2() macro implementation.
+ [Ralf S. Engelschall]
+
+ o Use BM_XXX() and str_xxx() APIs throughout internal implementation.
+ [Ralf S. Engelschall]
+
+ o Added missing manual page uuid-config(1).
+ [Ralf S. Engelschall]
+
+ o Fixed output of "uuid-config --version"
+ [Ralf S. Engelschall]
+
+ o Fixed typos in uuid.pod
+ [Ralf S. Engelschall]
+
+ o Cleanup uuid.ac for unused elements.
+ [Ralf S. Engelschall]
+
+ o Moved uuid_[u]int{8,16,32}_t auto-configuration into
+ own internal header uuid_ac.h.
+ [Ralf S. Engelschall]
+
+ o Fixed portability by replacing accidentally introduced
+ uint{8,16,32}_t with the portable uuid_uint{8,16,32}_t.
+ [Guerry Semones <guerry@tsunamiresearch.com>]
+
+ o Prefix all variable symbols in uuid.h with underscores
+ to avoid namespace conflicts.
+ [Ralf S. Engelschall]
+
+ o Add decoding examples to uuid(1) manual page.
+ [Ralf S. Engelschall]
+
+ Changes between 0.9.0 and 0.9.1 (11-Jan-2004 to 13-Jan-2004)
+
+ o Make "md5_init" and "mac_address" symbols namespace clean
+ by adding correct embedding support via "uuid_" prefix.
+ [Ralf S. Engelschall]
+
+ o Implement uuid_dump() and corresponding uuid CLI "-d"
+ option for dumping a given UUID into clear text. For convenience
+ reasons add uuid_bm.h (bit mask API) and uuid_str (string
+ formatting API) sub-modules.
+ [Ralf S. Engelschall]
+
+ o Add "-m" option to CLI for allowing to generate v1 UUIDs
+ with random multi-cast addresses (API UUID_MCASTRND option).
+ [Ralf S. Engelschall]
+
+ o Disable the C++ and F77 checks in GNU libtool.
+ [Ralf S. Engelschall]
+
+ o Print involved option character (instead of '?') on invalid
+ option for uuid(1) CLI.
+ [Matthias Andree <matthias.andree@gmx.de>]
+
+ o Fixed "make install" and "make uninstall": the uuid(1) CLI
+ has to be [un]installed through GNU libtool, too.
+ [Matthias Andree <matthias.andree@gmx.de>]
+
+ o Document in uuid(1) [uuid_cli.pod] that for version 3
+ UUIDs additional arguments are required and what pre-defined
+ namespace ids are known.
+ [Ralf S. Engelschall, M.Daniel <mdaniel@scdi.com>]
+
+ o cleaned up source tree documentation files.
+ [Ralf S. Engelschall]
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidHISTORY"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/HISTORY (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/HISTORY         (rev 0)
+++ freeswitch/trunk/libs/uuid/HISTORY        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,358 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ HISTORY
+
+ During OSSP uuid we were totally puzzled by a subtle bug in the UUID
+ standards related to the generation of multi-cast MAC addresses.
+ This part of the history shows a very interesting technical bug,
+ the unusual way of having to fix a standard (which was multiple
+ times revised by different standard authorities, including the
+ IETF, the OpenGroup and ISO/IEC) afterwards plus the fixing of six
+ implementations into which the bug was inherited similarly. Below are
+ some snapshot of this part of history: the first implementation fix
+ (for FreeBSD) and the notification of the IETF standards authors.
+
+ ___________________________________________________________________________
+
+ Date: Fri, 13 Feb 2004 16:09:31 +0100
+ From: "Ralf S. Engelschall" <rse@en1.engelschall.com>
+ To: paulle@microsoft.com, michael@neonym.net, rsalz@datapower.com
+ Subject: [PATCH] draft-mealling-uuid-urn-02.txt
+ Message-ID: <20040213150931.GA7656@engelschall.com>
+
+ During implementation of OSSP uuid (a flexible CLI and C API for
+ generation and partial decoding of version 1, 3 and 4 UUIDs, see
+ http://www.ossp.org/pkg/lib/uuid/ for details), I discovered a nasty bug
+ in the generation of random multicast MAC addresses. It is present in
+ all standards and drafts (both expired ones and current ones) and was
+ also inherited (until I fixed it by submitting patches to the authors
+ recently) by all six freely available UUID implementations (Apache APR,
+ FreeBSD uuidgen(2), Java JUG, Linux's libuuid from e2fsutil, Perl's
+ Data::UUID and WINE's UUID generator)).
+
+ In case no real/physical IEEE 802 address is available, both the
+ expired "draft-leach-uuids-guids-01" (section "4. Node IDs when no IEEE
+ 802 network card is available"), RFC 2518 (section "6.4.1 Node Field
+ Generation Without the IEEE 802 Address") and now even your current
+ "draft-mealling-uuid-urn-02.txt" (section "4.5 Node IDs that do not
+ identify the host") recommend:
+
+ "A better solution is to obtain a 47-bit cryptographic quality
+ random number, and use it as the low 47 bits of the node ID, with
+ the _most_ significant bit of the first octet of the node ID set to
+ one. This bit is the unicast/multicast bit, which will never be set
+ in IEEE 802 addresses obtained from network cards; hence, there can
+ never be a conflict between UUIDs generated by machines with and
+ without network cards."
+
+ Unfortunately, this incorrectly explains how to implement this and even
+ the example implementation (draft-mealling-uuid-urn-02.txt, "Appendix
+ A. Appendix A - Sample Implementation") inherited this. Correct is
+ "the _least_ significant bit of the first octet of the node ID" as the
+ multicast bit in a memory and hexadecimal string representation of a
+ 48-bit IEEE 802 MAC address.
+
+ This standards bug arised from a false interpretation, as the multicast
+ bit is actually the _most_ significant bit in IEEE 802.3 (Ethernet)
+ _transmission order_ of an IEEE 802 MAC address. But you forgot that the
+ bitwise order of an _octet_ from a MAC address _memory_ and hexadecimal
+ string representation is still always from left (MSB, bit 7) to right
+ (LSB, bit 0). And the standard deals with memory representations only,
+ so the transmission order of a MAC doesnt' matter here.
+
+ As mentioned, OSSP uuid already implements this correctly. The FreeBSD
+ uuidgen(2) and Apache APR generators I've also fixed myself recently in
+ CVS. And for the remaining implementations I've submitted patches to the
+ authors and they all (except for WINE) responded that they took over the
+ patch. So the results of this long-standing bug we were able to fix --
+ at least for the free software world ;-). What is now remaining is that
+ you finally also should fix this in your standard so the bug does not
+ spread any longer into other implementations.
+
+ Here is the minimal required patch against your draft:
+
+ --- draft-mealling-uuid-urn-02.txt.orig        Mon Feb 2 21:50:35 2004
+ +++ draft-mealling-uuid-urn-02.txt        Fri Feb 13 15:41:49 2004
+ @@ -751,7 +751,7 @@
+ [6], and the cost was US$550.
+
+ A better solution is to obtain a 47-bit cryptographic quality random
+ - number, and use it as the low 47 bits of the node ID, with the most
+ + number, and use it as the low 47 bits of the node ID, with the least
+ significant bit of the first octet of the node ID set to one. This
+ bit is the unicast/multicast bit, which will never be set in IEEE 802
+ addresses obtained from network cards; hence, there can never be a
+ @@ -1369,7 +1369,7 @@
+ }
+ else {
+ get_random_info(seed);
+ - seed[0] |= 0x80;
+ + seed[0] |= 0x01;
+ memcpy(&saved_node, seed, sizeof saved_node);
+ fp = fopen("nodeid", "wb");
+ if (fp) {
+
+ But I recommend you to perhaps also add one or two sentences which
+ explain what I explained above (the difference between memory and
+ transmission order), just to make sure people are not confused in the
+ other direction and then think there is a bug (in the then fixed and
+ correct) standard, because they know about the transmission order of MAC
+ addresses.
+
+ Yours,
+ Ralf S. Engelschall
+ rse@engelschall.com
+ www.engelschall.com
+
+ Date: Fri, 13 Feb 2004 11:05:51 -0500
+ From: Rich Salz <rsalz@datapower.com>
+ To: rse@engelschall.com
+ Cc: paulle@microsoft.com, michael@neonym.net
+ Message-ID: <402CF5DF.4020601@datapower.com>
+ Subject: Re: [PATCH] draft-mealling-uuid-urn-02.txt
+ References: <20040213150931.GA7656@engelschall.com>
+ Content-Length: 431
+ Lines: 11
+
+ Thanks for writing, Ralf.
+
+ You're correct, and this has been noted by the IESG and will be fixed in
+ the next draft. It's unfortunate we made it this far with the bug.
+
+ /r$
+ --
+ Rich Salz, Chief Security Architect
+ DataPower Technology http://www.datapower.com
+ XS40 XML Security Gateway http://www.datapower.com/products/xs40.html
+ XML Security Overview http://www.datapower.com/xmldev/xmlsecurity.html
+
+ Date: Thu, 22 Jan 2004 05:34:11 -0800 (PST)
+ From: "Ralf S. Engelschall" <rse@FreeBSD.org>
+ Message-Id: <200401221334.i0MDYB1K018137@repoman.freebsd.org>
+ To: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
+ Subject: cvs commit: src/sys/kern kern_uuid.c
+ X-FreeBSD-CVS-Branch: HEAD
+ X-Loop: FreeBSD.ORG
+ Content-Length: 1907
+ Lines: 42
+
+ rse 2004/01/22 05:34:11 PST
+
+ FreeBSD src repository
+
+ Modified files:
+ sys/kern kern_uuid.c
+ Log:
+ Fix generation of random multicast MAC address.
+
+ In case no real/physical IEEE 802 address is available, both the expired
+ "draft-leach-uuids-guids-01" (section "4. Node IDs when no IEEE 802
+ network card is available") and RFC 2518 (section "6.4.1 Node Field
+ Generation Without the IEEE 802 Address") recommend (quoted from RFC
+ 2518):
+
+ "The ideal solution is to obtain a 47 bit cryptographic quality random
+ number, and use it as the low 47 bits of the node ID, with the _most_
+ significant bit of the first octet of the node ID set to 1. This bit
+ is the unicast/multicast bit, which will never be set in IEEE 802
+ addresses obtained from network cards; hence, there can never be a
+ conflict between UUIDs generated by machines with and without network
+ cards."
+
+ Unfortunately, this incorrectly explains how to implement this and
+ the FreeBSD UUID generator code inherited this generation bug from
+ the broken reference code in the standards draft. They should instead
+ specify the "_least_ significant bit of the first octet of the node ID"
+ as the multicast bit in a memory and hexadecimal string representation
+ of a 48-bit IEEE 802 MAC address.
+
+ This standards bug arised from a false interpretation, as the multicast
+ bit is actually the _most_ significant bit in IEEE 802.3 (Ethernet)
+ _transmission order_ of an IEEE 802 MAC address. The standards authors
+ forgot that the bitwise order of an _octet_ from a MAC address _memory_
+ and hexadecimal string representation is still always from left (MSB,
+ bit 7) to right (LSB, bit 0).
+
+ Fortunately, this UUID generation bug could have occurred on systems
+ without any Ethernet NICs only.
+
+ Revision Changes Path
+ 1.7 +1 -1 src/sys/kern/kern_uuid.c
+
+ Date: Thu, 22 Jan 2004 15:20:22 -0800
+ From: Marcel Moolenaar <marcel@xcllnt.net>
+ To: "Ralf S. Engelschall" <rse@FreeBSD.org>
+ Cc: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
+ Subject: Re: cvs commit: src/sys/kern kern_uuid.c
+ Message-ID: <20040122232022.GA77798@ns1.xcllnt.net>
+ References: <200401221334.i0MDYB1K018137@repoman.freebsd.org>
+ Content-Length: 380
+ Lines: 14
+
+ On Thu, Jan 22, 2004 at 05:34:11AM -0800, Ralf S. Engelschall wrote:
+ > rse 2004/01/22 05:34:11 PST
+ >
+ > FreeBSD src repository
+ >
+ > Modified files:
+ > sys/kern kern_uuid.c
+ > Log:
+ > Fix generation of random multicast MAC address.
+
+ An excellent catch and an outstanding commit log. Chapeau!
+
+ --
+ Marcel Moolenaar         USPA: A-39004                 marcel@xcllnt.net
+
+ ___________________________________________________________________________
+
+ Index: ChangeLog
+ ===================================================================
+ RCS file: /e/ossp/cvs/ossp-pkg/uuid/ChangeLog,v
+ retrieving revision 1.42
+ diff -u -d -r1.42 ChangeLog
+ --- ChangeLog        13 Feb 2004 16:17:07 -0000        1.42
+ +++ ChangeLog        13 Feb 2004 21:01:07 -0000
+ @@ -13,6 +13,14 @@
+
+ Changes between 0.9.6 and 0.9.7 (11-Feb-2004 to 13-Feb-2004)
+
+ + o remove --with-rfc2518 option and functionality because
+ + even the IETF/IESG has finally approved our report about the broken
+ + random multicast MAC address generation in the standard (and
+ + will fix it in new versions of the draft-mealling-uuid-urn). So,
+ + finally get rid of this broken-by-design backward compatibility
+ + functionality.
+ + [Ralf S. Engelschall]
+ +
+ o Add support to uuid(1) CLI for decoding from stdin for
+ both binary and string representations.
+ [Ralf S. Engelschall]
+ Index: uuid.ac
+ ===================================================================
+ RCS file: /e/ossp/cvs/ossp-pkg/uuid/uuid.ac,v
+ retrieving revision 1.10
+ diff -u -d -r1.10 uuid.ac
+ --- uuid.ac        11 Feb 2004 14:38:40 -0000        1.10
+ +++ uuid.ac        13 Feb 2004 19:20:32 -0000
+ @@ -71,12 +71,6 @@
+ AC_CHECK_SIZEOF(unsigned long long, 8)
+
+ dnl # options
+ - AC_ARG_WITH(rfc2518,
+ - AC_HELP_STRING([--with-rfc2518], [use incorrect generation of IEEE 802 multicast addresses according to RFC2518]),
+ - [ac_cv_with_rfc2518=$withval], [ac_cv_with_rfc2518=no])
+ - if test ".$ac_cv_with_rfc2518" = ".yes"; then
+ - AC_DEFINE(WITH_RFC2518, 1, [whether to use incorrect generation of IEEE 802 multicast addresses according to RFC2518])
+ - fi
+ AC_ARG_WITH(dce,
+ AC_HELP_STRING([--with-dce], [build DCE 1.1 backward compatibility API]),
+ [ac_cv_with_dce=$withval], [ac_cv_with_dce=no])
+ Index: uuid.c
+ ===================================================================
+ RCS file: /e/ossp/cvs/ossp-pkg/uuid/uuid.c,v
+ retrieving revision 1.44
+ diff -u -d -r1.44 uuid.c
+ --- uuid.c        19 Jan 2004 14:56:35 -0000        1.44
+ +++ uuid.c        13 Feb 2004 19:22:01 -0000
+ @@ -61,69 +61,9 @@
+ Unix UTC base time is January 1, 1970) */
+ #define UUID_TIMEOFFSET "01B21DD213814000"
+
+ -/* IEEE 802 MAC address encoding/decoding bit fields
+ -
+ - ATTENTION:
+ -
+ - In case no real/physical IEEE 802 address is available, both
+ - "draft-leach-uuids-guids-01" (section "4. Node IDs when no IEEE 802
+ - network card is available") and RFC 2518 (section "6.4.1 Node Field
+ - Generation Without the IEEE 802 Address") recommend (quoted from RFC
+ - 2518):
+ -
+ - "The ideal solution is to obtain a 47 bit cryptographic quality
+ - random number, and use it as the low 47 bits of the node ID, with
+ - the most significant bit of the first octet of the node ID set to
+ - 1. This bit is the unicast/multicast bit, which will never be set
+ - in IEEE 802 addresses obtained from network cards; hence, there can
+ - never be a conflict between UUIDs generated by machines with and
+ - without network cards."
+ -
+ - This passage clearly explains the intention to use IEEE 802 multicast
+ - addresses. Unfortunately, it incorrectly explains how to implement
+ - this! It should instead specify the "*LEAST* significant bit of the
+ - first octet of the node ID" as the multicast bit in a memory and
+ - hexadecimal string representation of a 48-bit IEEE 802 MAC address.
+ -
+ - Unfortunately, even the reference implementation included in the
+ - expired IETF "draft-leach-uuids-guids-01" incorrectly set the
+ - multicast bit with an OR bit operation and an incorrect mask of
+ - 0x80. Hence, several other UUID implementations found on the
+ - Internet have inherited this bug.
+ -
+ - Luckily, neither DCE 1.1 nor ISO/IEC 11578:1996 are affected by this
+ - problem. They disregard the topic of missing IEEE 802 addresses
+ - entirely, and thus avoid adopting this bug from the original draft
+ - and code ;-)
+ -
+ - It seems that this standards bug arises from a false interpretation,
+ - as the multicast bit is actually the *MOST* significant bit in IEEE
+ - 802.3 (Ethernet) _transmission order_ of an IEEE 802 MAC address. The
+ - authors were likely not aware that the bitwise order of an octet from
+ - a MAC address memory and hexadecimal string representation is still
+ - always from left (MSB, bit 7) to right (LSB, bit 0).
+ -
+ - For more information, see "Understanding Physical Addresses" in
+ - "Ethernet -- The Definitive Guide", p.43, and the section "ETHERNET
+ - MULTICAST ADDRESSES" in http://www.iana.org/assignments/ethernet-numbers.
+ -
+ - At OSSP, we do it the intended/correct way and generate a real
+ - IEEE 802 multicast address. Those wanting to encode broken IEEE
+ - 802 MAC addresses (as specified) can nevertheless use a brain dead
+ - compile-time option to switch off the correct behavior. When decoding
+ - we always use the correct behavior of course. */
+ -
+ -/* encoding */
+ -#ifdef WITH_RFC2518
+ -#define IEEE_MAC_MCBIT_ENC BM_OCTET(1,0,0,0,0,0,0,0)
+ -#else
+ -#define IEEE_MAC_MCBIT_ENC BM_OCTET(0,0,0,0,0,0,0,1)
+ -#endif
+ -#define IEEE_MAC_LOBIT_ENC BM_OCTET(0,0,0,0,0,0,1,0)
+ -
+ -/* decoding */
+ -#define IEEE_MAC_MCBIT_DEC BM_OCTET(0,0,0,0,0,0,0,1)
+ -#define IEEE_MAC_LOBIT_DEC BM_OCTET(0,0,0,0,0,0,1,0)
+ +/* IEEE 802 MAC address encoding/decoding bit fields */
+ +#define IEEE_MAC_MCBIT BM_OCTET(0,0,0,0,0,0,0,1)
+ +#define IEEE_MAC_LOBIT BM_OCTET(0,0,0,0,0,0,1,0)
+
+ /* IEEE 802 MAC address octet length */
+ #define IEEE_MAC_OCTETS 6
+ @@ -622,8 +562,8 @@
+ (unsigned int)uuid->obj.node[3],
+ (unsigned int)uuid->obj.node[4],
+ (unsigned int)uuid->obj.node[5],
+ - (uuid->obj.node[0] & IEEE_MAC_LOBIT_DEC ? "local" : "global"),
+ - (uuid->obj.node[0] & IEEE_MAC_MCBIT_DEC ? "multicast" : "unicast"));
+ + (uuid->obj.node[0] & IEEE_MAC_LOBIT ? "local" : "global"),
+ + (uuid->obj.node[0] & IEEE_MAC_MCBIT ? "multicast" : "unicast"));
+ }
+ else {
+ /* decode anything else as hexadecimal byte-string only */
+ @@ -843,8 +783,8 @@
+ if ((mode & UUID_MAKE_MC) || (uuid->mac[0] & BM_OCTET(1,0,0,0,0,0,0,0))) {
+ /* generate random IEEE 802 local multicast MAC address */
+ prng_data(uuid->prng, (void *)&(uuid->obj.node), sizeof(uuid->obj.node));
+ - uuid->obj.node[0] |= IEEE_MAC_MCBIT_ENC;
+ - uuid->obj.node[0] |= IEEE_MAC_LOBIT_ENC;
+ + uuid->obj.node[0] |= IEEE_MAC_MCBIT;
+ + uuid->obj.node[0] |= IEEE_MAC_LOBIT;
+ }
+ else {
+ /* use real regular MAC address */
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidINSTALL"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/INSTALL (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/INSTALL         (rev 0)
+++ freeswitch/trunk/libs/uuid/INSTALL        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ INSTALLATION
+
+ To install OSSP uuid into /path/to/uuid/ perform
+ the following steps in your shell:
+
+ $ ./configure
+ --prefix=/path/to/uuid
+ [--with-dce]
+ [--with-perl[=/path/to/[bin[/perl]
+ --with-perl-compat]]
+ [--with-php]
+ $ make
+ $ make check
+ $ make install [DESTDIR=/path/to/temp/root]
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidMANIFEST"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/MANIFEST (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/MANIFEST         (rev 0)
+++ freeswitch/trunk/libs/uuid/MANIFEST        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+AUTHORS
+BINDINGS
+ChangeLog
+HISTORY
+INSTALL
+MANIFEST
+Makefile.PL
+Makefile.in
+NEWS
+OVERVIEW
+PORTING
+README
+SEEALSO
+THANKS
+TODO
+USERS
+aclocal.m4
+config.guess
+config.h.in
+config.sub
+configure
+configure.ac
+libtool.m4
+ltmain.sh
+perl/MANIFEST
+perl/Makefile.PL
+perl/uuid.pm
+perl/uuid.pod
+perl/uuid.tm
+perl/uuid.ts
+perl/uuid.xs
+perl/uuid_compat.pm
+perl/uuid_compat.pod
+perl/uuid_compat.ts
+pgsql/Makefile
+pgsql/uuid.c
+pgsql/uuid.sql.in
+pgsql/uuid.txt
+php/Makefile.local
+php/config.m4
+php/package.xml
+php/uuid.c
+php/uuid.php4
+php/uuid.php5
+php/uuid.ts
+shtool
+uuid++.3
+uuid++.cc
+uuid++.hh
+uuid++.pod
+uuid-config.1
+uuid-config.in
+uuid-config.pod
+uuid.1
+uuid.3
+uuid.ac
+uuid.c
+uuid.h.in
+uuid.pc.in
+uuid.pod
+uuid_ac.h
+uuid_bm.h
+uuid_cli.c
+uuid_cli.pod
+uuid_dce.c
+uuid_dce.h
+uuid_mac.c
+uuid_mac.h
+uuid_md5.c
+uuid_md5.h
+uuid_prng.c
+uuid_prng.h
+uuid_sha1.c
+uuid_sha1.h
+uuid_str.c
+uuid_str.h
+uuid_time.c
+uuid_time.h
+uuid_ui128.c
+uuid_ui128.h
+uuid_ui64.c
+uuid_ui64.h
+uuid_vers.h
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidMakefilePL"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/Makefile.PL (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/Makefile.PL         (rev 0)
+++ freeswitch/trunk/libs/uuid/Makefile.PL        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## Makefile.PL: top-level Perl ExtUtils::MakeMaker wrapper script
+##
+
+require 5.008;
+use IO::File;
+
+my $ARGS = join(" ", @ARGV);
+
+print "++ writing Makefile\n";
+
+my $mk = new IO::File ">Makefile" or die;
+$mk->print(<< "EOF");
+
+PERL = $^X
+FULLPERL = $^X
+ARGS = $ARGS
+
+all pure_all:
+        \@if [ ! -d build ]; then mkdir build; fi
+        \@if [ ! -f build/Makefile ]; then (cd build && ../configure --disable-shared); fi
+        \@if [ ! -f build/libuuid.la ]; then (cd build && \$(MAKE) \$(MFLAGS) libuuid.la); fi
+        \@if [ ! -f perl/Makefile ]; then (cd perl && \$(PERL) Makefile.PL \$(ARGS)); fi
+        \@cd perl && \$(MAKE) \$(MFLAGS) \$\@
+
+install pure_install test:
+        \@cd perl && \$(MAKE) \$(MFLAGS) \$\@
+
+clean:
+        \@cd build && \$(MAKE) \$(MFLAGS) \$\@
+        \@cd perl && \$(MAKE) \$(MFLAGS) \$\@
+
+distclean realclean:
+        \@cd build && \$(MAKE) \$(MFLAGS) \$\@
+        \@cd perl && \$(MAKE) \$(MFLAGS) \$\@
+        -rm -rf build || true
+        -rm -rf Makefile || true
+
+EOF
+
+$mk->close();
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidMakefilein"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/Makefile.in (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/Makefile.in         (rev 0)
+++ freeswitch/trunk/libs/uuid/Makefile.in        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,357 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## Makefile.in: make(1) build procedure
+##
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+S = $(srcdir)
+C = .
+
+DESTDIR =
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+mandir = @mandir@
+
+CC = @CC@
+CXX = @CXX@
+CPPFLAGS = -I. -I$(S) @CPPFLAGS@ @DEFS@
+CFLAGS = @CFLAGS@
+CXXFLAGS = @CXXFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+RM = rm -f
+CP = cp
+RMDIR = rmdir
+SHTOOL = $(S)/shtool
+LIBTOOL = $(C)/libtool
+TRUE = true
+POD2MAN = pod2man
+PERL = @PERL@
+PHP = @PHP@
+PG_CONFIG = @PG_CONFIG@
+
+LIB_NAME = libuuid.la
+LIB_OBJS = uuid.lo uuid_md5.lo uuid_sha1.lo uuid_prng.lo uuid_mac.lo uuid_time.lo uuid_ui64.lo uuid_ui128.lo uuid_str.lo
+
+DCE_NAME = libuuid_dce.la
+DCE_OBJS = uuid_dce.lo $(LIB_OBJS)
+
+CXX_NAME = libuuid++.la
+CXX_OBJS = uuid++.lo $(LIB_OBJS)
+
+PRG_NAME = uuid
+PRG_OBJS = uuid_cli.o
+
+MAN_NAME = uuid.3 uuid++.3 uuid.1
+
+PERL_NAME = $(S)/perl/blib/lib/OSSP/uuid.pm
+PERL_OBJS = $(S)/perl/uuid.pm
+
+PHP_NAME = $(S)/php/modules/uuid.so
+PHP_OBJS = $(S)/php/uuid.c
+
+PGSQL_NAME = $(S)/pgsql/libuuid.so
+PGSQL_OBJS = $(S)/pgsql/uuid.c
+
+TARGETS = $(LIB_NAME) @DCE_NAME@ @CXX_NAME@ $(PRG_NAME) @PERL_NAME@ @PHP_NAME@ @PGSQL_NAME@
+
+WITH_DCE = @WITH_DCE@
+WITH_CXX = @WITH_CXX@
+WITH_PERL = @WITH_PERL@
+WITH_PERL_COMPAT = @WITH_PERL_COMPAT@
+WITH_PHP = @WITH_PHP@
+WITH_PGSQL = @WITH_PGSQL@
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .o .lo
+
+all: $(TARGETS)
+
+.c.o:
+        $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
+
+.cc.o:
+        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<
+
+.c.lo:
+        @$(LIBTOOL) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
+
+.cc.lo:
+        @$(LIBTOOL) --mode=compile $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<
+
+$(LIB_NAME): $(LIB_OBJS)
+        @$(LIBTOOL) --mode=link $(CC) -o $(LIB_NAME) $(LIB_OBJS) -rpath $(libdir) \
+         -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h`
+
+$(DCE_NAME): $(DCE_OBJS)
+        @$(LIBTOOL) --mode=link $(CC) -o $(DCE_NAME) $(DCE_OBJS) -rpath $(libdir) \
+         -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h`
+
+$(CXX_NAME): $(CXX_OBJS)
+        @$(LIBTOOL) --mode=link $(CXX) -o $(CXX_NAME) $(CXX_OBJS) -rpath $(libdir) \
+         -version-info `$(SHTOOL) version -l c -d libtool $(S)/uuid_vers.h`
+
+$(PRG_NAME): $(PRG_OBJS) $(LIB_NAME)
+        @$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $(PRG_NAME) $(PRG_OBJS) $(LIB_NAME) $(LIBS)
+
+$(PERL_NAME): $(PERL_OBJS) $(LIB_NAME)
+        @cd $(S)/perl && $(PERL) Makefile.PL PREFIX=$(prefix) COMPAT=$(WITH_PERL_COMPAT) && $(MAKE) $(MFLAGS) all
+        @touch $(PERL_NAME)
+
+$(PHP_NAME): $(PHP_OBJS) $(LIB_NAME)
+        @cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local PHP=$(PHP)
+        @touch $(PHP_NAME)
+
+$(PGSQL_NAME): $(PGSQL_OBJS) $(LIB_NAME)
+        @cd $(S)/pgsql && $(MAKE) $(MFLAGS) PG_CONFIG=$(PG_CONFIG)
+        @touch $(PGSQL_NAME)
+
+uuid.lo: $(S)/uuid.c uuid.h $(S)/uuid_md5.h $(S)/uuid_sha1.h $(S)/uuid_prng.h $(S)/uuid_mac.h $(S)/uuid_ui64.h $(S)/uuid_ui128.h $(S)/uuid_str.h $(S)/uuid_bm.h $(S)/uuid_ac.h
+uuid_mac.lo: $(S)/uuid_mac.c $(S)/uuid_mac.h
+uuid_md5.lo: $(S)/uuid_md5.c $(S)/uuid_md5.h
+uuid_sha1.lo: $(S)/uuid_sha1.c $(S)/uuid_sha1.h
+uuid_prng.lo: $(S)/uuid_prng.c $(S)/uuid_prng.h
+uuid_str.lo: $(S)/uuid_str.c $(S)/uuid_str.h
+uuid_ui64.lo: $(S)/uuid_ui64.c $(S)/uuid_ui64.h
+uuid_ui128.lo: $(S)/uuid_ui64.c $(S)/uuid_ui128.h
+uuid_dce.lo: $(S)/uuid_dce.c uuid.h $(S)/uuid_dce.h
+uuid_cli.o: $(S)/uuid_cli.c uuid.h
+uuid++.lo: $(S)/uuid++.cc $(S)/uuid++.hh
+
+man: uuid.3 uuid++.3 uuid-config.1 uuid.1
+uuid.3: uuid.pod
+        V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \
+        V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \
+        D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \
+        $(POD2MAN) --quotes=none \
+         --section=3 --center="Universally Unique Identifier" \
+         --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid.pod | \
+        sed -e "s;UUID_VERSION_STR;$$V2;" >uuid.3
+uuid++.3: uuid++.pod
+        V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \
+        V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \
+        D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \
+        $(POD2MAN) --quotes=none \
+         --section=3 --center="Universally Unique Identifier" \
+         --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid++.pod | \
+        sed -e "s;UUID_VERSION_STR;$$V2;" >uuid++.3
+uuid-config.1: uuid-config.pod
+        V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \
+        V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \
+        D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \
+        $(POD2MAN) --quotes=none \
+         --section=1 --center="Universally Unique Identifier" \
+         --release="$$D" --date="OSSP uuid $$V1" $(S)/uuid-config.pod | \
+        sed -e "s;UUID_VERSION_STR;$$V2;" >uuid-config.1
+uuid.1: uuid_cli.pod
+        V1=`$(SHTOOL) version -l c -d short $(S)/uuid_vers.h`; \
+        V2=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h`; \
+        D=`$(SHTOOL) version -l c -d long $(S)/uuid_vers.h | sed -e 's;.*(;;' -e 's;).*;;'`; \
+        $(CP) $(S)/uuid_cli.pod /tmp/uuid.pod; \
+        $(POD2MAN) --quotes=none \
+         --section=1 --center="Universally Unique Identifier" \
+         --release="$$D" --date="OSSP uuid $$V1" /tmp/uuid.pod | \
+        sed -e "s;UUID_VERSION_STR;$$V2;" >uuid.1; \
+        $(RM) /tmp/uuid.pod
+
+check: all
+        @echo "==== UUID version 1 (time and node based): 4 single iterations"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -n 4 -1
+        @echo "==== UUID version 1 (time and node based): 4 subsequent iterations"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -n 4
+        @echo "==== UUID version 3 (name based, MD5): 2 times repeated"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v3 -n 2 ns:URL http://www.ossp.org/
+        @echo "==== UUID version 5 (name based, SHA-1): 2 times repeated"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v5 -n 2 ns:URL http://www.ossp.org/
+        @echo "==== UUID version 4 (random data based): 4 single iterations"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4 -n 4 -1
+        @echo "==== UUID version 4 (random data based): 4 subsequent iterations"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4 -n 4
+        @echo "==== UUID version 1 generation and decoding"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1`; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v1 -m`
+        @echo "==== UUID version 3 generation and decoding"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v3 ns:URL http://www.ossp.org/`
+        @echo "==== UUID version 5 generation and decoding"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v5 ns:URL http://www.ossp.org/`
+        @echo "==== UUID version 3 generation and decoding"; \
+        $(LIBTOOL) --mode=execute ./$(PRG_NAME) -d `$(LIBTOOL) --mode=execute ./$(PRG_NAME) -v4`
+        -@if [ ".$(WITH_PERL)" = .yes ]; then \
+         echo "==== Perl bindings to C API"; \
+         (cd $(S)/perl && $(MAKE) $(MFLAGS) test); \
+        fi
+        -@if [ ".$(WITH_PHP)" = .yes ]; then \
+         echo "==== PHP bindings to C API"; \
+         (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local test PHP=$(PHP)); \
+        fi
+        -@if [ ".$(WITH_PGSQL)" = .yes ]; then \
+         echo "==== PGSQL bindings to C API"; \
+         (cd $(S)/pgsql && $(MAKE) $(MFLAGS) test PG_CONFIG=$(PG_CONFIG)); \
+        fi
+
+.PHONY: install
+install:
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(prefix)
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(bindir)
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(includedir)
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(libdir)/pkgconfig
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man3
+        $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man1
+        $(SHTOOL) install -c -m 755 uuid-config $(DESTDIR)$(bindir)/
+        $(SHTOOL) install -c -m 644 $(S)/uuid-config.1 $(DESTDIR)$(mandir)/man1/
+        $(SHTOOL) install -c -m 644 $(S)/uuid.pc $(DESTDIR)$(libdir)/pkgconfig/
+        $(SHTOOL) install -c -m 644 uuid.h $(DESTDIR)$(includedir)/
+        -@if [ ".$(WITH_DCE)" = .yes ]; then \
+         echo "$(SHTOOL) install -c -m 644 $(S)/uuid_dce.h $(DESTDIR)$(includedir)/"; \
+         $(SHTOOL) install -c -m 644 $(S)/uuid_dce.h $(DESTDIR)$(includedir)/; \
+        fi
+        -@if [ ".$(WITH_CXX)" = .yes ]; then \
+         echo "$(SHTOOL) install -c -m 644 $(S)/uuid++.hh $(DESTDIR)$(includedir)/"; \
+         $(SHTOOL) install -c -m 644 $(S)/uuid++.hh $(DESTDIR)$(includedir)/; \
+        fi
+        $(SHTOOL) install -c -m 644 $(S)/uuid.3 $(DESTDIR)$(mandir)/man3/
+        -@if [ ".$(WITH_CXX)" = .yes ]; then \
+         echo "$(SHTOOL) install -c -m 644 $(S)/uuid++.3 $(DESTDIR)$(mandir)/man3/"; \
+         $(SHTOOL) install -c -m 644 $(S)/uuid++.3 $(DESTDIR)$(mandir)/man3/; \
+        fi
+        @$(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(LIB_NAME) $(DESTDIR)$(libdir)/
+        -@if [ ".$(WITH_DCE)" = .yes ]; then \
+         $(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(DCE_NAME) $(DESTDIR)$(libdir)/; \
+        fi
+        -@if [ ".$(WITH_CXX)" = .yes ]; then \
+         $(LIBTOOL) --mode=install $(SHTOOL) install -c -m 644 $(CXX_NAME) $(DESTDIR)$(libdir)/; \
+        fi
+        @$(LIBTOOL) --mode=install $(SHTOOL) install -c -s -m 755 uuid $(DESTDIR)$(bindir)/
+        $(SHTOOL) install -c -m 644 $(S)/uuid.1 $(DESTDIR)$(mandir)/man1/
+        -@if [ ".$(WITH_PERL)" = .yes ]; then \
+         (cd $(S)/perl && $(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR)); \
+        fi
+        -@if [ ".$(WITH_PHP)" = .yes ]; then \
+         (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local install EXTDIR=$(prefix)/lib/php PHP=$(PHP) DESTDIR=$(DESTDIR)); \
+        fi
+        -@if [ ".$(WITH_PGSQL)" = .yes ]; then \
+         (cd $(S)/pgsql && $(MAKE) $(MFLAGS) install DESTDIR=$(DESTDIR) PG_CONFIG=$(PG_CONFIG)); \
+        fi
+
+.PHONY: uninstall
+uninstall:
+        -$(RM) $(DESTDIR)$(mandir)/man1/uuid.1
+        -@$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(bindir)/uuid
+        -@$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIB_NAME)
+        -@if [ ".$(WITH_DCE)" = .yes ]; then \
+         $(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(DCE_NAME); \
+        fi
+        -@if [ ".$(WITH_CXX)" = .yes ]; then \
+         $(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(CXX_NAME); \
+        fi
+        -$(RM) $(DESTDIR)$(mandir)/man3/uuid.3
+        -@if [ ".$(WITH_CXX)" = .yes ]; then \
+         echo "$(RM) $(DESTDIR)$(mandir)/man3/uuid++.3"; \
+         $(RM) $(DESTDIR)$(mandir)/man3/uuid++.3; \
+        fi
+        -$(RM) $(DESTDIR)$(includedir)/uuid.h
+        -@if [ ".$(WITH_DCE)" = .yes ]; then \
+         echo "$(RM) $(DESTDIR)$(includedir)/uuid_dce.h"; \
+         $(RM) $(DESTDIR)$(includedir)/uuid_dce.h; \
+        fi
+        -@if [ ".$(WITH_CXX)" = .yes ]; then \
+         echo "$(RM) $(DESTDIR)$(includedir)/uuid++.hh"; \
+         $(RM) $(DESTDIR)$(includedir)/uuid++.hh; \
+        fi
+        -$(RM) $(DESTDIR)$(libdir)/pkgconfig/uuid.pc
+        -$(RM) $(DESTDIR)$(mandir)/man1/uuid-config.1
+        -$(RM) $(DESTDIR)$(bindir)/uuid-config
+        -$(RMDIR) $(DESTDIR)$(mandir)/man1 >/dev/null 2>&1 || $(TRUE)
+        -$(RMDIR) $(DESTDIR)$(mandir)/man3 >/dev/null 2>&1 || $(TRUE)
+        -$(RMDIR) $(DESTDIR)$(mandir) >/dev/null 2>&1 || $(TRUE)
+        -$(RMDIR) $(DESTDIR)$(libdir)/pkgconfig >/dev/null 2>&1 || $(TRUE)
+        -$(RMDIR) $(DESTDIR)$(libdir) >/dev/null 2>&1 || $(TRUE)
+        -$(RMDIR) $(DESTDIR)$(includedir) >/dev/null 2>&1 || $(TRUE)
+        -$(RMDIR) $(DESTDIR)$(bindir) >/dev/null 2>&1 || $(TRUE)
+        -$(RMDIR) $(DESTDIR)$(prefix) >/dev/null 2>&1 || $(TRUE)
+
+.PHONY: clean
+clean:
+        -$(RM) $(LIB_NAME) $(LIB_OBJS)
+        -@if [ ".$(WITH_DCE)" = .yes ]; then \
+         echo "$(RM) $(DCE_NAME) $(DCE_OBJS)"; \
+         $(RM) $(DCE_NAME) $(DCE_OBJS); \
+        fi
+        -@if [ ".$(WITH_CXX)" = .yes ]; then \
+         echo "$(RM) $(CXX_NAME) $(CXX_OBJS)"; \
+         $(RM) $(CXX_NAME) $(CXX_OBJS); \
+        fi
+        -$(RM) $(PRG_NAME) $(PRG_OBJS)
+        -$(RM) -r .libs >/dev/null 2>&1 || $(TRUE)
+        -$(RM) *.o *.lo
+        -@if [ ".$(WITH_PERL)" = .yes ]; then \
+         (cd $(S)/perl && $(MAKE) $(MFLAGS) clean || true); \
+        fi
+        -@if [ ".$(WITH_PHP)" = .yes ]; then \
+         (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local clean || true); \
+        fi
+        -@if [ ".$(WITH_PGSQL)" = .yes ]; then \
+         (cd $(S)/pgsql && $(MAKE) $(MFLAGS) clean PG_CONFIG=$(PG_CONFIG) || true); \
+        fi
+
+distclean: clean
+        -$(RM) config.log config.status config.cache
+        -$(RM) Makefile config.h uuid-config uuid.h uuid.pc
+        -$(RM) libtool
+        -@if [ ".$(WITH_PERL)" = .yes ]; then \
+         (cd $(S)/perl && $(MAKE) $(MFLAGS) distclean || true; rm -f Makefile.old); \
+        fi
+        -@if [ ".$(WITH_PHP)" = .yes ]; then \
+         (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local distclean || true); \
+        fi
+        -@if [ ".$(WITH_PGSQL)" = .yes ]; then \
+         (cd $(S)/pgsql && $(MAKE) $(MFLAGS) distclean PG_CONFIG=$(PG_CONFIG) || true); \
+        fi
+
+realclean: distclean
+        -$(RM) uuid.3 uuid.1
+        -$(RM) configure config.h.in
+        -$(RM) shtool
+        -$(RM) ltmain.sh libtool.m4 config.guess config.sub
+        -@if [ ".$(WITH_PERL)" = .yes ]; then \
+         (cd $(S)/perl && $(MAKE) $(MFLAGS) realclean || true; rm -f Makefile.old); \
+        fi
+        -@if [ ".$(WITH_PHP)" = .yes ]; then \
+         (cd $(S)/php && $(MAKE) $(MFLAGS) -f Makefile.local realclean || true); \
+        fi
+        -@if [ ".$(WITH_PGSQL)" = .yes ]; then \
+         (cd $(S)/pgsql && $(MAKE) $(MFLAGS) realclean PG_CONFIG=$(PG_CONFIG) || true); \
+        fi
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidNEWS"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/NEWS (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/NEWS         (rev 0)
+++ freeswitch/trunk/libs/uuid/NEWS        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ NEWS
+
+ This is a list of major changes to OSSP uuid. For more detailed
+ change descriptions, please have a look at the ChangeLog file.
+
+ Major changes between 1.4 and 1.5
+
+ o Many internal code cleanups and fixes.
+ o Improved and fixed PostgreSQL API.
+ o Improved and fixed PHP API.
+
+ Major changes between 1.3 and 1.4
+
+ o Added PostgreSQL API.
+
+ Major changes between 1.2 and 1.3
+
+ o Added Perl TIE-style API.
+ o Added Perl Data::UUID backward compatibility API.
+ o Added C++ API.
+ o Added PHP API.
+
+ Major changes between 1.1 and 1.2
+
+ o Added support for version 5 UUIDs (name-based, SHA-1)
+
+ Major changes between 1.0 and 1.1
+
+ o Added Perl API
+
+ Major changes between 0.9 and 1.0
+
+ o Initial functionality
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidOVERVIEW"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/OVERVIEW (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/OVERVIEW         (rev 0)
+++ freeswitch/trunk/libs/uuid/OVERVIEW        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,81 @@
</span><ins>+
+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ OVERVIEW
+
+ A UUID consists of 128 bits (16-octets) which are split into 6
+ octet-bounded unsigned integer fields ("time_low", "time_mid",
+ "time_hi_and_version", "clk_seq_hi_res", "clk_seq_low" and "node") and
+ where two fields are multiplexed with a fixed size 4-bit "version" and
+ a variable sized 2-3 bit "variant" field.
+
+ The UUID octets are counted from left to right 15 to 0 and the bits
+ in each octet are counted from left to right 7 to 0 (most significant
+ bit first, least significant bit last). The unsigned integer fields
+ formed out of multiple octets are stored in "network byte order" (most
+ significant octet first, least significant octet last). A UUID is
+ stored and transmitted from left to right, i.e., in "network byte
+ order" with the most significant octet first and the least significant
+ octet last.
+
+ Illustration 1:
+ (single octet array, less compact, more annotations)
+
+
+ Bits: [4] [2-3]
+ Field: version variant
+ MSO -->| |<-- -->| |<-- LSO
+ \ | | | | /
+ Octet: 15 14 13 12 11 10 | |9 8 | | 7 6 5 4 3 2 1 0
+ +------++------++------++------++------++------++------++------++------++------++------++------++------++------++------++------+
+ UUID: | || || || || || |#### || |##: || || || || || || || |
+ +------++------++------++------++------++------++------++------++------++------++------++------++------++------++------++------+
+ Bit: 76543210765432107654321076543210765432107654321076543210765432107654321076543210765432107654321076543210765432107654321076543210
+ /| || || || || || |\
+ MSB | || || || || || | LSB
+ |<---------------------------->||<------------>||<------------>||<---->||<---->||<-------------------------------------------->|
+ time_hi clk_seq clk_seq
+ Field: time_low time_mid _and_version _hi_res _low node
+ Bits: [32] [16] [16] [5-6] [8] [48]
+
+
+ Illustration 2:
+ (two octet arrays, more compact, less annotations)
+
+ [4]
+ version
+ -->| |<--
+ | |
+ | | [16]
+ [32] [16] | |time_hi
+ time_low time_mid | _and_version
+ |<---------------------------->||<------------>||<------------>|
+ | MSO || || | |
+ | / || || | |
+ | 15 14 13 12 || 11 10 || |9 8 |
+ 7654321076543210765432107654321076543210765432107654321076543210
+ /+------++------++------++------++------++------++------++------+~
+ MSB | || || || || || |#### || | ...
+ +------++------++------++------++------++------++------++------+~
+ ~+------++------++------++------++------++------++------++------+
+ ... ##: || || || || || || || | LSB
+ ~+------++------++------++------++------++------++------++------+/
+ 7654321076543210765432107654321076543210765432107654321076543210
+ | | 7 || 6 || 5 4 3 2 1 0 |
+ | | || || / |
+ | | || || LSO |
+ |<---->||<---->||<-------------------------------------------->|
+ |clk_seq clk_seq node
+ |_hi_res _low [48]
+ |[5-6] [8]
+ | |
+ -->| |<--
+ variant
+ [2-3]
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidPORTING"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/PORTING (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/PORTING         (rev 0)
+++ freeswitch/trunk/libs/uuid/PORTING        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ PORTING
+
+ OSSP uuid was already written with maximum portability in mind, so
+ there should be no great effort required to get it running on any Unix
+ platform with a reasonable POSIX API. Additionally, the portability
+ was tested by successfully building and running it on the following
+ particular Unix platforms (syntax is "<cpu>-<os> (<compiler>)"):
+
+ alpha-tru644.0 (cc)
+ alpha-tru645.1 (gcc, cc)
+ hppa-hpux11.11 (cc)
+ ia64-hpux11.23 (cc)
+ ix86-debian2.2 (gcc, icc)
+ ix86-debian3.0 (gcc)
+ ix86-debian3.1 (gcc)
+ ix86-freebsd4.9 (gcc)
+ ix86-freebsd5.2 (gcc, icc)
+ ix86-netbsd1.6 (gcc)
+ ix86-qnx6.2 (gcc)
+ ix86-solaris10 (gcc)
+ ix86-unixware7.1.3 (cc)
+ mips64-irix6.5 (gcc)
+ sparc64-solaris8 (gcc, forte)
+ sparc64-solaris9 (gcc)
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidREADME"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/README (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/README         (rev 0)
+++ freeswitch/trunk/libs/uuid/README        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,62 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+ Version 1.6.2 (04-Jul-2008)
+
+ ABSTRACT
+
+ OSSP uuid is a ISO-C:1999 application programming interface (API)
+ and corresponding command line interface (CLI) for the generation of
+ DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122 compliant Universally
+ Unique Identifier (UUID). It supports DCE 1.1 variant UUIDs of version
+ 1 (time and node based), version 3 (name based, MD5), version 4
+ (random number based) and version 5 (name based, SHA-1). Additional
+ API bindings are provided for the languages ISO-C++:1998, Perl:5 and
+ PHP:4/5. Optional backward compatibility exists for the ISO-C DCE-1.1
+ and Perl Data::UUID APIs.
+
+ UUIDs are 128 bit numbers which are intended to have a high likelihood
+ of uniqueness over space and time and are computationally difficult
+ to guess. They are globally unique identifiers which can be locally
+ generated without contacting a global registration authority. UUIDs
+ are intended as unique identifiers for both mass tagging objects
+ with an extremely short lifetime and to reliably identifying very
+ persistent objects across a network.
+
+ COPYRIGHT AND LICENSE
+
+ Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+ Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+
+ This file is part of OSSP uuid, a library for the generation
+ of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+
+ Permission to use, copy, modify, and distribute this software for
+ any purpose with or without fee is hereby granted, provided that
+ the above copyright notice and this permission notice appear in all
+ copies.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ HOME AND DOCUMENTATION
+
+ The documentation and latest release can be found on
+
+ o http://www.ossp.org/pkg/lib/uuid/
+ o ftp://ftp.ossp.org/pkg/lib/uuid/
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidSEEALSO"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/SEEALSO (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/SEEALSO         (rev 0)
+++ freeswitch/trunk/libs/uuid/SEEALSO        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ SEE ALSO
+
+ Although we consider OSSP uuid the ultimate reference implementation
+ of an UUID generator, there are multiple alternatives available.
+ Following is a short reference of all currently known UUID
+ implementations for platforms with an Unix/POSIX API:
+
+ o OSSP uuid (ISO-C), OSSP::uuid (Perl)
+ http://www.ossp.org/pkg/lib/uuid/
+ http://cvs.ossp.org/ossp-pkg/uuid/
+
+ o FreeBSD libc (ISO-C)
+ http://www.freebsd.org/
+ http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/uuid/
+
+ o Sun Solaris libc (ISO-C), DCE::UUID (Perl/XS)
+ http://www.opensolaris.org/
+ http://cvs.opensolaris.org/source/xref/usr/src/lib/libuuid/
+
+ o APR libaprutil (ISO-C), APR::UUID (Perl/XS)
+ http://svn.apache.org/repos/asf/apr/apr-util/trunk/crypto/
+
+ o e2fsprogs/libuuid (ISO-C), UUID (Perl/XS)
+ http://e2fsprogs.sourceforge.net/
+ http://thunk.org/hg/e2fsprogs/
+
+ o Wine rpcrt4 DLL (ISO-C)
+ http://www.winehq.org/
+
+ o Data::UUID (Perl/XS)
+ http://search.cpan.org/src/AGOLOMSH/
+ http://www.cpan.org/modules/by-module/Data/
+
+ o JUG (Java/JNI)
+ http://www.doomdark.org/doomdark/proj/jug/
+
+ o Mozilla (ISO-C, ISO-C++)
+ http://www.mozilla.org/
+ http://lxr.mozilla.org/mozilla1.7/source/calendar/libxpical/token.c
+
+ o HelixPlayer (ISO-C, ISO-C++)
+ https://player.helixcommunity.org/
+ common/util/chxuuid.cpp
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidTHANKS"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/THANKS (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/THANKS         (rev 0)
+++ freeswitch/trunk/libs/uuid/THANKS        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ THANKS
+
+ Credit has to be given to the following people who contributed ideas,
+ bugfixes, hints, gave platform feedback, etc. (in alphabetical order):
+
+ o Matthias Andree <matthias.andree@gmx.de>
+ o Neil Caunt <retardis@gmail.com>
+ o Neil Conway <neilc@samurai.com>
+ o M. Daniel <mdaniel@scdi.com>
+ o Simon "janus" Dassow <janus@errornet.de>
+ o Fuyuki <fuyuki@nigredo.org>
+ o Thomas Lotterer <thomas@lotterer.net>
+ o Roman Neuhauser <neuhauser@sigpipe.cz>
+ o Hrvoje Niksic <hniksic@xemacs.org>
+ o Piotr Roszatycki <dexter@debian.org>
+ o Hiroshi Saito <z-saito@guitar.ocn.ne.jp>
+ o Michael Schloh <michael@schloh.com>
+ o Guerry Semones <guerry@tsunamiresearch.com>
+ o David Wheeler <david@justatheory.com>
+ o Wu Yongwei <wuyongwei@gmail.com>
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidTODO"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/TODO (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/TODO         (rev 0)
+++ freeswitch/trunk/libs/uuid/TODO        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ TODO
+ ====
+
+ - <none>
+
+ CANDO
+ =====
+
+ - allow to re-create version 1 UUIDs by specifying time, etc.
+ - getopt_long support for CLI?
+ - a more sophisticated test suite with UUID references?!
+ - more platform support in uuid_mac.c?!
+ - global memory locking according to standard hints??
+ - persistent/non-volatile state writing according to standard hints??
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidUSERS"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/USERS (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/USERS         (rev 0)
+++ freeswitch/trunk/libs/uuid/USERS        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+ _ ___ ____ ____ ____ _ _
+ |_|_ _ / _ \/ ___/ ___|| _ \ _ _ _ _(_) __| |
+ _|_||_| | | | \___ \___ \| |_) | | | | | | | | |/ _` |
+ |_||_|_| | |_| |___) |__) | __/ | |_| | |_| | | (_| |
+ |_|_|_| \___/|____/____/|_| \__,_|\__,_|_|\__,_|
+
+ OSSP uuid - Universally Unique Identifier
+
+ USERS
+
+ OSSP uuid is known to be used by at least the following
+ Open Source software packages:
+
+ o PostgreSQL
+ Relational Database Management System (RDBMS)
+ http://www.postgresql.org/
+
+ o Aegis
+ Software Configuration Management (SCM) System
+ http://aegis.sourceforge.net/
+
+ o Heartbeat
+ Core component of the High-Availability Linux (Linux-HA) project
+ http://linux-ha.org/heartbeat/
+
+ o GAT
+ Grid Application Toolkit (GAT)
+ https://www.gridlab.org/WorkPackages/wp-1/
+
+ o Menes
+ High-Level C++ Library for mutexes, networking, etc.
+ http://www.saurik.com/
+ http://svn.saurik.com/repos/menes/trunk/
+
+ o OpenAether OAPR
+ C++ wrapper for NSPR
+ http://www.openaether.org/oapr.html
+
+ o Gauche Scheme Interpreter, UUID extension
+ http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/gauche/Gauche-uuid/
+ http://www.shiro.dreamhost.com/scheme/gauche/
+
+ o Guile Extension Examples (GEE)
+ https://gna.org/projects/gee
+
+ o CGI::Session::ID::uuid
+ UUID based ID generator backend for CGI::Session
+ http://www.cpan.org/modules/by-authors/id/RSE/
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidacincludem4"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/acinclude.m4 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/acinclude.m4         (rev 0)
+++ freeswitch/trunk/libs/uuid/acinclude.m4        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,352 @@
</span><ins>+dnl ##
+dnl ## SA - OSSP Socket Abstraction Library
+dnl ## Copyright (c) 2001-2003 Ralf S. Engelschall <rse@engelschall.com>
+dnl ## Copyright (c) 2001-2003 The OSSP Project <http://www.ossp.org/>
+dnl ## Copyright (c) 2001-2003 Cable & Wireless Deutschland <http://www.cw.com/de/>
+dnl ##
+dnl ## This file is part of OSSP SA, a socket abstraction library which
+dnl ## can be found at http://www.ossp.org/pkg/sa/.
+dnl ##
+dnl ## Permission to use, copy, modify, and distribute this software for
+dnl ## any purpose with or without fee is hereby granted, provided that
+dnl ## the above copyright notice and this permission notice appear in all
+dnl ## copies.
+dnl ##
+dnl ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+dnl ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+dnl ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+dnl ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+dnl ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+dnl ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+dnl ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+dnl ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+dnl ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+dnl ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+dnl ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+dnl ## SUCH DAMAGE.
+dnl ##
+dnl ## aclocal.m4: GNU Autoconf local macro definitions
+dnl ##
+
+dnl ##
+dnl ## Check whether compiler option works
+dnl ##
+dnl ## configure.in:
+dnl ## AC_COMPILER_OPTION(<name>, <display>, <option>,
+dnl ## <action-success>, <action-failure>)
+dnl ##
+
+AC_DEFUN([AC_COMPILER_OPTION],[dnl
+AC_MSG_CHECKING(whether compiler option(s) $2 work)
+AC_CACHE_VAL(ac_cv_compiler_option_$1,[
+SAVE_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $3"
+AC_TRY_COMPILE([],[], ac_cv_compiler_option_$1=yes, ac_cv_compiler_option_$1=no)
+CFLAGS="$SAVE_CFLAGS"
+])dnl
+if test ".$ac_cv_compiler_option_$1" = .yes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+AC_MSG_RESULT([$ac_cv_compiler_option_$1])
+])dnl
+
+dnl ##
+dnl ## Debugging Support
+dnl ##
+dnl ## configure.in:
+dnl ## AC_CHECK_DEBUGGING
+dnl ##
+
+AC_DEFUN([AC_CHECK_DEBUGGING],[dnl
+AC_ARG_ENABLE(debug,dnl
+[ --enable-debug build for debugging (default=no)],
+[dnl
+if test ".$ac_cv_prog_gcc" = ".yes"; then
+ case "$CFLAGS" in
+ *-O* ) ;;
+ * ) CFLAGS="$CFLAGS -O2" ;;
+ esac
+ case "$CFLAGS" in
+ *-g* ) ;;
+ * ) CFLAGS="$CFLAGS -g" ;;
+ esac
+ case "$CFLAGS" in
+ *-pipe* ) ;;
+ * ) AC_COMPILER_OPTION(pipe, -pipe, -pipe, CFLAGS="$CFLAGS -pipe") ;;
+ esac
+ AC_COMPILER_OPTION(defdbg, -DDEBUG, -DDEBUG, CFLAGS="$CFLAGS -DDEBUG")
+ CFLAGS="$CFLAGS -pedantic"
+ CFLAGS="$CFLAGS -Wall"
+ WMORE="-Wshadow -Wpointer-arith -Wcast-align -Winline"
+ WMORE="$WMORE -Wmissing-prototypes -Wmissing-declarations -Wnested-externs"
+ AC_COMPILER_OPTION(wmore, -W<xxx>, $WMORE, CFLAGS="$CFLAGS $WMORE")
+ AC_COMPILER_OPTION(wnolonglong, -Wno-long-long, -Wno-long-long, CFLAGS="$CFLAGS -Wno-long-long")
+else
+ case "$CFLAGS" in
+ *-g* ) ;;
+ * ) CFLAGS="$CFLAGS -g" ;;
+ esac
+fi
+msg="enabled"
+],[
+if test ".$ac_cv_prog_gcc" = ".yes"; then
+case "$CFLAGS" in
+ *-pipe* ) ;;
+ * ) AC_COMPILER_OPTION(pipe, -pipe, -pipe, CFLAGS="$CFLAGS -pipe") ;;
+esac
+fi
+case "$CFLAGS" in
+ *-g* ) CFLAGS=`echo "$CFLAGS" |\
+ sed -e 's/ -g / /g' -e 's/ -g$//' -e 's/^-g //g' -e 's/^-g$//'` ;;
+esac
+case "$CXXFLAGS" in
+ *-g* ) CXXFLAGS=`echo "$CXXFLAGS" |\
+ sed -e 's/ -g / /g' -e 's/ -g$//' -e 's/^-g //g' -e 's/^-g$//'` ;;
+esac
+msg=disabled
+])dnl
+AC_MSG_CHECKING(for compilation debug mode)
+AC_MSG_RESULT([$msg])
+if test ".$msg" = .enabled; then
+ enable_shared=no
+fi
+])
+
+dnl ##
+dnl ## Check for C99 va_copy() implementation
+dnl ## (and provide fallback implementation if neccessary)
+dnl ##
+dnl ## configure.in:
+dnl ## AC_CHECK_VA_COPY
+dnl ## foo.c:
+dnl ## #include "config.h"
+dnl ## [...]
+dnl ## va_copy(d,s)
+dnl ##
+dnl ## This check is rather complex: first because we really have to
+dnl ## try various possible implementations in sequence and second, we
+dnl ## cannot define a macro in config.h with parameters directly.
+dnl ##
+
+dnl # test program for va_copy() implementation
+changequote(<<,>>)
+m4_define(__va_copy_test, <<[
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#define DO_VA_COPY(d, s) $1
+void test(char *str, ...)
+{
+ va_list ap, ap2;
+ int i;
+ va_start(ap, str);
+ DO_VA_COPY(ap2, ap);
+ for (i = 1; i <= 9; i++) {
+ int k = (int)va_arg(ap, int);
+ if (k != i)
+ abort();
+ }
+ DO_VA_COPY(ap, ap2);
+ for (i = 1; i <= 9; i++) {
+ int k = (int)va_arg(ap, int);
+ if (k != i)
+ abort();
+ }
+ va_end(ap);
+}
+int main(int argc, char *argv[])
+{
+ test("test", 1, 2, 3, 4, 5, 6, 7, 8, 9);
+ exit(0);
+}
+]>>)
+changequote([,])
+
+dnl # test driver for va_copy() implementation
+m4_define(__va_copy_check, [
+ AH_VERBATIM($1,
+[/* Predefined possible va_copy() implementation (id: $1) */
+#define __VA_COPY_USE_$1(d, s) $2])
+ if test ".$ac_cv_va_copy" = .; then
+ AC_TRY_RUN(__va_copy_test($2), [ac_cv_va_copy="$1"])
+ fi
+])
+
+dnl # Autoconf check for va_copy() implementation checking
+AC_DEFUN([AC_CHECK_VA_COPY],[
+ dnl # provide Autoconf display check message
+ AC_MSG_CHECKING(for va_copy() function)
+ dnl # check for various implementations in priorized sequence
+ AC_CACHE_VAL(ac_cv_va_copy, [
+ ac_cv_va_copy=""
+ dnl # 1. check for standardized C99 macro
+ __va_copy_check(C99, [va_copy((d), (s))])
+ dnl # 2. check for alternative/deprecated GCC macro
+ __va_copy_check(GCM, [VA_COPY((d), (s))])
+ dnl # 3. check for internal GCC macro (high-level define)
+ __va_copy_check(GCH, [__va_copy((d), (s))])
+ dnl # 4. check for internal GCC macro (built-in function)
+ __va_copy_check(GCB, [__builtin_va_copy((d), (s))])
+ dnl # 5. check for assignment approach (assuming va_list is a struct)
+ __va_copy_check(ASS, [do { (d) = (s); } while (0)])
+ dnl # 6. check for assignment approach (assuming va_list is a pointer)
+ __va_copy_check(ASP, [do { *(d) = *(s); } while (0)])
+ dnl # 7. check for memory copying approach (assuming va_list is a struct)
+ __va_copy_check(CPS, [memcpy((void *)&(d), (void *)&(s), sizeof((s)))])
+ dnl # 8. check for memory copying approach (assuming va_list is a pointer)
+ __va_copy_check(CPP, [memcpy((void *)(d), (void *)(s), sizeof(*(s)))])
+ if test ".$ac_cv_va_copy" = .; then
+ AC_ERROR([no working implementation found])
+ fi
+ ])
+ dnl # optionally activate the fallback implementation
+ if test ".$ac_cv_va_copy" = ".C99"; then
+ AC_DEFINE(HAVE_VA_COPY, 1, [Define if va_copy() macro exists (and no fallback implementation is required)])
+ fi
+ dnl # declare which fallback implementation to actually use
+ AC_DEFINE_UNQUOTED([__VA_COPY_USE], [__VA_COPY_USE_$ac_cv_va_copy],
+ [Define to id of used va_copy() implementation])
+ dnl # provide activation hook for fallback implementation
+ AH_VERBATIM([__VA_COPY_ACTIVATION],
+[/* Optional va_copy() implementation activation */
+#ifndef HAVE_VA_COPY
+#define va_copy(d, s) __VA_COPY_USE(d, s)
+#endif
+])
+ dnl # provide Autoconf display result message
+ if test ".$ac_cv_va_copy" = ".C99"; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no (using fallback implementation)])
+ fi
+])
+
+dnl ##
+dnl ## Check for an external/extension library.
+dnl ## - is aware of <libname>-config style scripts
+dnl ## - searches under standard paths include, lib, etc.
+dnl ## - searches under subareas like .libs, etc.
+dnl ##
+dnl ## configure.in:
+dnl ## AC_CHECK_EXTLIB(<realname>, <libname>, <func>, <header>,
+dnl ## [<success-action> [, <fail-action>]])
+dnl ## Makefile.in:
+dnl ## CFLAGS = @CFLAGS@
+dnl ## LDFLAGS = @LDFLAGS@
+dnl ## LIBS = @LIBS@
+dnl ## shell:
+dnl ## $ ./configure --with-<libname>[=DIR]
+dnl ##
+
+AC_DEFUN([AC_CHECK_EXTLIB],[dnl
+AC_ARG_WITH($2, [dnl
+[ --with-]m4_substr([$2[[=DIR]] ], 0, 19)[build with external $1 library (default=no)]], [dnl
+ if test ".$with_$2" = .yes; then
+ # via config script in PATH
+ $2_version=`($2-config --version) 2>/dev/null`
+ if test ".$$2_version" != .; then
+ CPPFLAGS="$CPPFLAGS `$2-config --cflags`"
+ CFLAGS="$CFLAGS `$2-config --cflags`"
+ LDFLAGS="$LDFLAGS `$2-config --ldflags`"
+ fi
+ else
+ if test -d "$with_$2"; then
+ found=0
+ # via config script
+ for dir in $with_$2/bin $with_$2; do
+ if test -f "$dir/$2-config" && test ! -f "$dir/$2-config.in"; then
+ $2_version=`($dir/$2-config --version) 2>/dev/null`
+ if test ".$$2_version" != .; then
+ CPPFLAGS="$CPPFLAGS `$dir/$2-config --cflags`"
+ CFLAGS="$CFLAGS `$dir/$2-config --cflags`"
+ LDFLAGS="$LDFLAGS `$dir/$2-config --ldflags`"
+ found=1
+ break
+ fi
+ fi
+ done
+ # in standard sub-areas
+ if test ".$found" = .0; then
+ for dir in $with_$2/include/$2 $with_$2/include $with_$2; do
+ if test -f "$dir/$4"; then
+ CPPFLAGS="$CPPFLAGS -I$dir"
+ CFLAGS="$CFLAGS -I$dir"
+ found=1
+ break
+ fi
+ done
+ for dir in $with_$2/lib/$2 $with_$2/lib $with_$2; do
+ if test -f "$dir/lib$2.la" && test -d "$dir/.libs"; then
+ LDFLAGS="$LDFLAGS -L$dir -L$dir/.libs"
+ found=1
+ break
+ elif test -f "$dir/lib$2.a" || test -f "$dir/lib$2.so"; then
+ LDFLAGS="$LDFLAGS -L$dir"
+ found=1
+ break
+ fi
+ done
+ fi
+ # in any sub-area
+ if test ".$found" = .0; then
+changequote(, )dnl
+ for file in x `find $with_$2 -name "$4" -type f -print`; do
+ test .$file = .x && continue
+ dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;'`
+ CPPFLAGS="$CPPFLAGS -I$dir"
+ CFLAGS="$CFLAGS -I$dir"
+ done
+ for file in x `find $with_$2 -name "lib$2.[aso]" -type f -print`; do
+ test .$file = .x && continue
+ dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;'`
+ LDFLAGS="$LDFLAGS -L$dir"
+ done
+changequote([, ])dnl
+ fi
+ fi
+ fi
+ AC_HAVE_HEADERS($4)
+ AC_CHECK_LIB($2, $3)
+ with_$2=yes
+ ac_var="ac_cv_header_`echo $4 | sed 'y%./+-%__p_%'`"
+ eval "ac_val=\$$ac_var"
+ if test ".$ac_val" != .yes; then
+ with_$2=no
+ fi
+ if test ".$ac_cv_lib_$2_$3" != .yes; then
+ with_$2=no
+ fi
+ if test ".$with_$2" = .no; then
+ AC_ERROR([Unable to find $1 library])
+ fi
+ ], [dnl
+if test ".$with_$2" = .; then
+ with_$2=no
+fi
+ ])dnl
+AC_MSG_CHECKING(whether to build against external $1 library)
+if test ".$with_$2" = .yes; then
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+AC_MSG_RESULT([$with_$2])
+])dnl
+
+dnl ##
+dnl ## Check whether to activate Dmalloc
+dnl ##
+dnl ## configure.in:
+dnl ## AC_CHECK_DMALLOC
+dnl ##
+
+AC_DEFUN([AC_CHECK_DMALLOC],[dnl
+AC_CHECK_EXTLIB(Dmalloc, dmalloc, dmalloc_debug, dmalloc.h,
+ AC_DEFINE(WITH_DMALLOC, 1, [define if building with Dmalloc]))
+if test ".$with_dmalloc" = .yes; then
+ CFLAGS=`echo "X$CFLAGS" | sed -e 's;^X;;' -e 's; -Wredundant-decls;;'`
+fi
+])dnl
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidconfighin"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/config.h.in (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/config.h.in         (rev 0)
+++ freeswitch/trunk/libs/uuid/config.h.in        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,212 @@
</span><ins>+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Predefined possible va_copy() implementation (id: ASP) */
+#define __VA_COPY_USE_ASP(d, s) do { *(d) = *(s); } while (0)
+
+/* Predefined possible va_copy() implementation (id: ASS) */
+#define __VA_COPY_USE_ASS(d, s) do { (d) = (s); } while (0)
+
+/* Predefined possible va_copy() implementation (id: C99) */
+#define __VA_COPY_USE_C99(d, s) va_copy((d), (s))
+
+/* Predefined possible va_copy() implementation (id: CPP) */
+#define __VA_COPY_USE_CPP(d, s) memcpy((void *)(d), (void *)(s), sizeof(*(s)))
+
+/* Predefined possible va_copy() implementation (id: CPS) */
+#define __VA_COPY_USE_CPS(d, s) memcpy((void *)&(d), (void *)&(s), sizeof((s)))
+
+/* Predefined possible va_copy() implementation (id: GCB) */
+#define __VA_COPY_USE_GCB(d, s) __builtin_va_copy((d), (s))
+
+/* Predefined possible va_copy() implementation (id: GCH) */
+#define __VA_COPY_USE_GCH(d, s) __va_copy((d), (s))
+
+/* Predefined possible va_copy() implementation (id: GCM) */
+#define __VA_COPY_USE_GCM(d, s) VA_COPY((d), (s))
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <dmalloc.h> header file. */
+#undef HAVE_DMALLOC_H
+
+/* Define to 1 if you have the `getifaddrs' function. */
+#undef HAVE_GETIFADDRS
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the <ifaddrs.h> header file. */
+#undef HAVE_IFADDRS_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `dmalloc' library (-ldmalloc). */
+#undef HAVE_LIBDMALLOC
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+#undef HAVE_LIBSOCKET
+
+/* Define to 1 if the system has the type `long double'. */
+#undef HAVE_LONG_DOUBLE
+
+/* Define to 1 if the system has the type `long long'. */
+#undef HAVE_LONG_LONG
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `nanosleep' function. */
+#undef HAVE_NANOSLEEP
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <net/if_arp.h> header file. */
+#undef HAVE_NET_IF_ARP_H
+
+/* Define to 1 if you have the <net/if_dl.h> header file. */
+#undef HAVE_NET_IF_DL_H
+
+/* Define to 1 if you have the <net/if.h> header file. */
+#undef HAVE_NET_IF_H
+
+/* Define to 1 if you have the `Sleep' function. */
+#undef HAVE_SLEEP
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* define if exists "struct timeval" */
+#undef HAVE_STRUCT_TIMEVAL
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/sockio.h> header file. */
+#undef HAVE_SYS_SOCKIO_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if va_copy() macro exists (and no fallback implementation is
+ required) */
+#undef HAVE_VA_COPY
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `unsigned char', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_CHAR
+
+/* The size of `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of `unsigned long long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG_LONG
+
+/* The size of `unsigned short', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_SHORT
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* whether to build C++ bindings to C API */
+#undef WITH_CXX
+
+/* whether to build DCE 1.1 backward compatibility API */
+#undef WITH_DCE
+
+/* define if building with Dmalloc */
+#undef WITH_DMALLOC
+
+/* whether to build Perl bindings to C API */
+#undef WITH_PERL
+
+/* whether to build Perl compatibility API */
+#undef WITH_PERL_COMPAT
+
+/* whether to build PostgreSQL bindings to C API */
+#undef WITH_PGSQL
+
+/* whether to build PHP bindings to C API */
+#undef WITH_PHP
+
+/* Optional va_copy() implementation activation */
+#ifndef HAVE_VA_COPY
+#define va_copy(d, s) __VA_COPY_USE(d, s)
+#endif
+
+
+/* Define to id of used va_copy() implementation */
+#undef __VA_COPY_USE
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidconfigureac"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/configure.ac (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/configure.ac         (rev 0)
+++ freeswitch/trunk/libs/uuid/configure.ac        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,57 @@
</span><ins>+dnl ##
+dnl ## OSSP uuid - Universally Unique Identifier
+dnl ## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+dnl ## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+dnl ##
+dnl ## This file is part of OSSP uuid, a library for the generation
+dnl ## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+dnl ##
+dnl ## Permission to use, copy, modify, and distribute this software for
+dnl ## any purpose with or without fee is hereby granted, provided that
+dnl ## the above copyright notice and this permission notice appear in all
+dnl ## copies.
+dnl ##
+dnl ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+dnl ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+dnl ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+dnl ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+dnl ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+dnl ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+dnl ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+dnl ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+dnl ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+dnl ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+dnl ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+dnl ## SUCH DAMAGE.
+dnl ##
+dnl ## configure.ac: GNU Autoconf source script
+dnl ##
+
+AC_PREREQ(2.53)
+AC_INIT
+UUID_VERSION_RAW=`$ac_confdir/shtool version -l c -d short uuid_vers.h`
+UUID_VERSION_STR=`$ac_confdir/shtool version -l c -d long uuid_vers.h`
+UUID_VERSION_HEX=`$ac_confdir/shtool version -l c -d hex uuid_vers.h`
+$ac_confdir/shtool echo -e \
+ "Configuring %BOSSP uuid%b (Universally Unique Identifier), version %B${UUID_VERSION_STR}%b"
+AC_SUBST(UUID_VERSION_RAW)
+AC_SUBST(UUID_VERSION_STR)
+AC_SUBST(UUID_VERSION_HEX)
+
+AC_PROG_MAKE_SET
+AC_PROG_CC
+AC_CHECK_DEBUGGING
+AC_CHECK_DMALLOC
+
+with_tags=""
+sinclude(libtool.m4)
+AC_PROG_LIBTOOL
+
+sinclude(uuid.ac)
+UUID_CHECK_ALL
+
+AC_CONFIG_HEADERS(config.h)
+AC_CONFIG_FILES([Makefile uuid-config uuid.pc uuid.h])
+AC_CONFIG_COMMANDS([adjustment], [chmod a-w uuid.h; chmod a+x uuid-config])
+AC_OUTPUT
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperlMANIFEST"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/MANIFEST (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/MANIFEST         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/MANIFEST        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+MANIFEST
+Makefile.PL
+uuid.xs
+uuid.tm
+uuid.pm
+uuid.pod
+uuid.ts
+uuid_compat.pm
+uuid_compat.pod
+uuid_compat.ts
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperlMakefilePL"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/Makefile.PL (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/Makefile.PL         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/Makefile.PL        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## Makefile.PL: Perl MakeMaker build source procedure
+##
+
+require 5.008;
+
+use Config;
+use ExtUtils::MakeMaker;
+
+# determine source directory
+my ($srcdir) = map { my $d = $_; $d =~ s/\/libuuid\.la$//; $d }
+ grep { -f $_ } ("../libuuid.la", glob("../*/libuuid.la"))
+ or die "no source directory found (where libuuid.la is located)";
+
+# determine extra build options
+my $compat = 0;
+@ARGV = grep { $_ =~ m/^COMPAT=(\d+)$/i ? ($compat = $1, 0) : 1 } @ARGV;
+
+# generate Makefile
+WriteMakefile(
+ NAME => 'OSSP::uuid',
+ VERSION_FROM => 'uuid.pm',
+ ABSTRACT_FROM => 'uuid.pod',
+ PREREQ_PM => {},
+ LIBS => [ "-L$srcdir/.libs -L$srcdir -luuid" ],
+ DEFINE => '',
+ INC => "-I. -I$srcdir",
+ PM => { 'uuid.pm' => '$(INST_LIBDIR)/uuid.pm',
+ 'uuid.pod' => '$(INST_LIBDIR)/uuid.pod',
+ ($compat ? ('uuid_compat.pm' => '$(INST_LIBDIR)/../Data/UUID.pm') : ()),
+ ($compat ? ('uuid_compat.pod' => '$(INST_LIBDIR)/../Data/UUID.pod') : ()), },
+ MAN3PODS => { 'uuid.pod' => '$(INST_MAN3DIR)/OSSP::uuid.3',
+ ($compat ? ('uuid_compat.pod' => '$(INST_MAN3DIR)/Data::UUID.3') : ()), },
+ TYPEMAPS => [ 'uuid.tm' ],
+ test => { TESTS => 'uuid.ts' . ($compat ? ' uuid_compat.ts' : '') },
+ NO_META => 1,
+ # cruel hack to workaround the conflict between OSSP uuid's
+ # uuid_create() function and one from FreeBSD's libc
+ (( "$Config{'osname'}$Config{'osvers'}" =~ m/^freebsd[56]\./
+ and $Config{'ld'} =~ m/cc$/ and -f "/usr/include/uuid.h") ?
+ ( LDDLFLAGS => $Config{'lddlflags'} . ' -Wl,-Bsymbolic') : ())
+);
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuidpm"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid.pm (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid.pm         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid.pm        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,334 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.pm: Perl Binding (Perl part)
+##
+
+##
+## High-Level Perl Module TIE-style API
+## (just a functionality-reduced TIE wrapper around the OO-style API)
+##
+
+package OSSP::uuid::tie;
+
+use 5.008;
+use strict;
+use warnings;
+use Carp;
+
+# inhert from Tie::Scalar
+require Tie::Scalar;
+our @ISA = qw(Tie::Scalar);
+
+# helper function
+sub mode_sanity {
+ my ($mode) = @_;
+ if (not ( defined($mode)
+ and ref($mode) eq 'ARRAY'
+ and ( (@{$mode} == 1 and $mode->[0] =~ m|^v[14]$|)
+ or (@{$mode} == 3 and $mode->[0] =~ m|^v[35]$|)))) {
+ return (undef, "invalid UUID generation mode specification");
+ }
+ if ($mode->[0] =~ m|^v[35]$|) {
+ my $uuid_ns = new OSSP::uuid;
+ $uuid_ns->load($mode->[1])
+ or return (undef, "failed to load UUID $mode->[0] namespace");
+ $mode->[1] = $uuid_ns;
+ }
+ return ($mode, undef);
+}
+
+# constructor
+sub TIESCALAR {
+ my ($class, @args) = @_;
+ my $self = {};
+ bless ($self, $class);
+ $self->{-uuid} = new OSSP::uuid
+ or croak "failed to create OSSP::uuid object";
+ my ($mode, $error) = mode_sanity(defined($args[0]) ? [ @args ] : [ "v1" ]);
+ croak $error if defined($error);
+ $self->{-mode} = $mode;
+ return $self;
+}
+
+# destructor
+sub DESTROY {
+ my ($self) = @_;
+ delete $self->{-uuid};
+ delete $self->{-mode};
+ return;
+}
+
+# fetch value from scalar
+# (applied semantic: export UUID in string format)
+sub FETCH {
+ my ($self) = @_;
+ $self->{-uuid}->make(@{$self->{-mode}})
+ or croak "failed to generate new UUID";
+ my $value = $self->{-uuid}->export("str")
+ or croak "failed to export new UUID";
+ return $value;
+}
+
+# store value into scalar
+# (applied semantic: configure new UUID generation mode)
+sub STORE {
+ my ($self, $value) = @_;
+ my ($mode, $error) = mode_sanity($value);
+ croak $error if defined($error);
+ $self->{-mode} = $mode;
+ return;
+}
+
+##
+## High-Level Perl Module OO-style API
+## (just an OO wrapper around the C-style API)
+##
+
+package OSSP::uuid;
+
+use 5.008;
+use strict;
+use warnings;
+use Carp;
+use XSLoader;
+use Exporter;
+
+# API version
+our $VERSION = do { my @v = ('1.6.2' =~ m/\d+/g); sprintf("%d.".("%02d"x$#v), @v); };
+
+# API inheritance
+our @ISA = qw(Exporter);
+
+# API symbols
+my $symbols = {
+ 'const' => [qw(
+ UUID_VERSION
+ UUID_LEN_BIN
+ UUID_LEN_STR
+ UUID_LEN_SIV
+ UUID_RC_OK
+ UUID_RC_ARG
+ UUID_RC_MEM
+ UUID_RC_SYS
+ UUID_RC_INT
+ UUID_RC_IMP
+ UUID_MAKE_V1
+ UUID_MAKE_V3
+ UUID_MAKE_V4
+ UUID_MAKE_V5
+ UUID_MAKE_MC
+ UUID_FMT_BIN
+ UUID_FMT_STR
+ UUID_FMT_SIV
+ UUID_FMT_TXT
+ )],
+ 'func' => [qw(
+ uuid_create
+ uuid_destroy
+ uuid_load
+ uuid_make
+ uuid_isnil
+ uuid_compare
+ uuid_import
+ uuid_export
+ uuid_error
+ uuid_version
+ )]
+};
+
+# API symbol exportation
+our %EXPORT_TAGS = (
+ 'all' => [ @{$symbols->{'const'}}, @{$symbols->{'func'}} ],
+ 'const' => [ @{$symbols->{'const'}} ],
+ 'func' => [ @{$symbols->{'func'}} ]
+);
+our @EXPORT_OK = @{$EXPORT_TAGS{'all'}};
+our @EXPORT = ();
+
+# constructor
+sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ bless ($self, $class);
+ $self->{-uuid} = undef;
+ $self->{-rc} = $self->UUID_RC_OK;
+ my $rc = uuid_create($self->{-uuid});
+ if ($rc != $self->UUID_RC_OK) {
+ croak(sprintf("OSSP::uuid::new: uuid_create: %s (%d)", uuid_error($rc), $rc));
+ return undef;
+ }
+ return $self;
+}
+
+# destructor
+sub DESTROY ($) {
+ my ($self) = @_;
+ $self->{-rc} = uuid_destroy($self->{-uuid}) if (defined($self->{-uuid}));
+ if ($self->{-rc} != $self->UUID_RC_OK) {
+ carp(sprintf("OSSP::uuid::DESTROY: uuid_destroy: %s (%d)", uuid_error($self->{-rc}), $self->{-rc}));
+ return;
+ }
+ $self->{-uuid} = undef;
+ $self->{-rc} = undef;
+ return;
+}
+
+sub load ($$) {
+ my ($self, $name) = @_;
+ $self->{-rc} = uuid_load($self->{-uuid}, $name);
+ return ($self->{-rc} == $self->UUID_RC_OK);
+}
+
+sub make ($$;@) {
+ my ($self, $mode, @valist) = @_;
+ my $mode_code = 0;
+ foreach my $spec (split(/,/, $mode)) {
+ if ($spec eq 'v1') { $mode_code |= $self->UUID_MAKE_V1; }
+ elsif ($spec eq 'v3') { $mode_code |= $self->UUID_MAKE_V3; }
+ elsif ($spec eq 'v4') { $mode_code |= $self->UUID_MAKE_V4; }
+ elsif ($spec eq 'v5') { $mode_code |= $self->UUID_MAKE_V5; }
+ elsif ($spec eq 'mc') { $mode_code |= $self->UUID_MAKE_MC; }
+ else { croak("invalid mode specification \"$spec\""); }
+ }
+ if (($mode_code & $self->UUID_MAKE_V3) or ($mode_code & $self->UUID_MAKE_V5)) {
+ if (not (ref($valist[0]) and $valist[0]->isa("OSSP::uuid"))) {
+ croak("UUID_MAKE_V3/UUID_MAKE_V5 requires namespace argument to be OSSP::uuid object");
+ }
+ my $ns = $valist[0]->{-uuid};
+ my $name = $valist[1];
+ $self->{-rc} = uuid_make($self->{-uuid}, $mode_code, $ns, $name);
+ }
+ else {
+ $self->{-rc} = uuid_make($self->{-uuid}, $mode_code);
+ }
+ return ($self->{-rc} == $self->UUID_RC_OK);
+}
+
+sub isnil ($) {
+ my ($self) = @_;
+ my $result;
+ $self->{-rc} = uuid_isnil($self->{-uuid}, $result);
+ return ($self->{-rc} == $self->UUID_RC_OK ? $result : undef);
+}
+
+sub compare ($$) {
+ my ($self, $other) = @_;
+ my $result = 0;
+ if (not (ref($other) and $other->isa("OSSP::uuid"))) {
+ croak("argument has to an OSSP::uuid object");
+ }
+ $self->{-rc} = uuid_compare($self->{-uuid}, $other->{-uuid}, $result);
+ return ($self->{-rc} == $self->UUID_RC_OK ? $result : undef);
+}
+
+sub import {
+ # ATTENTION: The OSSP uuid API function "import" conflicts with
+ # the standardized "import" method the Perl world expects from
+ # their modules. In order to keep the Perl binding consist
+ # with the C API, we solve the conflict under run-time by
+ # distinguishing between the two types of "import" calls.
+ if (defined($_[0]) and ref($_[0]) =~ m/^OSSP::uuid/) {
+ # the regular OSSP::uuid "import" method
+ croak("import method expects 3 or 4 arguments") if (@_ < 3 or @_ > 4); # emulate prototype
+ my ($self, $fmt, $data_ptr, $data_len) = @_;
+ if ($fmt eq 'bin') { $fmt = $self->UUID_FMT_BIN; }
+ elsif ($fmt eq 'str') { $fmt = $self->UUID_FMT_STR; }
+ elsif ($fmt eq 'siv') { $fmt = $self->UUID_FMT_SIV; }
+ elsif ($fmt eq 'txt') { $fmt = $self->UUID_FMT_TXT; }
+ else { croak("invalid format \"$fmt\""); }
+ $data_len ||= length($data_ptr); # functional redudant, but Perl dislikes undef value here
+ $self->{-rc} = uuid_import($self->{-uuid}, $fmt, $data_ptr, $data_len);
+ return ($self->{-rc} == $self->UUID_RC_OK);
+ }
+ else {
+ # the special Perl "import" method
+ # (usually inherited from the Exporter)
+ no strict "refs";
+ return OSSP::uuid->export_to_level(1, @_);
+ }
+}
+
+sub export {
+ # ATTENTION: The OSSP uuid API function "export" conflicts with
+ # the standardized "export" method the Perl world expects from
+ # their modules. In order to keep the Perl binding consist
+ # with the C API, we solve the conflict under run-time by
+ # distinguishing between the two types of "export" calls.
+ if (defined($_[0]) and ref($_[0]) =~ m/^OSSP::uuid/) {
+ # the regular OSSP::uuid "export" method
+ croak("export method expects 2 arguments") if (@_ != 2); # emulate prototype
+ my ($self, $fmt) = @_;
+ my $data_ptr;
+ if ($fmt eq 'bin') { $fmt = $self->UUID_FMT_BIN; }
+ elsif ($fmt eq 'str') { $fmt = $self->UUID_FMT_STR; }
+ elsif ($fmt eq 'siv') { $fmt = $self->UUID_FMT_SIV; }
+ elsif ($fmt eq 'txt') { $fmt = $self->UUID_FMT_TXT; }
+ else { croak("invalid format \"$fmt\""); }
+ $self->{-rc} = uuid_export($self->{-uuid}, $fmt, $data_ptr, undef);
+ return ($self->{-rc} == $self->UUID_RC_OK ? $data_ptr : undef);
+ }
+ else {
+ # the special Perl "export" method
+ # (usually inherited from the Exporter)
+ return Exporter::export(@_);
+ }
+}
+
+sub error ($;$) {
+ my ($self, $rc) = @_;
+ $rc = $self->{-rc} if (not defined($rc));
+ return wantarray ? (uuid_error($rc), $rc) : uuid_error($rc);
+}
+
+sub version (;$) {
+ my ($self) = @_;
+ return uuid_version();
+}
+
+##
+## Low-Level Perl XS C-style API
+## (actually just the activation of the XS part)
+##
+
+# auto-loading constants
+sub AUTOLOAD {
+ my $constname;
+ our $AUTOLOAD;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ croak "&OSSP::uuid::constant not defined" if ($constname eq 'constant');
+ my ($error, $val) = constant($constname);
+ croak $error if ($error);
+ { no strict 'refs'; *$AUTOLOAD = sub { $val }; }
+ goto &$AUTOLOAD;
+}
+
+# static-loading functions
+XSLoader::load('OSSP::uuid', $VERSION);
+
+1;
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuidpod"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid.pod (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid.pod         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid.pod        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,207 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.pod: Perl Binding (Perl/POD part)
+##
+
+=pod
+
+=head1 NAME
+
+OSSP::uuid - B<OSSP uuid> Perl Binding
+
+=head1 DESCRIPTION
+
+B<OSSP uuid> is a ISO-C:1999 application programming interface (API)
+and corresponding command line interface (CLI) for the generation of
+DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant I<Universally Unique
+Identifier> (UUID). It supports DCE 1.1 variant UUIDs of version 1 (time
+and node based), version 3 (name based, MD5), version 4 (random number
+based) and version 5 (name based, SHA-1). Additional API bindings are
+provided for the languages ISO-C++:1998, Perl:5 and PHP:4/5. Optional
+backward compatibility exists for the ISO-C DCE-1.1 and Perl Data::UUID
+APIs.
+
+B<OSSP::uuid> is the Perl binding to the B<OSSP uuid> API.
+Three variants are provided:
+
+=head2 TIE-STYLE API
+
+The TIE-style API is a functionality-reduced wrapper around the OO-style
+API and intended for very high-level convenience programming:
+
+=over 4
+
+=item C<use OSSP::uuid;>
+
+=item B<tie>C< my $uuid, 'OSSP::uuid::tie', $mode, ...;>
+
+=item C<$uuid = [ $mode, ... ];>
+
+=item C<print "UUID=$uuid\n";>
+
+=item C<untie $uuid;>
+
+=back
+
+=head2 OO-STYLE API
+
+The OO-style API is a wrapper around the C-style API and intended for
+high-level regular programming.
+
+=over 4
+
+=item C<use OSSP::uuid;>
+
+=item C<my $uuid = >B<new>C< OSSP::uuid;>
+
+=item C<$uuid-E<gt>>B<load>C<($name);>
+
+=item C<$uuid-E<gt>>B<make>C<($mode, ...);>
+
+=item C<$result = $uuid-E<gt>>B<isnil>C<();>
+
+=item C<$result = $uuid-E<gt>>B<compare>C<($uuid2);>
+
+=item C<$uuid-E<gt>>B<import>C<($fmt, $data_ptr);>
+
+=item C<$data_ptr = $uuid-E<gt>>B<export>C<($fmt);>
+
+=item C<[(]$str[, $rc)] = $uuid-E<gt>>B<error>C<();>
+
+=item C<$ver = $uuid-E<gt>>B<version>C<();>
+
+=item C<undef $uuid;>
+
+=back
+
+Additionally, the strings C<"v1">, C<"v3">, C<"v4">, C<"v5"> and C<"mc">
+can be used in C<$mode> and the strings C<"bin">, C<"str">, and C<"txt">
+can be used for C<$fmt>.
+
+=head2 C-STYLE API
+
+The C-style API is a direct mapping
+of the B<OSSP uuid> ISO-C API to Perl and is intended for low-level
+programming. See uuid(3) for a description of the functions and
+their expected arguments.
+
+=over 4
+
+=item C<use OSSP::uuid qw(:all);>
+
+=item C<my $uuid; $rc = >B<uuid_create>C<($uuid);>
+
+=item C<$rc = >B<uuid_load>C<($uuid, $name);>
+
+=item C<$rc = >B<uuid_make>C<($uuid, $mode, ...);>
+
+=item C<$rc = >B<uuid_isnil>C<($uuid, $result);>
+
+=item C<$rc = >B<uuid_compare>C<($uuid, $uuid2, $result);>
+
+=item C<$rc = >B<uuid_import>C<($uuid, $fmt, $data_ptr, $data_len);>
+
+=item C<$rc = >B<uuid_export>C<($uuid, $fmt, $data_ptr, $data_len);>
+
+=item C<$str = >B<uuid_error>C<($rc);>
+
+=item C<$ver = >B<uuid_version>C<();>
+
+=item C<$rc = >B<uuid_destroy>C<($uuid);>
+
+=back
+
+Additionally, the following constants are exported for use in C<$rc>, C<$mode>, C<$fmt> and C<$ver>:
+
+C<UUID_VERSION>,
+C<UUID_LEN_BIN>,
+C<UUID_LEN_STR>,
+C<UUID_RC_OK>,
+C<UUID_RC_ARG>,
+C<UUID_RC_MEM>,
+C<UUID_RC_SYS>,
+C<UUID_RC_INT>,
+C<UUID_RC_IMP>,
+C<UUID_MAKE_V1>,
+C<UUID_MAKE_V3>,
+C<UUID_MAKE_V4>,
+C<UUID_MAKE_V5>,
+C<UUID_MAKE_MC>,
+C<UUID_FMT_BIN>,
+C<UUID_FMT_STR>,
+C<UUID_FMT_SIV>,
+C<UUID_FMT_TXT>.
+
+=head1 EXAMPLES
+
+The following two examples create the version 3 UUID
+C<02d9e6d5-9467-382e-8f9b-9300a64ac3cd>, both via the OO-style and the
+C-style API. Error handling is omitted here for easier reading, but has
+to be added for production-quality code.
+
+ # TIE-style API (very high-level)
+ use OSSP::uuid;
+ tie my $uuid, 'OSSP::uuid::tie';
+ $uuid = [ "v1" ];
+ print "UUIDs: $uuid, $uuid, $uuid\n";
+ $uuid = [ "v3", "ns:URL", "http://www.ossp.org/" ];
+ print "UUIDs: $uuid, $uuid, $uuid\n";
+ untie $uuid;
+
+ # OO-style API (high-level)
+ use OSSP::uuid;
+ my $uuid = new OSSP::uuid;
+ my $uuid_ns = new OSSP::uuid;
+ $uuid_ns->load("ns:URL");
+ $uuid->make("v3", $uuid_ns, "http://www.ossp.org/");
+ undef $uuid_ns;
+ my $str = $uuid->export("str");
+ undef $uuid;
+ print "$str\n";
+
+ # C-style API (low-level)
+ use OSSP::uuid qw(:all);
+ my $uuid; uuid_create($uuid);
+ my $uuid_ns; uuid_create($uuid_ns);
+ uuid_load($uuid_ns, "ns:URL");
+ uuid_make($uuid, UUID_MAKE_V3, $uuid_ns, "http://www.ossp.org/");
+ uuid_destroy($uuid_ns);
+ my $str; uuid_export($uuid, UUID_FMT_STR, $str, undef);
+ uuid_destroy($uuid);
+ print "$str\n";
+
+=head1 SEE ALSO
+
+uuid(1), uuid-config(1), uuid(3).
+
+=head1 HISTORY
+
+The Perl binding B<OSSP::uuid> to B<OSSP uuid> was implemented in
+November 2004 by Ralf S. Engelschall E<lt>rse@engelschall.comE<gt>.
+
+=cut
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuidtm"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid.tm (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid.tm         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid.tm        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.tm: Perl XS typemap for xsubpp(1)
+##
+
+TYPEMAP
+uuid_t * T_PTRREF
+uuid_t ** T_PTRREF
+uuid_rc_t T_IV
+uuid_fmt_t T_IV
+int * T_PV
+size_t * T_PV
+const void * T_PV
+void ** T_PV
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuidts"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid.ts (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid.ts         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid.ts        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,171 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.ts: Perl Binding (Perl test suite part)
+##
+
+use Test::More tests => 36;
+
+##
+## Module Loading
+##
+
+BEGIN {
+ use_ok('OSSP::uuid');
+};
+BEGIN {
+ use OSSP::uuid qw(:all);
+ ok(defined(UUID_VERSION), "UUID_VERSION");
+ ok(UUID_RC_OK == 0, "UUID_RC_OK");
+};
+
+##
+## C-Style API
+##
+
+my ($rc, $result, $uuid, $uuid_ns, $str, $ptr, $len);
+
+$rc = uuid_create($uuid);
+ok($rc == UUID_RC_OK, "uuid_create (1)");
+$rc = uuid_create($uuid_ns);
+ok($rc == UUID_RC_OK, "uuid_create (2)");
+
+$rc = uuid_isnil($uuid, $result);
+ok(($rc == UUID_RC_OK and $result == 1), "uuid_isnil (1)");
+$rc = uuid_isnil($uuid_ns, $result);
+ok(($rc == UUID_RC_OK and $result == 1), "uuid_isnil (2)");
+$rc = uuid_compare($uuid, $uuid_ns, $result);
+ok(($rc == UUID_RC_OK and $result == 0), "uuid_compare (1)");
+$rc = uuid_export($uuid, UUID_FMT_STR, $ptr, $len);
+ok(( $rc == UUID_RC_OK
+ and $ptr eq "00000000-0000-0000-0000-000000000000"
+ and $len == UUID_LEN_STR), "uuid_export (1)");
+
+$rc = uuid_load($uuid_ns, "ns:URL");
+ok($rc == UUID_RC_OK, "uuid_load (1)");
+$rc = uuid_export($uuid_ns, UUID_FMT_STR, $ptr, $len);
+ok(( $rc == UUID_RC_OK
+ and $ptr eq "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
+ and $len == UUID_LEN_STR), "uuid_export (2)");
+
+$rc = uuid_make($uuid, UUID_MAKE_V3, $uuid_ns, "http://www.ossp.org/");
+ok($rc == UUID_RC_OK, "uuid_make (1)");
+$rc = uuid_export($uuid, UUID_FMT_STR, $ptr, $len);
+ok(( $rc == UUID_RC_OK
+ and $ptr eq "02d9e6d5-9467-382e-8f9b-9300a64ac3cd"
+ and $len == UUID_LEN_STR), "uuid_export (3)");
+
+$rc = uuid_export($uuid, UUID_FMT_BIN, $ptr, $len);
+ok(( $rc == UUID_RC_OK
+ and $len == UUID_LEN_BIN), "uuid_export (4)");
+$rc = uuid_import($uuid_ns, UUID_FMT_BIN, $ptr, $len);
+ok($rc == UUID_RC_OK, "uuid_import (1)");
+$rc = uuid_export($uuid_ns, UUID_FMT_STR, $ptr, $len);
+ok(( $rc == UUID_RC_OK
+ and $ptr eq "02d9e6d5-9467-382e-8f9b-9300a64ac3cd"
+ and $len == UUID_LEN_STR), "uuid_export (5)");
+$rc = uuid_export($uuid_ns, UUID_FMT_SIV, $ptr, $len);
+ok(( $rc == UUID_RC_OK
+ and $ptr eq "3789866285607910888100818383505376205"
+ and $len <= UUID_LEN_SIV), "uuid_export (6)");
+
+$rc = uuid_destroy($uuid_ns);
+ok($rc == UUID_RC_OK, "uuid_destroy (1)");
+$rc = uuid_destroy($uuid);
+ok($rc == UUID_RC_OK, "uuid_destroy (2)");
+
+##
+## OO-style API
+##
+
+$uuid = new OSSP::uuid;
+ok(defined($uuid), "new OSSP::uuid (1)");
+$uuid_ns = new OSSP::uuid;
+ok(defined($uuid_ns), "new OSSP::uuid (2)");
+
+$rc = $uuid->isnil();
+ok((defined($rc) and $rc == 1), "isnil (1)");
+$rc = $uuid_ns->isnil();
+ok((defined($rc) and $rc == 1), "isnil (2)");
+
+$rc = $uuid->compare($uuid_ns);
+ok((defined($rc) and $rc == 0), "compare (1)");
+
+$ptr = $uuid->export("str");
+ok(( defined($ptr)
+ and $ptr eq "00000000-0000-0000-0000-000000000000"
+ and length($ptr) == UUID_LEN_STR), "export (1)");
+
+$rc = $uuid_ns->load("ns:URL");
+ok(defined($rc), "uuid_load (1)");
+$ptr = $uuid_ns->export("str");
+ok(( defined($ptr)
+ and $ptr eq "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
+ and length($ptr) == UUID_LEN_STR), "export (2)");
+
+$rc = $uuid->make("v3", $uuid_ns, "http://www.ossp.org/");
+ok(defined($rc), "make (1)");
+$ptr = $uuid->export("str");
+ok(( defined($ptr)
+ and $ptr eq "02d9e6d5-9467-382e-8f9b-9300a64ac3cd"
+ and length($ptr) == UUID_LEN_STR), "export (3)");
+
+$ptr = $uuid->export("bin");
+ok(( defined($ptr)
+ and length($ptr) == UUID_LEN_BIN), "export (4)");
+$rc = $uuid_ns->import("bin", $ptr);
+ok(defined($rc), "import (1)");
+$ptr = $uuid_ns->export("str");
+ok(( defined($ptr)
+ and $ptr eq "02d9e6d5-9467-382e-8f9b-9300a64ac3cd"
+ and length($ptr) == UUID_LEN_STR), "export (5)");
+
+undef $uuid;
+undef $uuid_ns;
+
+##
+## TIE API
+##
+
+$uuid = new OSSP::uuid;
+
+tie my $var, 'OSSP::uuid::tie';
+
+my $val_get1 = $var;
+my $val_get2 = $var;
+ok($val_get1 ne $val_get2, "subsequent generation");
+
+$uuid->import("str", $val_get1);
+my $val_cmp1 = $uuid->export("str");
+$uuid->import("str", $val_get2);
+my $val_cmp2 = $uuid->export("str");
+ok($val_get1 eq $val_cmp1, "validity comparison 1");
+ok($val_get2 eq $val_cmp2, "validity comparison 2");
+
+$var = [ "v3", "ns:URL", "http://www.ossp.org/" ];
+$val_get1 = $var;
+ok($val_get1 eq "02d9e6d5-9467-382e-8f9b-9300a64ac3cd", "generation of UUID v3");
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuidxs"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid.xs (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid.xs         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid.xs        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,236 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid.xs: Perl Binding (Perl/XS part)
+*/
+
+#include "uuid.h"
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+MODULE = OSSP::uuid PACKAGE = OSSP::uuid
+
+void
+constant(sv)
+ PREINIT:
+ dXSTARG;
+ STRLEN len;
+ int i;
+ static struct {
+ const char *name;
+ int value;
+ } constant_table[] = {
+ { "UUID_VERSION", UUID_VERSION },
+ { "UUID_LEN_BIN", UUID_LEN_BIN },
+ { "UUID_LEN_STR", UUID_LEN_STR },
+ { "UUID_LEN_SIV", UUID_LEN_SIV },
+ { "UUID_RC_OK", UUID_RC_OK },
+ { "UUID_RC_ARG", UUID_RC_ARG },
+ { "UUID_RC_MEM", UUID_RC_MEM },
+ { "UUID_RC_SYS", UUID_RC_SYS },
+ { "UUID_RC_INT", UUID_RC_INT },
+ { "UUID_RC_IMP", UUID_RC_IMP },
+ { "UUID_MAKE_V1", UUID_MAKE_V1 },
+ { "UUID_MAKE_V3", UUID_MAKE_V3 },
+ { "UUID_MAKE_V4", UUID_MAKE_V4 },
+ { "UUID_MAKE_V5", UUID_MAKE_V5 },
+ { "UUID_MAKE_MC", UUID_MAKE_MC },
+ { "UUID_FMT_BIN", UUID_FMT_BIN },
+ { "UUID_FMT_STR", UUID_FMT_STR },
+ { "UUID_FMT_SIV", UUID_FMT_SIV },
+ { "UUID_FMT_TXT", UUID_FMT_TXT }
+ };
+ INPUT:
+ SV *sv;
+ const char *s = SvPV(sv, len);
+ PPCODE:
+ for (i = 0; i < sizeof(constant_table)/sizeof(constant_table[0]); i++) {
+ if (strcmp(s, constant_table[i].name) == 0) {
+ EXTEND(SP, 1);
+ PUSHs(&PL_sv_undef);
+ PUSHi(constant_table[i].value);
+ break;
+ }
+ }
+ if (i == sizeof(constant_table)/sizeof(constant_table[0])) {
+ sv = sv_2mortal(newSVpvf("unknown contant OSSP::uuid::%s", s));
+ PUSHs(sv);
+ }
+
+
+uuid_rc_t
+uuid_create(uuid)
+ PROTOTYPE:
+ $
+ INPUT:
+ uuid_t *&uuid = NO_INIT
+ CODE:
+ RETVAL = uuid_create(&uuid);
+ OUTPUT:
+ uuid
+ RETVAL
+
+uuid_rc_t
+uuid_destroy(uuid)
+ PROTOTYPE:
+ $
+ INPUT:
+ uuid_t *uuid
+ CODE:
+ RETVAL = uuid_destroy(uuid);
+ OUTPUT:
+ RETVAL
+
+uuid_rc_t
+uuid_load(uuid,name)
+ PROTOTYPE:
+ $$
+ INPUT:
+ uuid_t *uuid
+ const char *name
+ CODE:
+ RETVAL = uuid_load(uuid, name);
+ OUTPUT:
+ RETVAL
+
+uuid_rc_t
+uuid_make(uuid,mode,...)
+ PROTOTYPE:
+ $$;$$
+ INPUT:
+ uuid_t *uuid
+ unsigned int mode
+ PREINIT:
+ uuid_t *ns;
+ const char *name;
+ CODE:
+ if ((mode & UUID_MAKE_V3) || (mode & UUID_MAKE_V5)) {
+ if (items != 4)
+ croak("mode UUID_MAKE_V3/UUID_MAKE_V5 requires two additional arguments to uuid_make()");
+         if (!SvROK(ST(2)))
+ croak("mode UUID_MAKE_V3/UUID_MAKE_V5 requires a UUID object as namespace");
+ ns = INT2PTR(uuid_t *, SvIV((SV*)SvRV(ST(2))));
+ name = (const char *)SvPV_nolen(ST(3));
+ RETVAL = uuid_make(uuid, mode, ns, name);
+ }
+ else {
+ if (items != 2)
+ croak("invalid number of arguments to uuid_make()");
+ RETVAL = uuid_make(uuid, mode);
+ }
+ OUTPUT:
+ RETVAL
+
+uuid_rc_t
+uuid_isnil(uuid,result)
+ PROTOTYPE:
+ $$
+ INPUT:
+ uuid_t *uuid
+ int &result = NO_INIT
+ CODE:
+ RETVAL = uuid_isnil(uuid, &result);
+ OUTPUT:
+ result
+ RETVAL
+
+uuid_rc_t
+uuid_compare(uuid,uuid2,result)
+ PROTOTYPE:
+ $$$
+ INPUT:
+ uuid_t *uuid
+ uuid_t *uuid2
+ int &result = NO_INIT
+ CODE:
+ RETVAL = uuid_compare(uuid, uuid2, &result);
+ OUTPUT:
+ result
+ RETVAL
+
+uuid_rc_t
+uuid_import(uuid,fmt,data_ptr,data_len)
+ PROTOTYPE:
+ $$$$
+ INPUT:
+ uuid_t *uuid
+ uuid_fmt_t fmt
+ const void *data_ptr
+ size_t data_len
+ CODE:
+ if (ST(3) == &PL_sv_undef)
+ data_len = sv_len(ST(2));
+ RETVAL = uuid_import(uuid, fmt, data_ptr, data_len);
+ OUTPUT:
+ RETVAL
+
+uuid_rc_t
+uuid_export(uuid,fmt,data_ptr,data_len)
+ PROTOTYPE:
+ $$$$
+ INPUT:
+ uuid_t *uuid
+ uuid_fmt_t fmt
+ void *&data_ptr = NO_INIT
+ size_t &data_len = NO_INIT
+ PPCODE:
+ data_ptr = NULL;
+ data_len = 0;
+ RETVAL = uuid_export(uuid, fmt, &data_ptr, &data_len);
+ if (RETVAL == UUID_RC_OK) {
+ if (fmt == UUID_FMT_SIV)
+ data_len = strlen((char *)data_ptr);
+ else if (fmt == UUID_FMT_STR || fmt == UUID_FMT_TXT)
+ data_len--; /* Perl doesn't wish NUL-termination on strings */
+ sv_setpvn(ST(2), data_ptr, data_len);
+ free(data_ptr);
+ if (ST(3) != &PL_sv_undef)
+ sv_setuv(ST(3), (UV)data_len);
+ }
+ PUSHi((IV)RETVAL);
+
+char *
+uuid_error(rc)
+ PROTOTYPE:
+ $
+ INPUT:
+ uuid_rc_t rc
+ CODE:
+ RETVAL = uuid_error(rc);
+ OUTPUT:
+ RETVAL
+
+unsigned long
+uuid_version()
+ PROTOTYPE:
+ INPUT:
+ CODE:
+ RETVAL = uuid_version();
+ OUTPUT:
+ RETVAL
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuid_compatpm"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid_compat.pm (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid_compat.pm         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid_compat.pm        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,176 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+## Copyright (c) 2004 Piotr Roszatycki <dexter@debian.org>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid_compat.pm: Data::UUID Backward Compatibility Perl API
+##
+
+package Data::UUID;
+
+use 5.006;
+use warnings;
+use strict;
+
+use OSSP::uuid;
+use MIME::Base64 qw();
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(NameSpace_DNS NameSpace_OID NameSpace_URL NameSpace_X500);
+
+our $VERSION = do { my @v = ('1.6.2' =~ m/\d+/g); sprintf("%d.".("%02d"x$#v), @v); };
+
+sub new {
+ my $class = shift;
+ my $self = bless {}, $class;
+ return $self;
+}
+
+sub create {
+ my ($self) = @_;
+ my $uuid = OSSP::uuid->new;
+ $uuid->make('v4');
+ return $uuid->export('bin');
+}
+
+sub create_from_name {
+ my ($self, $nsid, $name) = @_;
+ my $uuid = OSSP::uuid->new;
+ my $nsiduuid = OSSP::uuid->new;
+ $nsiduuid->import('bin', $nsiduuid);
+ $uuid = OSSP::uuid->new;
+ $uuid->make('v3', $nsiduuid, $name);
+ return $uuid->export('bin');
+}
+
+sub to_string {
+ my ($self, $bin) = @_;
+ my $uuid = OSSP::uuid->new;
+ $uuid->import('bin', $bin);
+ return $uuid->export('str');
+}
+
+sub to_hexstring {
+ my ($self, $bin) = @_;
+ my $uuid = OSSP::uuid->new;
+ $uuid->import('bin', $bin);
+ (my $string = '0x' . $uuid->export('str')) =~ s/-//g;
+ return $string;
+}
+
+sub to_b64string {
+ my ($self, $bin) = @_;
+ return MIME::Base64::encode_base64($bin, '');
+}
+
+sub from_string {
+ my ($self, $str) = @_;
+ my $uuid = OSSP::uuid->new;
+ $uuid->import('str',
+ $str =~ /^0x/
+ ? join '-', unpack('x2 a8 a4 a4 a4 a12', $str)
+ : $str
+ );
+ return $uuid->export('bin');
+}
+
+sub from_hexstring {
+ my ($self, $str) = @_;
+ my $uuid = OSSP::uuid->new;
+ $uuid->import('str', join '-', unpack('x2 a8 a4 a4 a4 a12', $str));
+ return $uuid->export('bin');
+}
+
+sub from_b64string {
+ my ($self, $b64) = @_;
+ return MIME::Base64::decode_base64($b64);
+}
+
+sub compare {
+ my ($self, $bin1, $bin2) = @_;
+ my $uuid1 = OSSP::uuid->new;
+ my $uuid2 = OSSP::uuid->new;
+ $uuid1->import('bin', $bin1);
+ $uuid2->import('bin', $bin2);
+ return $uuid1->compare($uuid2);
+}
+
+my %NS = (
+ 'NameSpace_DNS' => 'ns:DNS',
+ 'NameSpace_URL' => 'ns:URL',
+ 'NameSpace_OID' => 'ns:OID',
+ 'NameSpace_X500' => 'ns:X500',
+);
+
+while (my ($k, $v) = each %NS) {
+ no strict 'refs';
+ *{$k} = sub () {
+ my $uuid = OSSP::uuid->new;
+ $uuid->load($v);
+ return $uuid->export('bin');
+ };
+}
+
+sub constant {
+ my ($self, $arg) = @_;
+ my $uuid = OSSP::uuid->new;
+ $uuid->load($NS{$arg} || 'nil');
+ return $uuid->export('bin');
+}
+
+sub create_str {
+ my $self = shift;
+ return $self->to_string($self->create);
+}
+
+sub create_hex {
+ my $self = shift;
+ return $self->to_hexstring($self->create);
+}
+
+sub create_b64 {
+ my $self = shift;
+ return $self->to_b64string($self->create);
+}
+
+sub create_from_name_str {
+ my $self = shift;
+ return $self->to_string($self->create_from_name(@_));
+}
+
+sub create_from_name_hex {
+ my $self = shift;
+ return $self->to_hexstring($self->create_from_name(@_));
+}
+
+sub create_from_name_b64 {
+ my $self = shift;
+ return $self->to_b64string($self->create_from_name(@_));
+}
+
+1;
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuid_compatpod"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid_compat.pod (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid_compat.pod         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid_compat.pod        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,55 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid_compat.pod: Data::UUID Backward Compatibility Perl API (Perl/POD part)
+##
+
+=pod
+
+=head1 NAME
+
+Data::UUID - B<OSSP uuid> Backward Compatibility Perl Binding
+
+=head1 DESCRIPTION
+
+B<Data::UUID> is the B<OSSP uuid> backward compatibility Perl binding
+to the API of the original B<Data::UUID> module. It allows other
+B<Data::UUID> based Perl modules to run with B<OSSP::uuid> without
+changes.
+
+=head1 SEE ALSO
+
+B<OSSP::uuid>.
+
+=head1 HISTORY
+
+The backward compatibility Perl binding B<Data::UUID> for B<OSSP
+uuid> was originally implemented in 2004 by Piotr Roszatycki
+E<lt>dexter@debian.orgE<gt>. It was later cleaned up and speed optimized
+in December 2005 by David Wheeler E<lt>david@justatheory.comE<gt>.
+
+=cut
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidperluuid_compatts"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/perl/uuid_compat.ts (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/perl/uuid_compat.ts         (rev 0)
+++ freeswitch/trunk/libs/uuid/perl/uuid_compat.ts        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,55 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+## Copyright (c) 2004 Piotr Roszatycki <dexter@debian.org>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid_compat.ts: Data::UUID Backward Compatibility Perl API (Perl test suite part)
+##
+
+use Test::More tests => 14;
+
+BEGIN {
+ use_ok('Data::UUID');
+ use Data::UUID;
+};
+
+ok($ug = new Data::UUID);
+
+ok($uuid1 = $ug->create());
+ok($uuid2 = $ug->to_hexstring($uuid1));
+ok($uuid3 = $ug->from_string($uuid2));
+ok($ug->compare($uuid1, $uuid3) == 0);
+
+ok($uuid4 = $ug->to_b64string($uuid1));
+ok($uuid5 = $ug->to_b64string($uuid3));
+ok($uuid4 eq $uuid5);
+
+ok($uuid6 = $ug->from_b64string($uuid5));
+ok($ug->compare($uuid6, $uuid1) == 0);
+
+ok($uuid7 = NameSpace_URL);
+ok($uuid8 = $ug->from_string("6ba7b811-9dad-11d1-80b4-00c04fd430c8"));
+ok($ug->compare($uuid7, $uuid8) == 0);
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidpgsqlMakefile"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/pgsql/Makefile (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/pgsql/Makefile         (rev 0)
+++ freeswitch/trunk/libs/uuid/pgsql/Makefile        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,57 @@
</span><ins>+##
+## Makefile for PostgreSQL extension module
+##
+
+# NOTICE: This requires GNU make as the PostgreSQL PGXS build
+# environment is based on GNU make features!
+#
+# NOTICE: Usually one would just use "PGXS := $(shell pg_config
+# --pgxs)" followed by "include $(PGXS)" as the template. The problem
+# just is that this way (at least still under PostgreSQL 8.1) one
+# cannot pass the "-L../.libs -luuid" to the command which links the
+# DSO. Hence we fiddle around with the Makefiles which "PGXS" uses
+# itself ourself.
+
+PG_CONFIG ?= pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+POSTGRES := $(shell $(PG_CONFIG) --bindir)/postgres
+top_builddir := $(dir $(PGXS))../..
+include $(top_builddir)/src/Makefile.global
+
+NAME = uuid
+OBJS = uuid.o
+SO_MAJOR_VERSION = 1
+SO_MINOR_VERSION = 0
+
+override CPPFLAGS := -I.. $(CPPFLAGS)
+SHLIB_LINK := -L../.libs -luuid
+SHLIB_LINK += $(shell test $(shell uname -s) = FreeBSD && echo "-Wl,-Bsymbolic")
+SHLIB_LINK += $(shell test $(shell uname -s) = Darwin && echo "-bundle_loader $(POSTGRES)")
+rpath :=
+
+all: uuid.sql all-lib
+
+enable_shared = yes
+include $(top_builddir)/src/Makefile.shlib
+
+uuid.sql: uuid.sql.in
+        sed -e 's;MODULE_PATHNAME;$(DESTDIR)$(pkglibdir)/uuid$(DLSUFFIX);g' <uuid.sql.in >uuid.sql
+
+install: all
+        $(mkinstalldirs) $(DESTDIR)$(pkglibdir)
+        $(mkinstalldirs) $(DESTDIR)$(datadir)
+        $(INSTALL_SHLIB) $(shlib) $(DESTDIR)$(pkglibdir)/uuid$(DLSUFFIX)
+        $(INSTALL_DATA) uuid.sql $(DESTDIR)$(datadir)/uuid.sql
+
+uninstall:
+        -rm -f $(DESTDIR)$(pkglibdir)/uuid$(DLSUFFIX)
+        -rm -f $(DESTDIR)$(datadir)/uuid.sql
+
+clean distclean: clean-lib
+        rm -f $(OBJS)
+        rm -f uuid.sql
+
+realclean: distclean
+
+test:
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidpgsqluuidc"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/pgsql/uuid.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/pgsql/uuid.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/pgsql/uuid.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,436 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid.c: PostgreSQL Binding (C part)
+*/
+
+/* own headers */
+#include "uuid.h"
+
+/* PostgreSQL (part 1/2) headers */
+#include "postgres.h"
+
+/* system headers */
+#include <string.h>
+
+/* PostgreSQL (part 2/2) headers */
+#include "fmgr.h"
+#include "lib/stringinfo.h"
+#include "access/hash.h"
+
+/* PostgreSQL module magic cookie
+ (PostgreSQL >= 8.2 only) */
+#ifdef PG_MODULE_MAGIC
+PG_MODULE_MAGIC;
+#endif
+
+/* internal UUID datum data structure */
+typedef struct {
+ unsigned char uuid_bin[UUID_LEN_BIN];
+} uuid_datum_t;
+
+/* forward declarations */
+Datum pg_uuid_in (PG_FUNCTION_ARGS);
+Datum pg_uuid_out (PG_FUNCTION_ARGS);
+Datum pg_uuid_recv (PG_FUNCTION_ARGS);
+Datum pg_uuid_send (PG_FUNCTION_ARGS);
+Datum pg_uuid_hash (PG_FUNCTION_ARGS);
+Datum pg_uuid_make (PG_FUNCTION_ARGS);
+Datum pg_uuid_eq (PG_FUNCTION_ARGS);
+Datum pg_uuid_ne (PG_FUNCTION_ARGS);
+Datum pg_uuid_lt (PG_FUNCTION_ARGS);
+Datum pg_uuid_gt (PG_FUNCTION_ARGS);
+Datum pg_uuid_le (PG_FUNCTION_ARGS);
+Datum pg_uuid_ge (PG_FUNCTION_ARGS);
+Datum pg_uuid_cmp (PG_FUNCTION_ARGS);
+
+/* API function: uuid_in */
+PG_FUNCTION_INFO_V1(pg_uuid_in);
+Datum pg_uuid_in(PG_FUNCTION_ARGS)
+{
+ char *uuid_str;
+ uuid_datum_t *uuid_datum;
+ uuid_rc_t rc;
+ uuid_t *uuid;
+ void *vp;
+ size_t len;
+
+ /* sanity check input argument */
+ if ((uuid_str = PG_GETARG_CSTRING(0)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID string")));
+ if ((len = strlen(uuid_str)) != UUID_LEN_STR)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID string length %d (expected %d)", (int)len, UUID_LEN_STR)));
+
+ /* import as string representation */
+ if ((rc = uuid_create(&uuid)) != UUID_RC_OK)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to create UUID object: %s", uuid_error(rc))));
+ if ((rc = uuid_import(uuid, UUID_FMT_STR, uuid_str, len)) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to import UUID string representation: %s", uuid_error(rc))));
+ }
+
+ /* export as binary representation */
+ if ((uuid_datum = (uuid_datum_t *)palloc(sizeof(uuid_datum_t))) == NULL) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to allocate UUID datum")));
+ }
+ vp = &(uuid_datum->uuid_bin);
+ len = sizeof(uuid_datum->uuid_bin);
+ if ((rc = uuid_export(uuid, UUID_FMT_BIN, &vp, &len)) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to export UUID binary representation: %s", uuid_error(rc))));
+ }
+ uuid_destroy(uuid);
+
+ /* return UUID datum */
+ PG_RETURN_POINTER(uuid_datum);
+}
+
+/* API function: uuid_out */
+PG_FUNCTION_INFO_V1(pg_uuid_out);
+Datum pg_uuid_out(PG_FUNCTION_ARGS)
+{
+ uuid_datum_t *uuid_datum;
+ uuid_rc_t rc;
+ uuid_t *uuid;
+ char *uuid_str;
+ void *vp;
+ size_t len;
+
+ /* sanity check input argument */
+ if ((uuid_datum = (uuid_datum_t *)PG_GETARG_POINTER(0)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID datum")));
+
+ /* import as binary representation */
+ if ((rc = uuid_create(&uuid)) != UUID_RC_OK)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to create UUID object: %s", uuid_error(rc))));
+ if ((rc = uuid_import(uuid, UUID_FMT_BIN, uuid_datum->uuid_bin, sizeof(uuid_datum->uuid_bin))) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to import UUID binary representation: %s", uuid_error(rc))));
+ }
+
+ /* export as string representation */
+ len = UUID_LEN_STR+1;
+ if ((vp = uuid_str = (char *)palloc(len)) == NULL) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to allocate UUID string")));
+ }
+ if ((rc = uuid_export(uuid, UUID_FMT_STR, &vp, &len)) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to export UUID string representation: %s", uuid_error(rc))));
+ }
+ uuid_destroy(uuid);
+
+ /* return UUID string */
+ PG_RETURN_CSTRING(uuid_str);
+}
+
+/* API function: uuid_recv */
+PG_FUNCTION_INFO_V1(pg_uuid_recv);
+Datum pg_uuid_recv(PG_FUNCTION_ARGS)
+{
+ StringInfo uuid_internal;
+ uuid_datum_t *uuid_datum;
+
+ /* sanity check input argument */
+ if ((uuid_internal = (StringInfo)PG_GETARG_POINTER(0)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID StringInfo object")));
+ if (uuid_internal->len != UUID_LEN_BIN)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID binary length %d (expected %d)", uuid_internal->len, UUID_LEN_BIN)));
+
+ /* import as binary representation */
+ if ((uuid_datum = (uuid_datum_t *)palloc(sizeof(uuid_datum_t))) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to allocate UUID datum")));
+ memcpy(uuid_datum->uuid_bin, uuid_internal->data, uuid_internal->len);
+
+ /* return UUID datum */
+ PG_RETURN_POINTER(uuid_datum);
+}
+
+/* API function: uuid_send */
+PG_FUNCTION_INFO_V1(pg_uuid_send);
+Datum pg_uuid_send(PG_FUNCTION_ARGS)
+{
+ uuid_datum_t *uuid_datum;
+ bytea *uuid_bytea;
+
+ /* sanity check input argument */
+ if ((uuid_datum = (uuid_datum_t *)PG_GETARG_POINTER(0)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID datum")));
+
+ /* export as binary representation */
+ if ((uuid_bytea = (bytea *)palloc(VARHDRSZ + UUID_LEN_BIN)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to allocate UUID bytea")));
+#if defined(SET_VARSIZE) /* PostgreSQL >= 8.3 */
+ SET_VARSIZE(uuid_bytea, VARHDRSZ + UUID_LEN_BIN);
+#else
+ uuid_bytea->vl_len = VARHDRSZ + UUID_LEN_BIN;
+#endif
+ memcpy(uuid_bytea->vl_dat, uuid_datum->uuid_bin, UUID_LEN_BIN);
+
+ /* return UUID bytea */
+ PG_RETURN_BYTEA_P(uuid_bytea);
+}
+
+/* API function: uuid_make */
+PG_FUNCTION_INFO_V1(pg_uuid_make);
+Datum pg_uuid_make(PG_FUNCTION_ARGS)
+{
+ uuid_t *uuid;
+ uuid_t *uuid_ns;
+ uuid_rc_t rc;
+ int version;
+ unsigned int mode = 0;
+ uuid_datum_t *uuid_datum;
+ char *str_ns;
+ char *str_name;
+ void *vp;
+ size_t len;
+
+ /* sanity check input argument */
+ version = (int)PG_GETARG_INT32(0);
+ switch (version) {
+ case 1: mode = UUID_MAKE_V1; break;
+ case 3: mode = UUID_MAKE_V3; break;
+ case 4: mode = UUID_MAKE_V4; break;
+ case 5: mode = UUID_MAKE_V5; break;
+ default:
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID version %d (expected 1, 3, 4 or 5)", version)));
+ }
+ if ( ((mode & (UUID_MAKE_V1|UUID_MAKE_V4)) && PG_NARGS() != 1)
+ || ((mode & (UUID_MAKE_V3|UUID_MAKE_V5)) && PG_NARGS() != 3))
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid number (%d) of arguments", PG_NARGS())));
+
+ /* make a new UUID */
+ if ((rc = uuid_create(&uuid)) != UUID_RC_OK)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to create UUID object: %s", uuid_error(rc))));
+ if (version == 3 || version == 5) {
+ if ((str_ns = PG_GETARG_CSTRING(1)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid namespace UUID string")));
+ if ((str_name = PG_GETARG_CSTRING(2)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid name string")));
+ if ((rc = uuid_create(&uuid_ns)) != UUID_RC_OK)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to create UUID namespace object: %s", uuid_error(rc))));
+ if ((rc = uuid_load(uuid_ns, str_ns)) != UUID_RC_OK) {
+ if ((rc = uuid_import(uuid_ns, UUID_FMT_STR, str_ns, strlen(str_ns))) != UUID_RC_OK)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to import UUID namespace: %s", uuid_error(rc))));
+ }
+ if ((rc = uuid_make(uuid, mode, uuid_ns, str_name)) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to make v%d UUID: %s", version, uuid_error(rc))));
+ }
+ uuid_destroy(uuid_ns);
+ }
+ else {
+ if ((rc = uuid_make(uuid, mode)) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to make v%d UUID: %s", version, uuid_error(rc))));
+ }
+ }
+
+ /* export as binary representation */
+ if ((uuid_datum = (uuid_datum_t *)palloc(sizeof(uuid_datum_t))) == NULL) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to allocate UUID datum")));
+ }
+ vp = &(uuid_datum->uuid_bin);
+ len = sizeof(uuid_datum->uuid_bin);
+ if ((rc = uuid_export(uuid, UUID_FMT_BIN, &vp, &len)) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to export UUID binary representation: %s", uuid_error(rc))));
+ }
+ uuid_destroy(uuid);
+ PG_RETURN_POINTER(uuid_datum);
+}
+
+/* API function: uuid_hash */
+PG_FUNCTION_INFO_V1(pg_uuid_hash);
+Datum pg_uuid_hash(PG_FUNCTION_ARGS)
+{
+ uuid_datum_t *uuid_datum;
+
+ /* sanity check input argument */
+ if ((uuid_datum = (uuid_datum_t *)PG_GETARG_POINTER(0)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid UUID datum argument")));
+
+ /* return hash value of the UUID */
+ PG_RETURN_INT32(hash_any(uuid_datum->uuid_bin, sizeof(uuid_datum->uuid_bin)));
+}
+
+/* INTERNAL function: _uuid_cmp */
+static int _uuid_cmp(PG_FUNCTION_ARGS)
+{
+ uuid_datum_t *uuid_datum1;
+ uuid_datum_t *uuid_datum2;
+ uuid_t *uuid1;
+ uuid_t *uuid2;
+ uuid_rc_t rc;
+ int result;
+
+ /* sanity check input argument */
+ if ((uuid_datum1 = (uuid_datum_t *)PG_GETARG_POINTER(0)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid first UUID datum argument")));
+ if ((uuid_datum2 = (uuid_datum_t *)PG_GETARG_POINTER(1)) == NULL)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("invalid second UUID datum argument")));
+
+ /* load both UUIDs */
+ if ((rc = uuid_create(&uuid1)) != UUID_RC_OK)
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to create UUID object: %s", uuid_error(rc))));
+ if ((rc = uuid_create(&uuid2)) != UUID_RC_OK) {
+ uuid_destroy(uuid1);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to create UUID object: %s", uuid_error(rc))));
+ }
+ if ((rc = uuid_import(uuid1, UUID_FMT_BIN, uuid_datum1->uuid_bin, sizeof(uuid_datum1->uuid_bin))) != UUID_RC_OK) {
+ uuid_destroy(uuid1);
+ uuid_destroy(uuid2);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to import UUID: %s", uuid_error(rc))));
+ }
+ if ((rc = uuid_import(uuid2, UUID_FMT_BIN, uuid_datum2->uuid_bin, sizeof(uuid_datum2->uuid_bin))) != UUID_RC_OK) {
+ uuid_destroy(uuid1);
+ uuid_destroy(uuid2);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to import UUID: %s", uuid_error(rc))));
+ }
+
+ /* compare UUIDs */
+ if ((rc = uuid_compare(uuid1, uuid2, &result)) != UUID_RC_OK) {
+ uuid_destroy(uuid1);
+ uuid_destroy(uuid2);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("failed to compare UUID objects: %s", uuid_error(rc))));
+ }
+
+ /* cleanup */
+ uuid_destroy(uuid1);
+ uuid_destroy(uuid2);
+
+ /* return result */
+ return result;
+}
+
+/* API function: uuid_eq */
+PG_FUNCTION_INFO_V1(pg_uuid_eq);
+Datum pg_uuid_eq(PG_FUNCTION_ARGS)
+{
+ int rc;
+
+ rc = _uuid_cmp(fcinfo);
+ PG_RETURN_BOOL(rc == 0);
+}
+
+/* API function: uuid_ne */
+PG_FUNCTION_INFO_V1(pg_uuid_ne);
+Datum pg_uuid_ne(PG_FUNCTION_ARGS)
+{
+ int rc;
+
+ rc = _uuid_cmp(fcinfo);
+ PG_RETURN_BOOL(rc != 0);
+}
+
+/* API function: uuid_lt */
+PG_FUNCTION_INFO_V1(pg_uuid_lt);
+Datum pg_uuid_lt(PG_FUNCTION_ARGS)
+{
+ int rc;
+
+ rc = _uuid_cmp(fcinfo);
+ PG_RETURN_BOOL(rc == -1);
+}
+
+/* API function: uuid_gt */
+PG_FUNCTION_INFO_V1(pg_uuid_gt);
+Datum pg_uuid_gt(PG_FUNCTION_ARGS)
+{
+ int rc;
+
+ rc = _uuid_cmp(fcinfo);
+ PG_RETURN_BOOL(rc == 1);
+}
+
+/* API function: uuid_le */
+PG_FUNCTION_INFO_V1(pg_uuid_le);
+Datum pg_uuid_le(PG_FUNCTION_ARGS)
+{
+ int rc;
+
+ rc = _uuid_cmp(fcinfo);
+ PG_RETURN_BOOL(rc < 1);
+}
+
+/* API function: uuid_ge */
+PG_FUNCTION_INFO_V1(pg_uuid_ge);
+Datum pg_uuid_ge(PG_FUNCTION_ARGS)
+{
+ int rc;
+
+ rc = _uuid_cmp(fcinfo);
+ PG_RETURN_BOOL(rc > -1);
+}
+
+/* API function: uuid_cmp */
+PG_FUNCTION_INFO_V1(pg_uuid_cmp);
+Datum pg_uuid_cmp(PG_FUNCTION_ARGS)
+{
+ int rc;
+
+ rc = _uuid_cmp(fcinfo);
+ PG_RETURN_INT32(rc);
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidpgsqluuidsqlin"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/pgsql/uuid.sql.in (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/pgsql/uuid.sql.in         (rev 0)
+++ freeswitch/trunk/libs/uuid/pgsql/uuid.sql.in        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,244 @@
</span><ins>+--
+-- OSSP uuid - Universally Unique Identifier
+-- Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+-- Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+--
+-- This file is part of OSSP uuid, a library for the generation
+-- of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+--
+-- Permission to use, copy, modify, and distribute this software for
+-- any purpose with or without fee is hereby granted, provided that
+-- the above copyright notice and this permission notice appear in all
+-- copies.
+--
+-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+-- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+-- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+-- IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+-- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+-- USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+-- SUCH DAMAGE.
+--
+-- uuid.sql: PostgreSQL Binding (SQL part)
+--
+
+--
+-- prolog
+--
+
+SET search_path TO public;
+SET client_min_messages TO warning;
+
+DROP FUNCTION uuid_in(CSTRING) CASCADE;
+DROP FUNCTION uuid_out(uuid) CASCADE;
+DROP FUNCTION uuid_recv(INTERNAL) CASCADE;
+DROP FUNCTION uuid_send(uuid) CASCADE;
+DROP TYPE uuid CASCADE;
+DROP CAST (CSTRING AS uuid) CASCADE;
+DROP CAST (uuid AS CSTRING) CASCADE;
+
+DROP FUNCTION uuid(CSTRING) CASCADE;
+DROP FUNCTION uuid(INTEGER) CASCADE;
+DROP FUNCTION uuid(INTEGER, CSTRING, CSTRING) CASCADE;
+
+DROP FUNCTION uuid_eq(uuid) CASCADE;
+DROP FUNCTION uuid_ne(uuid) CASCADE;
+DROP FUNCTION uuid_lt(uuid, uuid) CASCADE;
+DROP FUNCTION uuid_gt(uuid, uuid) CASCADE;
+DROP FUNCTION uuid_le(uuid, uuid) CASCADE;
+DROP FUNCTION uuid_ge(uuid, uuid) CASCADE;
+DROP OPERATOR =(uuid,uuid) CASCADE;
+DROP OPERATOR <>(uuid,uuid) CASCADE;
+DROP OPERATOR <(uuid,uuid) CASCADE;
+DROP OPERATOR >(uuid,uuid) CASCADE;
+DROP OPERATOR <=(uuid,uuid) CASCADE;
+DROP OPERATOR >=(uuid,uuid) CASCADE;
+
+DROP FUNCTION uuid_hash(uuid) CASCADE;
+DROP FUNCTION uuid_cmp(uuid, uuid) CASCADE;
+DROP OPERATOR CLASS uuid_ops USING hash CASCADE;
+DROP OPERATOR CLASS uuid_ops USING btree CASCADE;
+
+BEGIN;
+
+--
+-- the UUID data type
+--
+
+CREATE FUNCTION
+ uuid_in(CSTRING) RETURNS uuid
+ STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_in';
+
+CREATE FUNCTION
+ uuid_out(uuid) RETURNS CSTRING
+ STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_out';
+
+CREATE FUNCTION
+ uuid_recv(INTERNAL) RETURNS uuid
+ STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_recv';
+
+CREATE FUNCTION
+ uuid_send(uuid) RETURNS BYTEA
+ STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_send';
+
+CREATE TYPE uuid (
+ INPUT = uuid_in, -- for SQL input
+ OUTPUT = uuid_out, -- for SQL output
+ RECEIVE = uuid_recv, -- for DB input
+ SEND = uuid_send, -- for DB output
+ DEFAULT = 'uuid(1)',
+ INTERNALLENGTH = 16,
+ ALIGNMENT = char
+);
+
+COMMENT ON TYPE uuid
+ IS 'UUID type';
+
+-- CREATE CAST (CSTRING AS uuid)
+-- WITH FUNCTION uuid_in(CSTRING) AS ASSIGNMENT;
+--
+-- CREATE CAST (uuid AS CSTRING)
+-- WITH FUNCTION uuid_out(uuid) AS ASSIGNMENT;
+
+--
+-- the UUID constructor function
+--
+
+CREATE FUNCTION
+ uuid(CSTRING) RETURNS uuid
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_in';
+
+CREATE FUNCTION
+ uuid(INTEGER) RETURNS uuid
+ VOLATILE CALLED ON NULL INPUT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_make';
+
+CREATE FUNCTION
+ uuid(INTEGER, CSTRING, CSTRING) RETURNS uuid
+ VOLATILE CALLED ON NULL INPUT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_make';
+
+--
+-- the UUID operators
+--
+
+CREATE FUNCTION
+ uuid_eq(uuid, uuid) RETURNS BOOL
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_eq';
+
+CREATE FUNCTION
+ uuid_ne(uuid, uuid) RETURNS BOOL
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_ne';
+
+CREATE FUNCTION
+ uuid_lt(uuid, uuid) RETURNS BOOL
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_lt';
+
+CREATE FUNCTION
+ uuid_gt(uuid, uuid) RETURNS BOOL
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_gt';
+
+CREATE FUNCTION
+ uuid_le(uuid, uuid) RETURNS BOOL
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_le';
+
+CREATE FUNCTION
+ uuid_ge(uuid, uuid) RETURNS BOOL
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_ge';
+
+CREATE OPERATOR = (
+ leftarg = uuid,
+ rightarg = uuid,
+ negator = <>,
+ procedure = uuid_eq
+);
+
+CREATE OPERATOR <> (
+ leftarg = uuid,
+ rightarg = uuid,
+ negator = =,
+ procedure = uuid_ne
+);
+
+CREATE OPERATOR < (
+ leftarg = uuid,
+ rightarg = uuid,
+ commutator = >,
+ negator = >=,
+ procedure = uuid_lt
+);
+
+CREATE OPERATOR > (
+ leftarg = uuid,
+ rightarg = uuid,
+ commutator = <,
+ negator = <=,
+ procedure = uuid_gt
+);
+
+CREATE OPERATOR <= (
+ leftarg = uuid,
+ rightarg = uuid,
+ commutator = >=,
+ negator = >,
+ procedure = uuid_le
+);
+
+CREATE OPERATOR >= (
+ leftarg = uuid,
+ rightarg = uuid,
+ commutator = <=,
+ negator = <,
+ procedure = uuid_ge
+);
+
+--
+-- the UUID support for indexing
+--
+
+CREATE FUNCTION
+ uuid_hash(uuid) RETURNS INTEGER
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_hash';
+
+CREATE FUNCTION
+ uuid_cmp(uuid, uuid) RETURNS INTEGER
+ IMMUTABLE STRICT
+ LANGUAGE C AS 'MODULE_PATHNAME', 'pg_uuid_cmp';
+
+CREATE OPERATOR CLASS uuid_ops
+ DEFAULT FOR TYPE uuid USING hash AS
+ OPERATOR 1 =, -- 1: equal
+ FUNCTION 1 uuid_hash(uuid);
+
+CREATE OPERATOR CLASS uuid_ops
+ DEFAULT FOR TYPE uuid USING btree AS
+ OPERATOR 1 <, -- 1: less than
+ OPERATOR 2 <=, -- 2: less than or equal
+ OPERATOR 3 =, -- 3: equal
+ OPERATOR 4 >=, -- 4: greater than or equal
+ OPERATOR 5 >, -- 5: greater than
+ FUNCTION 1 uuid_cmp(uuid, uuid);
+
+--
+-- epilog
+--
+
+COMMIT;
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidpgsqluuidtxt"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/pgsql/uuid.txt (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/pgsql/uuid.txt         (rev 0)
+++ freeswitch/trunk/libs/uuid/pgsql/uuid.txt        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+
+ OSSP uuid bindings for PostgreSQL
+ =================================
+
+ This is the OSSP uuid binding for the PostgreSQL RDBMS, providing
+ native UUID data type support.
+
+ Installation
+ ------------
+
+ In order to install the OSSP uuid binding into the PostgreSQL database
+ <database> one has run:
+
+ $ <prefix>/bin/psql \
+ -d <database> \
+ -U postgresql \
+ -f <prefix>/share/postgresql/uuid.sql
+
+ Usage
+ -----
+
+ psql -d <database>
+ psql> CREATE TABLE test (id UUID DEFAULT uuid(1), name TEXT);
+ psql> INSERT INTO test (name) VALUES
+ ('foo');
+ psql> INSERT INTO test (id, name) VALUES
+ (uuid(1), 'bar');
+ psql> INSERT INTO test (id, name) VALUES
+ (uuid(3, 'ns:URL', 'http://www.ossp.org/'), 'baz');
+ psql> INSERT INTO test (id, name) VALUES
+ (uuid(3, '6ba7b811-9dad-11d1-80b4-00c04fd430c8',
+ 'http://www.ossp.org/'), 'quux');
+ psql> SELECT uuid(4);
+ psql> SELECT * FROM test WHERE id = uuid(3, 'ns:URL', 'http://www.ossp.org/');
+ psql> DROP TABLE test;
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidphpMakefilelocal"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/php/Makefile.local (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/php/Makefile.local         (rev 0)
+++ freeswitch/trunk/libs/uuid/php/Makefile.local        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## Makefile.local: PHP/Zend API build procedure (language: make)
+##
+
+PHP = php
+EXTDIR = `$(PHP)-config --extension-dir`
+DESTDIR =
+
+all: build
+
+config:
+        @if [ ! -f ./configure ]; then $(PHP)ize 2>/dev/null; fi
+        @if [ ! -f ./Makefile ]; then ./configure --with-php-config=$(PHP)-config; fi
+
+build: config
+        @$(MAKE) $(MFLAGS) -f Makefile
+
+test: build
+        @version=`$(PHP)-config --version | sed -e 's;^\([0-9]\).*$$;\1;'`; \
+        $(PHP) -q -d "safe_mode=0" -d "extension_dir=./" uuid.ts $$version
+
+install: build
+        @version=`$(PHP)-config --version | sed -e 's;^\([0-9]\).*$$;\1;'`; extdir="$(EXTDIR)"; \
+        echo "installing PHP$$version API into $$extdir"; \
+        ./build/shtool mkdir -f -p -m 755 $(DESTDIR)$$extdir; \
+        ./build/shtool install -c -m 755 modules/uuid.so $(DESTDIR)$$extdir/uuid.so; \
+        ./build/shtool install -c -m 644 uuid.php$$version $(DESTDIR)$$extdir/uuid.php
+
+clean:
+        @$(MAKE) $(MFLAGS) -f Makefile clean || true
+
+distclean: clean
+        -rm -f Makefile .deps
+        -rm -f config.status configure.lineno
+        -rm -f config.h config.log
+        -rm -f *.core *~
+
+realclean: distclean
+        -rm -rf autom4te.cache build include modules
+        -rm -f Makefile.fragments Makefile.objects Makefile.global
+        -rm -f acinclude.m4 aclocal.m4
+        -rm -f config.guess config.h.in config.nice config.sub
+        -rm -f configure configure.in
+        -rm -f install-sh libtool ltmain.sh missing mkinstalldirs
+        -rm -f run-tests.php
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidphpconfigm4"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/php/config.m4 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/php/config.m4         (rev 0)
+++ freeswitch/trunk/libs/uuid/php/config.m4        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,48 @@
</span><ins>+dnl
+dnl OSSP uuid - Universally Unique Identifier
+dnl Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+dnl Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+dnl
+dnl This file is part of OSSP uuid, a library for the generation
+dnl of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+dnl
+dnl Permission to use, copy, modify, and distribute this software for
+dnl any purpose with or without fee is hereby granted, provided that
+dnl the above copyright notice and this permission notice appear in all
+dnl copies.
+dnl
+dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+dnl WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+dnl IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+dnl CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+dnl USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+dnl ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+dnl OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+dnl OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+dnl SUCH DAMAGE.
+dnl
+dnl config.m4: PHP/Zend API build-time configuration (language: m4)
+dnl
+
+PHP_ARG_ENABLE(uuid, OSSP uuid module,
+[ --enable-uuid Enable OSSP uuid extension module.])
+
+if test "$PHP_UUID" != "no"; then
+ PHP_NEW_EXTENSION(uuid, uuid.c, $ext_shared)
+ AC_DEFINE(HAVE_UUID, 1, [Have OSSP uuid library])
+ PHP_ADD_LIBPATH([..], )
+ PHP_ADD_LIBRARY([uuid],, UUID_SHARED_LIBADD)
+ PHP_ADD_INCLUDE([..])
+ PHP_SUBST(UUID_SHARED_LIBADD)
+
+ dnl avoid linking conflict with a potentially existing uuid_create(3) in libc
+ AC_CHECK_FUNC(uuid_create,[
+ SAVE_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
+ AC_TRY_LINK([],[], [EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-Bsymbolic"])
+ LDFLAGS="$SAVE_LDFLAGS"])
+fi
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidphppackagexml"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/php/package.xml (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/php/package.xml         (rev 0)
+++ freeswitch/trunk/libs/uuid/php/package.xml        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<package>
+ <name>uuid</name>
+ <summary>Universally Unique Identifiers (UUID) extension</summary>
+ <description>
+ UUID is a PHP extension for the creation
+ of Universally Unique Identifiers (UUID).
+ </description>
+ <license>MIT-Style License</license>
+ <maintainers>
+ <maintainer>
+ <user>rse</user>
+ <name>Ralf S. Engelschall</name>
+ <email>rse@engelschall.com</email>
+ </maintainer>
+ </maintainers>
+ <release>
+ <version>1.0</version>
+ <date>2003-05-17</date>
+ <state>unstable</state>
+ </release>
+ <configureoptions>
+ <configureoption name="with-uuid" default="autodetect" prompt="path to OSSP uuid?"/>
+ </configureoptions>
+ <filelist>
+ <dir role="src" name="/">
+ <file role="src">Makefile.local</file>
+ <file role="src">config.m4</file>
+ <file role="src">uuid.c</file>
+ <file role="php">uuid.php4</file>
+ <file role="php">uuid.php5</file>
+ <file role="src">uuid.ts</file>
+ </dir>
+ </filelist>
+</package>
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidphpuuidc"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/php/uuid.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/php/uuid.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/php/uuid.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,531 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid.c: PHP/Zend API (language: C)
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "uuid.h"
+#include "php.h"
+#include "ext/standard/info.h"
+
+/* context structure */
+typedef struct {
+ uuid_t *uuid;
+} ctx_t;
+
+/* context implicit destruction */
+static void ctx_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+{
+ ctx_t *ctx = (ctx_t *)rsrc->ptr;
+
+ if (ctx != NULL) {
+ if (ctx->uuid != NULL) {
+ uuid_destroy(ctx->uuid);
+ ctx->uuid = NULL;
+ }
+ free(ctx);
+ }
+ return;
+}
+
+/* context resource identification */
+static int ctx_id; /* internal number */
+#define ctx_name "UUID context" /* external name */
+
+/* module initialization */
+PHP_MINIT_FUNCTION(uuid)
+{
+ /* register resource identifier */
+ ctx_id = zend_register_list_destructors_ex(
+ ctx_destructor, NULL, ctx_name, module_number);
+
+ /* register API constants */
+ REGISTER_LONG_CONSTANT("UUID_VERSION", UUID_VERSION, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_LEN_BIN", UUID_LEN_BIN, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_LEN_STR", UUID_LEN_STR, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_LEN_SIV", UUID_LEN_SIV, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_RC_OK", UUID_RC_OK, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_RC_ARG", UUID_RC_ARG, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_RC_MEM", UUID_RC_MEM, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_RC_SYS", UUID_RC_SYS, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_RC_INT", UUID_RC_INT, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_RC_IMP", UUID_RC_IMP, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_MAKE_V1", UUID_MAKE_V1, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_MAKE_V3", UUID_MAKE_V3, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_MAKE_V4", UUID_MAKE_V4, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_MAKE_V5", UUID_MAKE_V5, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_MAKE_MC", UUID_MAKE_MC, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_FMT_BIN", UUID_FMT_BIN, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_FMT_STR", UUID_FMT_STR, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_FMT_SIV", UUID_FMT_SIV, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("UUID_FMT_TXT", UUID_FMT_TXT, CONST_CS|CONST_PERSISTENT);
+
+ return SUCCESS;
+}
+
+/* module shutdown */
+PHP_MSHUTDOWN_FUNCTION(uuid)
+{
+ return SUCCESS;
+}
+
+/* module information */
+PHP_MINFO_FUNCTION(uuid)
+{
+ char version[32];
+
+ /* provide PHP module information */
+ sprintf(version, "%lx", uuid_version());
+ php_info_print_table_start();
+ php_info_print_table_row(2, "UUID (Universally Unique Identifier) Support", "enabled");
+ php_info_print_table_row(2, "UUID Library Version", version);
+ php_info_print_table_end();
+
+ return;
+}
+
+/* API FUNCTION:
+ proto rc uuid_create(ctx)
+ $rc = uuid_create(&$uuid);
+ create UUID context */
+PHP_FUNCTION(uuid_create)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ uuid_rc_t rc;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &z_ctx) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ if (!PZVAL_IS_REF(z_ctx)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_create: parameter wasn't passed by reference");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ /* perform operation */
+ if ((ctx = (ctx_t *)malloc(sizeof(ctx_t))) == NULL)
+ RETURN_LONG((long)UUID_RC_MEM);
+ if ((rc = uuid_create(&ctx->uuid)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_create: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ ZEND_REGISTER_RESOURCE(z_ctx, ctx, ctx_id);
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_destroy(ctx)
+ $rc = uuid_destroy($uuid);
+ destroy UUID context */
+PHP_FUNCTION(uuid_destroy)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ uuid_rc_t rc;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_ctx) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_destroy: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ /* perform operation */
+ if ((rc = uuid_destroy(ctx->uuid)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_destroy: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ ctx->uuid = NULL;
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_clone(ctx, &ctx2)
+ $rc = uuid_clone($uuid, &$uuid);
+ clone UUID context */
+PHP_FUNCTION(uuid_clone)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ zval *z_clone;
+ ctx_t *clone;
+ uuid_rc_t rc;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &z_ctx, &z_clone) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_clone: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ if (!PZVAL_IS_REF(z_clone)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_clone: clone parameter wasn't passed by reference");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ /* perform operation */
+ if ((clone = (ctx_t *)malloc(sizeof(ctx_t))) == NULL)
+ RETURN_LONG((long)UUID_RC_MEM);
+ if ((rc = uuid_clone(ctx->uuid, &clone->uuid)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_clone: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ ZEND_REGISTER_RESOURCE(z_clone, clone, ctx_id);
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_load(ctx, name)
+ $rc = uuid_name($uuid, $name);
+ load an existing UUID */
+PHP_FUNCTION(uuid_load)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ char *name;
+ size_t name_len;
+ uuid_rc_t rc;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ctx, &name, &name_len) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_load: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ /* perform operation */
+ if ((rc = uuid_load(ctx->uuid, name)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_load: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_make(ctx, mode[, ..., ...])
+ $rc = uuid_make($uuid, $mode[, ..., ...]);
+ make a new UUID */
+PHP_FUNCTION(uuid_make)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ uuid_rc_t rc;
+ long z_mode;
+ unsigned long mode;
+ zval *z_ctx_ns;
+ ctx_t *ctx_ns;
+ char *url;
+ size_t url_len;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|rs", &z_ctx, &z_mode, &z_ctx_ns, &url, &url_len) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_make: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ mode = (unsigned long)z_mode;
+
+ /* perform operation */
+ if (ZEND_NUM_ARGS() == 2 && ((mode & UUID_MAKE_V1) || (mode & UUID_MAKE_V4))) {
+ if ((rc = uuid_make(ctx->uuid, mode)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_make: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ }
+ else if (ZEND_NUM_ARGS() == 4 && ((mode & UUID_MAKE_V3) || (mode & UUID_MAKE_V5))) {
+ ZEND_FETCH_RESOURCE(ctx_ns, ctx_t *, &z_ctx_ns, -1, ctx_name, ctx_id);
+ if (ctx_ns == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_make: invalid namespace context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ if (url == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_make: invalid URL");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ if ((rc = uuid_make(ctx->uuid, mode, ctx_ns->uuid, url)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_make: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ }
+ else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_make: invalid mode");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_isnil(ctx, result)
+ $rc = uuid_isnil($uuid, &$result);
+ compare UUID for being Nil UUID */
+PHP_FUNCTION(uuid_isnil)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ uuid_rc_t rc;
+ zval *z_result;
+ int result;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &z_ctx, &z_result) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_isnil: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ if (!PZVAL_IS_REF(z_result)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_isnil: result parameter wasn't passed by reference");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ /* perform operation */
+ if ((rc = uuid_isnil(ctx->uuid, &result)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_isnil: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ ZVAL_LONG(z_result, (long)result);
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_compare(ctx, ctx2, result)
+ $rc = uuid_compare($uuid, $uuid2, &$result);
+ compare two UUIDs */
+PHP_FUNCTION(uuid_compare)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ zval *z_ctx2;
+ ctx_t *ctx2;
+ uuid_rc_t rc;
+ zval *z_result;
+ int result;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrz", &z_ctx, &z_ctx2, &z_result) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_compare: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ ZEND_FETCH_RESOURCE(ctx2, ctx_t *, &z_ctx2, -1, ctx_name, ctx_id);
+ if (ctx2 == NULL || ctx2->uuid) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_compare: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ if (!PZVAL_IS_REF(z_result)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_compare: result parameter wasn't passed by reference");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ /* perform operation */
+ if ((rc = uuid_compare(ctx->uuid, ctx2->uuid, &result)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_compare: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ ZVAL_LONG(z_result, (long)result);
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_import(ctx, fmt, data)
+ $rc = uuid_import($ctx, $fmt, $data);
+ import UUID from variable */
+PHP_FUNCTION(uuid_import)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ long z_fmt;
+ unsigned long fmt;
+ zval *z_data;
+ uuid_rc_t rc;
+ void *data_ptr;
+ size_t data_len;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rls", &z_ctx, &z_fmt, &data_ptr, &data_len) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_import: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ fmt = (unsigned long)z_fmt;
+
+ /* perform operation */
+ if ((rc = uuid_import(ctx->uuid, fmt, data_ptr, data_len)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_import: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_export(ctx, fmt, data)
+ $rc = uuid_error($ctx, $fmt, &$data);
+ export UUID into variable */
+PHP_FUNCTION(uuid_export)
+{
+ zval *z_ctx;
+ ctx_t *ctx;
+ long z_fmt;
+ unsigned long fmt;
+ zval *z_data;
+ uuid_rc_t rc;
+ void *data_ptr;
+ size_t data_len;
+
+ /* parse parameters */
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlz", &z_ctx, &z_fmt, &z_data) == FAILURE)
+ RETURN_LONG((long)UUID_RC_ARG);
+
+ /* post-process and sanity check parameters */
+ ZEND_FETCH_RESOURCE(ctx, ctx_t *, &z_ctx, -1, ctx_name, ctx_id);
+ if (ctx == NULL || ctx->uuid == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_export: invalid context");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+ fmt = (unsigned long)z_fmt;
+ if (!PZVAL_IS_REF(z_data)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_export: data parameter wasn't passed by reference");
+ RETURN_LONG((long)UUID_RC_ARG);
+ }
+
+ /* perform operation */
+ data_ptr = NULL;
+ data_len = 0;
+ if ((rc = uuid_export(ctx->uuid, fmt, &data_ptr, &data_len)) != UUID_RC_OK) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "uuid_export: %s", uuid_error(rc));
+ RETURN_LONG((long)rc);
+ }
+ if (fmt == UUID_FMT_SIV)
+ data_len = strlen((char *)data_ptr);
+ else if (fmt == UUID_FMT_STR || fmt == UUID_FMT_TXT)
+ data_len--; /* PHP doesn't wish NUL-termination on strings */
+ ZVAL_STRINGL(z_data, data_ptr, data_len, 1);
+ free(data_ptr);
+
+ RETURN_LONG((long)rc);
+}
+
+/* API FUNCTION:
+ proto rc uuid_error(ctx)
+ $error = uuid_error($rc);
+ return error string corresponding to error return code */
+PHP_FUNCTION(uuid_error)
+{
+ int z_rc;
+ uuid_rc_t rc;
+ char *error;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &z_rc) == FAILURE)
+ RETURN_NULL();
+ rc = (uuid_rc_t)z_rc;
+ if ((error = uuid_error(rc)) == NULL)
+ RETURN_NULL();
+ RETURN_STRING(error, 1);
+}
+
+/* API FUNCTION:
+ proto int uuid_version()
+ $version = uuid_version();
+ return library version number */
+PHP_FUNCTION(uuid_version)
+{
+ RETURN_LONG((long)uuid_version());
+}
+
+/* module function table */
+static function_entry uuid_functions[] = {
+ PHP_FE(uuid_create, NULL)
+ PHP_FE(uuid_destroy, NULL)
+ PHP_FE(uuid_clone, NULL)
+ PHP_FE(uuid_load, NULL)
+ PHP_FE(uuid_make, NULL)
+ PHP_FE(uuid_isnil, NULL)
+ PHP_FE(uuid_compare, NULL)
+ PHP_FE(uuid_import, NULL)
+ PHP_FE(uuid_export, NULL)
+ PHP_FE(uuid_error, NULL)
+ PHP_FE(uuid_version, NULL)
+ { NULL, NULL, NULL }
+};
+
+/* module entry table */
+zend_module_entry uuid_module_entry = {
+ STANDARD_MODULE_HEADER,
+ "uuid",
+ uuid_functions,
+ PHP_MINIT(uuid),
+ PHP_MSHUTDOWN(uuid),
+ NULL,
+ NULL,
+ PHP_MINFO(uuid),
+ NO_VERSION_YET,
+ STANDARD_MODULE_PROPERTIES
+};
+
+#ifdef COMPILE_DL_UUID
+ZEND_GET_MODULE(uuid)
+#endif
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidphpuuidphp4"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/php/uuid.php4 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/php/uuid.php4         (rev 0)
+++ freeswitch/trunk/libs/uuid/php/uuid.php4        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,78 @@
</span><ins>+<?php
+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.php: PHP/Zend API (language: php 4.x)
+##
+
+class UUID {
+ var $uuid = null;
+ function UUID() {
+ uuid_create(&$this->uuid);
+ }
+ function clone() {
+ $clone = new UUID;
+ uuid_clone($this->uuid, &$clone->uuid);
+ return $clone;
+ }
+ function load($name) {
+ uuid_load($this->uuid, $name);
+ }
+ function make($fmt, $ns = null, $url = null) {
+ if (func_num_args() == 3) {
+ uuid_make($this->uuid, $fmt, $ns->uuid, $url);
+ }
+ else {
+ uuid_make($this->uuid, $fmt);
+ }
+ }
+ function isnil() {
+ $result = 0;
+ uuid_isnil($this->uuid, &$result);
+ return $result;
+ }
+ function compare($other) {
+ $result = 0;
+ uuid_compare($this->uuid, $other->uuid, &$result);
+ return $result;
+ }
+ function import($fmt, $data) {
+ uuid_import($this->uuid, $fmt, $data);
+ }
+ function export($fmt) {
+ $data = "";
+ uuid_export($this->uuid, $fmt, &$data);
+ return $data;
+ }
+ function error($rc) {
+ return uuid_error($this->uuid, $rc);
+ }
+ function version() {
+ return uuid_version();
+ }
+}
+
+?>
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidphpuuidphp5"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/php/uuid.php5 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/php/uuid.php5         (rev 0)
+++ freeswitch/trunk/libs/uuid/php/uuid.php5        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,81 @@
</span><ins>+<?php
+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.php: PHP/Zend API (language: php 5.x)
+##
+
+class UUID {
+ private $uuid = null;
+ public function __construct() {
+ uuid_create(&$this->uuid);
+ }
+ public function __destruct() {
+ uuid_destroy($this->uuid);
+ }
+ public function __clone() {
+ $uuid = null;
+ uuid_clone($this->uuid, &$uuid);
+ $this->uuid = $uuid;
+ }
+ public function load($name) {
+ uuid_load($this->uuid, $name);
+ }
+ public function make($fmt, $ns = null, $url = null) {
+ if (func_num_args() == 3) {
+ uuid_make($this->uuid, $fmt, $ns->uuid, $url);
+ }
+ else {
+ uuid_make($this->uuid, $fmt);
+ }
+ }
+ public function isnil() {
+ $result = 0;
+ uuid_isnil($this->uuid, &$result);
+ return $result;
+ }
+ public function compare($other) {
+ $result = 0;
+ uuid_compare($this->uuid, $other->uuid, &$result);
+ return $result;
+ }
+ public function import($fmt, $data) {
+ uuid_import($this->uuid, $fmt, $data);
+ }
+ public function export($fmt) {
+ $data = "";
+ uuid_export($this->uuid, $fmt, &$data);
+ return $data;
+ }
+ public function error($rc) {
+ return uuid_error($this->uuid, $rc);
+ }
+ public function version() {
+ return uuid_version();
+ }
+}
+
+?>
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidphpuuidts"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/php/uuid.ts (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/php/uuid.ts         (rev 0)
+++ freeswitch/trunk/libs/uuid/php/uuid.ts        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,161 @@
</span><ins>+<?php
+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.ts: PHP/Zend API test procedure (language: php)
+##
+
+##
+## INITIALIZATION
+##
+
+$php_version = $argv[1];
+
+print "++ loading DSO uuid.so (low-level API)\n";
+if (!extension_loaded('uuid')) {
+ dl('modules/uuid.so');
+}
+
+print "++ loading PHP uuid.php${php_version} (high-level API)\n";
+require "uuid.php${php_version}";
+
+print "++ establishing assertion environment\n";
+assert_options(ASSERT_ACTIVE, 1);
+assert_options(ASSERT_WARNING, 0);
+assert_options(ASSERT_QUIET_EVAL, 1);
+function my_assert_handler($file, $line, $code)
+{
+ echo "ASSERTION FAILED: $file: $line: $code\n";
+ exit(1);
+}
+assert_options(ASSERT_CALLBACK, 'my_assert_handler');
+
+##
+## LOW-LEVEL API TESTING
+##
+
+print "++ testing low-level C-style API:\n";
+
+$uuid = 42;
+$rc = uuid_create(&$uuid);
+assert('$rc == 0');
+assert('$uuid != 42');
+
+$rc = uuid_make($uuid, UUID_MAKE_V1);
+assert('$rc == 0');
+
+$str = "foo";
+$rc = uuid_export($uuid, UUID_FMT_STR, &$str);
+assert('$rc == 0');
+assert('$str != "foo"');
+print "UUID: $str\n";
+
+$uuid_ns = 42;
+$rc = uuid_create(&$uuid_ns);
+assert('$rc == 0');
+
+$rc = uuid_load($uuid_ns, "ns:URL");
+assert('$rc == 0');
+
+$rc = uuid_make($uuid, UUID_MAKE_V3, $uuid_ns, "http://www.ossp.org/");
+assert('$rc == 0');
+
+$str = "bar";
+$rc = uuid_export($uuid, UUID_FMT_STR, &$str);
+assert('$rc == 0');
+assert('$str != "bar"');
+#assert('$str == "02d9e6d5-9467-382e-8f9b-9300a64ac3cd"');
+print "UUID: $str\n";
+
+$rc = uuid_destroy($uuid);
+assert('$rc == 0');
+
+$rc = uuid_create(&$uuid);
+assert('$rc == 0');
+
+$rc = uuid_import($uuid, UUID_FMT_STR, $str);
+assert('$rc == 0');
+
+$str = "baz";
+$rc = uuid_export($uuid, UUID_FMT_STR, &$str);
+assert('$rc == 0');
+assert('$str != "baz"');
+#assert('$str == "02d9e6d5-9467-382e-8f9b-9300a64ac3cd"');
+print "UUID: $str\n";
+
+$clone = null;
+$rc = uuid_clone($uuid, &$clone);
+assert('$rc == 0');
+assert('$clone != null');
+
+$rc = uuid_destroy($uuid);
+assert('$rc == 0');
+
+$str = "quux";
+$rc = uuid_export($clone, UUID_FMT_STR, &$str);
+assert('$rc == 0');
+assert('$str != "quux"');
+#assert('$str == "02d9e6d5-9467-382e-8f9b-9300a64ac3cd"');
+print "UUID: $str\n";
+
+##
+## HIGH-LEVEL API TESTING
+##
+
+print "++ testing high-level OO-style API:\n";
+
+$uuid = new UUID;
+$uuid->make(UUID_MAKE_V1);
+$str = $uuid->export(UUID_FMT_STR);
+print "UUID: $str\n";
+
+$uuid_ns = new UUID;
+$uuid_ns->load("ns:URL");
+$uuid->make(UUID_MAKE_V3, $uuid_ns, "http://www.ossp.org/");
+$str = $uuid->export(UUID_FMT_STR);
+print "UUID: $str\n";
+$uuid = null;
+$uuid_ns = null;
+
+$uuid = new UUID;
+$uuid->import(UUID_FMT_STR, $str);
+$str = $uuid->export(UUID_FMT_STR);
+print "UUID: $str\n";
+
+if ($php_version == 4) {
+ eval('$clone = $uuid->clone();');
+}
+else {
+ eval('$clone = clone $uuid;');
+}
+$uuid = null;
+
+$str = $clone->export(UUID_FMT_STR);
+print "UUID: $str\n";
+
+$clone = null;
+
+?>
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuidshtool"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/shtool (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/shtool         (rev 0)
+++ freeswitch/trunk/libs/uuid/shtool        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,4007 @@
</span><ins>+#!/bin/sh
+##
+## GNU shtool -- The GNU Portable Shell Tool
+## Copyright (c) 1994-2007 Ralf S. Engelschall <rse@engelschall.com>
+##
+## See http://www.gnu.org/software/shtool/ for more information.
+## See ftp://ftp.gnu.org/gnu/shtool/ for latest version.
+##
+## Version: 2.0.7 (19-May-2007)
+## Contents: all available modules
+##
+
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+## USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
+##
+## NOTICE: Given that you include this file verbatim into your own
+## source tree, you are justified in saying that it remains separate
+## from your package, and that this way you are simply just using GNU
+## shtool. So, in this situation, there is no requirement that your
+## package itself is licensed under the GNU General Public License in
+## order to take advantage of GNU shtool.
+##
+
+##
+## Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]
+##
+## Available commands:
+## echo Print string with optional construct expansion
+## mdate Pretty-print modification time of a file or dir
+## table Pretty-print a field-separated list as a table
+## prop Display progress with a running propeller
+## move Move files with simultaneous substitution
+## install Install a program, script or datafile
+## mkdir Make one or more directories
+## mkln Make link with calculation of relative paths
+## mkshadow Make a shadow tree through symbolic links
+## fixperm Fix file permissions inside a source tree
+## rotate Logfile rotation
+## tarball Roll distribution tarballs
+## subst Apply sed(1) substitution operations
+## platform Platform Identification Utility
+## arx Extended archive command
+## slo Separate linker options by library class
+## scpp Sharing C Pre-Processor
+## version Maintain a version information file
+## path Deal with program paths
+##
+
+# maximum Bourne-Shell compatibility
+if [ ".$ZSH_VERSION" != . ] && (emulate sh) >/dev/null 2>&1; then
+ # reconfigure zsh(1)
+ emulate sh
+ NULLCMD=:
+ alias -g '${1+"$@"}'='"$@"'
+elif [ ".$BASH_VERSION" != . ] && (set -o posix) >/dev/null 2>&1; then
+ # reconfigure bash(1)
+ set -o posix
+fi
+
+# maximum independence of NLS nuisances
+for var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $var=C; export $var) 2>&1`"); then
+ eval $var=C; export $var
+ else
+ unset $var
+ fi
+done
+
+# initial command line handling
+if [ $# -eq 0 ]; then
+ echo "$0:Error: invalid command line" 1>&2
+ echo "$0:Hint: run \`$0 -h' for usage" 1>&2
+ exit 1
+fi
+if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then
+ echo "This is GNU shtool, version 2.0.7 (19-May-2007)"
+ echo 'Copyright (c) 1994-2007 Ralf S. Engelschall <rse@engelschall.com>'
+ echo 'Report bugs to <bug-shtool@gnu.org>'
+ echo ''
+ echo 'Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]'
+ echo ''
+ echo 'Available global <options>:'
+ echo ' -v, --version display shtool version information'
+ echo ' -h, --help display shtool usage help page (this one)'
+ echo ' -d, --debug display shell trace information'
+ echo ' -r, --recreate recreate this shtool script via shtoolize'
+ echo ''
+ echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:'
+ echo ' echo [-n|--newline] [-e|--expand] [<string> ...]'
+ echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]'
+ echo ' [-f|--field-sep <str>] [-o|--order <spec>] <path>'
+ echo ' table [-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns'
+ echo ' <cols>] [-s|--strip <strip>] <str><sep><str>...'
+ echo ' prop [-p|--prefix <str>]'
+ echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]'
+ echo ' <src-file> <dst-file>'
+ echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]'
+ echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>]'
+ echo ' [-o|--owner <owner>] [-g|--group <group>] [-e|--exec'
+ echo ' <sed-cmd>] <file> [<file> ...] <path>'
+ echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode'
+ echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir>'
+ echo ' [<dir> ...]'
+ echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] <src-path>'
+ echo ' [<src-path> ...] <dst-path>'
+ echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>'
+ echo ' fixperm [-v|--verbose] [-t|--trace] <path> [<path> ...]'
+ echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files'
+ echo ' <count>] [-s|--size <size>] [-c|--copy] [-r|--remove]'
+ echo ' [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>]'
+ echo ' [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode'
+ echo ' <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate'
+ echo ' <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]'
+ echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output <tarball>]'
+ echo ' [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user'
+ echo ' <user>] [-g|--group <group>] [-e|--exclude <pattern>]'
+ echo ' <path> [<path> ...]'
+ echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]'
+ echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup'
+ echo ' <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>]'
+ echo ' [...]'
+ echo ' platform [-F|--format <format>] [-S|--sep <string>] [-C|--conc'
+ echo ' <string>] [-L|--lower] [-U|--upper] [-v|--verbose]'
+ echo ' [-c|--concise] [-n|--no-newline] [-t|--type <type>]'
+ echo ' [-V|--version] [-h|--help]'
+ echo ' arx [-t|--trace] [-C|--command <cmd>] <op> <archive> [<file>'
+ echo ' ...]'
+ echo ' slo [-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib>'
+ echo ' ...]'
+ echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter <filter>]'
+ echo ' [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark'
+ echo ' <mark>] [-D|--define <dname>] [-C|--class <cname>]'
+ echo ' <file> [<file> ...]'
+ echo ' version [-l|--language <lang>] [-n|--name <name>] [-p|--prefix'
+ echo ' <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase'
+ echo ' <knob>] [-d|--display <type>] <file>'
+ echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]'
+ echo ' [-m|--magic] [-p|--path <path>] <str> [<str> ...]'
+ echo ''
+ exit 0
+fi
+if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then
+ echo "GNU shtool 2.0.7 (19-May-2007)"
+ exit 0
+fi
+if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then
+ shtoolize -oshtool all
+ exit 0
+fi
+if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then
+ shift
+ set -x
+fi
+name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'`
+case "$name" in
+ echo|mdate|table|prop|move|install|mkdir|mkln|mkshadow|fixperm|rotate|tarball|subst|platform|arx|slo|scpp|version|path )
+ # implicit tool command selection
+ tool="$name"
+ ;;
+ * )
+ # explicit tool command selection
+ tool="$1"
+ shift
+ ;;
+esac
+arg_spec=""
+opt_spec=""
+gen_tmpfile=no
+
+##
+## DISPATCH INTO SCRIPT PROLOG
+##
+
+case $tool in
+ echo )
+ str_tool="echo"
+ str_usage="[-n|--newline] [-e|--expand] [<string> ...]"
+ arg_spec="0+"
+ opt_spec="n.e."
+ opt_alias="n:newline,e:expand"
+ opt_n=no
+ opt_e=no
+ ;;
+ mdate )
+ str_tool="mdate"
+ str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep <str>] [-o|--order <spec>] <path>"
+ arg_spec="1="
+ opt_spec="n.z.s.d.f:o:"
+ opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order"
+ opt_n=no
+ opt_z=no
+ opt_s=no
+ opt_d=no
+ opt_f=" "
+ opt_o="dmy"
+ ;;
+ table )
+ str_tool="table"
+ str_usage="[-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns <cols>] [-s|--strip <strip>] <str><sep><str>..."
+ arg_spec="1+"
+ opt_spec="F:w:c:s:"
+ opt_alias="F:field-sep,w:width,c:columns,s:strip"
+ opt_F=":"
+ opt_w=15
+ opt_c=3
+ opt_s=79
+ ;;
+ prop )
+ str_tool="prop"
+ str_usage="[-p|--prefix <str>]"
+ arg_spec="0="
+ opt_spec="p:"
+ opt_alias="p:prefix"
+ opt_p=""
+ ;;
+ move )
+ str_tool="move"
+ str_usage="[-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve] <src-file> <dst-file>"
+ arg_spec="2="
+ opt_spec="v.t.e.p."
+ opt_alias="v:verbose,t:trace,e:expand,p:preserve"
+ opt_v=no
+ opt_t=no
+ opt_e=no
+ opt_p=no
+ ;;
+ install )
+ str_tool="install"
+ str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] [-e|--exec <sed-cmd>] <file> [<file> ...] <path>"
+ arg_spec="1+"
+ opt_spec="v.t.d.c.C.s.m:o:g:e+"
+ opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec"
+ opt_v=no
+ opt_t=no
+ opt_d=no
+ opt_c=no
+ opt_C=no
+ opt_s=no
+ opt_m="0755"
+ opt_o=""
+ opt_g=""
+ opt_e=""
+ ;;
+ mkdir )
+ str_tool="mkdir"
+ str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir> [<dir> ...]"
+ arg_spec="1+"
+ opt_spec="t.f.p.m:o:g:"
+ opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group"
+ opt_t=no
+ opt_f=no
+ opt_p=no
+ opt_m=""
+ opt_o=""
+ opt_g=""
+ ;;
+ mkln )
+ str_tool="mkln"
+ str_usage="[-t|--trace] [-f|--force] [-s|--symbolic] <src-path> [<src-path> ...] <dst-path>"
+ arg_spec="2+"
+ opt_spec="t.f.s."
+ opt_alias="t:trace,f:force,s:symbolic"
+ opt_t=no
+ opt_f=no
+ opt_s=no
+ ;;
+ mkshadow )
+ str_tool="mkshadow"
+ str_usage="[-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>"
+ arg_spec="2="
+ opt_spec="v.t.a."
+ opt_alias="v:verbose,t:trace,a:all"
+ opt_v=no
+ opt_t=no
+ opt_a=no
+ ;;
+ fixperm )
+ str_tool="fixperm"
+ str_usage="[-v|--verbose] [-t|--trace] <path> [<path> ...]"
+ arg_spec="1+"
+ opt_spec="v.t."
+ opt_alias="v:verbose,t:trace"
+ opt_v=no
+ opt_t=no
+ ;;
+ rotate )
+ str_tool="rotate"
+ str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files <count>] [-s|--size <size>] [-c|--copy] [-r|--remove] [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>] [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]"
+ arg_spec="1+"
+ opt_spec="v.t.f.n:s:c.r.a:z:b.d.p:o:g:m:M:P:E:"
+ opt_alias="v:verbose,t:trace,f:force,n:num-files,s:size,c:copy,r:remove,a:archive-dir,z:compress,b:background,d:delay,p:pad,o:owner,g:group,m:mode,M:migrate,P:prolog,E:epilog"
+ opt_v=no
+ opt_t=no
+ opt_f=no
+ opt_n=10
+ opt_s=""
+ opt_c=no
+ opt_r=no
+ opt_a=""
+ opt_z=""
+ opt_b=no
+ opt_d=no
+ opt_p=1
+ opt_o=""
+ opt_g=""
+ opt_m=""
+ opt_M=""
+ opt_P=""
+ opt_E=""
+ ;;
+ tarball )
+ str_tool="tarball"
+ str_usage="[-t|--trace] [-v|--verbose] [-o|--output <tarball>] [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user <user>] [-g|--group <group>] [-e|--exclude <pattern>] <path> [<path> ...]"
+ gen_tmpfile=yes
+ arg_spec="1+"
+ opt_spec="t.v.o:c:d:u:g:e:"
+ opt_alias="t:trace,v:verbose,o:output,c:compress,d:directory,u:user,g:group,e:exclude"
+ opt_t=no
+ opt_v=no
+ opt_o=""
+ opt_c=""
+ opt_d=""
+ opt_u=""
+ opt_g=""
+ opt_e="CVS,\\.cvsignore,\\.svn,\\.[oa]\$"
+ ;;
+ subst )
+ str_tool="subst"
+ str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning] [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>] [...]"
+ gen_tmpfile=yes
+ arg_spec="0+"
+ opt_spec="v.t.n.w.q.s.i.b:e+f:"
+ opt_alias="v:verbose,t:trace,n:nop,w:warning,q:quiet,s:stealth,i:interactive,b:backup,e:exec,f:file"
+ opt_v=no
+ opt_t=no
+ opt_n=no
+ opt_w=no
+ opt_q=no
+ opt_s=no
+ opt_i=no
+ opt_b=""
+ opt_e=""
+ opt_f=""
+ ;;
+ platform )
+ str_tool="platform"
+ str_usage="[-F|--format <format>] [-S|--sep <string>] [-C|--conc <string>] [-L|--lower] [-U|--upper] [-v|--verbose] [-c|--concise] [-n|--no-newline] [-t|--type <type>] [-V|--version] [-h|--help]"
+ arg_spec="0="
+ opt_spec="F:S:C:L.U.v.c.n.t:d.V.h."
+ opt_alias="F:format,S:sep,C:conc,L:lower,U:upper,v:verbose,c:consise,t:type,n:no-newline,V:version,h:help"
+ opt_F="%{sp} (%{ap})"
+ opt_S=" "
+ opt_C="/"
+ opt_L=no
+ opt_U=no
+ opt_t=""
+ opt_v=no
+ opt_c=no
+ opt_n=no
+ opt_V=no
+ opt_h=no
+ ;;
+ arx )
+ str_tool="arx"
+ str_usage="[-t|--trace] [-C|--command <cmd>] <op> <archive> [<file> ...]"
+ arg_spec="2+"
+ opt_spec="t.C:"
+ opt_alias="t:trace,C:command"
+ opt_t=no
+ opt_C="ar"
+ ;;
+ slo )
+ str_tool="slo"
+ str_usage="[-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib> ...]"
+ arg_spec="1+"
+ opt_spec="p:"
+ opt_alias="p:prefix"
+ opt_p="SLO_"
+ ;;
+ scpp )
+ str_tool="scpp"
+ str_usage="[-v|--verbose] [-p|--preserve] [-f|--filter <filter>] [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark <mark>] [-D|--define <dname>] [-C|--class <cname>] <file> [<file> ...]"
+ gen_tmpfile=yes
+ arg_spec="1+"
+ opt_spec="v.p.f+o:t:M:D:C:"
+ opt_alias="v:verbose,p:preserve,f:filter,o:output,t:template,M:mark,D:define,C:class"
+ opt_v=no
+ opt_p=no
+ opt_f=""
+ opt_o="lib.h"
+ opt_t="lib.h.in"
+ opt_M="%%MARK%%"
+ opt_D="cpp"
+ opt_C="intern"
+ ;;
+ version )
+ str_tool="version"
+ str_usage="[-l|--language <lang>] [-n|--name <name>] [-p|--prefix <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase <knob>] [-d|--display <type>] <file>"
+ arg_spec="1="
+ opt_spec="l:n:p:s:i:e.d:"
+ opt_alias="l:language,n:name,p:prefix,s:set,e:edit,i:increase,d:display"
+ opt_l="txt"
+ opt_n="unknown"
+ opt_p=""
+ opt_s=""
+ opt_e="no"
+ opt_i=""
+ opt_d="short"
+ ;;
+ path )
+ str_tool="path"
+ str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path <path>] <str> [<str> ...]"
+ gen_tmpfile=yes
+ arg_spec="1+"
+ opt_spec="s.r.d.b.m.p:"
+ opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path"
+ opt_s=no
+ opt_r=no
+ opt_d=no
+ opt_b=no
+ opt_m=no
+ opt_p="$PATH"
+ ;;
+ -* )
+ echo "$0:Error: unknown option \`$tool'" 2>&1
+ echo "$0:Hint: run \`$0 -h' for usage" 2>&1
+ exit 1
+ ;;
+ * )
+ echo "$0:Error: unknown command \`$tool'" 2>&1
+ echo "$0:Hint: run \`$0 -h' for usage" 2>&1
+ exit 1
+ ;;
+esac
+
+##
+## COMMON UTILITY CODE
+##
+
+# commonly used ASCII values
+ASC_TAB="        "
+ASC_NL="
+"
+
+# determine name of tool
+if [ ".$tool" != . ]; then
+ # used inside shtool script
+ toolcmd="$0 $tool"
+ toolcmdhelp="shtool $tool"
+ msgprefix="shtool:$tool"
+else
+ # used as standalone script
+ toolcmd="$0"
+ toolcmdhelp="sh $0"
+ msgprefix="$str_tool"
+fi
+
+# parse argument specification string
+eval `echo $arg_spec |\
+ sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
+
+# parse option specification string
+eval `echo h.$opt_spec |\
+ sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
+
+# parse option alias string
+eval `echo h:help,$opt_alias |\
+ sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'`
+
+# interate over argument line
+opt_PREV=''
+while [ $# -gt 0 ]; do
+ # special option stops processing
+ if [ ".$1" = ".--" ]; then
+ shift
+ break
+ fi
+
+ # determine option and argument
+ opt_ARG_OK=no
+ if [ ".$opt_PREV" != . ]; then
+ # merge previous seen option with argument
+ opt_OPT="$opt_PREV"
+ opt_ARG="$1"
+ opt_ARG_OK=yes
+ opt_PREV=''
+ else
+ # split argument into option and argument
+ case "$1" in
+ --[a-zA-Z0-9]*=*)
+ eval `echo "x$1" |\
+ sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'`
+ opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
+ eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
+ ;;
+ --[a-zA-Z0-9]*)
+ opt_OPT=`echo "x$1" | cut -c4-`
+ opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
+ eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
+ opt_ARG=''
+ ;;
+ -[a-zA-Z0-9]*)
+ eval `echo "x$1" |\
+ sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
+ -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
+ ;;
+ -[a-zA-Z0-9])
+ opt_OPT=`echo "x$1" | cut -c3-`
+ opt_ARG=''
+ ;;
+ *)
+ break
+ ;;
+ esac
+ fi
+
+ # eat up option
+ shift
+
+ # determine whether option needs an argument
+ eval "opt_MODE=\$opt_MODE_${opt_OPT}"
+ if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then
+ if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then
+ opt_PREV="$opt_OPT"
+ continue
+ fi
+ fi
+
+ # process option
+ case $opt_MODE in
+ '.' )
+ # boolean option
+ eval "opt_${opt_OPT}=yes"
+ ;;
+ ':' )
+ # option with argument (multiple occurances override)
+ eval "opt_${opt_OPT}=\"\$opt_ARG\""
+ ;;
+ '+' )
+ # option with argument (multiple occurances append)
+ eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\""
+ ;;
+ * )
+ echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2
+ echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
+ exit 1
+ ;;
+ esac
+done
+if [ ".$opt_PREV" != . ]; then
+ echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2
+ echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
+ exit 1
+fi
+
+# process help option
+if [ ".$opt_h" = .yes ]; then
+ echo "Usage: $toolcmdhelp $str_usage"
+ exit 0
+fi
+
+# complain about incorrect number of arguments
+case $arg_MODE in
+ '=' )
+ if [ $# -ne $arg_NUMS ]; then
+ echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
+ echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2
+ exit 1
+ fi
+ ;;
+ '+' )
+ if [ $# -lt $arg_NUMS ]; then
+ echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
+ echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2
+ exit 1
+ fi
+ ;;
+esac
+
+# establish a temporary file on request
+if [ ".$gen_tmpfile" = .yes ]; then
+ # create (explicitly) secure temporary directory
+ if [ ".$TMPDIR" != . ]; then
+ tmpdir="$TMPDIR"
+ elif [ ".$TEMPDIR" != . ]; then
+ tmpdir="$TEMPDIR"
+ else
+ tmpdir="/tmp"
+ fi
+ tmpdir="$tmpdir/.shtool.$$"
+ ( umask 077
+ rm -rf "$tmpdir" >/dev/null 2>&1 || true
+ mkdir "$tmpdir" >/dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2
+ exit 1
+ fi
+ )
+
+ # create (implicitly) secure temporary file
+ tmpfile="$tmpdir/shtool.tmp"
+ touch "$tmpfile"
+fi
+
+# utility function: map string to lower case
+util_lower () {
+ echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'
+}
+
+# utility function: map string to upper case
+util_upper () {
+ echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+}
+
+# cleanup procedure
+shtool_exit () {
+ rc="$1"
+ if [ ".$gen_tmpfile" = .yes ]; then
+ rm -rf "$tmpdir" >/dev/null 2>&1 || true
+ fi
+ exit $rc
+}
+
+##
+## DISPATCH INTO SCRIPT BODY
+##
+
+case $tool in
+
+echo )
+ ##
+ ## echo -- Print string with optional construct expansion
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ text="$*"
+
+ # check for broken escape sequence expansion
+ seo=''
+ bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`
+ if [ ".$bytes" != .3 ]; then
+ bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`
+ if [ ".$bytes" = .3 ]; then
+ seo='-E'
+ fi
+ fi
+
+ # check for existing -n option (to suppress newline)
+ minusn=''
+ bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'`
+ if [ ".$bytes" = .3 ]; then
+ minusn='-n'
+ fi
+
+ # determine terminal bold sequence
+ term_bold=''
+ term_norm=''
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then
+ case $TERM in
+ # for the most important terminal types we directly know the sequences
+ xterm|xterm*|vt220|vt220*)
+ term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null`
+ term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null`
+ ;;
+ vt100|vt100*|cygwin)
+ term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null`
+ term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null`
+ ;;
+ # for all others, we try to use a possibly existing `tput' or `tcout' utility
+ * )
+ paths=`echo $PATH | sed -e 's/:/ /g'`
+ for tool in tput tcout; do
+ for dir in $paths; do
+ if [ -r "$dir/$tool" ]; then
+ for seq in bold md smso; do # 'smso' is last
+ bold="`$dir/$tool $seq 2>/dev/null`"
+ if [ ".$bold" != . ]; then
+ term_bold="$bold"
+ break
+ fi
+ done
+ if [ ".$term_bold" != . ]; then
+ for seq in sgr0 me rmso init reset; do # 'reset' is last
+ norm="`$dir/$tool $seq 2>/dev/null`"
+ if [ ".$norm" != . ]; then
+ term_norm="$norm"
+ break
+ fi
+ done
+ fi
+ break
+ fi
+ done
+ if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then
+ break;
+ fi
+ done
+ ;;
+ esac
+ if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then
+ echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2
+ term_bold=''
+ term_norm=''
+ fi
+ fi
+
+ # determine user name
+ username=''
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then
+ username="`(id -un) 2>/dev/null`"
+ if [ ".$username" = . ]; then
+ str="`(id) 2>/dev/null`"
+ if [ ".`echo $str | grep '^uid[         ]*=[         ]*[0-9]*('`" != . ]; then
+ username=`echo $str | sed -e 's/^uid[         ]*=[         ]*[0-9]*(//' -e 's/).*$//'`
+ fi
+ if [ ".$username" = . ]; then
+ username="$LOGNAME"
+ if [ ".$username" = . ]; then
+ username="$USER"
+ if [ ".$username" = . ]; then
+ username="`(whoami) 2>/dev/null |\
+ awk '{ printf("%s", $1); }'`"
+ if [ ".$username" = . ]; then
+ username="`(who am i) 2>/dev/null |\
+ awk '{ printf("%s", $1); }'`"
+ if [ ".$username" = . ]; then
+ username='unknown'
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # determine user id
+ userid=''
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then
+ userid="`(id -u) 2>/dev/null`"
+ if [ ".$userid" = . ]; then
+ userid="`(id -u ${username}) 2>/dev/null`"
+ if [ ".$userid" = . ]; then
+ str="`(id) 2>/dev/null`"
+ if [ ".`echo $str | grep '^uid[         ]*=[         ]*[0-9]*('`" != . ]; then
+ userid=`echo $str | sed -e 's/^uid[         ]*=[         ]*//' -e 's/(.*$//'`
+ fi
+ if [ ".$userid" = . ]; then
+ userid=`(getent passwd ${username}) 2>/dev/null | \
+ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$userid" = . ]; then
+ userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \
+ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$userid" = . ]; then
+ userid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \
+ sed -e 'q' | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$userid" = . ]; then
+ userid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \
+ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$userid" = . ]; then
+ userid='?'
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # determine (primary) group id
+ groupid=''
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then
+ groupid="`(id -g ${username}) 2>/dev/null`"
+ if [ ".$groupid" = . ]; then
+ str="`(id) 2>/dev/null`"
+ if [ ".`echo $str | grep 'gid[         ]*=[         ]*[0-9]*('`" != . ]; then
+ groupid=`echo $str | sed -e 's/^.*gid[         ]*=[         ]*//' -e 's/(.*$//'`
+ fi
+ if [ ".$groupid" = . ]; then
+ groupid=`(getent passwd ${username}) 2>/dev/null | \
+ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$groupid" = . ]; then
+ groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \
+ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$groupid" = . ]; then
+ groupid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \
+ sed -e 'q' | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$groupid" = . ]; then
+ groupid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \
+ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
+ if [ ".$groupid" = . ]; then
+ groupid='?'
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # determine (primary) group name
+ groupname=''
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then
+ groupname="`(id -gn ${username}) 2>/dev/null`"
+ if [ ".$groupname" = . ]; then
+ str="`(id) 2>/dev/null`"
+ if [ ".`echo $str | grep 'gid[         ]*=[         ]*[0-9]*('`" != . ]; then
+ groupname=`echo $str | sed -e 's/^.*gid[         ]*=[         ]*[0-9]*(//' -e 's/).*$//'`
+ fi
+ if [ ".$groupname" = . ]; then
+ groupname=`(getent group) 2>/dev/null | \
+ grep "^[^:]*:[^:]*:${groupid}:" | \
+ sed -e 's/:.*$//'`
+ if [ ".$groupname" = . ]; then
+ groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \
+ sed -e 's/:.*$//'`
+ if [ ".$groupname" = . ]; then
+ groupname=`(ypcat group; niscat group) 2>/dev/null | \
+ sed -e 'q' | grep "^[^:]*:[^:]*:${groupid}:" | \
+ sed -e 's/:.*$//'`
+ if [ ".$groupname" = . ]; then
+ groupname=`(nidump group .) 2>/dev/null | \
+ grep "^[^:]*:[^:]*:${groupid}:" | \
+ sed -e 's/:.*$//'`
+ if [ ".$groupname" = . ]; then
+ groupname='?'
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+
+ # determine host and domain name
+ hostname=''
+ domainname=''
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then
+ hostname="`(uname -n) 2>/dev/null |\
+ awk '{ printf("%s", $1); }'`"
+ if [ ".$hostname" = . ]; then
+ hostname="`(hostname) 2>/dev/null |\
+ awk '{ printf("%s", $1); }'`"
+ if [ ".$hostname" = . ]; then
+ hostname='unknown'
+ fi
+ fi
+ case $hostname in
+ *.* )
+ domainname=".`echo $hostname | cut -d. -f2-`"
+ hostname="`echo $hostname | cut -d. -f1`"
+ ;;
+ esac
+ fi
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then
+ if [ ".$domainname" = . ]; then
+ if [ -f /etc/resolv.conf ]; then
+ domainname="`grep '^[         ]*domain' /etc/resolv.conf | sed -e 'q' |\
+ sed -e 's/.*domain//' \
+ -e 's/^[         ]*//' -e 's/^ *//' -e 's/^        *//' \
+ -e 's/^\.//' -e 's/^/./' |\
+ awk '{ printf("%s", $1); }'`"
+ if [ ".$domainname" = . ]; then
+ domainname="`grep '^[         ]*search' /etc/resolv.conf | sed -e 'q' |\
+ sed -e 's/.*search//' \
+ -e 's/^[         ]*//' -e 's/^ *//' -e 's/^        *//' \
+ -e 's/ .*//' -e 's/        .*//' \
+ -e 's/^\.//' -e 's/^/./' |\
+ awk '{ printf("%s", $1); }'`"
+ fi
+ fi
+ fi
+ fi
+
+ # determine current time
+ time_day=''
+ time_month=''
+ time_year=''
+ time_monthname=''
+ if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then
+ time_day=`date '+%d'`
+ time_month=`date '+%m'`
+ time_year=`date '+%Y' 2>/dev/null`
+ if [ ".$time_year" = . ]; then
+ time_year=`date '+%y'`
+ case $time_year in
+ [5-9][0-9]) time_year="19$time_year" ;;
+ [0-4][0-9]) time_year="20$time_year" ;;
+ esac
+ fi
+ case $time_month in
+ 1|01) time_monthname='Jan' ;;
+ 2|02) time_monthname='Feb' ;;
+ 3|03) time_monthname='Mar' ;;
+ 4|04) time_monthname='Apr' ;;
+ 5|05) time_monthname='May' ;;
+ 6|06) time_monthname='Jun' ;;
+ 7|07) time_monthname='Jul' ;;
+ 8|08) time_monthname='Aug' ;;
+ 9|09) time_monthname='Sep' ;;
+ 10) time_monthname='Oct' ;;
+ 11) time_monthname='Nov' ;;
+ 12) time_monthname='Dec' ;;
+ esac
+ fi
+
+ # expand special ``%x'' constructs
+ if [ ".$opt_e" = .yes ]; then
+ text=`echo $seo "$text" |\
+ sed -e "s/%B/${term_bold}/g" \
+ -e "s/%b/${term_norm}/g" \
+ -e "s/%u/${username}/g" \
+ -e "s/%U/${userid}/g" \
+ -e "s/%g/${groupname}/g" \
+ -e "s/%G/${groupid}/g" \
+ -e "s/%h/${hostname}/g" \
+ -e "s/%d/${domainname}/g" \
+ -e "s/%D/${time_day}/g" \
+ -e "s/%M/${time_month}/g" \
+ -e "s/%Y/${time_year}/g" \
+ -e "s/%m/${time_monthname}/g" 2>/dev/null`
+ fi
+
+ # create output
+ if [ .$opt_n = .no ]; then
+ echo $seo "$text"
+ else
+ # the harder part: echo -n is best, because
+ # awk may complain about some \xx sequences.
+ if [ ".$minusn" != . ]; then
+ echo $seo $minusn "$text"
+ else
+ echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text"
+ fi
+ fi
+
+ shtool_exit 0
+ ;;
+
+mdate )
+ ##
+ ## mdate -- Pretty-print modification time of a file or dir
+ ## Copyright (c) 1995-1997 Free Software Foundation, Inc.
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ fod="$1"
+ case "$opt_o" in
+ [dmy][dmy][dmy] )
+ ;;
+ * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2
+ shtool_exit 1
+ ;;
+ esac
+ if [ ! -r "$fod" ]; then
+ echo "$msgprefix:Error: file or directory not found: $fod" 1>&2
+ shtool_exit 1
+ fi
+
+ # GNU ls changes its time format in response to the TIME_STYLE
+ # variable. Since we cannot assume "unset" works, revert this
+ # variable to its documented default.
+ if [ ".$TIME_STYLE" != . ]; then
+ TIME_STYLE=posix-long-iso
+ export TIME_STYLE
+ fi
+
+ # get the extended ls output of the file or directory.
+ if /bin/ls -L /dev/null >/dev/null 2>&1; then
+ set - x`/bin/ls -L -l -d $fod`
+ else
+ set - x`/bin/ls -l -d $fod`
+ fi
+
+ # The month is at least the fourth argument
+ # (3 shifts here, the next inside the loop).
+ shift; shift; shift
+
+ # Find the month. Next argument is day, followed by the year or time.
+ month=""
+ while [ ".$month" = . ]; do
+ shift
+ case $1 in
+ Jan) month=January; nummonth=1 ;;
+ Feb) month=February; nummonth=2 ;;
+ Mar) month=March; nummonth=3 ;;
+ Apr) month=April; nummonth=4 ;;
+ May) month=May; nummonth=5 ;;
+ Jun) month=June; nummonth=6 ;;
+ Jul) month=July; nummonth=7 ;;
+ Aug) month=August; nummonth=8 ;;
+ Sep) month=September; nummonth=9 ;;
+ Oct) month=October; nummonth=10 ;;
+ Nov) month=November; nummonth=11 ;;
+ Dec) month=December; nummonth=12 ;;
+ esac
+ done
+ day="$2"
+ year="$3"
+
+ # We finally have to deal with the problem that the "ls" output
+ # gives either the time of the day or the year.
+ case $year in
+ *:*)
+ this_year=`date '+%Y' 2>/dev/null`
+ if [ ".$this_year" = . ]; then
+ this_year=`date '+%y'`
+ case $this_year in
+ [5-9][0-9]) this_year="19$this_year" ;;
+ [0-4][0-9]) this_year="20$this_year" ;;
+ esac
+ fi
+ # for the following months of the last year the time notation
+ # is usually also used for files modified in the last year.
+ this_month=`date '+%m'`
+ if (expr $nummonth \> $this_month) >/dev/null; then
+ this_year=`expr $this_year - 1`
+ fi
+ year="$this_year"
+ ;;
+ esac
+
+ # Optionally fill day and month with leeding zeros
+ if [ ".$opt_z" = .yes ]; then
+ case $day in
+ [0-9][0-9] ) ;;
+ [0-9] ) day="0$day" ;;
+ esac
+ case $nummonth in
+ [0-9][0-9] ) ;;
+ [0-9] ) nummonth="0$nummonth" ;;
+ esac
+ fi
+
+ # Optionally use digits for month
+ if [ ".$opt_d" = .yes ]; then
+ month="$nummonth"
+ fi
+
+ # Optionally shorten the month name to three characters
+ if [ ".$opt_s" = .yes ]; then
+ month=`echo $month | cut -c1-3`
+ fi
+
+ # Output the resulting date string
+ echo dummy | awk '{
+ for (i = 0; i < 3; i++) {
+ now = substr(order, 1, 1);
+ order = substr(order, 2);
+ if (now == "d")
+ out = day;
+ else if (now == "m")
+ out = month;
+ else if (now == "y")
+ out = year;
+ if (i < 2)
+ printf("%s%s", out, field);
+ else
+ printf("%s", out);
+ }
+ if (newline != "yes")
+ printf("\n");
+ }' "day=$day" "month=$month" "year=$year" \
+ "field=$opt_f" "order=$opt_o" "newline=$opt_n"
+
+ shtool_exit 0
+ ;;
+
+table )
+ ##
+ ## table -- Pretty-print a field-separated list as a table
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ if [ $opt_c -gt 4 ]; then
+ echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2
+ shtool_exit 1
+ fi
+ case "x$opt_F" in
+ x? ) ;;
+ * ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; shtool_exit 1 ;;
+ esac
+
+ # split the list into a table
+ list=`
+ IFS="$opt_F"
+ for entry in $*; do
+ if [ ".$entry" != . ]; then
+ echo "$entry"
+ fi
+ done |\
+ awk "
+ BEGIN { list = \"\"; n = 0; }
+ {
+ list = list \\$1;
+ n = n + 1;
+ if (n < $opt_c) {
+ list = list \":\";
+ }
+ if (n == $opt_c) {
+ list = list \"\\n\";
+ n = 0;
+ }
+ }
+ END { print list; }
+ "
+ `
+
+ # format table cells and make sure table
+ # doesn't exceed maximum width
+ OIFS="$IFS"
+ IFS='
+'
+ for entry in $list; do
+ case $opt_c in
+ 1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;;
+ 2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;;
+ 3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;;
+ 4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;;
+ esac
+ done |\
+ awk "{
+ if (length(\$0) > $opt_s) {
+ printf(\"%s\\n\", substr(\$0, 0, $opt_s-1));
+ } else {
+ print \$0;
+ }
+ }"
+ IFS="$OIFS"
+
+ shtool_exit 0
+ ;;
+
+prop )
+ ##
+ ## prop -- Display progress with a running propeller
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ perl=''
+ for dir in `echo $PATH | sed -e 's/:/ /g'` .; do
+ if [ -f "$dir/perl" ]; then
+ perl="$dir/perl"
+ break
+ fi
+ done
+ if [ ".$perl" != . ]; then
+ # Perl is preferred because writing to STDERR in
+ # Perl really writes immediately as one would expect
+ $perl -e '
+ @p = ("|","/","-","\\");
+ $i = 0;
+ while (<STDIN>) {
+ printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]);
+ $i = 0 if ($i > 3);
+ }
+ printf(STDERR "\r%s \n", $ARGV[0]);
+ ' "$opt_p"
+ else
+ # But if Perl doesn't exists we use Awk even
+ # some Awk's buffer even the /dev/stderr writing :-(
+ awk '
+ BEGIN {
+ split("|#/#-#\\", p, "#");
+ i = 1;
+ }
+ {
+ printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr";
+ if (i > 4) { i = 1; }
+ }
+ END {
+ printf("\r%s \n", prefix) > "/dev/stderr";
+ }
+ ' "prefix=$opt_p"
+ fi
+
+ shtool_exit 0
+ ;;
+
+move )
+ ##
+ ## move -- Move files with simultaneous substitution
+ ## Copyright (c) 1999-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ src="$1"
+ dst="$2"
+
+ # consistency checks
+ if [ ".$src" = . ] || [ ".$dst" = . ]; then
+ echo "$msgprefix:Error: Invalid arguments" 1>&2
+ shtool_exit 1
+ fi
+ if [ ".$src" = ".$dst" ]; then
+ echo "$msgprefix:Error: Source and destination files are the same" 1>&2
+ shtool_exit 1
+ fi
+ expsrc="$src"
+ if [ ".$opt_e" = .yes ]; then
+ expsrc="`echo $expsrc`"
+ fi
+ if [ ".$opt_e" = .yes ]; then
+ if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then
+ echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2
+ shtool_exit 1
+ fi
+ if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then
+ echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2
+ shtool_exit 1
+ fi
+ if [ ".$expsrc" = ".$src" ]; then
+ echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2
+ shtool_exit 1
+ fi
+ else
+ if [ ! -r "$src" ]; then
+ echo "$msgprefix:Error: Source not found: $src" 1>&2
+ shtool_exit 1
+ fi
+ fi
+
+ # determine substitution patterns
+ if [ ".$opt_e" = .yes ]; then
+ srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'`
+ dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'`
+ fi
+
+ # iterate over source(s)
+ for onesrc in $expsrc; do
+ if [ .$opt_e = .yes ]; then
+ onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"`
+ else
+ onedst="$dst"
+ fi
+ errorstatus=0
+ if [ ".$opt_v" = .yes ]; then
+ echo "$onesrc -> $onedst"
+ fi
+ if [ ".$opt_p" = .yes ]; then
+ if [ -r $onedst ]; then
+ if cmp -s $onesrc $onedst; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -f $onesrc" 1>&2
+ fi
+ rm -f $onesrc || errorstatus=$?
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "mv -f $onesrc $onedst" 1>&2
+ fi
+ mv -f $onesrc $onedst || errorstatus=$?
+ fi
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "mv -f $onesrc $onedst" 1>&2
+ fi
+ mv -f $onesrc $onedst || errorstatus=$?
+ fi
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "mv -f $onesrc $onedst" 1>&2
+ fi
+ mv -f $onesrc $onedst || errorstatus=$?
+ fi
+ if [ $errorstatus -ne 0 ]; then
+ break;
+ fi
+ done
+
+ shtool_exit $errorstatus
+ ;;
+
+install )
+ ##
+ ## install -- Install a program, script or datafile
+ ## Copyright (c) 1997-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ # special case: "shtool install -d <dir> [...]" internally
+ # maps to "shtool mkdir -f -p -m 755 <dir> [...]"
+ if [ "$opt_d" = yes ]; then
+ cmd="$0 mkdir -f -p -m 755"
+ if [ ".$opt_o" != . ]; then
+ cmd="$cmd -o '$opt_o'"
+ fi
+ if [ ".$opt_g" != . ]; then
+ cmd="$cmd -g '$opt_g'"
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ cmd="$cmd -v"
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ cmd="$cmd -t"
+ fi
+ for dir in "$@"; do
+ eval "$cmd $dir" || shtool_exit $?
+ done
+ shtool_exit 0
+ fi
+
+ # determine source(s) and destination
+ argc=$#
+ srcs=""
+ while [ $# -gt 1 ]; do
+ srcs="$srcs $1"
+ shift
+ done
+ dstpath="$1"
+
+ # type check for destination
+ dstisdir=0
+ if [ -d $dstpath ]; then
+ dstpath=`echo "$dstpath" | sed -e 's:/$::'`
+ dstisdir=1
+ fi
+
+ # consistency check for destination
+ if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then
+ echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2
+ shtool_exit 1
+ fi
+
+ # iterate over all source(s)
+ for src in $srcs; do
+ dst=$dstpath
+
+ # if destination is a directory, append the input filename
+ if [ $dstisdir = 1 ]; then
+ dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'`
+ dst="$dst/$dstfile"
+ fi
+
+ # check for correct arguments
+ if [ ".$src" = ".$dst" ]; then
+ echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2
+ continue
+ fi
+ if [ -d "$src" ]; then
+ echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2
+ continue
+ fi
+
+ # make a temp file name in the destination directory
+ dsttmp=`echo $dst |\
+ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \
+ -e "s;\$;/#INST@$$#;"`
+
+ # verbosity
+ if [ ".$opt_v" = .yes ]; then
+ echo "$src -> $dst" 1>&2
+ fi
+
+ # copy or move the file name to the temp name
+ # (because we might be not allowed to change the source)
+ if [ ".$opt_C" = .yes ]; then
+ opt_c=yes
+ fi
+ if [ ".$opt_c" = .yes ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "cp $src $dsttmp" 1>&2
+ fi
+ cp "$src" "$dsttmp" || shtool_exit $?
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "mv $src $dsttmp" 1>&2
+ fi
+ mv "$src" "$dsttmp" || shtool_exit $?
+ fi
+
+ # adjust the target file
+ if [ ".$opt_e" != . ]; then
+ sed='sed'
+ OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS"
+ for e
+ do
+ sed="$sed -e '$e'"
+ done
+ cp "$dsttmp" "$dsttmp.old"
+ chmod u+w $dsttmp
+ eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $?
+ rm -f $dsttmp.old
+ fi
+ if [ ".$opt_s" = .yes ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "strip $dsttmp" 1>&2
+ fi
+ strip $dsttmp || shtool_exit $?
+ fi
+ if [ ".$opt_o" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chown $opt_o $dsttmp" 1>&2
+ fi
+ chown $opt_o $dsttmp || shtool_exit $?
+ fi
+ if [ ".$opt_g" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chgrp $opt_g $dsttmp" 1>&2
+ fi
+ chgrp $opt_g $dsttmp || shtool_exit $?
+ fi
+ if [ ".$opt_m" != ".-" ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod $opt_m $dsttmp" 1>&2
+ fi
+ chmod $opt_m $dsttmp || shtool_exit $?
+ fi
+
+ # determine whether to do a quick install
+ # (has to be done _after_ the strip was already done)
+ quick=no
+ if [ ".$opt_C" = .yes ]; then
+ if [ -r $dst ]; then
+ if cmp -s "$src" "$dst"; then
+ quick=yes
+ fi
+ fi
+ fi
+
+ # finally, install the file to the real destination
+ if [ $quick = yes ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -f $dsttmp" 1>&2
+ fi
+ rm -f $dsttmp
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -f $dst && mv $dsttmp $dst" 1>&2
+ fi
+ rm -f $dst && mv $dsttmp $dst
+ fi
+ done
+
+ shtool_exit 0
+ ;;
+
+mkdir )
+ ##
+ ## mkdir -- Make one or more directories
+ ## Copyright (c) 1996-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ errstatus=0
+ for p in ${1+"$@"}; do
+ # if the directory already exists...
+ if [ -d "$p" ]; then
+ if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then
+ echo "$msgprefix:Error: directory already exists: $p" 1>&2
+ errstatus=1
+ break
+ else
+ continue
+ fi
+ fi
+ # if the directory has to be created...
+ if [ ".$opt_p" = .no ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "mkdir $p" 1>&2
+ fi
+ mkdir $p || errstatus=$?
+ if [ ".$opt_o" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chown $opt_o $p" 1>&2
+ fi
+ chown $opt_o $p || errstatus=$?
+ fi
+ if [ ".$opt_g" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chgrp $opt_g $p" 1>&2
+ fi
+ chgrp $opt_g $p || errstatus=$?
+ fi
+ if [ ".$opt_m" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod $opt_m $p" 1>&2
+ fi
+ chmod $opt_m $p || errstatus=$?
+ fi
+ else
+ # the smart situation
+ set fnord `echo ":$p" |\
+ sed -e 's/^:\//%/' \
+ -e 's/^://' \
+ -e 's/\// /g' \
+ -e 's/^%/\//'`
+ shift
+ pathcomp=''
+ for d in ${1+"$@"}; do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp="./$pathcomp" ;;
+ esac
+ if [ ! -d "$pathcomp" ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "mkdir $pathcomp" 1>&2
+ fi
+ mkdir $pathcomp || errstatus=$?
+ if [ ".$opt_o" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chown $opt_o $pathcomp" 1>&2
+ fi
+ chown $opt_o $pathcomp || errstatus=$?
+ fi
+ if [ ".$opt_g" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chgrp $opt_g $pathcomp" 1>&2
+ fi
+ chgrp $opt_g $pathcomp || errstatus=$?
+ fi
+ if [ ".$opt_m" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod $opt_m $pathcomp" 1>&2
+ fi
+ chmod $opt_m $pathcomp || errstatus=$?
+ fi
+ fi
+ pathcomp="$pathcomp/"
+ done
+ fi
+ done
+
+ shtool_exit $errstatus
+ ;;
+
+mkln )
+ ##
+ ## mkln -- Make link with calculation of relative paths
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ # determine source(s) and destination
+ args=$?
+ srcs=""
+ while [ $# -gt 1 ]; do
+ srcs="$srcs $1"
+ shift
+ done
+ dst="$1"
+ if [ ! -d $dst ]; then
+ if [ $args -gt 2 ]; then
+ echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2
+ shtool_exit 1
+ fi
+ fi
+
+ # determine link options
+ lnopt=""
+ if [ ".$opt_f" = .yes ]; then
+ lnopt="$lnopt -f"
+ fi
+ if [ ".$opt_s" = .yes ]; then
+ lnopt="$lnopt -s"
+ fi
+
+ # iterate over sources
+ for src in $srcs; do
+ # determine if one of the paths is an absolute path,
+ # because then we _have_ to use an absolute symlink
+ oneisabs=0
+ srcisabs=0
+ dstisabs=0
+ case $src in
+ /* ) oneisabs=1; srcisabs=1 ;;
+ esac
+ case $dst in
+ /* ) oneisabs=1; dstisabs=1 ;;
+ esac
+
+ # split source and destination into dir and base name
+ if [ -d $src ]; then
+ srcdir=`echo $src | sed -e 's;/*$;;'`
+ srcbase=""
+ else
+ srcdir=`echo $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
+ srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'`
+ fi
+ if [ -d $dst ]; then
+ dstdir=`echo $dst | sed -e 's;/*$;;'`
+ dstbase=""
+ else
+ dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
+ dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'`
+ fi
+
+ # consistency check
+ if [ ".$dstdir" != . ]; then
+ if [ ! -d $dstdir ]; then
+ echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2
+ shtool_exit 1
+ fi
+ fi
+
+ # make sure the source is reachable from the destination
+ if [ $dstisabs = 1 ]; then
+ if [ $srcisabs = 0 ]; then
+ if [ ".$srcdir" = . ]; then
+ srcdir="`pwd | sed -e 's;/*$;;'`"
+ srcisabs=1
+ oneisabs=1
+ elif [ -d $srcdir ]; then
+ srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`"
+ srcisabs=1
+ oneisabs=1
+ fi
+ fi
+ fi
+
+ # split away a common prefix
+ prefix=""
+ if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then
+ prefix="$srcdir/"
+ srcdir=""
+ dstdir=""
+ else
+ while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do
+ presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'`
+ predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'`
+ if [ ".$presrc" != ".$predst" ]; then
+ break
+ fi
+ prefix="$prefix$presrc/"
+ srcdir=`echo $srcdir | sed -e 's;^[^/]*/*;;'`
+ dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'`
+ done
+ fi
+
+ # destination prefix is just the common prefix
+ dstpre="$prefix"
+
+ # determine source prefix which is the reverse directory
+ # step-up corresponding to the destination directory
+ srcpre=""
+ allow_relative_srcpre=no
+ if [ ".$prefix" != . ] && [ ".$prefix" != ./ ]; then
+ allow_relative_srcpre=yes
+ fi
+ if [ $oneisabs = 0 ]; then
+ allow_relative_srcpre=yes
+ fi
+ if [ ".$opt_s" != .yes ]; then
+ allow_relative_srcpre=no
+ fi
+ if [ ".$allow_relative_srcpre" = .yes ]; then
+ pl="$dstdir/"
+ OIFS="$IFS"; IFS='/'
+ for pe in $pl; do
+ [ ".$pe" = . ] && continue
+ [ ".$pe" = .. ] && continue
+ srcpre="../$srcpre"
+ done
+ IFS="$OIFS"
+ else
+ if [ $srcisabs = 1 ]; then
+ srcpre="$prefix"
+ fi
+ fi
+
+ # determine destination symlink name
+ if [ ".$dstbase" = . ]; then
+ if [ ".$srcbase" != . ]; then
+ dstbase="$srcbase"
+ else
+ dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'`
+ fi
+ fi
+
+ # now finalize source and destination directory paths
+ srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'`
+ dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'`
+
+ # run the final link command
+ if [ ".$opt_t" = .yes ]; then
+ echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase"
+ fi
+ eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase
+ done
+
+ shtool_exit 0
+ ;;
+
+mkshadow )
+ ##
+ ## mkshadow -- Make a shadow tree through symbolic links
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ # source and destination directory
+ src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
+ dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
+
+ # check whether source exists
+ if [ ! -d $src ]; then
+ echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2
+ shtool_exit 1
+ fi
+
+ # determine if one of the paths is an absolute path,
+ # because then we have to use an absolute symlink
+ oneisabs=0
+ case $src in
+ /* ) oneisabs=1 ;;
+ esac
+ case $dst in
+ /* ) oneisabs=1 ;;
+ esac
+
+ # determine reverse directory for destination directory
+ dstrevdir=''
+ if [ $oneisabs = 0 ]; then
+ # derive reverse path from forward path
+ pwd=`pwd`
+ OIFS="$IFS"; IFS='/'
+ for pe in $dst; do
+ if [ "x$pe" = "x.." ]; then
+ OIFS2="$IFS"; IFS="$DIFS"
+ eval `echo "$pwd" |\
+ sed -e 's:\([^/]*\)$:; dir="\1":' \
+ -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\
+ -e 's:^;:pwd="";:'`
+ dstrevdir="$dir/$dstrevdir"
+ IFS="$OIFS2"
+ else
+ dstrevdir="../$dstrevdir"
+ fi
+ done
+ IFS="$OIFS"
+ else
+ src="`cd $src; pwd`";
+ fi
+
+ # create directory tree at destination
+ if [ ! -d $dst ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "mkdir $dst" 1>&2
+ fi
+ mkdir $dst
+ fi
+ if [ ".$opt_a" = .yes ]; then
+ DIRS=`cd $src; find . -type d -print |\
+ sed -e '/^\.$/d' -e 's:^\./::'`
+ else
+ DIRS=`cd $src; find . -type d -print |\
+ sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'`
+ fi
+ for dir in $DIRS; do
+ if [ ".$opt_t" = .yes ]; then
+ echo "mkdir $dst/$dir" 1>&2
+ fi
+ mkdir $dst/$dir
+ done
+
+ # fill directory tree with symlinks to files
+ if [ ".$opt_a" = .yes ]; then
+ FILES="`cd $src; find . -depth -print |\
+ sed -e 's/^\.\///'`"
+ else
+ FILES="`cd $src; find . -depth -print |\
+ sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \
+ -e '/\.cvsignore$/d' -e '/\/CVS/d' \
+ -e '/\/\.#/d' -e '/\.orig$/d' \
+ -e 's/^\.\///'`"
+ fi
+ for file in $FILES; do
+ # don't use `-type f' above for find because of symlinks
+ if [ -d "$src/$file" ]; then
+ continue
+ fi
+ basename=`echo $file | sed -e 's:^.*/::'`
+ dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'`
+ from=`echo "$src/$file" | sed -e 's/^\.\///'`
+ to="$dst/$dir$basename"
+ if [ $oneisabs = 0 ]; then
+ if [ ".$dir" != . ]; then
+ subdir=`echo $dir | sed -e 's:/$::'`
+ # derive reverse path from forward path
+ revdir=''
+ OIFS="$IFS"; IFS='/'
+ for pe in $subdir; do
+ revdir="../$revdir"
+ done
+ IFS="$OIFS"
+ # finalize from
+ from="$revdir$from"
+ fi
+ from="$dstrevdir$from"
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ echo " $to" 1>&2
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "ln -s $from $to" 1>&2
+ fi
+ ln -s $from $to
+ done
+
+ shtool_exit 0
+ ;;
+
+fixperm )
+ ##
+ ## fixperm -- Fix file permissions inside a source tree
+ ## Copyright (c) 1996-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ paths="$*"
+
+ # check whether the test command supports the -x option
+ if [ -x /bin/sh ] 2>/dev/null; then
+ minusx="-x"
+ else
+ minusx="-r"
+ fi
+
+ # iterate over paths
+ for p in $paths; do
+ for file in `find $p -depth -print`; do
+ if [ -f $file ]; then
+ if [ $minusx $file ]; then
+ if [ ".$opt_v" = .yes ]; then
+ echo "-rwxr-xr-x $file" 2>&1
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod 755 $file" 2>&1
+ fi
+ chmod 755 $file
+ else
+ if [ ".$opt_v" = .yes ]; then
+ echo "-rw-r--r-- $file" 2>&1
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod 644 $file" 2>&1
+ fi
+ chmod 644 $file
+ fi
+ continue
+ fi
+ if [ -d $file ]; then
+ if [ ".$opt_v" = .yes ]; then
+ echo "drwxr-xr-x $file" 2>&1
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod 755 $file" 2>&1
+ fi
+ chmod 755 $file
+ continue
+ fi
+ if [ ".$opt_v" = .yes ]; then
+ echo "?????????? $file" 2>&1
+ fi
+ done
+ done
+
+ shtool_exit 0
+ ;;
+
+rotate )
+ ##
+ ## rotate -- Logfile rotation
+ ## Copyright (c) 2001-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ # make sure we have at least one file to rotate
+ if [ ".$opt_n" = .0 ]; then
+ echo "$msgprefix:Error: invalid argument \`$opt_n' to option -n." 1>&2
+ shtool_exit 1
+ fi
+
+ # canonicalize -s option argument
+ if [ ".$opt_s" != . ]; then
+ if [ ".`expr $opt_s : '[0-9]*$'`" != .0 ]; then
+ :
+ elif [ ".`expr $opt_s : '[0-9]*[Kk]$'`" != .0 ]; then
+ opt_s=`expr $opt_s : '\([0-9]*\)[Kk]$'`
+ opt_s=`expr $opt_s \* 1024`
+ elif [ ".`expr $opt_s : '[0-9]*[Mm]$'`" != .0 ]; then
+ opt_s=`expr $opt_s : '\([0-9]*\)[Mm]$'`
+ opt_s=`expr $opt_s \* 1048576` # 1024*1024
+ elif [ ".`expr $opt_s : '[0-9]*[Gg]$'`" != .0 ]; then
+ opt_s=`expr $opt_s : '\([0-9]*\)[Gg]$'`
+ opt_s=`expr $opt_s \* 1073741824` # 1024*1024*1024
+ else
+ echo "$msgprefix:Error: invalid argument \`$opt_s' to option -s." 1>&2
+ shtool_exit 1
+ fi
+ fi
+
+ # option -d/-z consistency
+ if [ ".$opt_d" = .yes ] && [ ".$opt_z" = . ]; then
+ echo "$msgprefix:Error: option -d requires option -z." 1>&2
+ shtool_exit 1
+ fi
+
+ # make sure target directory exists
+ if [ ".$opt_a" != . ]; then
+ if [ ! -d $opt_a ]; then
+ if [ ".$opt_f" = .no ]; then
+ echo "$msgprefix:Error: archive directory \`$opt_a' does not exist." 1>&2
+ shtool_exit 1
+ fi
+ mkdir $opt_a || shtool_exit $?
+ chmod 755 $opt_a
+ fi
+ if [ ! -w $opt_a ]; then
+ echo "$msgprefix:Error: archive directory \`$opt_a' not writable." 1>&2
+ shtool_exit 1
+ fi
+ fi
+
+ # determine compression approach
+ if [ ".$opt_z" != . ]; then
+ comp_lvl="$opt_z"
+ comp_prg=""
+ case $comp_lvl in
+ *:* ) eval `echo $comp_lvl |\
+ sed -e 's%^\(.*\):\(.*\)$%comp_prg="\1"; comp_lvl="\2"%'` ;;
+ esac
+
+ # compression level consistency
+ case $comp_lvl in
+ [0-9] )
+ ;;
+ * ) echo "$msgprefix:Error: invalid compression level \`$comp_lvl'" 1>&2
+ shtool_exit 1
+ ;;
+ esac
+
+ # determine a suitable compression tool
+ if [ ".$comp_prg" = . ]; then
+ # check whether the test command supports the -x option
+ if [ -x /bin/sh ] 2>/dev/null; then
+ minusx="-x"
+ else
+ minusx="-r"
+ fi
+ # search for tools in $PATH
+ paths="`echo $PATH |\
+ sed -e 's%/*:%:%g' -e 's%/*$%%' \
+ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
+ -e 's/:/ /g'`"
+ for prg in bzip2 gzip compress; do
+ for path in $paths; do
+ if [ $minusx "$path/$prg" ] && [ ! -d "$path/$prg" ]; then
+ comp_prg="$prg"
+ break
+ fi
+ done
+ if [ ".$comp_prg" != . ]; then
+ break
+ fi
+ done
+ if [ ".$comp_prg" = . ]; then
+ echo "$msgprefix:Error: no suitable compression tool found in \$PATH" 1>&2
+ shtool_exit 1
+ fi
+ fi
+
+ # determine standard compression extension
+ # and make sure it is a known tool
+ case $comp_prg in
+ */bzip2 | bzip2 ) comp_ext="bz2" comp_lvl="-$comp_lvl" ;;
+ */gzip | gzip ) comp_ext="gz" comp_lvl="-$comp_lvl" ;;
+ */compress | compress ) comp_ext="Z"; comp_lvl="" ;;
+ * ) echo "$msgprefix:Error: tool \`$comp_prg' is not a known compression tool" 1>&2
+ shtool_exit 1
+ ;;
+ esac
+ comp_suf=".$comp_ext"
+ fi
+
+ # iterate over all given logfile arguments
+ for file in $*; do
+ # make sure the logfile exists
+ if [ ! -f $file ]; then
+ if [ ".$opt_f" = .yes ]; then
+ continue
+ fi
+ echo "$msgprefix:Error: logfile \`$file' not found" 1>&2
+ shtool_exit 1
+ fi
+
+ # determine log directory (where original logfile is placed)
+ ldir="."
+ case $file in
+ */* ) eval `echo $file | sed -e 's%^\(.*\)/\([^/]*\)$%ldir="\1"; file="\2";%'` ;;
+ esac
+
+ # determine archive directory (where rotated logfiles are placed)
+ adir="$ldir"
+ if [ ".$opt_a" != . ]; then
+ case "$opt_a" in
+ /* | ./* ) adir="$opt_a" ;;
+ * ) adir="$ldir/$opt_a" ;;
+ esac
+ fi
+
+ # optionally take logfile size into account
+ if [ ".$opt_s" != . ]; then
+ # determine size of logfile
+ set -- `env -i /bin/ls -l "$ldir/$file" | sed -e "s;$ldir/$file;;" |\
+ sed -e 's; -> .*$;;' -e 's;[         ][         ]*; ;g'`
+ n=`expr $# - 3`
+ eval "size=\`echo \${$n}\`"
+
+ # skip logfile if size is still too small
+ if [ $size -lt $opt_s ]; then
+ if [ ".$opt_v" = .yes ]; then
+ echo "$ldir/$file: still too small in size -- skipping"
+ fi
+ continue
+ fi
+ fi
+
+ # verbosity
+ if [ ".$opt_v" = .yes ]; then
+ echo "rotating $ldir/$file"
+ fi
+
+ # execute prolog
+ if [ ".$opt_P" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "$opt_P"
+ fi
+ eval $opt_P
+ [ $? -ne 0 ] && shtool_exit $?
+ fi
+
+ # kick away out-rotated logfile
+ n=`expr $opt_n - 1`
+ n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n`
+ if [ -f "${adir}/${file}.${n}${comp_suf}" ]; then
+ # optionally migrate away the out-rotated logfile
+ if [ ".$opt_M" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "$opt_M ${adir}/${file}.${n}${comp_suf}"
+ fi
+ eval "$opt_M ${adir}/${file}.${n}${comp_suf}"
+ [ $? -ne 0 ] && shtool_exit $?
+ fi
+ # finally get rid of the out-rotated logfile
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -f ${adir}/${file}.${n}${comp_suf}"
+ fi
+ rm -f ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
+ fi
+
+ # rotate already archived logfiles
+ while [ $n -gt 0 ]; do
+ m=$n
+ n=`expr $n - 1`
+ n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n`
+ if [ $n -eq 0 ] && [ ".$opt_d" = .yes ]; then
+ # special case: first rotation file under delayed compression situation
+ if [ ! -f "${adir}/${file}.${n}" ]; then
+ continue
+ fi
+
+ # compress file (delayed)
+ if [ ".$opt_b" = .yes ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "mv ${adir}/${file}.${n} ${adir}/${file}.${m}"
+ fi
+ mv ${adir}/${file}.${n} ${adir}/${file}.${m} || shtool_exit $?
+ if [ ".$opt_t" = .yes ]; then
+ echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${m} >${adir}/${file}.${m}${comp_suf}; rm -f ${adir}/${file}.${m}) &"
+ fi
+ ( ${comp_prg} ${comp_lvl} \
+ <${adir}/${file}.${m} \
+ >${adir}/${file}.${m}${comp_suf} || shtool_exit $?
+ rm -f ${adir}/${file}.${m} || shtool_exit $?
+ ) </dev/null >/dev/null 2>&1 &
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${m}${comp_suf}"
+ fi
+ ${comp_prg} ${comp_lvl} \
+ <${adir}/${file}.${n} \
+ >${adir}/${file}.${m}${comp_suf} || shtool_exit $?
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -f ${adir}/${file}.${n}"
+ fi
+ rm -f ${adir}/${file}.${n} || shtool_exit $?
+ fi
+
+ # fix file attributes
+ if [ ".$opt_o" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chown $opt_o ${adir}/${file}.${m}${comp_suf}"
+ fi
+ chown $opt_o ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
+ fi
+ if [ ".$opt_g" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chgrp $opt_g ${adir}/${file}.${m}${comp_suf}"
+ fi
+ chgrp $opt_g ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
+ fi
+ if [ ".$opt_m" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod $opt_m ${adir}/${file}.${m}${comp_suf}"
+ fi
+ chmod $opt_m ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
+ fi
+ else
+ # standard case: second and following rotation file
+ if [ ! -f "${adir}/${file}.${n}${comp_suf}" ]; then
+ continue
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf}"
+ fi
+ mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf} || shtool_exit $?
+ fi
+ done
+
+ # move away current logfile
+ if [ ".$opt_c" = .yes ]; then
+ # approach: copy[+truncate]
+ if [ ".$opt_t" = .yes ]; then
+ echo "cp -p ${ldir}/${file} ${adir}/${file}.${n}"
+ fi
+ cp -p ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $?
+ if [ ".$opt_r" = .no ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "cp /dev/null ${ldir}/${file}"
+ fi
+ cp /dev/null ${ldir}/${file} || shtool_exit $?
+ fi
+ else
+ # approach: move[+touch]
+ if [ ".$opt_t" = .yes ]; then
+ echo "mv ${ldir}/${file} ${adir}/${file}.${n}"
+ fi
+ mv ${ldir}/${file} ${adir}/${file}.${n} || shtool_exit $?
+ if [ ".$opt_r" = .no ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "touch ${ldir}/${file}"
+ fi
+ touch ${ldir}/${file} || shtool_exit $?
+ # fix file attributes
+ if [ ".$opt_o" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chown $opt_o ${ldir}/${file}"
+ fi
+ chown $opt_o ${ldir}/${file} || shtool_exit $?
+ fi
+ if [ ".$opt_g" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chgrp $opt_g ${ldir}/${file}"
+ fi
+ chgrp $opt_g ${ldir}/${file} || shtool_exit $?
+ fi
+ if [ ".$opt_m" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod $opt_m ${ldir}/${file}"
+ fi
+ chmod $opt_m ${ldir}/${file} || shtool_exit $?
+ fi
+ fi
+ fi
+
+ # regular compression step
+ if [ ".$opt_z" != . ] && [ ".$opt_d" = .no ]; then
+ # compress file
+ if [ ".$opt_b" = .yes ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}; rm -f ${adir}/${file}.${n}) &"
+ fi
+ ( ${comp_prg} ${comp_lvl} \
+ <${adir}/${file}.${n} \
+ >${adir}/${file}.${n}${comp_suf} || shtool_exit $?
+ rm -f ${adir}/${file}.${n} || shtool_exit $?
+ ) </dev/null >/dev/null 2>&1 &
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}"
+ fi
+ ${comp_prg} ${comp_lvl} \
+ <${adir}/${file}.${n} \
+ >${adir}/${file}.${n}${comp_suf} || shtool_exit $?
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -f ${opt_a}${file}.${n}"
+ fi
+ rm -f ${adir}/${file}.${n} || shtool_exit $?
+ fi
+
+ # fix file attributes
+ if [ ".$opt_o" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chown $opt_o ${adir}/${file}.${n}${comp_suf}"
+ fi
+ chown $opt_o ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
+ fi
+ if [ ".$opt_g" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chgrp $opt_g ${adir}/${file}.${n}${comp_suf}"
+ fi
+ chgrp $opt_g ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
+ fi
+ if [ ".$opt_m" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chmod $opt_m ${adir}/${file}.${n}${comp_suf}"
+ fi
+ chmod $opt_m ${adir}/${file}.${n}${comp_suf} || shtool_exit $?
+ fi
+ fi
+
+ # execute epilog
+ if [ ".$opt_E" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "$opt_E"
+ fi
+ eval $opt_E
+ [ $? -ne 0 ] && shtool_exit $?
+ fi
+ done
+
+ shtool_exit 0
+ ;;
+
+tarball )
+ ##
+ ## tarball -- Roll distribution tarballs
+ ## Copyright (c) 1999-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ srcs="$*"
+
+ # check whether the test command supports the -x option
+ if [ -x /bin/sh ] 2>/dev/null; then
+ minusx="-x"
+ else
+ minusx="-r"
+ fi
+
+ # find the tools
+ paths="`echo $PATH |\
+ sed -e 's%/*:%:%g' -e 's%/*$%%' \
+ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
+ -e 's/:/ /g'`"
+ for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do
+ prg=`echo $spec | sed -e 's/:.*$//'`
+ tools=`echo $spec | sed -e 's/^.*://'`
+ eval "prg_${prg}=''"
+ # iterate over tools
+ for tool in `echo $tools | sed -e 's/,/ /g'`; do
+ # iterate over paths
+ for path in $paths; do
+ if [ $minusx "$path/$tool" ] && [ ! -d "$path/$tool" ]; then
+ eval "prg_${prg}=\"$path/$tool\""
+ break
+ fi
+ done
+ eval "val=\$prg_${prg}"
+ if [ ".$val" != . ]; then
+ break
+ fi
+ done
+ done
+
+ # expand source paths
+ exclude=''
+ for pat in `echo $opt_e | sed 's/,/ /g'`; do
+ exclude="$exclude | grep -v '$pat'"
+ done
+ if [ ".$opt_t" = .yes ]; then
+ echo "cp /dev/null $tmpfile.lst" 1>&2
+ fi
+ cp /dev/null $tmpfile.lst
+ for src in $srcs; do
+ if [ -d $src ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2
+ fi
+ (cd $src && $prg_find . -type f -depth -print) |\
+ sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst
+ else
+ if [ ".$opt_t" = .yes ]; then
+ echo "echo $src >>$tmpfile.lst" 1>&2
+ fi
+ echo $src >>$tmpfile.lst
+ fi
+ done
+ sort <$tmpfile.lst >$tmpfile.lst.n
+ mv $tmpfile.lst.n $tmpfile.lst
+ if [ ".$opt_v" = .yes ]; then
+ cat $tmpfile.lst | sed -e 's/^/ /' 1>&2
+ fi
+
+ # determine tarball file and directory name
+ if [ ".$opt_o" != . ]; then
+ tarfile="$opt_o"
+ if [ ".$opt_d" != . ]; then
+ tarname="$opt_d"
+ else
+ tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'`
+ fi
+ else
+ if [ ".$opt_d" != . ]; then
+ tarname="$opt_d"
+ elif [ -d "$from" ]; then
+ tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'`
+ else
+ tarname="out"
+ fi
+ tarfile="$tarname.tar"
+ fi
+
+ # roll the tarball
+ compress=''
+ if [ ".$opt_c" != . ]; then
+ compress="| $opt_c"
+ fi
+ if [ ".$prg_tardy" != . ]; then
+ # the elegant hackers way
+ tardy_opt="--prefix=$tarname"
+ tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security!
+ if [ ".$opt_u" != . ]; then
+ tardy_opt="$tardy_opt --user_name=$opt_u"
+ fi
+ if [ ".$opt_g" != . ]; then
+ tardy_opt="$tardy_opt --group_name=$opt_g"
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2
+ fi
+ cat $tmpfile.lst |\
+ xargs $prg_tar cf - |\
+ $prg_tardy $tardy_opt |\
+ eval cat $compress >$tmpfile.out
+ if [ ".$opt_t" = .yes ]; then
+ echo "cp $tmpfile.out $tarfile" 1>&2
+ fi
+ cp $tmpfile.out $tarfile
+ else
+ # the portable standard way
+ if [ ".$opt_t" = .yes ]; then
+ echo "mkdir $tmpdir/$tarname" 1>&2
+ fi
+ mkdir $tmpdir/$tarname || shtool_exit 1
+ if [ ".$opt_t" = .yes ]; then
+ echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2
+ fi
+ cat $tmpfile.lst |\
+ xargs $prg_tar cf - |\
+ (cd $tmpdir/$tarname && $prg_tar xf -)
+ if [ ".$opt_u" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1
+ fi
+ chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\
+ echo "$msgprefix:Warning: cannot set user name \`$opt_u' (would require root privileges)"
+ fi
+ if [ ".$opt_g" != . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1
+ fi
+ chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\
+ echo "$msgprefix:Warning: cannot set group name \`$opt_g' (would require root privileges)"
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2
+ fi
+ (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\
+ eval cat $compress >$tmpfile.out
+ if [ ".$opt_t" = .yes ]; then
+ echo "cp $tmpfile.out $tarfile" 1>&2
+ fi
+ cp $tmpfile.out $tarfile
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -rf $tmpdir/$tarname" 1>&2
+ fi
+ rm -rf $tmpdir/$tarname
+ fi
+
+ # cleanup
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2
+ fi
+ rm -f $tmpfile.lst $tmpfile.out
+
+ shtool_exit 0
+ ;;
+
+subst )
+ ##
+ ## subst -- Apply sed(1) substitution operations
+ ## Copyright (c) 2001-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ # remember optional list of file(s)
+ files="$*"
+ files_num="$#"
+
+ # parameter consistency check
+ if [ $# -eq 0 ] && [ ".$opt_b" != . ]; then
+ echo "$msgprefix:Error: option -b cannot be applied to stdin" 1>&2
+ shtool_exit 1
+ fi
+ if [ $# -eq 0 ] && [ ".$opt_s" = .yes ]; then
+ echo "$msgprefix:Error: option -s cannot be applied to stdin" 1>&2
+ shtool_exit 1
+ fi
+
+ # build underlying sed(1) command
+ sedcmd='sed'
+ if [ ".$opt_e" != . ]; then
+ OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS"
+ for e
+ do
+ sedcmd="$sedcmd -e '$e'"
+ done
+ elif [ ".$opt_f" != . ]; then
+ if [ ! -f $opt_f ]; then
+ echo "$msgprefix:Error: command file \`$opt_f' not found or not a regular file" 1>&2
+ shtool_exit 1
+ fi
+ sedcmd="$sedcmd -f '$opt_f'"
+ else
+ echo "$msgprefix:Error: either -e option(s) or -f option required" 1>&2
+ shtool_exit 1
+ fi
+
+ # determine extension for original file
+ orig=".orig"
+ if [ ".$opt_b" != . ]; then
+ orig="$opt_b"
+ fi
+
+ # apply sed(1) operation(s)
+ if [ ".$files" != . ]; then
+ # apply operation(s) to files
+ substdone=no
+ for file in $files; do
+ test ".$file" = . && continue
+ if [ ! -f $file ]; then
+ echo "$msgprefix:Warning: file \`$file' not found or not a regular file" 1>&2
+ continue
+ fi
+
+ # handle interactive mode
+ if [ ".$opt_i" = .yes ]; then
+ eval "$sedcmd <$file >$file.new"
+ skip=no
+ if cmp $file $file.new >/dev/null 2>&1; then
+ rm -f $file.new
+ skip=yes
+ else
+ (diff -U1 $file $file.new >$tmpfile) 2>/dev/null
+ if [ ".`cat $tmpfile`" = . ]; then
+ (diff -C1 $file $file.new >$tmpfile) 2>/dev/null
+ if [ ".`cat $tmpfile`" = . ]; then
+ echo "$msgprefix:Warning: unable to show difference for file \`$file'" 1>&2
+ cp /dev/null $tmpfile
+ fi
+ fi
+ rm -f $file.new
+ cat $tmpfile
+ echo dummy | awk '{ printf("%s", TEXT); }' TEXT=">>> Apply [Y/n]: "
+ read input
+ if [ ".$input" != .Y ] &&\
+ [ ".$input" != .y ] &&\
+ [ ".$input" != . ]; then
+ skip=yes
+ fi
+ fi
+ if [ ".$skip" = .yes ]; then
+ if [ ".$opt_v" = .yes ]; then
+ echo "file \`$file' -- skipped" 1>&2
+ fi
+ continue
+ fi
+ fi
+
+ # apply sed(1) operation(s)
+ if [ ".$opt_v" = .yes ]; then
+ echo "patching \`$file'" 1>&2
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "\$ cp -p $file $file$orig"
+ echo "\$ chmod u+w $file"
+ echo "\$ $sedcmd <$file$orig >$file"
+ fi
+ if [ ".$opt_n" = .no ]; then
+ cp -p $file $file$orig
+ chmod u+w $file >/dev/null 2>&1 || true
+ eval "$sedcmd <$file$orig >$file"
+ fi
+
+ # optionally fix timestamp
+ if [ ".$opt_s" = .yes ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "\$ touch -r $file$orig $file"
+ fi
+ if [ ".$opt_n" = .no ]; then
+ touch -r $file$orig $file
+ fi
+ fi
+
+ # optionally check whether any content change actually occurred
+ if [ ".$opt_q" = .no ]; then
+ if cmp $file$orig $file >/dev/null 2>&1; then
+ if [ ".$opt_w" = .yes ]; then
+ echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2
+ fi
+ else
+ substdone=yes
+ fi
+ fi
+
+ # optionally remove preserved original file
+ if [ ".$opt_b" = . ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "\$ rm -f $file$orig"
+ fi
+ if [ ".$opt_n" = .no ]; then
+ rm -f $file$orig
+ fi
+ fi
+ done
+ if [ ".$opt_q" = .no ] && [ ".$opt_w" = .no ]; then
+ if [ ".$substdone" = .no ]; then
+ if [ ".$files_num" = .1 ]; then
+ echo "$msgprefix:Warning: substitution resulted in no content change on file \"$file\"" 1>&2
+ else
+ echo "$msgprefix:Warning: substitution resulted in no content change on any file" 1>&2
+ fi
+ fi
+ fi
+ else
+ # apply operation(s) to stdin/stdout
+ if [ ".$opt_v" = .yes ]; then
+ echo "patching <stdin>" 1>&2
+ fi
+ if [ ".$opt_t" = .yes ]; then
+ echo "\$ $sedcmd"
+ fi
+ if [ ".$opt_n" = .no ]; then
+ eval "$sedcmd"
+ fi
+ fi
+
+ shtool_exit 0
+ ;;
+
+platform )
+ ##
+ ## platform -- Platform Identification Utility
+ ## Copyright (c) 2003-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ # option post-processing
+ if [ ".$opt_t" != . ]; then
+ case "$opt_t" in
+ binary )
+ # binary package id (OpenPKG RPM)
+ opt_F="%<ap>-%<sp>"
+ opt_L=yes
+ opt_S=""
+ opt_C="+"
+ ;;
+ build )
+ # build time checking (OpenPKG RPM)
+ opt_F="%<at>-%<st>"
+ opt_L=yes
+ opt_S=""
+ opt_C="+"
+ ;;
+ gnu )
+ # GNU config.guess style <arch>-<vendor>-<os><osversion>
+ opt_F="%<at>-unknown-%<st>"
+ opt_L=yes
+ opt_S=""
+ opt_C="+"
+ ;;
+ web )
+ # non-whitespace HTTP Server-header id
+ opt_F="%<sp>-%<ap>"
+ opt_S="/"
+ opt_C="+"
+ ;;
+ summary)
+ # human readable verbose summary information
+ opt_F="Class: %[sc] (%[ac])\\nProduct: %[sp] (%[ap])\\nTechnology: %[st] (%[at])"
+ opt_S=" "
+ opt_C="/"
+ ;;
+ all-in-one )
+ # full-table all-in-one information
+ opt_F=""
+ opt_F="${opt_F}concise architecture class: %<ac>\\n"
+ opt_F="${opt_F}regular architecture class: %{ac}\\n"
+ opt_F="${opt_F}verbose architecture class: %[ac]\\n"
+ opt_F="${opt_F}concise architecture product: %<ap>\\n"
+ opt_F="${opt_F}regular architecture product: %{ap}\\n"
+ opt_F="${opt_F}verbose architecture product: %[ap]\\n"
+ opt_F="${opt_F}concise architecture technology: %<at>\\n"
+ opt_F="${opt_F}regular architecture technology: %{at}\\n"
+ opt_F="${opt_F}verbose architecture technology: %[at]\\n"
+ opt_F="${opt_F}concise system class: %<sc>\\n"
+ opt_F="${opt_F}regular system class: %{sc}\\n"
+ opt_F="${opt_F}verbose system class: %[sc]\\n"
+ opt_F="${opt_F}concise system product: %<sp>\\n"
+ opt_F="${opt_F}regular system product: %{sp}\\n"
+ opt_F="${opt_F}verbose system product: %[sp]\\n"
+ opt_F="${opt_F}concise system technology: %<st>\\n"
+ opt_F="${opt_F}regular system technology: %{st}\\n"
+ opt_F="${opt_F}verbose system technology: %[st]"
+ ;;
+ * )
+ echo "$msgprefix:Error: invalid type \`$opt_t'" 1>&2
+ exit 1
+ ;;
+ esac
+ fi
+
+ # assemble initial platform information
+ UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\
+ UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\
+ UNAME_MACHINE='unknown'
+ UNAME_SYSTEM=`(uname -s) 2>/dev/null` ||\
+ UNAME_SYSTEM='unknown'
+ UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\
+ UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\
+ UNAME_RELEASE='unknown'
+
+ UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}"
+
+ AC=""; AP=""; AT=""
+ SC=""; SP=""; ST=""
+
+ # dispatch into platform specific sections
+ case "${UNAME}" in
+
+ # FreeBSD
+ *:FreeBSD:* )
+ # determine architecture
+ AC="${UNAME_MACHINE}"
+ case "${AC}" in
+ i386 ) AC="iX86" ;;
+ esac
+ AP="${AC}"
+ AT="${AP}"
+ if [ ".${AT}" = ".iX86" ]; then
+ case "`(/sbin/sysctl -n hw.model) 2>&1`" in
+ *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;;
+ *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;;
+ *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;;
+ esac
+ fi
+ # determine system
+ r=`echo "${UNAME_RELEASE}" |\
+ sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'`
+ ST="FreeBSD ${r}"
+ SP="${ST}"
+ case "${r}" in
+ 1.* ) SC="4.3BSD" ;;
+ * ) SC="4.4BSD" ;;
+ esac
+ ;;
+
+ # NetBSD
+ *:NetBSD:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ AP="${AT}"
+ case "${AP}" in
+ i[3-6]86 ) AP="iX86" ;;
+ esac
+ AC="${AP}"
+ # determine system
+ r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
+ ST="NetBSD ${r}"
+ SP="${ST}"
+ case "${r}" in
+ 0.* ) SC="4.3BSD" ;;
+ * ) SC="4.4BSD" ;;
+ esac
+ ;;
+
+ # OpenBSD
+ *:OpenBSD:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ AP="${AT}"
+ case "${AP}" in
+ i[3-6]86 ) AP="iX86" ;;
+ esac
+ AC="${AP}"
+ # determine system
+ r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
+ ST="OpenBSD ${r}"
+ SP="${ST}"
+ SC="4.4BSD"
+ ;;
+
+ # GNU/Linux
+ *:Linux:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ case "${AT}" in
+ ia64 ) AT="IA64" ;;
+ x86_64 ) AT='AMD64' ;;
+ parisc ) AT="HPPA32" ;;
+ parisc64 ) AT="HPPA64" ;;
+ esac
+ AP="${AT}"
+ case "${AP}" in
+ i[3-6]86 ) AP='iX86' ;;
+ esac
+ AC="${AP}"
+ # determine system
+ v_kern=`echo "${UNAME_RELEASE}" |\
+ sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'`
+ v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\
+ env -i sort -n | sed -n -e '$p' | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null`
+ ST="GNU/<Linux >${v_libc}/<${v_kern}>"
+ if [ -f /etc/lsb-release ]; then
+ eval `( . /etc/lsb-release
+ echo "SC=\"LSB${LSB_VERSION}\""
+ if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then
+ echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\""
+ fi
+ ) 2>/dev/null`
+ fi
+ if [ ".$SP" = . ]; then
+ for tagfile in x \
+ `cd /etc && \
+ /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \
+ sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \
+ echo redhat-release lsb-release`
+ do
+ [ ".${tagfile}" = .x ] && continue
+ [ ! -f "/etc/${tagfile}" ] && continue
+ n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'`
+ v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | sed -e 'q' |\
+ sed -e 's/^/#/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
+ -e 's/^#.*$//'`
+ case "`util_lower ${n}`" in
+ redhat )
+ if [ ".`grep 'Red Hat Enterprise Linux' /etc/${tagfile}`" != . ]; then
+ n="<R>ed <H>at <E>nterprise <L>inux"
+ else
+ n="<R>ed <H>at <L>inux"
+ fi
+ ;;
+ debian ) n="Debian[ GNU/Linux]" ;;
+ ubuntu ) n="Ubuntu[ GNU/Linux]" ;;
+ fedora ) n="<Fedora> Core[ GNU/Linux]" ;;
+ suse ) n="SuSE[ Linux]" ;;
+ mandrake*|mandriva ) n="Mandriva[ Linux]" ;;
+ gentoo ) n="Gentoo[ GNU/Linux]" ;;
+ slackware ) n="Slackware[ Linux]" ;;
+ turbolinux ) n="TurboLinux" ;;
+ unitedlinux ) n="UnitedLinux" ;;
+ * ) n="${n}[ GNU/Linux]" ;;
+ esac
+ case "$n" in
+ *"<"*">"* ) SP="$n <$v>" ;;
+ * ) SP="$n $v" ;;
+ esac
+ break
+ done
+ fi
+ [ ".$SP" = . ] && SP="${ST}"
+ [ ".$SC" = . ] && SC="LSB"
+ ;;
+
+ # Sun Solaris
+ *:SunOS:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ case "${AT}" in
+ i86pc )
+ AT="iX86"
+ case "`(/bin/isainfo -k) 2>&1`" in
+ amd64 ) AT="AMD64" ;;
+ esac
+ ;;
+ esac
+ AP="${AT}"
+ case "${AP}" in
+ sun4[cdm] ) AP="SPARC32" ;;
+ sun4[uv] ) AP="SPARC64" ;;
+ sun4* ) AP="SPARC" ;;
+ esac
+ AC="${AP}"
+ case "${AC}" in
+ SPARC* ) AC="SPARC" ;;
+ esac
+ # determine system
+ ST="[Sun ]SunOS ${UNAME_RELEASE}"
+ v=`echo "${UNAME_RELEASE}" |\
+ sed -e 's;^4\.;1.;' \
+ -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \
+ -e 's;^5\.\([0-9][0-9]*\).*;\1;'`
+ SP="[Sun ]Solaris $v"
+ case "${UNAME_RELEASE}" in
+ 4.* ) SC="4.3BSD" ;;
+ 5.* ) SC="SVR4" ;;
+ esac
+ ;;
+
+ # SCO UnixWare
+ *:UnixWare:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ case "${AT}" in
+ i[3-6]86 | ix86at ) AT="iX86" ;;
+ esac
+ AP="${AT}"
+ # determine system
+ v=`/sbin/uname -v`
+ ST="[SCO ]UnixWare ${v}"
+ SP="${ST}"
+ SC="SVR${UNAME_RELEASE}"
+ ;;
+
+ # QNX
+ *:QNX:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ case "${AT}" in
+ x86pc ) AT="iX86" ;;
+ esac
+ AP="${AT}"
+ # determine system
+ v="${UNAME_RELEASE}"
+ ST="QNX[ Neutrino RTOS] ${v}"
+ v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'`
+ SP="QNX[ Neutrino RTOS] ${v}"
+ SC="QNX"
+ ;;
+
+ # SGI IRIX
+ *:IRIX*:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ AP="${AT}"
+ case "${AP}:${UNAME_SYSTEM}" in
+ IP*:IRIX64 ) AP="MIPS64" ;;
+ IP*:* ) AP="MIPS" ;;
+ esac
+ AC="${AP}"
+ # determine system
+ v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'`
+ ST="[SGI ]IRIX ${v}"
+ v="${UNAME_RELEASE}"
+ SP="[SGI ]IRIX ${v}"
+ SC="4.2BSD/SVR3"
+ ;;
+
+ # HP HP-UX
+ *:HP-UX:* )
+ # determine architecture
+ AT="${UNAME_MACHINE}"
+ case "${AT}" in
+ ia64 ) AT="IA64" ;;
+ 9000/[34]?? ) AT=M68K ;;
+ 9000/[678][0-9][0-9])
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523 ) AT="HPPA1.0" ;;
+ 528 ) AT="HPPA1.1" ;;
+ 532 ) AT="HPPA2.0"
+ case "${sc_kernel_bits}" in
+ 32 ) AT="${AT}n" ;;
+ 64 ) AT="${AT}w" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ AP="${AT}"
+ case "${AP}" in
+ HPPA* ) AP="HPPA" ;;
+ esac
+ AC="${AP}"
+ # determine system
+ v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'`
+ ST="[HP ]<HP>-<UX ${v}>"
+ SP="${ST}"
+ case "${v}" in
+ 10.* ) SC="SVR4.2" ;;
+ [7-9]* ) SC="SVR4" ;;
+ esac
+ ;;
+
+ # HP Tru64 (OSF1)
+ *:OSF1:* )
+ # determine architecture
+ AP="${UNAME_MACHINE}"
+ case "${AP}" in
+ alpha ) AP="Alpha" ;;
+ esac
+ alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\
+ sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | sed -e 'q'`
+ AT="${AP}${alpha_type}"
+ AC="${AP}"
+ # determine system
+ v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'`
+ ST="[HP ]Tru64 ${v}"
+ SP="${ST}"
+ SC="OSF1"
+ ;;
+
+ # IBM AIX
+ *:AIX:* )
+ cpu_arch=rs6000
+ if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then
+ cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then
+ cpu_arch=powerpc
+ fi
+ elif [ -d /QOpenSys ]; then
+ # IBM i5/OS (aka OS/400) with PASE (Portable Application Solutions Environment)
+ cpu_arch=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ]; then
+ os_level=`/usr/bin/oslevel`
+ else
+ os_level="`uname -v`.`uname -r`"
+ fi
+ os_level=`echo "${os_level}" |\
+ sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \
+ -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'`
+ AT="${cpu_arch}"
+ AP="${AT}"
+ AC="${AP}"
+ ST="[IBM ]<AIX >${os_level}"
+ SP="${ST}"
+ case "${os_level}" in
+ [12]* ) SC="SVR2" ;;
+ * ) SC="SVR4" ;;
+ esac
+ ;;
+
+ # Apple MacOS X Darwin
+ *:Darwin:* )
+ AT=`uname -p`
+ case "${AT}" in
+ powerpc ) AT="PPC" ;;
+ esac
+ AP="${AT}"
+ AC="${AP}"
+ case "${AC}" in
+ i?86 ) AC="iX86" ;;
+ esac
+ ST="[Apple ]${UNAME_SYSTEM} ${UNAME_RELEASE}"
+ SP="${ST}"
+ SC="4.4BSD/Mach3"
+ ;;
+
+ # TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO
+ # *:XXX:* )
+ # ...
+ # ;;
+
+ # ...A STILL UNKNOWN PLATFORM...
+ * )
+ AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"`
+ AP="${AT}"
+ AC="${AP}"
+ v=`echo "${UNAME_RELEASE}" |\
+ sed -e 's/^/#/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
+ -e 's/^#.*$/?/'`
+ ST="${UNAME_SYSTEM} ${v}"
+ SP="${ST}"
+ SC="${SP}"
+ ;;
+
+ esac
+
+ # provide fallback values
+ [ ".$AT" = . ] && AT="${AP:-${AC}}"
+ [ ".$AP" = . ] && AP="${AT:-${AC}}"
+ [ ".$AC" = . ] && AC="${AP:-${AT}}"
+ [ ".$ST" = . ] && ST="${SP:-${SC}}"
+ [ ".$SP" = . ] && SP="${ST:-${SC}}"
+ [ ".$SC" = . ] && SC="${SP:-${ST}}"
+
+ # support explicit enforced verbose/concise output
+ if [ ".$opt_v" = .yes ]; then
+ opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'`
+ elif [ ".$opt_c" = .yes ]; then
+ opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'`
+ fi
+
+ # provide verbose and concise variants
+ AC_V=""; AC_N=""; AC_C=""
+ AP_V=""; AP_N=""; AP_C=""
+ AT_V=""; AT_N=""; AT_C=""
+ SC_V=""; SC_N=""; SC_C=""
+ SP_V=""; SP_N=""; SP_C=""
+ ST_V=""; ST_N=""; ST_C=""
+ for var_lc in at ap ac st sp sc; do
+ case "$opt_F" in
+ *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* )
+ var_uc=`util_upper "$var_lc"`
+ eval "val=\"\$${var_uc}\""
+ val_V=""; val_N=""; val_C=""
+ case "$opt_F" in
+ *"%[${var_lc}]"* )
+ val_V=`echo ":$val" | \
+ sed -e 's/^://' \
+ -e 's;\[\([^]]*\)\];\1;g' \
+ -e 's;<\([^>]*\)>;\1;g' \
+ -e "s; ;\xA7\xA7;g" \
+ -e "s;/;%%;g" \
+ -e "s;\xA7\xA7;${opt_S};g" \
+ -e "s;%%;${opt_C};g"`
+ eval "${var_uc}_V=\"\${val_V}\""
+ ;;
+ esac
+ case "$opt_F" in
+ *"%{${var_lc}}"* | *"%${var_lc}"* )
+ val_N=`echo ":$val" | \
+ sed -e 's/^://' \
+ -e 's;\[\([^]]*\)\];;g' \
+ -e 's;<\([^>]*\)>;\1;g' \
+ -e "s; ;\xA7\xA7;g" \
+ -e "s;/;%%;g" \
+ -e "s;\xA7\xA7;${opt_S};g" \
+ -e "s;%%;${opt_C};g"`
+ eval "${var_uc}_N=\"\${val_N}\""
+ ;;
+ esac
+ case "$opt_F" in
+ *"%<${var_lc}>"* )
+ val_C=`echo ":$val" | \
+ sed -e 's/^://' \
+ -e 's;\[\([^]]*\)\];;g' \
+ -e 's;[^<]*<\([^>]*\)>[^<]*;\1;g' \
+ -e "s; ;\xA7\xA7;g" \
+ -e "s;/;%%;g" \
+ -e "s;\xA7\xA7;${opt_S};g" \
+ -e "s;%%;${opt_C};g"`
+ eval "${var_uc}_C=\"\${val_C}\""
+ ;;
+ esac
+ ;;
+ esac
+ done
+
+ # create output string
+ output=`echo ":$opt_F" |\
+ sed -e "s/^://" \
+ -e "s;%\\[ac\\];${AC_V};g" \
+ -e "s;%{ac};${AC_N};g" \
+ -e "s;%ac;${AC_N};g" \
+ -e "s;%<ac>;${AC_C};g" \
+ -e "s;%\\[ap\\];${AP_V};g" \
+ -e "s;%{ap};${AP_N};g" \
+ -e "s;%ap;${AP_N};g" \
+ -e "s;%<ap>;${AP_C};g" \
+ -e "s;%\\[at\\];${AT_V};g" \
+ -e "s;%{at};${AT_N};g" \
+ -e "s;%at;${AT_N};g" \
+ -e "s;%<at>;${AT_C};g" \
+ -e "s;%\\[sc\\];${SC_V};g" \
+ -e "s;%{sc};${SC_N};g" \
+ -e "s;%sc;${SC_N};g" \
+ -e "s;%<sc>;${SC_C};g" \
+ -e "s;%\\[sp\\];${SP_V};g" \
+ -e "s;%{sp};${SP_N};g" \
+ -e "s;%sp;${SP_N};g" \
+ -e "s;%<sp>;${SP_C};g" \
+ -e "s;%\\[st\\];${ST_V};g" \
+ -e "s;%{st};${ST_N};g" \
+ -e "s;%st;${ST_N};g" \
+ -e "s;%<st>;${ST_C};g" \
+ -e 's/\\\\n/^/g' |\
+ tr '^' '\012'`
+
+ # support lower/upper-case mapping
+ if [ ".$opt_L" = .yes ]; then
+ output=`util_lower "$output"`
+ elif [ ".$opt_U" = .yes ]; then
+ output=`util_upper "$output"`
+ fi
+
+ # display output string
+ if [ ".$opt_n" = .yes ]; then
+ echo . | awk '{ printf("%s", output); }' output="$output"
+ else
+ echo "$output"
+ fi
+
+ shtool_exit 0
+ ;;
+
+arx )
+ ##
+ ## arx -- Extended archive command
+ ## Copyright (c) 1999-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ ar_prg="$opt_C"
+ ar_cmd="$1"; shift
+ archive="$1"; shift
+ files="$*"
+
+ # walk through the file list and expand archives members
+ ar_tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'`
+ nfiles=''
+ if [ ".$files" != . ]; then
+ for file in $files; do
+ if [ ! -f $file ]; then
+ echo "$msgprefix:Error: input file not found: $file" 1>&2
+ shtool_exit 1
+ fi
+ case $file in
+ *.a )
+ if [ ! -d $ar_tmpdir ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "mkdir $ar_tmpdir" 1>&2
+ fi
+ mkdir $ar_tmpdir
+ fi
+ case $ar_tmpdir in
+ .arx )
+ from="../$file"
+ ;;
+ * )
+ dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'`
+ base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'`
+ from="`cd $dir; pwd`/$base"
+ ;;
+ esac
+ if [ ".$opt_t" = .yes ]; then
+ echo "(cd $ar_tmpdir && $ar_prg x $from)" 1>&2
+ fi
+ (cd $ar_tmpdir && eval $ar_prg x $from)
+ if [ $? -ne 0 ]; then
+ echo "$msgprefix:Error: member extraction failed for archive: $file" 1>&2
+ shtool_exit 1
+ fi
+ for member in - `eval $ar_prg t $file | sed -e '/_\.SYMDEF/d'`; do
+ [ ".$member" = .- ] && continue
+ nfiles="$nfiles $ar_tmpdir/$member"
+ done
+ ;;
+ * )
+ nfiles="$nfiles $file"
+ ;;
+ esac
+ done
+ fi
+
+ # run the final archive command
+ if [ ".$opt_t" = .yes ]; then
+ echo "$ar_prg $ar_cmd $archive $nfiles" 1>&2
+ fi
+ eval $ar_prg $ar_cmd $archive $nfiles
+ if [ $? -ne 0 ]; then
+ echo "$msgprefix:Error: archive command failed" 1>&2
+ shtool_exit $?
+ fi
+
+ # cleanup and die gracefully
+ if [ -d $ar_tmpdir ]; then
+ if [ ".$opt_t" = .yes ]; then
+ echo "rm -rf $ar_tmpdir" 1>&2
+ fi
+ rm -rf $ar_tmpdir
+ fi
+
+ shtool_exit 0
+ ;;
+
+slo )
+ ##
+ ## slo -- Separate linker options by library class
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ DIFS="$IFS"
+
+ # parse out -L and -l options from command line
+ DIRS=''
+ LIBS=''
+ ARGV=''
+ optprev=''
+ for opt
+ do
+ # concatenate with previous option if exists
+ if [ ".$optprev" != . ]; then
+ opt="${optprev}${opt}";
+ optprev=''
+ fi
+ # remember options for arg if used stand-alone
+ if [ ".$opt" = ".-L" ] || [ ".$opt" = ".-l" ]; then
+ optprev="$opt"
+ continue;
+ fi
+ # split argument into option plus option argument
+ arg="`echo $opt | cut -c3-`"
+ opt="`echo $opt | cut -c1-2`"
+ # store into containers
+ case $opt in
+ -L) DIRS="$DIRS:$arg" ;;
+ -l) LIBS="$LIBS:$arg" ;;
+ *) ARGV="$ARGV $opt" ;;
+ esac
+ done
+
+ # set linker default directories
+ DIRS_DEFAULT='/lib:/usr/lib'
+ if [ ".$LD_LIBRARY_PATH" != . ]; then
+ DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH"
+ fi
+
+ # sort options by class
+ DIRS_OBJ=''
+ LIBS_OBJ=''
+ DIRS_PIC=''
+ LIBS_PIC=''
+ DIRS_DSO=''
+ LIBS_DSO=''
+
+ # for each library...
+ OIFS="$IFS"; IFS=':'
+ for lib in $LIBS; do
+ [ ".$lib" = . ] && continue
+
+ found='no'
+ found_indefdir='no'
+ found_type=''
+ found_dir=''
+
+ # for each directory...
+ OIFS2="$IFS"; IFS=":$DIFS"
+ for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do
+ [ ".$dir" = . ] && continue
+ [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes
+ [ ! -d $dir ] && continue
+
+ # search the file
+ OIFS3="$IFS"; IFS="$DIFS"
+ for file in '' `cd $dir && env -i /bin/ls lib${lib}.* 2>/dev/null`; do
+ [ ".$file" = . ] && continue
+ case $file in
+ *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* )
+ found=yes;
+ found_type=DSO;
+ break
+ ;;
+ *.lo|*.la )
+ found=yes;
+ found_type=PIC
+ ;;
+ *.a )
+ if [ ".$found_type" = . ]; then
+ found=yes
+ found_type=OBJ
+ fi
+ ;;
+ esac
+ done
+ IFS="$OIFS3"
+ if [ ".$found" = .yes ]; then
+ found_dir="$dir"
+ break
+ fi
+ done
+ IFS="$OIFS2"
+
+ if [ ".$found" = .yes ]; then
+ if [ ".$found_indefdir" != .yes ]; then
+ eval "dirlist=\"\${DIRS_${found_type}}:\""
+ case "$dirlist" in
+ *:$found_dir:* ) ;;
+ * ) eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\"" ;;
+ esac
+ eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
+ else
+ eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
+ fi
+ else
+ LIBS_OBJ="$LIBS_OBJ:$lib"
+ #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`"
+ #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1
+ #echo "slo:Warning: $dirlist" 1>&1
+ fi
+ done
+ IFS="$OIFS"
+
+ # also pass-through unused dirs even if it's useless
+ OIFS="$IFS"; IFS=':'
+ for dir in $DIRS; do
+ dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:"
+ case "$dirlist" in
+ *:$dir:* ) ;;
+ * ) DIRS_OBJ="$DIRS_OBJ:$dir" ;;
+ esac
+ done
+ IFS="$OIFS"
+
+ # reassemble the options but separated by type
+ for type in OBJ PIC DSO; do
+ OIFS="$IFS"; IFS=':'
+ eval "libs=\"\$LIBS_${type}\""
+ opts=''
+ for lib in $libs; do
+ [ ".$lib" = . ] && continue
+ opts="$opts -l$lib"
+ done
+ eval "LIBS_${type}=\"$opts\""
+
+ eval "dirs=\"\$DIRS_${type}\""
+ opts=''
+ for dir in $dirs; do
+ [ ".$dir" = . ] && continue
+ opts="$opts -L$dir"
+ done
+ eval "DIRS_${type}=\"$opts\""
+ IFS="$OIFS"
+ done
+
+ # give back results
+ for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do
+ eval "val=\"\$${var}\""
+ val="`echo $val | sed -e 's/^ *//'`"
+ echo "${opt_p}${var}=\"${val}\""
+ done
+
+ shtool_exit 0
+ ;;
+
+scpp )
+ ##
+ ## scpp -- Sharing C Pre-Processor
+ ## Copyright (c) 1999-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ srcs="$*"
+ output="${opt_o}.n"
+
+ # find a reasonable Awk
+ awk=''
+ paths=`echo $PATH |\
+ sed -e 's%/*:%:%g' -e 's%/$%%' \
+ -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
+ -e 's/:/ /g'`
+ for name in gawk nawk awk; do
+ for path in $paths; do
+ if [ -r "$path/$name" ]; then
+ awk="$path/$name"
+ break
+ fi
+ done
+ if [ ".$awk" != . ]; then
+ break
+ fi
+ done
+ if [ ".$awk" = . ]; then
+ echo "$msgprefix:Error: cannot find a reasonable Awk" 1>&2
+ shtool_exit 1
+ fi
+
+ # parse source file(s)
+ if [ ".$opt_v" = .yes ]; then
+ echo "Parsing:" | $awk '{ printf("%s", $0); }' 1>&2
+ fi
+ for src in $srcs; do
+ if [ ".$opt_v" = .yes ]; then
+ echo $src | $awk '{ printf(" %s", $0); }' 1>&2
+ fi
+ if [ ".$opt_f" != . ]; then
+ inputcmd="sed"
+ OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_f; IFS="$OIFS"
+ for e
+ do
+ inputcmd="$inputcmd -e '$e'"
+ done
+ inputcmd="$inputcmd '$src'"
+ else
+ inputcmd="cat '$src'"
+ fi
+ eval $inputcmd |\
+ $awk '
+ BEGIN {
+ ln = 0;
+ fln = 0;
+ level = 0;
+ mode = "";
+ store = "";
+ }
+ {
+ ln++;
+ }
+ /^#if.*/ {
+ level++;
+ }
+ /^#if [a-zA-Z_][a-zA-Z0-9_]* *$/ {
+ if ($2 == define) {
+ mode = "D";
+ printf("D:#line %d \"%s\"\n", ln, src);
+ next;
+ }
+ }
+ /^#endif.*/ {
+ level--;
+ if (mode == "D" && level == 0) {
+ mode = "";
+ next;
+ }
+ }
+ /^[a-zA-Z_][a-zA-Z0-9_].*;.*/ {
+ if ($1 == class) {
+ printf("V:#line %d \"%s\"\n", ln, src);
+ printf("V:%s\n", $0);
+ printf("J:%s\n", $0);
+ next;
+ }
+ }
+ /^[a-zA-Z_][a-zA-Z0-9_].*=.*/ {
+ if ($1 == class) {
+ printf("V:#line %d \"%s\"\n", ln, src);
+ printf("V:%s\n", $0);
+ printf("J:%s\n", $0);
+ next;
+ }
+ }
+ /^[a-zA-Z_][a-zA-Z0-9_]*/ {
+ if ($1 == class) {
+ fln = ln;
+ store = $0;
+ mode = "F";
+ next;
+ }
+ }
+ /^\{ *$/ {
+ if (mode == "F") {
+ printf("F:#line %d \"%s\"\n", fln, src);
+ printf("F:%s;\n", store);
+ printf("I:%s;\n", store);
+ store = "";
+ mode = "";
+ next;
+ }
+ }
+ {
+ if (mode == "D")
+ printf("D:%s\n", $0);
+ else if (mode == "F")
+ store = store " " $0;
+ }
+ ' "src=$src" "define=$opt_D" "class=$opt_C" >>$tmpfile
+ done
+ if [ ".$opt_v" = .yes ]; then
+ echo "" 1>&2
+ fi
+
+ # start generating output header
+ echo "/* $opt_o -- autogenerated from $opt_t, DO NOT EDIT! */" >$output
+ echo "#line 1 \"$opt_t\"" >>$output
+ sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd' |\
+ sed -e "/^${opt_M} *\$/d" >>$output
+
+ # merge in the define blocks
+ grep '^D:' $tmpfile | sed -e 's/^D://' >>$output
+
+ # generate standard prolog
+ echo "#line 1 \"_ON_THE_FLY_\"" >>$output
+ echo "" >>$output
+ echo "/* make sure the scpp source extensions are skipped */" >>$output
+ echo "#define $opt_D 0" >>$output
+ echo "#define $opt_C /**/" >>$output
+
+ # generate namespace hiding for variables
+ echo "" >>$output
+ echo "/* move intern variables to hidden namespace */" >>$output
+ grep '^J:' $tmpfile | sed >>$output \
+ -e 's/^J://' \
+ -e 's/ */ /g' \
+ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\];.*$/#define \1 __\1/' \
+ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\] =.*$/#define \1 __\1/' \
+ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\);.*$/#define \1 __\1/' \
+ -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\) =.*$/#define \1 __\1/'
+
+ # generate namespace hiding for functions
+ echo "" >>$output
+ echo "/* move intern functions to hidden namespace */" >>$output
+ grep '^I:' $tmpfile | sed >>$output \
+ -e 's/^I://' \
+ -e 's/\([ (]\) */\1/g' \
+ -e 's/ *\([),]\)/\1/g' \
+ -e 's/^[^(]*[ *]\([a-zA-Z0-9_]*\)(.*$/#define \1 __\1/'
+
+ # generate prototypes for variables
+ echo "" >>$output
+ echo "/* prototypes for intern variables */" >>$output
+ grep '^V:' $tmpfile | sed >>$output \
+ -e 's/^V://' \
+ -e 's/ */ /g' \
+ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\);.*$/\1;/' \
+ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\) =.*$/\1;/' \
+ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\);.*$/\1;/' \
+ -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\) =.*$/\1;/' \
+ -e 's/ ;/;/g' \
+ -e "s/^$opt_C /extern /"
+
+ # generate prototypes for functions
+ echo "" >>$output
+ echo "/* prototypes for intern functions */" >>$output
+ grep '^F:' $tmpfile | sed >>$output \
+ -e 's/^F://' \
+ -e 's/\([ (]\) */\1/g' \
+ -e 's/ *\([),]\)/\1/g' \
+ -e 's/\([* ]\)[a-zA-Z0-9_]*,/\1,/g' \
+ -e 's/\([* ]\)[a-zA-Z0-9_]*);/\1);/g' \
+ -e 's/(\*[a-zA-Z0-9_]*)(/(*)(/g' \
+ -e 's/\([ (]\) */\1/g' \
+ -e 's/ *\([),]\)/\1/g' \
+ -e "s/^$opt_C /extern /"
+
+ # finish generating output header
+ n=`(echo ''; sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd') |\
+ wc -l | sed -e 's;^ *\([0-9]*\) *$;\1;'`
+ echo "#line $n \"$opt_t\"" >>$output
+ sed <$opt_t -e "/^${opt_M} *\$/,\$p" -e 'd' |\
+ sed -e "/^${opt_M} *\$/d" >>$output
+
+ # create final output file
+ if [ -f $opt_o ]; then
+ if [ ".$opt_p" = .yes ]; then
+ grep -v '^#line' $opt_o >$tmpfile.o
+ grep -v '^#line' $output >$tmpfile.n
+ out_old="$tmpfile.o"
+ out_new="$tmpfile.n"
+ else
+ out_old="$opt_o"
+ out_new="$output"
+ fi
+ if cmp -s $out_old $out_new; then
+ :
+ else
+ cp $output $opt_o
+ fi
+ else
+ cp $output $opt_o
+ fi
+ rm -f $output
+ rm -f $tmpfile $tmpfile.* >/dev/null 2>&1
+
+ shtool_exit 0
+ ;;
+
+version )
+ ##
+ ## version -- Maintain a version information file
+ ## Copyright (c) 1994-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ file="$1"
+
+ # determine prefix and name
+ name="$opt_n"
+ prefix="$opt_p"
+
+ # determine current version
+ triple="$opt_s"
+ if [ ".$triple" != . ]; then
+ # use given triple
+ if [ ".`echo $triple | grep '[0-9]*.[0-9]*[sabp.][0-9]*'`" = . ]; then
+ echo "$msgprefix:Error: invalid argument to option \`-s': \`$opt_s'" 1>&2
+ shtool_exit 1
+ fi
+ eval `echo $triple |\
+ sed -e 's%\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\).*%\
+ ver="\1";rev="\2";typ="\3";lev="\4"%'`
+ tim=calc
+ elif [ -r $file ]; then
+ # determine triple from given file
+ eval `grep 'Version [0-9]*.[0-9]*[sabp.][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $file |\
+ sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\
+ ver="\1";rev="\2";typ="\3";lev="\4";tim="\5"%' -e 'q'`
+ else
+ # intialise to first version
+ ver=0
+ rev=1
+ typ=.
+ lev=0
+ tim=calc
+ fi
+
+ # determine new version in batch
+ if [ ".$opt_i" != . ]; then
+ case $opt_i in
+ v ) ver=`expr $ver + 1`
+ rev=0
+ lev=0
+ ;;
+ r ) rev=`expr $rev + 1`
+ lev=0
+ ;;
+ l ) lev=`expr $lev + 1`
+ ;;
+ * ) echo "$msgprefix:Error: invalid argument to option \`-i': \`$opt_i'" 1>&2
+ shtool_exit 1
+ ;;
+ esac
+ tim=calc
+ fi
+
+ # determine new version interactively
+ if [ ".$opt_e" = .yes ]; then
+ echo "old version: ${ver}.${rev}${typ}${lev}"
+ while [ 1 ]; do
+ echo dummy | awk '{ printf("new version: "); }'
+ read triple
+ case $triple in
+ [0-9]*.[0-9]*[sabp.][0-9]* )
+ ;;
+ * ) echo "$msgprefix:Error: invalid version string entered: \`$triple'" 1>&2
+ continue
+ ;;
+ esac
+ break
+ done
+ eval `echo $triple |\
+ sed -e 's%^\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\)$%\
+ ver="\1";rev="\2";typ="\3";lev="\4"%'`
+ tim=calc
+ fi
+
+ # determine hexadecimal and libtool value of version
+ case $typ in
+ a ) typnum=0; levnum=$lev ;;
+ b ) typnum=1; levnum=$lev ;;
+ p | . ) typnum=2; levnum=$lev ;;
+ s ) typnum=15; levnum=255 ;; # snapshots are special
+ esac
+ hex=`echo "$ver:$rev:$typnum:$levnum" |\
+ awk -F: '{ printf("0x%x%02x%1x%02x", $1, $2, $3, $4); }' |\
+ tr 'abcdef' 'ABCDEF'`
+ ltv=`echo "$ver:$rev:$typnum:$levnum" |\
+ awk -F: '{ printf("%d:%d", $1*10 + $2, $3*10 + $4); }'`
+
+ # determine date
+ if [ ".$tim" = .calc ]; then
+ day=`date '+%d'`
+ month=`date '+%m'`
+ year=`date '+%Y' 2>/dev/null`
+ if [ ".$time_year" = . ]; then
+ year=`date '+%y'`
+ case $year in
+ [5-9][0-9]) year="19$year" ;;
+ [0-4][0-9]) year="20$year" ;;
+ esac
+ fi
+ case $month in
+ 1|01) month='Jan' ;;
+ 2|02) month='Feb' ;;
+ 3|03) month='Mar' ;;
+ 4|04) month='Apr' ;;
+ 5|05) month='May' ;;
+ 6|06) month='Jun' ;;
+ 7|07) month='Jul' ;;
+ 8|08) month='Aug' ;;
+ 9|09) month='Sep' ;;
+ 10) month='Oct' ;;
+ 11) month='Nov' ;;
+ 12) month='Dec' ;;
+ esac
+ tim="${day}-${month}-${year}"
+ fi
+
+ # perform result actions
+ mode=show
+ if [ ".$opt_i" != . ]; then
+ mode=edit
+ elif [ ".$opt_e" = .yes ]; then
+ mode=edit
+ elif [ ".$opt_s" != . ]; then
+ mode=edit
+ fi
+ if [ ".$mode" = .show ]; then
+ # just display the current version
+ case $opt_d in
+ short )
+ echo "${ver}.${rev}${typ}${lev}"
+ ;;
+ long )
+ echo "${ver}.${rev}${typ}${lev} ($tim)"
+ ;;
+ libtool )
+ echo "${ltv}"
+ ;;
+ hex )
+ echo "${hex}"
+ ;;
+ * ) echo "$msgprefix:Error: invalid argument to option \`-d': \`$opt_d'" 1>&2
+ shtool_exit 1
+ ;;
+ esac
+ else
+ # update the version file
+
+ # pre-generate various strings
+ triple="${ver}.${rev}${typ}${lev}"
+ vHex="$hex"
+ vShort="${triple}"
+ vLong="${triple} (${tim})"
+ vTeX="This is ${name}, Version ${triple} (${tim})"
+ vGNU="${name} ${triple} (${tim})"
+ vWeb="${name}/${triple}"
+ vSCCS="@(#)${name} ${triple} (${tim})"
+ vRCS="\$Id: ${name} ${triple} (${tim}) \$"
+
+ # determine string out of filename
+ # (do NOT try to optimize this in any way because of portability)
+ filestr=`util_upper "$file" | tr './%+' '____' | sed -e 's/-/_/g'`
+
+ # generate uppercase prefix
+ prefixupper=`util_upper "$prefix"`
+
+ # create the version file according the the selected language
+ echo "new version: ${vLong}"
+
+ cp /dev/null $file
+ case $opt_l in
+ txt )
+ echo >>$file ""
+ echo >>$file " ${file} -- Version Information for ${name} (syntax: Text)"
+ echo >>$file " [automatically generated and maintained by GNU shtool]"
+ echo >>$file ""
+ echo >>$file " $vTeX"
+ echo >>$file ""
+ ;;
+ c )
+ echo >>$file "/*"
+ echo >>$file "** ${file} -- Version Information for ${name} (syntax: C/C++)"
+ echo >>$file "** [automatically generated and maintained by GNU shtool]"
+ echo >>$file "*/"
+ echo >>$file ""
+ echo >>$file "#ifdef _${filestr}_AS_HEADER_"
+ echo >>$file ""
+ echo >>$file "#ifndef _${filestr}_"
+ echo >>$file "#define _${filestr}_"
+ echo >>$file ""
+ echo >>$file "#define ${prefixupper}VERSION ${vHex}"
+ echo >>$file ""
+ echo >>$file "typedef struct {"
+ echo >>$file " const int v_hex;"
+ echo >>$file " const char *v_short;"
+ echo >>$file " const char *v_long;"
+ echo >>$file " const char *v_tex;"
+ echo >>$file " const char *v_gnu;"
+ echo >>$file " const char *v_web;"
+ echo >>$file " const char *v_sccs;"
+ echo >>$file " const char *v_rcs;"
+ echo >>$file "} ${prefix}version_t;"
+ echo >>$file ""
+ echo >>$file "extern ${prefix}version_t ${prefix}version;"
+ echo >>$file ""
+ echo >>$file "#endif /* _${filestr}_ */"
+ echo >>$file ""
+ echo >>$file "#else /* _${filestr}_AS_HEADER_ */"
+ echo >>$file ""
+ echo >>$file "#define _${filestr}_AS_HEADER_"
+ echo >>$file "#include \"${file}\""
+ echo >>$file "#undef _${filestr}_AS_HEADER_"
+ echo >>$file ""
+ echo >>$file "${prefix}version_t ${prefix}version = {"
+ echo >>$file " ${vHex},"
+ echo >>$file " \"${vShort}\","
+ echo >>$file " \"${vLong}\","
+ echo >>$file " \"${vTeX}\","
+ echo >>$file " \"${vGNU}\","
+ echo >>$file " \"${vWeb}\","
+ echo >>$file " \"${vSCCS}\","
+ echo >>$file " \"${vRCS}\""
+ echo >>$file "};"
+ echo >>$file ""
+ echo >>$file "#endif /* _${filestr}_AS_HEADER_ */"
+ echo >>$file ""
+ ;;
+ m4 )
+ echo >>$file "##"
+ echo >>$file "## ${file} -- Version Information for ${name} (syntax: M4)"
+ echo >>$file "## [automatically generated and maintained by GNU shtool]"
+ echo >>$file "##"
+ echo >>$file ""
+ echo >>$file "m4_define([v_hex], [${vHex}])"
+ echo >>$file "m4_define([v_short], [${vShort}])"
+ echo >>$file "m4_define([v_long], [${vLong}])"
+ echo >>$file "m4_define([v_tex], [${vTeX}])"
+ echo >>$file "m4_define([v_gnu], [${vGNU}])"
+ echo >>$file "m4_define([v_web], [${vWeb}])"
+ echo >>$file "m4_define([v_sccs], [${vSCCS}])"
+ echo >>$file "m4_define([v_rcs], [${vRCS}])"
+ echo >>$file ""
+ ;;
+ perl )
+ echo >>$file "##"
+ echo >>$file "## ${file} -- Version Information for ${name} (syntax: Perl)"
+ echo >>$file "## [automatically generated and maintained by GNU shtool]"
+ echo >>$file "##"
+ echo >>$file ""
+ echo >>$file "our \$${prefix}version = {"
+ echo >>$file " 'v_hex' => ${vHex},"
+ echo >>$file " 'v_short' => \"${vShort}\","
+ echo >>$file " 'v_long' => \"${vLong}\","
+ echo >>$file " 'v_tex' => \"${vTeX}\","
+ echo >>$file " 'v_gnu' => \"${vGNU}\","
+ echo >>$file " 'v_web' => \"${vWeb}\","
+ echo >>$file " 'v_sccs' => \"${vSCCS}\","
+ echo >>$file " 'v_rcs' => \"\\${vRCS}/\""
+ echo >>$file "};"
+ echo >>$file ""
+ echo >>$file "1;"
+ echo >>$file ""
+ ;;
+ python )
+ echo >>$file "##"
+ echo >>$file "## ${file} -- Version Information for ${name} (syntax: Python)"
+ echo >>$file "## [automatically generated and maintained by GNU shtool]"
+ echo >>$file "##"
+ echo >>$file ""
+ echo >>$file "class ${prefix}version:"
+ echo >>$file " v_hex = ${vHex}"
+ echo >>$file " v_short = \"${vShort}\""
+ echo >>$file " v_long = \"${vLong}\""
+ echo >>$file " v_tex = \"${vTeX}\""
+ echo >>$file " v_gnu = \"${vGNU}\""
+ echo >>$file " v_web = \"${vWeb}\""
+ echo >>$file " v_sccs = \"${vSCCS}\""
+ echo >>$file " v_rcs = \"${vRCS}\""
+ echo >>$file ""
+ ;;
+ * ) echo "$msgprefix:Error: invalid argument to option \`-l': \`$opt_l'" 1>&2
+ shtool_exit 1
+ ;;
+ esac
+ fi
+
+ shtool_exit 0
+ ;;
+
+path )
+ ##
+ ## path -- Deal with program paths
+ ## Copyright (c) 1998-2007 Ralf S. Engelschall <rse@engelschall.com>
+ ##
+
+ namelist="$*"
+
+ # check whether the test command supports the -x option
+ if [ -x /bin/sh ] 2>/dev/null; then
+ minusx="-x"
+ else
+ minusx="-r"
+ fi
+
+ # split path string
+ paths="`echo $opt_p |\
+ sed -e 's/^:/.:/' \
+ -e 's/::/:.:/g' \
+ -e 's/:$/:./' \
+ -e 's/:/ /g'`"
+
+ # SPECIAL REQUEST
+ # translate forward to reverse path
+ if [ ".$opt_r" = .yes ]; then
+ if [ "x$namelist" = "x." ]; then
+ rp='.'
+ else
+ rp=''
+ for pe in `IFS="$IFS/"; echo $namelist`; do
+ rp="../$rp"
+ done
+ fi
+ echo $rp | sed -e 's:/$::'
+ shtool_exit 0
+ fi
+
+ # SPECIAL REQUEST
+ # strip out directory or base name
+ if [ ".$opt_d" = .yes ]; then
+ echo "$namelist" |\
+ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;'
+ shtool_exit 0
+ fi
+ if [ ".$opt_b" = .yes ]; then
+ echo "$namelist" |\
+ sed -e 's;.*/\([^/]*\)$;\1;'
+ shtool_exit 0
+ fi
+
+ # MAGIC SITUATION
+ # Perl Interpreter (perl)
+ if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then
+ rm -f $tmpfile >/dev/null 2>&1
+ touch $tmpfile
+ found=0
+ pc=99
+ for dir in $paths; do
+ dir=`echo $dir | sed -e 's;/*$;;'`
+ nc=99
+ for name in perl perl5 miniperl; do
+ if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then
+ perl="$dir/$name"
+ pv=`$perl -e 'printf("%.3f", $]);'`
+ echo "$pv:$pc:$nc:$perl" >>$tmpfile
+ found=1
+ fi
+ nc=`expr $nc - 1`
+ done
+ pc=`expr $pc - 1`
+ done
+ if [ $found = 1 ]; then
+ perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`"
+ rm -f $tmpfile >/dev/null 2>&1
+ echo "$perl"
+ shtool_exit 0
+ fi
+ rm -f $tmpfile >/dev/null 2>&1
+ shtool_exit 1
+ fi
+
+ # MAGIC SITUATION
+ # C pre-processor (cpp)
+ if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then
+ echo >$tmpfile.c "#include <assert.h>"
+ echo >>$tmpfile.c "Syntax Error"
+ # 1. try the standard cc -E approach
+ cpp="${CC-cc} -E"
+ (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
+ my_error=`grep -v '^ *+' $tmpfile.out`
+ if [ ".$my_error" != . ]; then
+ # 2. try the cc -E approach and GCC's -traditional-ccp option
+ cpp="${CC-cc} -E -traditional-cpp"
+ (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
+ my_error=`grep -v '^ *+' $tmpfile.out`
+ if [ ".$my_error" != . ]; then
+ # 3. try a standalone cpp command in path and lib dirs
+ for path in $paths /lib /usr/lib /usr/local/lib; do
+ path=`echo $path | sed -e 's;/*$;;'`
+ if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then
+ cpp="$path/cpp"
+ break
+ fi
+ done
+ if [ ".$cpp" != . ]; then
+ (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
+ my_error=`grep -v '^ *+' $tmpfile.out`
+ if [ ".$my_error" != . ]; then
+ # ok, we gave up...
+ cpp=''
+ fi
+ fi
+ fi
+ fi
+ rm -f $tmpfile >/dev/null 2>&1
+ rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1
+ if [ ".$cpp" != . ]; then
+ echo "$cpp"
+ shtool_exit 0
+ fi
+ shtool_exit 1
+ fi
+
+ # STANDARD SITUATION
+ # iterate over names
+ for name in $namelist; do
+ # iterate over paths
+ for path in $paths; do
+ path=`echo $path | sed -e 's;/*$;;'`
+ if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then
+ if [ ".$opt_s" != .yes ]; then
+ echo "$path/$name"
+ fi
+ shtool_exit 0
+ fi
+ done
+ done
+
+ shtool_exit 1
+ ;;
+
+esac
+
+shtool_exit 0
+
</ins><span class="cx">Property changes on: freeswitch/trunk/libs/uuid/shtool
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid3"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid++.3 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid++.3         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid++.3        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,307 @@
</span><ins>+.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.07)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C`
+. ds C'
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title ".::uuid++ 3"
+.TH .::uuid++ 3 "OSSP uuid 1.6.2" "04-Jul-2008" "Universally Unique Identifier"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+\&\fB\s-1OSSP\s0 uuid\fR \- \fBUniversally Unique Identifier\fR (\*(C+ \s-1API\s0)
+.SH "VERSION"
+.IX Header "VERSION"
+\&\s-1OSSP\s0 uuid \s-11.6.2 (04-Jul-2008)\s0
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fBuuid++\fR is the \s-1ISO\-\*(C+\s0 language binding of the \fB\s-1OSSP\s0 uuid\fR C \s-1API\s0.
+It provides a thin \s-1ISO\-\*(C+\s0 class \fBuuid\fR wrapping the ISO-C \s-1API\s0 type
+\&\fBuuid_t\fR.
+.SH "APPLICATION PROGRAMMING INTERFACE"
+.IX Header "APPLICATION PROGRAMMING INTERFACE"
+The \s-1ISO\-\*(C+\s0 Application Programming Interface (\s-1API\s0) of \fB\s-1OSSP\s0 uuid\fR
+consists of the following components:
+.Sh "\s-1CONSTANTS\s0"
+.IX Subsection "CONSTANTS"
+The constants are the same to those provided by the ISO-C \s-1API\s0.
+See \fIuuid\fR\|(3) for details.
+.Sh "\s-1CLASSES\s0"
+.IX Subsection "CLASSES"
+The following classes are provided:
+.IP "\fBuuid\fR" 4
+.IX Item "uuid"
+This is the class corresponding to the C \s-1API\s0 type \fBuuid_t\fR.
+It is the main object.
+.IP "\fBuuid_error_t\fR" 4
+.IX Item "uuid_error_t"
+This is the class corresponding to the C \s-1API\s0 function \fBuuid_error\fR.
+It is the object thrown as an exception in case of any errors.
+.Sh "\s-1METHODS\s0"
+.IX Subsection "METHODS"
+The following methods are provided:
+.IP "\fBuuid\fR();" 4
+.IX Item "uuid();"
+The standard constructor.
+.IP "\fBuuid\fR(const uuid &_obj);" 4
+.IX Item "uuid(const uuid &_obj);"
+The copy constructor for \fBuuid\fR class.
+.IP "\fBuuid\fR(const uuid_t *_obj);" 4
+.IX Item "uuid(const uuid_t *_obj);"
+The import constructor for C \s-1API\s0 objects.
+.IP "\fBuuid\fR(const void *_bin);" 4
+.IX Item "uuid(const void *_bin);"
+The import constructor for binary representation.
+.IP "\fBuuid\fR(const char *_str);" 4
+.IX Item "uuid(const char *_str);"
+The import constructor for string representation.
+.IP "~\fBuuid\fR();" 4
+.IX Item "~uuid();"
+The standard destructor for \fBuuid\fR class.
+.IP "uuid &\fBuuid::operator=\fR(const uuid &_obj);" 4
+.IX Item "uuid &uuid::operator=(const uuid &_obj);"
+The assignment operator corresponding to the copy constructor.
+.IP "uuid &\fBuuid::operator=\fR(const uuid_t *_obj);" 4
+.IX Item "uuid &uuid::operator=(const uuid_t *_obj);"
+The assignment operator corresponding to the import constructor for C \s-1API\s0 objects.
+.IP "uuid &\fBuuid::operator=\fR(const void *_bin);" 4
+.IX Item "uuid &uuid::operator=(const void *_bin);"
+The assignment operator corresponding to the import constructor for binary representation.
+.IP "uuid &\fBuuid::operator=\fR(const char *_str);" 4
+.IX Item "uuid &uuid::operator=(const char *_str);"
+The assignment operator corresponding to the import constructor for string and single integer value representation.
+.IP "uuid \fBuuid::clone\fR(void);" 4
+.IX Item "uuid uuid::clone(void);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_clone\fR.
+.IP "void \fBuuid::load\fR(const char *_name);" 4
+.IX Item "void uuid::load(const char *_name);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_load\fR.
+.IP "void \fBuuid::make\fR(unsigned int _mode, ...);" 4
+.IX Item "void uuid::make(unsigned int _mode, ...);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_make\fR.
+.IP "int \fBuuid::isnil\fR(void);" 4
+.IX Item "int uuid::isnil(void);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_isnil\fR.
+.IP "int \fBuuid::compare\fR(const uuid &_obj);" 4
+.IX Item "int uuid::compare(const uuid &_obj);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_compare\fR.
+.IP "int \fBuuid::operator==\fR(const uuid &_obj);" 4
+.IX Item "int uuid::operator==(const uuid &_obj);"
+The comparison operator corresponding to \fBuuid_compare\fR usage for equality.
+.IP "int \fBuuid::operator!=\fR(const uuid &_obj);" 4
+.IX Item "int uuid::operator!=(const uuid &_obj);"
+The comparison operator corresponding to \fBuuid_compare\fR usage for inequality.
+.IP "int \fBuuid::operator<\fR(const uuid &_obj);" 4
+.IX Item "int uuid::operator<(const uuid &_obj);"
+The comparison operator corresponding to \fBuuid_compare\fR usage for less-than.
+.IP "int \fBuuid::operator<=\fR(const uuid &_obj);" 4
+.IX Item "int uuid::operator<=(const uuid &_obj);"
+The comparison operator corresponding to \fBuuid_compare\fR usage for less-than-or-equal.
+.IP "int \fBuuid::operator>\fR(const uuid &_obj);" 4
+.IX Item "int uuid::operator>(const uuid &_obj);"
+The comparison operator corresponding to \fBuuid_compare\fR usage for greater-than.
+.IP "int \fBuuid::operator>=\fR(const uuid &_obj);" 4
+.IX Item "int uuid::operator>=(const uuid &_obj);"
+The comparison operator corresponding to \fBuuid_compare\fR usage for greater-than-or-equal.
+.IP "void \fBuuid::import\fR(const void *_bin);" 4
+.IX Item "void uuid::import(const void *_bin);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_import\fR for binary representation usage.
+.IP "void \fBuuid::import\fR(const char *_str);" 4
+.IX Item "void uuid::import(const char *_str);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_import\fR for string representation usage.
+.IP "void *\fBuuid::binary\fR(void);" 4
+.IX Item "void *uuid::binary(void);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_export\fR for binary representation usage.
+.IP "char *\fBuuid::string\fR(void);" 4
+.IX Item "char *uuid::string(void);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_export\fR for string representation usage.
+.IP "char *\fBuuid::integer\fR(void);" 4
+.IX Item "char *uuid::integer(void);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_export\fR for single integer value representation usage.
+.IP "char *\fBuuid::summary\fR(void);" 4
+.IX Item "char *uuid::summary(void);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_export\fR for textual summary representation usage.
+.IP "unsigned long \fBuuid::version\fR(void);" 4
+.IX Item "unsigned long uuid::version(void);"
+Regular method corresponding to the C \s-1API\s0 function \fBuuid_version\fR.
+.IP "\fBuuid_error_t\fR()" 4
+.IX Item "uuid_error_t()"
+The standard constructor for \fBuuid_error_t\fR class.
+.IP "\fBuuid_error_t\fR(uuid_rc_t _code)" 4
+.IX Item "uuid_error_t(uuid_rc_t _code)"
+The standard constructor for \fBuuid_error_t\fR class with return code initialization.
+.IP "~\fBuuid_error_t\fR()" 4
+.IX Item "~uuid_error_t()"
+The standard destructor for \fBuuid_error_t\fR class.
+.IP "void \fBuuid_error_t::code\fR(uuid_rc_t _code)" 4
+.IX Item "void uuid_error_t::code(uuid_rc_t _code)"
+Regular method for setting the return code.
+.IP "uuid_rc_t \fBuuid_error_t::code\fR(void)" 4
+.IX Item "uuid_rc_t uuid_error_t::code(void)"
+Regular method for fetching the return code.
+.IP "char *\fBuuid_error_t::string\fR(void)" 4
+.IX Item "char *uuid_error_t::string(void)"
+Regular method for fetching the string corresponding to the current return code.
+.SH "EXAMPLE"
+.IX Header "EXAMPLE"
+The following shows an example usage of the \*(C+ \s-1API\s0. Exception handling is
+omitted for code simplification and has to be re-added for production
+code.
+.PP
+.Vb 5
+\& /* generate a DCE 1.1 v1 UUID from system environment */
+\& char *uuid_v1(void)
+\& {
+\& uuid id;
+\& char *str;
+\&
+\& id.make(UUID_MAKE_V1);
+\& str = id.string();
+\& return str;
+\& }
+\&
+\& /* generate a DCE 1.1 v3 UUID from an URL */
+\& char *uuid_v3(const char *url)
+\& {
+\& uuid id;
+\& uuid id_ns;
+\& char *str;
+\&
+\& id_ns.load("ns:URL");
+\& id.make(UUID_MAKE_V3, &id_ns, url);
+\& str = id.string();
+\& return str;
+\& }
+.Ve
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fIuuid\fR\|(3).
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidcc"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid++.cc (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid++.cc         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid++.cc        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,301 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid++.cc: library C++ API implementation
+*/
+
+#include <string.h>
+#include <stdarg.h>
+
+#include "uuid++.hh"
+
+/* standard constructor */
+uuid::uuid()
+{
+ uuid_rc_t rc;
+ if ((rc = uuid_create(&ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+}
+
+/* copy constructor */
+uuid::uuid(const uuid &obj)
+{
+ /* Notice: the copy constructor is the same as the assignment
+ operator (with the object as the argument) below, except that
+ (1) no check for self-assignment is required, (2) no existing
+ internals have to be destroyed and (3) no return value is given back. */
+ uuid_rc_t rc;
+ if ((rc = uuid_clone(obj.ctx, &ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return;
+}
+
+/* extra constructor via C API object */
+uuid::uuid(const uuid_t *obj)
+{
+ uuid_rc_t rc;
+ if (obj == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ if ((rc = uuid_clone(obj, &ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return;
+}
+
+/* extra constructor via binary representation */
+uuid::uuid(const void *bin)
+{
+ uuid_rc_t rc;
+ if (bin == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ if ((rc = uuid_create(&ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ import(bin);
+ return;
+}
+
+/* extra constructor via string representation */
+uuid::uuid(const char *str)
+{
+ uuid_rc_t rc;
+ if (str == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ if ((rc = uuid_create(&ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ import(str);
+ return;
+}
+
+/* standard destructor */
+uuid::~uuid()
+{
+ uuid_destroy(ctx);
+ return;
+}
+
+/* assignment operator: import of other C++ API object */
+uuid &uuid::operator=(const uuid &obj)
+{
+ uuid_rc_t rc;
+ if (this == &obj)
+ return *this;
+ if ((rc = uuid_destroy(ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ if ((rc = uuid_clone(obj.ctx, &ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return *this;
+}
+
+/* assignment operator: import of other C API object */
+uuid &uuid::operator=(const uuid_t *obj)
+{
+ uuid_rc_t rc;
+ if (obj == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ if ((rc = uuid_clone(obj, &ctx)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return *this;
+}
+
+/* assignment operator: import of binary representation */
+uuid &uuid::operator=(const void *bin)
+{
+ if (bin == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ import(bin);
+ return *this;
+}
+
+/* assignment operator: import of string representation */
+uuid &uuid::operator=(const char *str)
+{
+ if (str == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ import(str);
+ return *this;
+}
+
+/* method: clone object */
+uuid uuid::clone(void)
+{
+ return new uuid(this);
+}
+
+/* method: loading existing UUID by name */
+void uuid::load(const char *name)
+{
+ uuid_rc_t rc;
+ if (name == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ if ((rc = uuid_load(ctx, name)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return;
+}
+
+/* method: making new UUID one from scratch */
+void uuid::make(unsigned int mode, ...)
+{
+ uuid_rc_t rc;
+ va_list ap;
+
+ va_start(ap, mode);
+ if ((mode & UUID_MAKE_V3) || (mode & UUID_MAKE_V5)) {
+ const uuid *ns = (const uuid *)va_arg(ap, const uuid *);
+ const char *name = (const char *)va_arg(ap, char *);
+ if (ns == NULL || name == NULL)
+ throw uuid_error_t(UUID_RC_ARG);
+ rc = uuid_make(ctx, mode, ns->ctx, name);
+ }
+ else
+ rc = uuid_make(ctx, mode);
+ va_end(ap);
+ if (rc != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return;
+}
+
+/* method: comparison for Nil UUID */
+int uuid::isnil(void)
+{
+ uuid_rc_t rc;
+ int rv;
+
+ if ((rc = uuid_isnil(ctx, &rv)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return rv;
+}
+
+/* method: comparison against other object */
+int uuid::compare(const uuid &obj)
+{
+ uuid_rc_t rc;
+ int rv;
+
+ if ((rc = uuid_compare(ctx, obj.ctx, &rv)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return rv;
+}
+
+/* method: comparison for equality */
+int uuid::operator==(const uuid &obj)
+{
+ return (compare(obj) == 0);
+}
+
+/* method: comparison for inequality */
+int uuid::operator!=(const uuid &obj)
+{
+ return (compare(obj) != 0);
+}
+
+/* method: comparison for lower-than */
+int uuid::operator<(const uuid &obj)
+{
+ return (compare(obj) < 0);
+}
+
+/* method: comparison for lower-than-or-equal */
+int uuid::operator<=(const uuid &obj)
+{
+ return (compare(obj) <= 0);
+}
+
+/* method: comparison for greater-than */
+int uuid::operator>(const uuid &obj)
+{
+ return (compare(obj) > 0);
+}
+
+/* method: comparison for greater-than-or-equal */
+int uuid::operator>=(const uuid &obj)
+{
+ return (compare(obj) >= 0);
+}
+
+/* method: import binary representation */
+void uuid::import(const void *bin)
+{
+ uuid_rc_t rc;
+ if ((rc = uuid_import(ctx, UUID_FMT_BIN, bin, UUID_LEN_BIN)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return;
+}
+
+/* method: import string or single integer value representation */
+void uuid::import(const char *str)
+{
+ uuid_rc_t rc;
+ if ((rc = uuid_import(ctx, UUID_FMT_STR, str, UUID_LEN_STR)) != UUID_RC_OK)
+ if ((rc = uuid_import(ctx, UUID_FMT_SIV, str, UUID_LEN_SIV)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return;
+}
+
+/* method: export binary representation */
+void *uuid::binary(void)
+{
+ uuid_rc_t rc;
+ void *bin = NULL;
+ if ((rc = uuid_export(ctx, UUID_FMT_BIN, &bin, NULL)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return bin;
+}
+
+/* method: export string representation */
+char *uuid::string(void)
+{
+ uuid_rc_t rc;
+ char *str = NULL;
+ if ((rc = uuid_export(ctx, UUID_FMT_STR, (void **)&str, NULL)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return str;
+}
+
+/* method: export single integer value representation */
+char *uuid::integer(void)
+{
+ uuid_rc_t rc;
+ char *str = NULL;
+ if ((rc = uuid_export(ctx, UUID_FMT_SIV, (void **)&str, NULL)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return str;
+}
+
+/* method: export textual summary representation */
+char *uuid::summary(void)
+{
+ uuid_rc_t rc;
+ char *txt = NULL;
+ if ((rc = uuid_export(ctx, UUID_FMT_TXT, (void **)&txt, NULL)) != UUID_RC_OK)
+ throw uuid_error_t(rc);
+ return txt;
+}
+
+/* method: return library version */
+unsigned long uuid::version(void)
+{
+ return uuid_version();
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidhh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid++.hh (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid++.hh         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid++.hh        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,98 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid++.hh: library C++ API definition
+*/
+
+#ifndef __UUIDXX_HH__
+#define __UUIDXX_HH__
+
+/* required C API header */
+#include <stdlib.h>
+#include "uuid.h"
+
+/* UUID object class */
+class uuid {
+ public:
+ /* construction & destruction */
+ uuid (); /* standard constructor */
+ uuid (const uuid &_obj); /* copy constructor */
+ uuid (const uuid_t *_obj); /* import constructor */
+ uuid (const void *_bin); /* import constructor */
+ uuid (const char *_str); /* import constructor */
+ ~uuid (); /* destructor */
+
+ /* copying & cloning */
+ uuid &operator= (const uuid &_obj); /* copy assignment operator */
+ uuid &operator= (const uuid_t *_obj); /* import assignment operator */
+ uuid &operator= (const void *_bin); /* import assignment operator */
+ uuid &operator= (const char *_str); /* import assignment operator */
+ uuid clone (void); /* regular method */
+
+ /* content generation */
+ void load (const char *_name); /* regular method */
+ void make (unsigned int _mode, ...); /* regular method */
+
+ /* content comparison */
+ int isnil (void); /* regular method */
+ int compare (const uuid &_obj); /* regular method */
+ int operator== (const uuid &_obj); /* comparison operator */
+ int operator!= (const uuid &_obj); /* comparison operator */
+ int operator< (const uuid &_obj); /* comparison operator */
+ int operator<= (const uuid &_obj); /* comparison operator */
+ int operator> (const uuid &_obj); /* comparison operator */
+ int operator>= (const uuid &_obj); /* comparison operator */
+
+ /* content importing & exporting */
+ void import (const void *_bin); /* regular method */
+ void import (const char *_str); /* regular method */
+ void *binary (void); /* regular method */
+ char *string (void); /* regular method */
+ char *integer (void); /* regular method */
+ char *summary (void); /* regular method */
+
+ unsigned long version (void); /* regular method */
+
+ private:
+ uuid_t *ctx;
+};
+
+/* UUID exception class */
+class uuid_error_t {
+ public:
+ uuid_error_t () { code(UUID_RC_OK); };
+ uuid_error_t (uuid_rc_t _code) { code(_code); };
+ ~uuid_error_t () { };
+ void code (uuid_rc_t _code) { rc = _code; };
+ uuid_rc_t code (void) { return rc; };
+ char *string (void) { return uuid_error(rc); };
+
+ private:
+ uuid_rc_t rc;
+};
+
+#endif /* __UUIDXX_HH__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidpod"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid++.pod (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid++.pod         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid++.pod        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,253 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid++.pod: manual page for C++ API
+##
+
+=pod
+
+=head1 NAME
+
+B<OSSP uuid> - B<Universally Unique Identifier> (C++ API)
+
+=head1 VERSION
+
+OSSP uuid UUID_VERSION_STR
+
+=head1 DESCRIPTION
+
+B<uuid++> is the ISO-C++ language binding of the B<OSSP uuid> C API.
+It provides a thin ISO-C++ class B<uuid> wrapping the ISO-C API type
+B<uuid_t>.
+
+=head1 APPLICATION PROGRAMMING INTERFACE
+
+The ISO-C++ Application Programming Interface (API) of B<OSSP uuid>
+consists of the following components:
+
+=head2 CONSTANTS
+
+The constants are the same to those provided by the ISO-C API.
+See uuid(3) for details.
+
+=head2 CLASSES
+
+The following classes are provided:
+
+=over 4
+
+=item B<uuid>
+
+This is the class corresponding to the C API type B<uuid_t>.
+It is the main object.
+
+=item B<uuid_error_t>
+
+This is the class corresponding to the C API function B<uuid_error>.
+It is the object thrown as an exception in case of any errors.
+
+=back
+
+=head2 METHODS
+
+The following methods are provided:
+
+=over 4
+
+=item B<uuid>();
+
+The standard constructor.
+
+=item B<uuid>(const uuid &_obj);
+
+The copy constructor for B<uuid> class.
+
+=item B<uuid>(const uuid_t *_obj);
+
+The import constructor for C API objects.
+
+=item B<uuid>(const void *_bin);
+
+The import constructor for binary representation.
+
+=item B<uuid>(const char *_str);
+
+The import constructor for string representation.
+
+=item ~B<uuid>();
+
+The standard destructor for B<uuid> class.
+
+=item uuid &B<uuid::operator=>(const uuid &_obj);
+
+The assignment operator corresponding to the copy constructor.
+
+=item uuid &B<uuid::operator=>(const uuid_t *_obj);
+
+The assignment operator corresponding to the import constructor for C API objects.
+
+=item uuid &B<uuid::operator=>(const void *_bin);
+
+The assignment operator corresponding to the import constructor for binary representation.
+
+=item uuid &B<uuid::operator=>(const char *_str);
+
+The assignment operator corresponding to the import constructor for string and single integer value representation.
+
+=item uuid B<uuid::clone>(void);
+
+Regular method corresponding to the C API function B<uuid_clone>.
+
+=item void B<uuid::load>(const char *_name);
+
+Regular method corresponding to the C API function B<uuid_load>.
+
+=item void B<uuid::make>(unsigned int _mode, ...);
+
+Regular method corresponding to the C API function B<uuid_make>.
+
+=item int B<uuid::isnil>(void);
+
+Regular method corresponding to the C API function B<uuid_isnil>.
+
+=item int B<uuid::compare>(const uuid &_obj);
+
+Regular method corresponding to the C API function B<uuid_compare>.
+
+=item int B<uuid::operator==>(const uuid &_obj);
+
+The comparison operator corresponding to B<uuid_compare> usage for equality.
+
+=item int B<uuid::operator!=>(const uuid &_obj);
+
+The comparison operator corresponding to B<uuid_compare> usage for inequality.
+
+=item int B<uuid::operatorE<lt>>(const uuid &_obj);
+
+The comparison operator corresponding to B<uuid_compare> usage for less-than.
+
+=item int B<uuid::operatorE<lt>=>(const uuid &_obj);
+
+The comparison operator corresponding to B<uuid_compare> usage for less-than-or-equal.
+
+=item int B<uuid::operatorE<gt>>(const uuid &_obj);
+
+The comparison operator corresponding to B<uuid_compare> usage for greater-than.
+
+=item int B<uuid::operatorE<gt>=>(const uuid &_obj);
+
+The comparison operator corresponding to B<uuid_compare> usage for greater-than-or-equal.
+
+=item void B<uuid::import>(const void *_bin);
+
+Regular method corresponding to the C API function B<uuid_import> for binary representation usage.
+
+=item void B<uuid::import>(const char *_str);
+
+Regular method corresponding to the C API function B<uuid_import> for string representation usage.
+
+=item void *B<uuid::binary>(void);
+
+Regular method corresponding to the C API function B<uuid_export> for binary representation usage.
+
+=item char *B<uuid::string>(void);
+
+Regular method corresponding to the C API function B<uuid_export> for string representation usage.
+
+=item char *B<uuid::integer>(void);
+
+Regular method corresponding to the C API function B<uuid_export> for single integer value representation usage.
+
+=item char *B<uuid::summary>(void);
+
+Regular method corresponding to the C API function B<uuid_export> for textual summary representation usage.
+
+=item unsigned long B<uuid::version>(void);
+
+Regular method corresponding to the C API function B<uuid_version>.
+
+=item B<uuid_error_t>()
+
+The standard constructor for B<uuid_error_t> class.
+
+=item B<uuid_error_t>(uuid_rc_t _code)
+
+The standard constructor for B<uuid_error_t> class with return code initialization.
+
+=item ~B<uuid_error_t>()
+
+The standard destructor for B<uuid_error_t> class.
+
+=item void B<uuid_error_t::code>(uuid_rc_t _code)
+
+Regular method for setting the return code.
+
+=item uuid_rc_t B<uuid_error_t::code>(void)
+
+Regular method for fetching the return code.
+
+=item char *B<uuid_error_t::string>(void)
+
+Regular method for fetching the string corresponding to the current return code.
+
+=back
+
+=head1 EXAMPLE
+
+The following shows an example usage of the C++ API. Exception handling is
+omitted for code simplification and has to be re-added for production
+code.
+
+ /* generate a DCE 1.1 v1 UUID from system environment */
+ char *uuid_v1(void)
+ {
+ uuid id;
+ char *str;
+
+ id.make(UUID_MAKE_V1);
+ str = id.string();
+ return str;
+ }
+
+ /* generate a DCE 1.1 v3 UUID from an URL */
+ char *uuid_v3(const char *url)
+ {
+ uuid id;
+ uuid id_ns;
+ char *str;
+
+ id_ns.load("ns:URL");
+ id.make(UUID_MAKE_V3, &id_ns, url);
+ str = id.string();
+ return str;
+ }
+
+=head1 SEE ALSO
+
+uuid(3).
+
+=cut
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidconfig1"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid-config.1 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid-config.1         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid-config.1        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,236 @@
</span><ins>+.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.07)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C`
+. ds C'
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "UUID-CONFIG 1"
+.TH UUID-CONFIG 1 "OSSP uuid 1.6.2" "04-Jul-2008" "Universally Unique Identifier"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+\&\fBuuid-config\fR \- \fB\s-1OSSP\s0 uuid \s-1API\s0 build utility\fR
+.SH "VERSION"
+.IX Header "VERSION"
+\&\s-1OSSP\s0 uuid \s-11.6.2 (04-Jul-2008)\s0
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+\&\fBuuid-config\fR
+[\fB\-\-help\fR]
+[\fB\-\-version\fR]
+[\fB\-\-all\fR]
+[\fB\-\-prefix\fR]
+[\fB\-\-exec\-prefix\fR]
+[\fB\-\-bindir\fR]
+[\fB\-\-libdir\fR]
+[\fB\-\-includedir\fR]
+[\fB\-\-mandir\fR]
+[\fB\-\-datadir\fR]
+[\fB\-\-acdir\fR]
+[\fB\-\-cflags\fR]
+[\fB\-\-ldflags\fR]
+[\fB\-\-libs\fR]
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+The \fBuuid-config\fR program is a little helper utility for easy configuring and
+building applications based on the \fIuuid\fR\|(3) library. It can be used to query the
+C compiler and linker flags which are required to correctly compile and link
+the application against the \fIuuid\fR\|(3) library.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+\&\fBuuid-config\fR accepts the following options:
+.IP "\fB\-\-help\fR" 2
+.IX Item "--help"
+Prints the short usage information.
+.IP "\fB\-\-version\fR" 2
+.IX Item "--version"
+Prints the version number and date of the installed \fIuuid\fR\|(3) library.
+.IP "\fB\-\-all\fR" 2
+.IX Item "--all"
+Forces the output of all flags, that is, including extra flags which are not
+\&\fB\s-1OSSP\s0 uuid\fR specific.
+.IP "\fB\-\-prefix\fR" 2
+.IX Item "--prefix"
+Prints the installation prefix of architecture independent files
+.IP "\fB\-\-exec\-prefix\fR" 2
+.IX Item "--exec-prefix"
+Prints the installation prefix of architecture dependent files.
+.IP "\fB\-\-bindir\fR" 2
+.IX Item "--bindir"
+Prints the installation directory of binaries.
+.IP "\fB\-\-libdir\fR" 2
+.IX Item "--libdir"
+Prints the installation directory of libraries.
+.IP "\fB\-\-includedir\fR" 2
+.IX Item "--includedir"
+Prints the installation directory of include headers.
+.IP "\fB\-\-mandir\fR" 2
+.IX Item "--mandir"
+Prints the installation directory of manual pages.
+.IP "\fB\-\-datadir\fR" 2
+.IX Item "--datadir"
+Prints the installation directory of shared data.
+.IP "\fB\-\-acdir\fR" 2
+.IX Item "--acdir"
+Prints the installation directory of \fBautoconf\fR data.
+.IP "\fB\-\-cflags\fR" 2
+.IX Item "--cflags"
+Prints the C compiler flags which are needed to compile the \fIuuid\fR\|(3)\-based
+application. The output is usually added to the \f(CW\*(C`CFLAGS\*(C'\fR uuidiable of the
+applications \f(CW\*(C`Makefile\*(C'\fR.
+.IP "\fB\-\-ldflags\fR" 2
+.IX Item "--ldflags"
+Prints the linker flags (\f(CW\*(C`\-L\*(C'\fR) which are needed to link the application with
+the \fIuuid\fR\|(3) library. The output is usually added to the \f(CW\*(C`LDFLAGS\*(C'\fR uuidiable of
+the applications \f(CW\*(C`Makefile\*(C'\fR.
+.IP "\fB\-\-libs\fR" 2
+.IX Item "--libs"
+Prints the library flags (\f(CW\*(C`\-l\*(C'\fR) which are needed to link the application with
+the C \fIuuid\fR\|(3) library. The output is usually added to the \f(CW\*(C`LIBS\*(C'\fR uuidiable of the
+applications \f(CW\*(C`Makefile\*(C'\fR.
+.SH "EXAMPLE"
+.IX Header "EXAMPLE"
+.Vb 4
+\& CC = cc
+\& CFLAGS = \-O \`uuid\-config \-\-cflags\`
+\& LDFLAGS = \`uuid\-config \-\-ldflags\`
+\& LIBS = \-lm \`uuid\-config \-\-libs\`
+\&
+\& all: foo
+\& foo: foo.o
+\& $(CC) $(LDFLAGS) \-o foo foo.o $(LIBS)
+\& foo.o: foo.c
+\& $(CC) $(CFLAGS) \-c foo.c
+.Ve
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fIuuid\fR\|(3), \fIuuid\fR\|(1), \fIOSSP::uuid\fR\|(3).
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidconfigin"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid-config.in (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid-config.in         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid-config.in        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,145 @@
</span><ins>+#!/bin/sh
+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid-config.in: library build utility
+##
+
+DIFS='
+'
+
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+datarootdir="@datarootdir@"
+
+uuid_prefix="$prefix"
+uuid_exec_prefix="$exec_prefix"
+uuid_bindir="@bindir@"
+uuid_libdir="@libdir@"
+uuid_includedir="@includedir@"
+uuid_mandir="@mandir@"
+uuid_datadir="@datadir@"
+uuid_acdir="@datadir@/aclocal"
+uuid_cflags="@CFLAGS@"
+uuid_ldflags="@LDFLAGS@"
+uuid_libs="@LIBS@"
+uuid_version="@UUID_VERSION_STR@"
+
+help=no
+version=no
+
+usage="uuid-config"
+usage="$usage [--help] [--version] [--all]"
+usage="$usage [--prefix] [--exec-prefix] [--bindir] [--libdir] [--includedir] [--mandir] [--datadir] [--acdir]"
+usage="$usage [--cflags] [--ldflags] [--libs]"
+if [ $# -eq 0 ]; then
+ echo "uuid-config:Error: Invalid option" 1>&2
+ echo "uuid-config:Usage: $usage" 1>&2
+ exit 1
+fi
+output=''
+output_extra=''
+all=no
+prev=''
+OIFS="$IFS" IFS="$DIFS"
+for option
+do
+ if [ ".$prev" != . ]; then
+ eval "$prev=\$option"
+ prev=''
+ continue
+ fi
+ case "$option" in
+ -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg='' ;;
+ esac
+ case "$option" in
+ --help|-h)
+ echo "Usage: $usage"
+ exit 0
+ ;;
+ --version|-v)
+ echo "OSSP uuid $uuid_version"
+ exit 0
+ ;;
+ --all)
+ all=yes
+ ;;
+ --prefix)
+ output="$output $uuid_prefix"
+ ;;
+ --exec-prefix)
+ output="$output $uuid_exec_prefix"
+ ;;
+ --bindir)
+ output="$output $uuid_bindir"
+ ;;
+ --libdir)
+ output="$output $uuid_libdir"
+ ;;
+ --includedir)
+ output="$output $uuid_includedir"
+ ;;
+ --mandir)
+ output="$output $uuid_mandir"
+ ;;
+ --datadir)
+ output="$output $uuid_datadir"
+ ;;
+ --acdir)
+ output="$output $uuid_acdir"
+ ;;
+ --cflags)
+ output="$output -I$uuid_includedir"
+ output_extra="$output_extra $uuid_cflags"
+ ;;
+ --ldflags)
+ output="$output -L$uuid_libdir"
+ output_extra="$output_extra $uuid_ldflags"
+ ;;
+ --libs)
+ output="$output -luuid"
+ output_extra="$output_extra $uuid_libs"
+ ;;
+ * )
+ echo "uuid-config:Error: Invalid option" 1>&2
+ echo "uuid-config:Usage: $usage" 1>&2
+ exit 1;
+ ;;
+ esac
+done
+IFS="$OIFS"
+if [ ".$prev" != . ]; then
+ echo "uuid-config:Error: missing argument to --`echo $prev | sed 's/_/-/g'`" 1>&2
+ exit 1
+fi
+if [ ".$output" != . ]; then
+ if [ ".$all" = .yes ]; then
+ output="$output $output_extra"
+ fi
+ echo $output
+fi
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidconfigpod"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid-config.pod (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid-config.pod         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid-config.pod        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,155 @@
</span><ins>+#!/bin/sh
+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid-config.pod: library build utility manpage
+##
+
+=pod
+
+=head1 NAME
+
+B<uuid-config> - B<OSSP uuid API build utility>
+
+=head1 VERSION
+
+OSSP uuid UUID_VERSION_STR
+
+=head1 SYNOPSIS
+
+B<uuid-config>
+[B<--help>]
+[B<--version>]
+[B<--all>]
+[B<--prefix>]
+[B<--exec-prefix>]
+[B<--bindir>]
+[B<--libdir>]
+[B<--includedir>]
+[B<--mandir>]
+[B<--datadir>]
+[B<--acdir>]
+[B<--cflags>]
+[B<--ldflags>]
+[B<--libs>]
+
+=head1 DESCRIPTION
+
+The B<uuid-config> program is a little helper utility for easy configuring and
+building applications based on the uuid(3) library. It can be used to query the
+C compiler and linker flags which are required to correctly compile and link
+the application against the uuid(3) library.
+
+=head1 OPTIONS
+
+B<uuid-config> accepts the following options:
+
+=over 2
+
+=item B<--help>
+
+Prints the short usage information.
+
+=item B<--version>
+
+Prints the version number and date of the installed uuid(3) library.
+
+=item B<--all>
+
+Forces the output of all flags, that is, including extra flags which are not
+B<OSSP uuid> specific.
+
+=item B<--prefix>
+
+Prints the installation prefix of architecture independent files
+
+=item B<--exec-prefix>
+
+Prints the installation prefix of architecture dependent files.
+
+=item B<--bindir>
+
+Prints the installation directory of binaries.
+
+=item B<--libdir>
+
+Prints the installation directory of libraries.
+
+=item B<--includedir>
+
+Prints the installation directory of include headers.
+
+=item B<--mandir>
+
+Prints the installation directory of manual pages.
+
+=item B<--datadir>
+
+Prints the installation directory of shared data.
+
+=item B<--acdir>
+
+Prints the installation directory of B<autoconf> data.
+
+=item B<--cflags>
+
+Prints the C compiler flags which are needed to compile the uuid(3)-based
+application. The output is usually added to the C<CFLAGS> uuidiable of the
+applications C<Makefile>.
+
+=item B<--ldflags>
+
+Prints the linker flags (C<-L>) which are needed to link the application with
+the uuid(3) library. The output is usually added to the C<LDFLAGS> uuidiable of
+the applications C<Makefile>.
+
+=item B<--libs>
+
+Prints the library flags (C<-l>) which are needed to link the application with
+the C uuid(3) library. The output is usually added to the C<LIBS> uuidiable of the
+applications C<Makefile>.
+
+=back
+
+=head1 EXAMPLE
+
+ CC = cc
+ CFLAGS = -O `uuid-config --cflags`
+ LDFLAGS = `uuid-config --ldflags`
+ LIBS = -lm `uuid-config --libs`
+
+ all: foo
+ foo: foo.o
+ $(CC) $(LDFLAGS) -o foo foo.o $(LIBS)
+ foo.o: foo.c
+ $(CC) $(CFLAGS) -c foo.c
+
+=head1 SEE ALSO
+
+uuid(3), uuid(1), OSSP::uuid(3).
+
+=cut
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid1"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid.1 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid.1         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid.1        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,291 @@
</span><ins>+.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.07)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C`
+. ds C'
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "UUID 1"
+.TH UUID 1 "OSSP uuid 1.6.2" "04-Jul-2008" "Universally Unique Identifier"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+\&\fB\s-1OSSP\s0 uuid\fR \- \fBUniversally Unique Identifier Command-Line Tool\fR
+.SH "VERSION"
+.IX Header "VERSION"
+\&\s-1OSSP\s0 uuid \s-11.6.2 (04-Jul-2008)\s0
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+\&\fBuuid\fR
+[\fB\-v\fR \fIversion\fR]
+[\fB\-m\fR]
+[\fB\-n\fR \fIcount\fR]
+[\fB\-1\fR]
+[\fB\-F\fR \fIformat\fR]
+[\fB\-o\fR \fIfilename\fR]
+[\fInamespace\fR \fIname\fR]
+.PP
+\&\fBuuid\fR
+\&\fB\-d\fR
+[\fB\-r\fR]
+[\fB\-o\fR \fIfilename\fR]
+\&\fIuuid\fR
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fB\s-1OSSP\s0 uuid\fR is a \s-1ISO\-C:1999\s0 application programming interface (\s-1API\s0) and
+corresponding command line interface (\s-1CLI\s0) for the generation of \s-1DCE\s0
+1.1, \s-1ISO/IEC\s0 11578:1996 and \s-1IETF\s0 \s-1RFC\-4122\s0 compliant \fIUniversally Unique
+Identifier\fR (\s-1UUID\s0). It supports \s-1DCE\s0 1.1 variant UUIDs of version 1 (time
+and node based), version 3 (name based, \s-1MD5\s0), version 4 (random number
+based) and version 5 (name based, \s-1SHA\-1\s0). Additional \s-1API\s0 bindings are
+provided for the languages \s-1ISO\-\*(C+:1998\s0, Perl:5 and \s-1PHP:4/5\s0. Optional
+backward compatibility exists for the ISO-C \s-1DCE\-1\s0.1 and Perl Data::UUID
+APIs.
+.PP
+UUIDs are 128 bit numbers which are intended to have a high likelihood
+of uniqueness over space and time and are computationally difficult
+to guess. They are globally unique identifiers which can be locally
+generated without contacting a global registration authority. UUIDs
+are intended as unique identifiers for both mass tagging objects
+with an extremely short lifetime and to reliably identifying very
+persistent objects across a network.
+.PP
+This is the command line interface (\s-1CLI\s0) of \fB\s-1OSSP\s0 uuid\fR. For a
+detailed description of UUIDs see the documentation of the application
+programming interface (\s-1API\s0) in \fIuuid\fR\|(3).
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+.IP "\fB\-v\fR \fIversion\fR" 3
+.IX Item "-v version"
+Sets the version of the generated \s-1DCE\s0 1.1 variant \s-1UUID\s0. Supported
+are \fIversion\fR "\f(CW1\fR\*(L", \*(R"\f(CW3\fR\*(L", \*(R"\f(CW4\fR\*(L" and \*(R"\f(CW5\fR\*(L". The default is \*(R"\f(CW1\fR".
+.Sp
+For version 3 and version 5 UUIDs the additional command line arguments
+\&\fInamespace\fR and \fIname\fR have to be given. The \fInamespace\fR is either
+a \s-1UUID\s0 in string representation or an identifier for internally
+pre-defined namespace UUIDs (currently known are "\f(CW\*(C`ns:DNS\*(C'\fR\*(L",
+\&\*(R"\f(CW\*(C`ns:URL\*(C'\fR\*(L", \*(R"\f(CW\*(C`ns:OID\*(C'\fR\*(L", and \*(R"\f(CW\*(C`ns:X500\*(C'\fR"). The \fIname\fR is a string of
+arbitrary length.
+.IP "\fB\-m\fR" 3
+.IX Item "-m"
+Forces the use of a random multi-cast \s-1MAC\s0 address when generating
+version 1 UUIDs. By default the real physical \s-1MAC\s0 address of the system
+is used.
+.IP "\fB\-n\fR \fIcount\fR" 3
+.IX Item "-n count"
+Generate \fIcount\fR UUIDs instead of just a single one (the default).
+.IP "\fB\-1\fR" 3
+.IX Item "-1"
+If option \fB\-n\fR is used with a \fIcount\fR greater than \f(CW1\fR, then this
+option can enforce the reset the \s-1UUID\s0 context for each generated \s-1UUID\s0.
+This makes no difference for \fIversion\fR \f(CW3\fR, \f(CW4\fR and \f(CW5\fR UUIDs. But
+version \f(CW1\fR UUIDs are based on the previously generated \s-1UUID\s0 which is
+remembered in the \s-1UUID\s0 context of the \s-1API\s0. Option \fB\-1\fR deletes the
+remembered \s-1UUID\s0 on each iteration.
+.IP "\fB\-F\fR \fIformat\fR" 3
+.IX Item "-F format"
+Representation format for importing or exporting an \s-1UUID\s0. The
+following (case insensitive) format identifiers are currently recognized:
+.RS 3
+.ie n .IP "\*(C`BIN\*(C' (binary representation)" 4
+.el .IP "\f(CW\*(C`BIN\*(C'\fR (binary representation)" 4
+.IX Item "BIN (binary representation)"
+This is the raw 128 bit network byte order binary representation of a
+\&\s-1UUID\s0. Example is the octet stream \f(CW\*(C`0xF8 0x1D 0x4F 0xAE 0x7D 0xEC 0x11
+0xD0 0xA7 0x65 0x00 0xA0 0xC9 0x1E 0x6B 0xF6\*(C'\fR.
+.ie n .IP "\*(C`STR\*(C' (string representation)" 4
+.el .IP "\f(CW\*(C`STR\*(C'\fR (string representation)" 4
+.IX Item "STR (string representation)"
+This is the 36 character hexadecimal \s-1ASCII\s0 string representation of a
+\&\s-1UUID\s0. Example is the string "\f(CW\*(C`f81d4fae\-7dec\-11d0\-a765\-00a0c91e6bf6\*(C'\fR".
+.ie n .IP "\*(C`SIV\*(C' (single integer value representation)" 4
+.el .IP "\f(CW\*(C`SIV\*(C'\fR (single integer value representation)" 4
+.IX Item "SIV (single integer value representation)"
+This is the maximum 39 character long single integer
+value representation of a \s-1UUID\s0. Example is the string
+"\f(CW329800735698586629295641978511506172918\fR".
+.RE
+.RS 3
+.RE
+.IP "\fB\-o\fR \fIfilename\fR" 3
+.IX Item "-o filename"
+Write output to \fIfilename\fR instead of to \fIstdout\fR.
+.IP "\fB\-d\fR" 3
+.IX Item "-d"
+Decode a given \s-1UUID\s0 (given as a command line argument or if the command
+line argument is "\f(CW\*(C`\-\*(C'\fR" the \s-1UUID\s0 is read from \fIstdin\fR) and dump textual
+information about the \s-1UUID\s0.
+.SH "EXAMPLES"
+.IX Header "EXAMPLES"
+.Vb 3
+\& # generate DCE 1.1 v1 UUID (time and node based)
+\& $ uuid \-v1
+\& 01c47915\-4777\-11d8\-bc70\-0090272ff725
+\&
+\& # decode and dump DCE 1.1 v1 UUID (time and node based)
+\& $ uuid \-d 01c47915\-4777\-11d8\-bc70\-0090272ff725
+\& encode: STR: 01c47915\-4777\-11d8\-bc70\-0090272ff725
+\& SIV: 2349374037528578887923094374772111141
+\& decode: variant: DCE 1.1, ISO/IEC 11578:1996
+\& version: 1 (time and node based)
+\& content: time: 2004\-01\-15 16:22:26.376322.1 UTC
+\& clock: 15472 (usually random)
+\& node: 00:90:27:2f:f7:25 (global unicast)
+\&
+\& # generate DCE 1.1 v3 UUID (name based)
+\& $ uuid \-v3 ns:URL http://www.ossp.org/
+\& 02d9e6d5\-9467\-382e\-8f9b\-9300a64ac3cd
+\&
+\& # decode and dump DCE 1.1 v3 UUID (name based)
+\& $ uuid \-d 02d9e6d5\-9467\-382e\-8f9b\-9300a64ac3cd
+\& encode: STR: 02d9e6d5\-9467\-382e\-8f9b\-9300a64ac3cd
+\& SIV: 3789866285607910888100818383505376205
+\& decode: variant: DCE 1.1, ISO/IEC 11578:1996
+\& version: 3 (name based, MD5)
+\& content: 02:D9:E6:D5:94:67:08:2E:0F:9B:93:00:A6:4A:C3:CD
+\& (not decipherable: MD5 message digest only)
+\&
+\& # generate DCE 1.1 v4 UUID 4 (random data based)
+\& $ uuid \-v4
+\& eb424026\-6f54\-4ef8\-a4d0\-bb658a1fc6cf
+\&
+\& # decode and dump DCE 1.1 v4 UUID 4 (random data based)
+\& $ uuid \-d eb424026\-6f54\-4ef8\-a4d0\-bb658a1fc6cf
+\& encode: STR: eb424026\-6f54\-4ef8\-a4d0\-bb658a1fc6cf
+\& SIV: 312712571721458096795100956955942831823
+\& decode: variant: DCE 1.1, ISO/IEC 11578:1996
+\& version: 4 (random data based)
+\& content: EB:42:40:26:6F:54:0E:F8:24:D0:BB:65:8A:1F:C6:CF
+\& (no semantics: random data only)
+.Ve
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fIuuid\fR\|(3), \fIOSSP::uuid\fR\|(3).
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid3"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid.3 (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid.3         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid.3        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,578 @@
</span><ins>+.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.07)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C`
+. ds C'
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title ".::uuid 3"
+.TH .::uuid 3 "OSSP uuid 1.6.2" "04-Jul-2008" "Universally Unique Identifier"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+\&\fB\s-1OSSP\s0 uuid\fR \- \fBUniversally Unique Identifier\fR
+.SH "VERSION"
+.IX Header "VERSION"
+\&\s-1OSSP\s0 uuid \s-11.6.2 (04-Jul-2008)\s0
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fB\s-1OSSP\s0 uuid\fR is a \s-1ISO\-C:1999\s0 application programming interface (\s-1API\s0) and
+corresponding command line interface (\s-1CLI\s0) for the generation of \s-1DCE\s0
+1.1, \s-1ISO/IEC\s0 11578:1996 and \s-1IETF\s0 \s-1RFC\-4122\s0 compliant \fIUniversally Unique
+Identifier\fR (\s-1UUID\s0). It supports \s-1DCE\s0 1.1 variant UUIDs of version 1 (time
+and node based), version 3 (name based, \s-1MD5\s0), version 4 (random number
+based) and version 5 (name based, \s-1SHA\-1\s0). Additional \s-1API\s0 bindings are
+provided for the languages \s-1ISO\-\*(C+:1998\s0, Perl:5 and \s-1PHP:4/5\s0. Optional
+backward compatibility exists for the ISO-C \s-1DCE\-1\s0.1 and Perl Data::UUID
+APIs.
+.PP
+UUIDs are 128 bit numbers which are intended to have a high likelihood
+of uniqueness over space and time and are computationally difficult
+to guess. They are globally unique identifiers which can be locally
+generated without contacting a global registration authority. UUIDs
+are intended as unique identifiers for both mass tagging objects
+with an extremely short lifetime and to reliably identifying very
+persistent objects across a network.
+.PP
+This is the ISO-C application programming interface (\s-1API\s0) of \fB\s-1OSSP\s0 uuid\fR.
+.Sh "\s-1UUID\s0 Binary Representation"
+.IX Subsection "UUID Binary Representation"
+According to the \s-1DCE\s0 1.1, \s-1ISO/IEC\s0 11578:1996 and \s-1IETF\s0 \s-1RFC\-4122\s0
+standards, a \s-1DCE\s0 1.1 variant \s-1UUID\s0 is a 128 bit number defined out of 7
+fields, each field a multiple of an octet in size and stored in network
+byte order:
+.PP
+.Vb 11
+\& [4]
+\& version
+\& \-\->| |<\-\-
+\& | |
+\& | | [16]
+\& [32] [16] | |time_hi
+\& time_low time_mid | _and_version
+\& |<\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\->||<\-\-\-\-\-\-\-\-\-\-\-\->||<\-\-\-\-\-\-\-\-\-\-\-\->|
+\& | MSB || || | |
+\& | / || || | |
+\& |/ || || | |
+\&
+\& +\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-+~~
+\& | 15 || 14 || 13 || 12 || 11 || 10 |####9 || 8 |
+\& | MSO || || || || || |#### || |
+\& +\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-+~~
+\& 7654321076543210765432107654321076543210765432107654321076543210
+\&
+\& ~~+\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-+
+\& ##* 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 |
+\& ##* || || || || || || || LSO |
+\& ~~+\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-++\-\-\-\-\-\-+
+\& 7654321076543210765432107654321076543210765432107654321076543210
+\&
+\& | | || || /|
+\& | | || || / |
+\& | | || || LSB |
+\& |<\-\-\-\->||<\-\-\-\->||<\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\->|
+\& |clk_seq clk_seq node
+\& |_hi_res _low [48]
+\& |[5\-6] [8]
+\& | |
+\& \-\->| |<\-\-
+\& variant
+\& [2\-3]
+.Ve
+.PP
+An example of a \s-1UUID\s0 binary representation is the octet stream \f(CW\*(C`0xF8
+0x1D 0x4F 0xAE 0x7D 0xEC 0x11 0xD0 0xA7 0x65 0x00 0xA0 0xC9 0x1E 0x6B
+0xF6\*(C'\fR. The binary representation format is exactly what the \fB\s-1OSSP\s0 uuid\fR
+\&\s-1API\s0 functions \fBuuid_import\fR() and \fBuuid_export\fR() deal with under
+\&\f(CW\*(C`UUID_FMT_BIN\*(C'\fR.
+.Sh "\s-1UUID\s0 \s-1ASCII\s0 String Representation"
+.IX Subsection "UUID ASCII String Representation"
+According to the \s-1DCE\s0 1.1, \s-1ISO/IEC\s0 11578:1996 and \s-1IETF\s0 \s-1RFC\-4122\s0
+standards, a \s-1DCE\s0 1.1 variant \s-1UUID\s0 is represented as an \s-1ASCII\s0 string
+consisting of 8 hexadecimal digits followed by a hyphen, then three
+groups of 4 hexadecimal digits each followed by a hyphen, then 12
+hexadecimal digits. Formally, the string representation is defined by
+the following grammar:
+.PP
+.Vb 10
+\& uuid = <time_low> "\-"
+\& <time_mid> "\-"
+\& <time_high_and_version> "\-"
+\& <clock_seq_high_and_reserved>
+\& <clock_seq_low> "\-"
+\& <node>
+\& time_low = 4*<hex_octet>
+\& time_mid = 2*<hex_octet>
+\& time_high_and_version = 2*<hex_octet>
+\& clock_seq_high_and_reserved = <hex_octet>
+\& clock_seq_low = <hex_octet>
+\& node = 6*<hex_octet>
+\& hex_octet = <hex_digit> <hex_digit>
+\& hex_digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
+\& |"a"|"b"|"c"|"d"|"e"|"f"
+\& |"A"|"B"|"C"|"D"|"E"|"F"
+.Ve
+.PP
+An example of a \s-1UUID\s0 string representation is the \s-1ASCII\s0 string
+"\f(CW\*(C`f81d4fae\-7dec\-11d0\-a765\-00a0c91e6bf6\*(C'\fR". The string representation
+format is exactly what the \fB\s-1OSSP\s0 uuid\fR \s-1API\s0 functions \fBuuid_import\fR()
+and \fBuuid_export\fR() deal with under \f(CW\*(C`UUID_FMT_STR\*(C'\fR.
+.PP
+Notice: a corresponding \s-1URL\s0 can be generated out of a \s-1ASCII\s0 string
+representation of an \s-1UUID\s0 by prefixing with "\f(CW\*(C`urn:uuid:\*(C'\fR\*(L" as in
+\&\*(R"\f(CW\*(C`urn:uuid:f81d4fae\-7dec\-11d0\-a765\-00a0c91e6bf6\*(C'\fR".
+.Sh "\s-1UUID\s0 Single Integer Value Representation"
+.IX Subsection "UUID Single Integer Value Representation"
+According to the \s-1ISO/IEC\s0 11578:1996 and ITU-T Rec. X.667 standards, a
+\&\s-1DCE\s0 1.1 variant \s-1UUID\s0 can be also represented as a single integer value
+consisting of a decimal number with up to 39 digits.
+.PP
+An example of a \s-1UUID\s0 single integer value representation is the decimal
+number "\f(CW329800735698586629295641978511506172918\fR". The string
+representation format is exactly what the \fB\s-1OSSP\s0 uuid\fR \s-1API\s0 functions
+\&\fBuuid_import\fR() and \fBuuid_export\fR() deal with under \f(CW\*(C`UUID_FMT_SIV\*(C'\fR.
+.PP
+Notice: a corresponding \s-1ISO\s0 \s-1OID\s0 can be generated under the
+\&\*(L"{\fIjoint\-iso\-itu\-t\fR\|(2) uuid(25)}\*(R" arc out of a single integer value
+representation of a \s-1UUID\s0 by prefixing with "\f(CW2.25.\fR\*(L". An example \s-1OID\s0
+is \*(R"\f(CW2.25.329800735698586629295641978511506172918\fR\*(L". Additionally,
+an \s-1URL\s0 can be generated by further prefixing with \*(R"\f(CW\*(C`urn:oid:\*(C'\fR\*(L" as in
+\&\*(R"\f(CW\*(C`urn:oid:2.25.329800735698586629295641978511506172918\*(C'\fR".
+.Sh "\s-1UUID\s0 Variants and Versions"
+.IX Subsection "UUID Variants and Versions"
+A \s-1UUID\s0 has a variant and version. The variant defines the layout of the
+\&\s-1UUID\s0. The version defines the content of the \s-1UUID\s0. The \s-1UUID\s0 variant
+supported in \fB\s-1OSSP\s0 uuid\fR is the \s-1DCE\s0 1.1 variant only. The \s-1DCE\s0 1.1 \s-1UUID\s0
+variant versions supported in \fB\s-1OSSP\s0 uuid\fR are:
+.IP "\fBVersion 1\fR (time and node based)" 4
+.IX Item "Version 1 (time and node based)"
+These are the classical UUIDs, created out of a 60\-bit system time,
+a 14\-bit local clock sequence and 48\-bit system \s-1MAC\s0 address. The \s-1MAC\s0
+address can be either the real one of a physical network interface card
+(\s-1NIC\s0) or a random multi-cast \s-1MAC\s0 address. Version 1 UUIDs are usually
+used as one-time global unique identifiers.
+.IP "\fBVersion 3\fR (name based, \s-1MD5\s0)" 4
+.IX Item "Version 3 (name based, MD5)"
+These are UUIDs which are based on the 128\-bit \s-1MD5\s0 message digest of the
+concatenation of a 128\-bit namespace \s-1UUID\s0 and a name string of arbitrary
+length. Version 3 UUIDs are usually used for non-unique but repeatable
+message digest identifiers.
+.IP "\fBVersion 4\fR (random data based)" 4
+.IX Item "Version 4 (random data based)"
+These are UUIDs which are based on just 128\-bit of random data. Version
+4 UUIDs are usually used as one-time local unique identifiers.
+.IP "\fBVersion 5\fR (name based, \s-1SHA\-1\s0)" 4
+.IX Item "Version 5 (name based, SHA-1)"
+These are UUIDs which are based on the 160\-bit \s-1SHA\-1\s0 message digest of the
+concatenation of a 128\-bit namespace \s-1UUID\s0 and a name string of arbitrary
+length. Version 5 UUIDs are usually used for non-unique but repeatable
+message digest identifiers.
+.Sh "\s-1UUID\s0 Uniqueness"
+.IX Subsection "UUID Uniqueness"
+Version 1 UUIDs are guaranteed to be unique through combinations of
+hardware addresses, time stamps and random seeds. There is a reference
+in the \s-1UUID\s0 to the hardware (\s-1MAC\s0) address of the first network interface
+card (\s-1NIC\s0) on the host which generated the \s-1UUID\s0 \*(-- this reference
+is intended to ensure the \s-1UUID\s0 will be unique in space as the \s-1MAC\s0
+address of every network card is assigned by a single global authority
+(\s-1IEEE\s0) and is guaranteed to be unique. The next component in a \s-1UUID\s0
+is a timestamp which, as clock always (should) move forward, will
+be unique in time. Just in case some part of the above goes wrong
+(the hardware address cannot be determined or the clock moved steps
+backward), there is a random clock sequence component placed into the
+\&\s-1UUID\s0 as a \*(L"catch-all\*(R" for uniqueness.
+.PP
+Version 3 and version 5 UUIDs are guaranteed to be inherently globally
+unique if the combination of namespace and name used to generate them is
+unique.
+.PP
+Version 4 UUIDs are not guaranteed to be globally unique, because they
+are generated out of locally gathered pseudo-random numbers only.
+Nevertheless there is still a high likelihood of uniqueness over space
+and time and that they are computationally difficult to guess.
+.Sh "Nil \s-1UUID\s0"
+.IX Subsection "Nil UUID"
+There is a special \fINil\fR \s-1UUID\s0 consisting of all octets set to zero in
+the binary representation. It can be used as a special \s-1UUID\s0 value which does
+not conflict with real UUIDs.
+.SH "APPLICATION PROGRAMMING INTERFACE"
+.IX Header "APPLICATION PROGRAMMING INTERFACE"
+The ISO-C Application Programming Interface (\s-1API\s0) of \fB\s-1OSSP\s0 uuid\fR
+consists of the following components.
+.Sh "\s-1CONSTANTS\s0"
+.IX Subsection "CONSTANTS"
+The following constants are provided:
+.IP "\fB\s-1UUID_VERSION\s0\fR" 4
+.IX Item "UUID_VERSION"
+The hexadecimal encoded \fB\s-1OSSP\s0 uuid\fR version. This allows compile-time
+checking of the \fB\s-1OSSP\s0 uuid\fR version. For run-time checking use
+\&\fBuuid_version\fR() instead.
+.Sp
+The hexadecimal encoding for a version "$\fIv\fR.$\fIr\fR$\fIt\fR$\fIl\fR" is
+calculated with the \fB\s-1GNU\s0 shtool\fR \fBversion\fR command and is (in
+Perl-style for concise description) "sprintf('0x%x%02x%d%02x', $\fIv\fR,
+$\fIr\fR, {qw(s 9 . 2 b 1 a 0)}\->{$\fIt\fR}, ($\fIt\fR eq 's' ? 99 : $\fIl\fR))\*(L",
+i.e., the version 0.9.6 is encoded as \*(R"0x009206".
+.IP "\fB\s-1UUID_LEN_BIN\s0\fR, \fB\s-1UUID_LEN_STR\s0\fR, \fB\s-1UUID_LEN_SIV\s0\fR" 4
+.IX Item "UUID_LEN_BIN, UUID_LEN_STR, UUID_LEN_SIV"
+The number of octets of the \s-1UUID\s0 binary and string representations.
+Notice that the lengths of the string representation (\fB\s-1UUID_LEN_STR\s0\fR)
+and the lengths of the single integer value representation
+(\fB\s-1UUID_LEN_SIV\s0\fR) does \fInot\fR include the necessary \f(CW\*(C`NUL\*(C'\fR termination
+character.
+.IP "\fB\s-1UUID_MAKE_V1\s0\fR, \fB\s-1UUID_MAKE_V3\s0\fR, \fB\s-1UUID_MAKE_V4\s0\fR, \fB\s-1UUID_MAKE_V5\s0\fR, \fB\s-1UUID_MAKE_MC\s0\fR" 4
+.IX Item "UUID_MAKE_V1, UUID_MAKE_V3, UUID_MAKE_V4, UUID_MAKE_V5, UUID_MAKE_MC"
+The \fImode\fR bits for use with \fBuuid_make\fR(). The \fB\s-1UUID_MAKE_V\s0\fR\fIN\fR
+specify which \s-1UUID\s0 version to generate. The \fB\s-1UUID_MAKE_MC\s0\fR forces the
+use of a random multi-cast \s-1MAC\s0 address instead of the real physical \s-1MAC\s0
+address in version 1 UUIDs.
+.IP "\fB\s-1UUID_RC_OK\s0\fR, \fB\s-1UUID_RC_ARG\s0\fR, \fB\s-1UUID_RC_MEM\s0\fR, \fB\s-1UUID_RC_SYS\s0\fR, \fB\s-1UUID_RC_INT\s0\fR, \fB\s-1UUID_RC_IMP\s0\fR" 4
+.IX Item "UUID_RC_OK, UUID_RC_ARG, UUID_RC_MEM, UUID_RC_SYS, UUID_RC_INT, UUID_RC_IMP"
+The possible numerical return-codes of \s-1API\s0 functions.
+The \f(CW\*(C`UUID_RC_OK\*(C'\fR indicates success, the others indicate errors.
+Use \fBuuid_error\fR() to translate them into string versions.
+.IP "\fB\s-1UUID_FMT_BIN\s0\fR, \fB\s-1UUID_FMT_STR\s0\fR, \fB\s-1UUID_FMT_SIV\s0\fR, \fB\s-1UUID_FMT_TXT\s0\fR" 4
+.IX Item "UUID_FMT_BIN, UUID_FMT_STR, UUID_FMT_SIV, UUID_FMT_TXT"
+The \fIfmt\fR formats for use with \fBuuid_import\fR() and \fBuuid_export\fR().
+The \fB\s-1UUID_FMT_BIN\s0\fR indicates the \s-1UUID\s0 binary representation (of
+length \fB\s-1UUID_LEN_BIN\s0\fR), the \fB\s-1UUID_FMT_STR\s0\fR indicates the \s-1UUID\s0 string
+representation (of length \fB\s-1UUID_LEN_STR\s0\fR), the \fB\s-1UUID_FMT_SIV\s0\fR
+indicates the \s-1UUID\s0 single integer value representation (of maximum
+length \fB\s-1UUID_LEN_SIV\s0\fR) and the \fB\s-1UUID_FMT_TXT\s0\fR indicates the textual
+description (of arbitrary length) of a \s-1UUID\s0.
+.Sh "\s-1FUNCTIONS\s0"
+.IX Subsection "FUNCTIONS"
+The following functions are provided:
+.IP "uuid_rc_t \fBuuid_create\fR(uuid_t **\fIuuid\fR);" 4
+.IX Item "uuid_rc_t uuid_create(uuid_t **uuid);"
+Create a new \s-1UUID\s0 object and store a pointer to it in \f(CW\*(C`*\*(C'\fR\fIuuid\fR.
+A \s-1UUID\s0 object consists of an internal representation of a \s-1UUID\s0, the
+internal \s-1PRNG\s0 and \s-1MD5\s0 generator contexts, and cached \s-1MAC\s0 address and
+timestamp information. The initial \s-1UUID\s0 is the \fINil\fR \s-1UUID\s0.
+.IP "uuid_rc_t \fBuuid_destroy\fR(uuid_t *\fIuuid\fR);" 4
+.IX Item "uuid_rc_t uuid_destroy(uuid_t *uuid);"
+Destroy \s-1UUID\s0 object \fIuuid\fR.
+.IP "uuid_rc_t \fBuuid_clone\fR(const uuid_t *\fIuuid\fR, uuid_t **\fIuuid_clone\fR);" 4
+.IX Item "uuid_rc_t uuid_clone(const uuid_t *uuid, uuid_t **uuid_clone);"
+Clone \s-1UUID\s0 object \fIuuid\fR and store new \s-1UUID\s0 object in \fIuuid_clone\fR.
+.IP "uuid_rc_t \fBuuid_isnil\fR(const uuid_t *\fIuuid\fR, int *\fIresult\fR);" 4
+.IX Item "uuid_rc_t uuid_isnil(const uuid_t *uuid, int *result);"
+Checks whether the \s-1UUID\s0 in \fIuuid\fR is the \fINil\fR \s-1UUID\s0.
+If this is the case, it returns \fItrue\fR in \f(CW\*(C`*\*(C'\fR\fIresult\fR.
+Else it returns \fIfalse\fR in \f(CW\*(C`*\*(C'\fR\fIresult\fR.
+.IP "uuid_rc_t \fBuuid_compare\fR(const uuid_t *\fIuuid\fR, const uuid_t *\fIuuid2\fR, int *\fIresult\fR);" 4
+.IX Item "uuid_rc_t uuid_compare(const uuid_t *uuid, const uuid_t *uuid2, int *result);"
+Compares the order of the two UUIDs in \fIuuid1\fR and \fIuuid2\fR
+and returns the result in \f(CW\*(C`*\*(C'\fR\fIresult\fR: \f(CW\*(C`\-1\*(C'\fR if \fIuuid1\fR is
+smaller than \fIuuid2\fR, \f(CW0\fR if \fIuuid1\fR is equal to \fIuuid2\fR
+and \f(CW+1\fR if \fIuuid1\fR is greater than \fIuuid2\fR.
+.IP "uuid_rc_t \fBuuid_import\fR(uuid_t *\fIuuid\fR, uuid_fmt_t \fIfmt\fR, const void *\fIdata_ptr\fR, size_t \fIdata_len\fR);" 4
+.IX Item "uuid_rc_t uuid_import(uuid_t *uuid, uuid_fmt_t fmt, const void *data_ptr, size_t data_len);"
+Imports a \s-1UUID\s0 \fIuuid\fR from an external representation of format \fIfmt\fR.
+The data is read from the buffer at \fIdata_ptr\fR which contains at least
+\&\fIdata_len\fR bytes.
+.Sp
+The format of the external representation is specified by \fIfmt\fR and the
+minimum expected length in \fIdata_len\fR depends on it. Valid values for
+\&\fIfmt\fR are \fB\s-1UUID_FMT_BIN\s0\fR, \fB\s-1UUID_FMT_STR\s0\fR and \fB\s-1UUID_FMT_SIV\s0\fR.
+.IP "uuid_rc_t \fBuuid_export\fR(const uuid_t *\fIuuid\fR, uuid_fmt_t \fIfmt\fR, void *\fIdata_ptr\fR, size_t *\fIdata_len\fR);" 4
+.IX Item "uuid_rc_t uuid_export(const uuid_t *uuid, uuid_fmt_t fmt, void *data_ptr, size_t *data_len);"
+Exports a \s-1UUID\s0 \fIuuid\fR into an external representation of format
+\&\fIfmt\fR. Valid values for \fIfmt\fR are \fB\s-1UUID_FMT_BIN\s0\fR, \fB\s-1UUID_FMT_STR\s0\fR,
+\&\fB\s-1UUID_FMT_SIV\s0\fR and \fB\s-1UUID_FMT_TXT\s0\fR.
+.Sp
+The data is written to the buffer whose location is obtained
+by dereferencing \fIdata_ptr\fR after a \*(L"cast\*(R" to the appropriate
+pointer-to-pointer type. Hence the generic pointer argument \fIdata_ptr\fR
+is expected to be a pointer to a \*(L"pointer of a particular type\*(R", i.e.,
+it has to be of type "\f(CW\*(C`unsigned char **\*(C'\fR" for \fB\s-1UUID_FMT_BIN\s0\fR and
+"\f(CW\*(C`char **\*(C'\fR" for \fB\s-1UUID_FMT_STR\s0\fR, \fB\s-1UUID_FMT_SIV\s0\fR and \fB\s-1UUID_FMT_TXT\s0\fR.
+.Sp
+The buffer has to be room for at least \f(CW\*(C`*\*(C'\fR\fIdata_len\fR bytes. If the
+value of the pointer after \*(L"casting\*(R" and dereferencing \fIdata_ptr\fR
+is \f(CW\*(C`NULL\*(C'\fR, \fIdata_len\fR is ignored as input and a new buffer is
+allocated and returned in the pointer after \*(L"casting\*(R" and dereferencing
+\&\fIdata_ptr\fR (the caller has to \fIfree\fR\|(3) it later on).
+.Sp
+If \fIdata_len\fR is not \f(CW\*(C`NULL\*(C'\fR, the number of available bytes in the
+buffer has to be provided in \f(CW\*(C`*\*(C'\fR\fIdata_len\fR and the number of actually
+written bytes are returned in \f(CW\*(C`*\*(C'\fR\fIdata_len\fR again. The minimum
+required buffer length depends on the external representation as
+specified by \fIfmt\fR and is at least \fB\s-1UUID_LEN_BIN\s0\fR for \fB\s-1UUID_FMT_BIN\s0\fR,
+\&\fB\s-1UUID_LEN_STR\s0\fR for \fB\s-1UUID_FMT_STR\s0\fR and \fB\s-1UUID_LEN_SIV\s0\fR for
+\&\fB\s-1UUID_FMT_SIV\s0\fR. For \fB\s-1UUID_FMT_TXT\s0\fR a buffer of unspecified length is
+required and hence it is recommended to allow \fB\s-1OSSP\s0 uuid\fR to allocate
+the buffer as necessary.
+.IP "uuid_rc_t \fBuuid_load\fR(uuid_t *\fIuuid\fR, const char *\fIname\fR);" 4
+.IX Item "uuid_rc_t uuid_load(uuid_t *uuid, const char *name);"
+Loads a pre-defined \s-1UUID\s0 value into the \s-1UUID\s0 object \fIuuid\fR. The
+following \fIname\fR arguments are currently known:
+.RS 4
+.IP "\fIname\fR \fI\s-1UUID\s0\fR" 4
+.IX Item "name UUID"
+.PD 0
+.IP "nil 00000000\-0000\-0000\-0000\-000000000000" 4
+.IX Item "nil 00000000-0000-0000-0000-000000000000"
+.IP "ns:DNS 6ba7b810\-9dad\-11d1\-80b4\-00c04fd430c8" 4
+.IX Item "ns:DNS 6ba7b810-9dad-11d1-80b4-00c04fd430c8"
+.IP "ns:URL 6ba7b811\-9dad\-11d1\-80b4\-00c04fd430c8" 4
+.IX Item "ns:URL 6ba7b811-9dad-11d1-80b4-00c04fd430c8"
+.IP "ns:OID 6ba7b812\-9dad\-11d1\-80b4\-00c04fd430c8" 4
+.IX Item "ns:OID 6ba7b812-9dad-11d1-80b4-00c04fd430c8"
+.IP "ns:X500 6ba7b814\-9dad\-11d1\-80b4\-00c04fd430c8" 4
+.IX Item "ns:X500 6ba7b814-9dad-11d1-80b4-00c04fd430c8"
+.RE
+.RS 4
+.PD
+.Sp
+The "\f(CW\*(C`ns:\*(C'\fR\fI\s-1XXX\s0\fR" are names of pre-defined name-space UUIDs for use in
+the generation of \s-1DCE\s0 1.1 version 3 and version 5 UUIDs.
+.RE
+.IP "uuid_rc_t \fBuuid_make\fR(uuid_t *\fIuuid\fR, unsigned int \fImode\fR, ...);" 4
+.IX Item "uuid_rc_t uuid_make(uuid_t *uuid, unsigned int mode, ...);"
+Generates a new \s-1UUID\s0 in \fIuuid\fR according to \fImode\fR and optional
+arguments (dependent on \fImode\fR).
+.Sp
+If \fImode\fR contains the \f(CW\*(C`UUID_MAKE_V1\*(C'\fR bit, a \s-1DCE\s0 1.1 variant \s-1UUID\s0 of
+version 1 is generated. Then optionally the bit \f(CW\*(C`UUID_MAKE_MC\*(C'\fR forces
+the use of random multi-cast \s-1MAC\s0 address instead of the real physical
+\&\s-1MAC\s0 address (the default). The \s-1UUID\s0 is generated out of the 60\-bit current
+system time, a 12\-bit clock sequence and the 48\-bit \s-1MAC\s0 address.
+.Sp
+If \fImode\fR contains the \f(CW\*(C`UUID_MAKE_V3\*(C'\fR or \f(CW\*(C`UUID_MAKE_V5\*(C'\fR bit, a \s-1DCE\s0
+1.1 variant \s-1UUID\s0 of version 3 or 5 is generated and two additional
+arguments are expected: first, a namespace \s-1UUID\s0 object (\f(CW\*(C`uuid_t *\*(C'\fR).
+Second, a name string of arbitrary length (\f(CW\*(C`const char *\*(C'\fR). The \s-1UUID\s0 is
+generated out of the 128\-bit \s-1MD5\s0 or 160\-bit \s-1SHA\-1\s0 from the concatenated
+octet stream of namespace \s-1UUID\s0 and name string.
+.Sp
+If \fImode\fR contains the \f(CW\*(C`UUID_MAKE_V4\*(C'\fR bit, a \s-1DCE\s0 1.1 variant \s-1UUID\s0
+of version 4 is generated. The \s-1UUID\s0 is generated out of 128\-bit random
+data.
+.IP "char *\fBuuid_error\fR(uuid_rc_t \fIrc\fR);" 4
+.IX Item "char *uuid_error(uuid_rc_t rc);"
+Returns a constant string representation corresponding to the
+return-code \fIrc\fR for use in displaying \fB\s-1OSSP\s0 uuid\fR errors.
+.IP "unsigned long \fBuuid_version\fR(void);" 4
+.IX Item "unsigned long uuid_version(void);"
+Returns the hexadecimal encoded \fB\s-1OSSP\s0 uuid\fR version as compiled into
+the library object files. This allows run-time checking of the \fB\s-1OSSP\s0
+uuid\fR version. For compile-time checking use \f(CW\*(C`UUID_VERSION\*(C'\fR instead.
+.SH "EXAMPLE"
+.IX Header "EXAMPLE"
+The following shows an example usage of the \s-1API\s0. Error handling is
+omitted for code simplification and has to be re-added for production
+code.
+.PP
+.Vb 5
+\& /* generate a DCE 1.1 v1 UUID from system environment */
+\& char *uuid_v1(void)
+\& {
+\& uuid_t *uuid;
+\& char *str;
+\&
+\& uuid_create(&uuid);
+\& uuid_make(uuid, UUID_MAKE_V1);
+\& str = NULL;
+\& uuid_export(uuid, UUID_FMT_STR, &str, NULL);
+\& uuid_destroy(uuid);
+\& return str;
+\& }
+\&
+\& /* generate a DCE 1.1 v3 UUID from an URL */
+\& char *uuid_v3(const char *url)
+\& {
+\& uuid_t *uuid;
+\& uuid_t *uuid_ns;
+\& char *str;
+\&
+\& uuid_create(&uuid);
+\& uuid_create(&uuid_ns);
+\& uuid_load(uuid_ns, "ns:URL");
+\& uuid_make(uuid, UUID_MAKE_V3, uuid_ns, url);
+\& str = NULL;
+\& uuid_export(uuid, UUID_FMT_STR, &str, NULL);
+\& uuid_destroy(uuid_ns);
+\& uuid_destroy(uuid);
+\& return str;
+\& }
+.Ve
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+The following are references to \fB\s-1UUID\s0\fR documentation and specifications:
+.IP "\(bu" 4
+\&\fBA Universally Unique IDentifier (\s-1UUID\s0) \s-1URN\s0 Namespace\fR,
+P. Leach, M. Mealling, R. Salz,
+\&\s-1IETF\s0 \s-1RFC\-4122\s0,
+July 2005, 32 pages,
+http://www.ietf.org/rfc/rfc4122.txt
+.IP "\(bu" 4
+Information Technology \*(-- Open Systems Interconnection (\s-1OSI\s0),
+\&\fBProcedures for the operation of \s-1OSI\s0 Registration Authorities:
+Generation and Registration of Universally Unique Identifiers (UUIDs)
+and their Use as \s-1ASN\s0.1 Object Identifier Components\fR,
+\&\s-1ISO/IEC\s0 9834\-8:2004 / ITU-T Rec. X.667, 2004,
+December 2004, 25 pages,
+http://www.itu.int/ITU\-T/studygroups/com17/oid/X.667\-E.pdf
+.IP "\(bu" 4
+\&\fB\s-1DCE\s0 1.1: Remote Procedure Call\fR,
+appendix \fBUniversally Unique Identifier\fR,
+Open Group Technical Standard
+Document Number C706, August 1997, 737 pages,
+(supersedes C309 \s-1DCE:\s0 Remote Procedure Call 8/1994,
+which was basis for \s-1ISO/IEC\s0 11578:1996 specification),
+http://www.opengroup.org/publications/catalog/c706.htm
+.IP "\(bu" 4
+Information technology \*(-- Open Systems Interconnection (\s-1OSI\s0),
+\&\fBRemote Procedure Call (\s-1RPC\s0)\fR,
+\&\s-1ISO/IEC\s0 11578:1996,
+August 2001, 570 pages, (\s-1CHF\s0 340,00),
+http://www.iso.ch/cate/d2229.html
+.IP "\(bu" 4
+\&\fB\s-1HTTP\s0 Extensions for Distributed Authoring (WebDAV)\fR,
+section \fB6.4.1 Node Field Generation Without the \s-1IEEE\s0 802 Address\fR,
+\&\s-1IETF\s0 \s-1RFC\-2518\s0,
+February 1999, 94 pages,
+http://www.ietf.org/rfc/rfc2518.txt
+.IP "\(bu" 4
+\&\fB\s-1DCE\s0 1.1 compliant \s-1UUID\s0 functions\fR,
+FreeBSD manual pages \fIuuid\fR\|(3) and \fIuuidgen\fR\|(2),
+http://www.freebsd.org/cgi/man.cgi?query=uuid&manpath=FreeBSD+6.0\-RELEASE
+.SH "HISTORY"
+.IX Header "HISTORY"
+\&\fB\s-1OSSP\s0 uuid\fR was implemented in January 2004 by Ralf S. Engelschall
+<rse@engelschall.com>. It was prompted by the use of UUIDs
+in the \fB\s-1OSSP\s0 as\fR and \fBOpenPKG\fR projects. It is a clean room
+implementation intended to be strictly standards compliant and maximum
+portable.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fIuuid\fR\|(1), \fIuuid\-config\fR\|(1), \fIOSSP::uuid\fR\|(3).
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidac"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid.ac (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid.ac         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid.ac        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,206 @@
</span><ins>+dnl ##
+dnl ## OSSP uuid - Universally Unique Identifier
+dnl ## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+dnl ## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+dnl ##
+dnl ## This file is part of OSSP uuid, a library for the generation
+dnl ## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+dnl ##
+dnl ## Permission to use, copy, modify, and distribute this software for
+dnl ## any purpose with or without fee is hereby granted, provided that
+dnl ## the above copyright notice and this permission notice appear in all
+dnl ## copies.
+dnl ##
+dnl ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+dnl ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+dnl ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+dnl ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+dnl ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+dnl ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+dnl ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+dnl ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+dnl ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+dnl ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+dnl ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+dnl ## SUCH DAMAGE.
+dnl ##
+dnl ## uuid.ac: UUID specific Autoconf checks
+dnl ##
+
+dnl # Check for anything OSSP uuid wants to know
+dnl # configure.in:
+dnl # UUID_CHECK_ALL
+
+AC_DEFUN([UUID_CHECK_ALL],[
+ dnl # make sure libnsl and libsocket are linked in if they exist
+ AC_CHECK_LIB(nsl, gethostname)
+ if test ".`echo $LIBS | grep nsl`" = .; then
+ AC_CHECK_LIB(nsl, gethostbyname)
+ fi
+ AC_CHECK_LIB(socket, accept)
+
+ dnl # check for portable va_copy()
+ AC_CHECK_VA_COPY()
+
+ dnl # check for system headers
+ AC_CHECK_HEADERS(sys/types.h sys/param.h sys/time.h sys/socket.h sys/sockio.h sys/ioctl.h sys/select.h)
+ AC_CHECK_HEADERS(netdb.h ifaddrs.h net/if.h net/if_dl.h net/if_arp.h netinet/in.h arpa/inet.h,,,
+[[
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#if HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+]])
+
+ dnl # check for existence of particular C structures
+ AC_MSG_CHECKING(for struct timeval)
+ AC_TRY_COMPILE([
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <time.h>
+ ],[ struct timeval tv; ],
+ [ msg="yes" ], [ msg="no" ])
+ if test ".$msg" = .yes; then
+ AC_DEFINE(HAVE_STRUCT_TIMEVAL, 1, [define if exists "struct timeval"])
+ fi
+ AC_MSG_RESULT([$msg])
+
+ dnl # check for functions
+ AC_CHECK_FUNCS(getifaddrs nanosleep Sleep gettimeofday clock_gettime)
+
+ dnl # check size of built-in types
+ AC_CHECK_TYPES([long long, long double])
+ AC_CHECK_SIZEOF(char, 1)
+ AC_CHECK_SIZEOF(unsigned char, 1)
+ AC_CHECK_SIZEOF(short, 2)
+ AC_CHECK_SIZEOF(unsigned short, 2)
+ AC_CHECK_SIZEOF(int, 4)
+ AC_CHECK_SIZEOF(unsigned int, 4)
+ AC_CHECK_SIZEOF(long, 4)
+ AC_CHECK_SIZEOF(unsigned long, 4)
+ AC_CHECK_SIZEOF(long long, 8)
+ AC_CHECK_SIZEOF(unsigned long long, 8)
+
+ dnl # configure option --with-dce
+ AC_ARG_WITH([dce],
+ AC_HELP_STRING([--with-dce], [build DCE 1.1 backward compatibility API]),
+ [ac_cv_with_dce=$withval], [ac_cv_with_dce=no])
+ AC_CACHE_CHECK([whether to build DCE 1.1 backward compatibility API], [ac_cv_with_dce], [ac_cv_with_dce=no])
+ if test ".$ac_cv_with_dce" = ".yes"; then
+ AC_DEFINE(WITH_DCE, 1, [whether to build DCE 1.1 backward compatibility API])
+ WITH_DCE='yes'
+ DCE_NAME='$(DCE_NAME)'
+ else
+ WITH_DCE='no'
+ DCE_NAME=''
+ fi
+ AC_SUBST(WITH_DCE)
+ AC_SUBST(DCE_NAME)
+
+ dnl # configure option --with-cxx
+ AC_ARG_WITH([cxx],
+ AS_HELP_STRING([--with-cxx], [build C++ bindings to C API]),
+ [ac_cv_with_cxx=$withval], [ac_cv_with_cxx=no])
+ AC_CACHE_CHECK([whether to build C++ bindings to C API], [ac_cv_with_cxx], [ac_cv_with_cxx=no])
+ if test ".$ac_cv_with_cxx" = ".yes"; then
+ AC_DEFINE(WITH_CXX, 1, [whether to build C++ bindings to C API])
+ WITH_CXX='yes'
+ CXX_NAME='$(CXX_NAME)'
+ AC_PROG_CXX
+ else
+ WITH_CXX='no'
+ CXX_NAME=''
+ fi
+ AC_SUBST(CXX_NAME)
+ AC_SUBST(WITH_CXX)
+
+ dnl # configure option --with-perl
+ AC_ARG_WITH([perl],
+ AS_HELP_STRING([--with-perl], [build Perl bindings to C API]),
+ [ac_cv_with_perl=$withval], [ac_cv_with_perl=no])
+ AC_CACHE_CHECK([whether to build Perl bindings to C API], [ac_cv_with_perl], [ac_cv_with_perl=no])
+ AC_ARG_WITH([perl-compat],
+ AS_HELP_STRING([--with-perl-compat], [build Perl compatibility API]),
+ [ac_cv_with_perl_compat=$withval], [ac_cv_with_perl_compat=no])
+ AC_CACHE_CHECK([whether to build Perl compatibility API], [ac_cv_with_perl_compat], [ac_cv_with_perl_compat=no])
+ if test ".$ac_cv_with_perl" = ".yes"; then
+ AC_DEFINE(WITH_PERL, 1, [whether to build Perl bindings to C API])
+ WITH_PERL='yes'
+ PERL_NAME='$(PERL_NAME)'
+ else
+ WITH_PERL='no'
+ PERL_NAME=''
+ fi
+ if test ".$ac_cv_with_perl_compat" = ".yes"; then
+ AC_DEFINE(WITH_PERL_COMPAT, 1, [whether to build Perl compatibility API])
+ WITH_PERL_COMPAT=1
+ else
+ WITH_PERL_COMPAT=0
+ fi
+ AC_SUBST(PERL_NAME)
+ AC_SUBST(WITH_PERL)
+ AC_SUBST(WITH_PERL_COMPAT)
+ AC_PATH_PROG(PERL, perl, NA)
+ if test ".$ac_cv_with_perl" = ".yes" -a ".$PERL" = ".NA"; then
+ AC_ERROR([required Perl interpreter not found in \$PATH])
+ fi
+
+ dnl # configure option --with-php
+ AC_ARG_WITH([php],
+ AS_HELP_STRING([--with-php], [build PHP bindings to C API]),
+ [ac_cv_with_php=$withval], [ac_cv_with_php=no])
+ AC_CACHE_CHECK([whether to build PHP bindings to C API], [ac_cv_with_php], [ac_cv_with_php=no])
+ if test ".$ac_cv_with_php" = ".yes"; then
+ AC_DEFINE(WITH_PHP, 1, [whether to build PHP bindings to C API])
+ WITH_PHP='yes'
+ PHP_NAME='$(PHP_NAME)'
+ else
+ WITH_PHP='no'
+ PHP_NAME=''
+ fi
+ AC_SUBST(PHP_NAME)
+ AC_SUBST(WITH_PHP)
+ AC_PATH_PROGS(PHP, php5 php, NA)
+ if test ".$ac_cv_with_php" = ".yes" -a ".$PHP" = ".NA"; then
+ AC_ERROR([required PHP interpreter not found in \$PATH])
+ fi
+ if test ".$ac_cv_with_php" = ".yes"; then
+ (cd php && make -f Makefile.local config PHP=$PHP)
+ fi
+
+ dnl # configure option --with-pgsql
+ AC_ARG_WITH([pgsql],
+ AS_HELP_STRING([--with-pgsql], [build PostgreSQL bindings to C API]),
+ [ac_cv_with_pgsql=$withval], [ac_cv_with_pgsql=no])
+ AC_CACHE_CHECK([whether to build PostgreSQL bindings to C API], [ac_cv_with_pgsql], [ac_cv_with_pgsql=no])
+ if test ".$ac_cv_with_pgsql" = ".yes"; then
+ AC_DEFINE(WITH_PGSQL, 1, [whether to build PostgreSQL bindings to C API])
+ WITH_PGSQL='yes'
+ PGSQL_NAME='$(PGSQL_NAME)'
+ else
+ WITH_PGSQL='no'
+ PGSQL_NAME=''
+ fi
+ AC_SUBST(PGSQL_NAME)
+ AC_SUBST(WITH_PGSQL)
+ AC_PATH_PROGS(PG_CONFIG, pg_config, NA)
+ if test ".$ac_cv_with_pgsql" = ".yes" -a ".$PG_CONFIG" = ".NA"; then
+ AC_ERROR([required PostgreSQL pg_config utility not found in \$PATH])
+ fi
+ if test ".$ac_cv_with_pgsql" = ".yes" -a ".`${MAKE-make} -v 2>/dev/null | grep GNU`" = .; then
+ AC_ERROR([PostgreSQL bindings require GNU make to build])
+ fi
+])
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidc"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,1217 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid.c: library API implementation
+*/
+
+/* own headers (part 1/2) */
+#include "uuid.h"
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+/* own headers (part 2/2) */
+#include "uuid_vers.h"
+#include "uuid_md5.h"
+#include "uuid_sha1.h"
+#include "uuid_prng.h"
+#include "uuid_mac.h"
+#include "uuid_time.h"
+#include "uuid_ui64.h"
+#include "uuid_ui128.h"
+#include "uuid_str.h"
+#include "uuid_bm.h"
+#include "uuid_ac.h"
+
+/* maximum number of 100ns ticks of the actual resolution of system clock
+ (which in our case is 1us (= 1000ns) because we use gettimeofday(2) */
+#define UUIDS_PER_TICK 10
+
+/* time offset between UUID and Unix Epoch time according to standards.
+ (UUID UTC base time is October 15, 1582
+ Unix UTC base time is January 1, 1970) */
+#define UUID_TIMEOFFSET "01B21DD213814000"
+
+/* IEEE 802 MAC address encoding/decoding bit fields */
+#define IEEE_MAC_MCBIT BM_OCTET(0,0,0,0,0,0,0,1)
+#define IEEE_MAC_LOBIT BM_OCTET(0,0,0,0,0,0,1,0)
+
+/* IEEE 802 MAC address octet length */
+#define IEEE_MAC_OCTETS 6
+
+/* UUID binary representation according to UUID standards */
+typedef struct {
+ uuid_uint32_t time_low; /* bits 0-31 of time field */
+ uuid_uint16_t time_mid; /* bits 32-47 of time field */
+ uuid_uint16_t time_hi_and_version; /* bits 48-59 of time field plus 4 bit version */
+ uuid_uint8_t clock_seq_hi_and_reserved; /* bits 8-13 of clock sequence field plus 2 bit variant */
+ uuid_uint8_t clock_seq_low; /* bits 0-7 of clock sequence field */
+ uuid_uint8_t node[IEEE_MAC_OCTETS]; /* bits 0-47 of node MAC address */
+} uuid_obj_t;
+
+/* abstract data type (ADT) of API */
+struct uuid_st {
+ uuid_obj_t obj; /* inlined UUID object */
+ prng_t *prng; /* RPNG sub-object */
+ md5_t *md5; /* MD5 sub-object */
+ sha1_t *sha1; /* SHA-1 sub-object */
+ uuid_uint8_t mac[IEEE_MAC_OCTETS]; /* pre-determined MAC address */
+ struct timeval time_last; /* last retrieved timestamp */
+ unsigned long time_seq; /* last timestamp sequence counter */
+};
+
+/* create UUID object */
+uuid_rc_t uuid_create(uuid_t **uuid)
+{
+ uuid_t *obj;
+
+ /* argument sanity check */
+ if (uuid == NULL)
+ return UUID_RC_ARG;
+
+ /* allocate UUID object */
+ if ((obj = (uuid_t *)malloc(sizeof(uuid_t))) == NULL)
+ return UUID_RC_MEM;
+
+ /* create PRNG, MD5 and SHA1 sub-objects */
+ if (prng_create(&obj->prng) != PRNG_RC_OK) {
+ free(obj);
+ return UUID_RC_INT;
+ }
+ if (md5_create(&obj->md5) != MD5_RC_OK) {
+ (void)prng_destroy(obj->prng);
+ free(obj);
+ return UUID_RC_INT;
+ }
+ if (sha1_create(&obj->sha1) != SHA1_RC_OK) {
+ (void)md5_destroy(obj->md5);
+ (void)prng_destroy(obj->prng);
+ free(obj);
+ return UUID_RC_INT;
+ }
+
+ /* set UUID object initially to "Nil UUID" */
+ if (uuid_load(obj, "nil") != UUID_RC_OK) {
+ (void)sha1_destroy(obj->sha1);
+ (void)md5_destroy(obj->md5);
+ (void)prng_destroy(obj->prng);
+ free(obj);
+ return UUID_RC_INT;
+ }
+
+ /* resolve MAC address for insertion into node field of UUIDs */
+ if (!mac_address((unsigned char *)(obj->mac), sizeof(obj->mac))) {
+ memset(obj->mac, 0, sizeof(obj->mac));
+ obj->mac[0] = BM_OCTET(1,0,0,0,0,0,0,0);
+ }
+
+ /* initialize time attributes */
+ obj->time_last.tv_sec = 0;
+ obj->time_last.tv_usec = 0;
+ obj->time_seq = 0;
+
+ /* store result object */
+ *uuid = obj;
+
+ return UUID_RC_OK;
+}
+
+/* destroy UUID object */
+uuid_rc_t uuid_destroy(uuid_t *uuid)
+{
+ /* argument sanity check */
+ if (uuid == NULL)
+ return UUID_RC_ARG;
+
+ /* destroy PRNG, MD5 and SHA-1 sub-objects */
+ (void)prng_destroy(uuid->prng);
+ (void)md5_destroy(uuid->md5);
+ (void)sha1_destroy(uuid->sha1);
+
+ /* free UUID object */
+ free(uuid);
+
+ return UUID_RC_OK;
+}
+
+/* clone UUID object */
+uuid_rc_t uuid_clone(const uuid_t *uuid, uuid_t **clone)
+{
+ uuid_t *obj;
+
+ /* argument sanity check */
+ if (uuid == NULL || uuid_clone == NULL)
+ return UUID_RC_ARG;
+
+ /* allocate UUID object */
+ if ((obj = (uuid_t *)malloc(sizeof(uuid_t))) == NULL)
+ return UUID_RC_MEM;
+
+ /* clone entire internal state */
+ memcpy(obj, uuid, sizeof(uuid_t));
+
+ /* re-initialize with new PRNG, MD5 and SHA1 sub-objects */
+ if (prng_create(&obj->prng) != PRNG_RC_OK) {
+ free(obj);
+ return UUID_RC_INT;
+ }
+ if (md5_create(&obj->md5) != MD5_RC_OK) {
+ (void)prng_destroy(obj->prng);
+ free(obj);
+ return UUID_RC_INT;
+ }
+ if (sha1_create(&obj->sha1) != SHA1_RC_OK) {
+ (void)md5_destroy(obj->md5);
+ (void)prng_destroy(obj->prng);
+ free(obj);
+ return UUID_RC_INT;
+ }
+
+ /* store result object */
+ *clone = obj;
+
+ return UUID_RC_OK;
+}
+
+/* check whether UUID object represents "Nil UUID" */
+uuid_rc_t uuid_isnil(const uuid_t *uuid, int *result)
+{
+ const unsigned char *ucp;
+ int i;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || result == NULL)
+ return UUID_RC_ARG;
+
+ /* a "Nil UUID" is defined as all octets zero, so check for this case */
+ *result = UUID_TRUE;
+ for (i = 0, ucp = (unsigned char *)&(uuid->obj); i < UUID_LEN_BIN; i++) {
+ if (*ucp++ != (unsigned char)'\0') {
+ *result = UUID_FALSE;
+ break;
+ }
+ }
+
+ return UUID_RC_OK;
+}
+
+/* compare UUID objects */
+uuid_rc_t uuid_compare(const uuid_t *uuid1, const uuid_t *uuid2, int *result)
+{
+ int r;
+
+ /* argument sanity check */
+ if (result == NULL)
+ return UUID_RC_ARG;
+
+ /* convenience macro for setting result */
+#define RESULT(r) \
+ /*lint -save -e801 -e717*/ \
+ do { \
+ *result = (r); \
+ goto result_exit; \
+ } while (0) \
+ /*lint -restore*/
+
+ /* special cases: NULL or equal UUIDs */
+ if (uuid1 == uuid2)
+ RESULT(0);
+ if (uuid1 == NULL && uuid2 == NULL)
+ RESULT(0);
+ if (uuid1 == NULL)
+ RESULT((uuid_isnil(uuid2, &r) == UUID_RC_OK ? r : 0) ? 0 : -1);
+ if (uuid2 == NULL)
+ RESULT((uuid_isnil(uuid1, &r) == UUID_RC_OK ? r : 0) ? 0 : 1);
+
+ /* standard cases: regular different UUIDs */
+ if (uuid1->obj.time_low != uuid2->obj.time_low)
+ RESULT((uuid1->obj.time_low < uuid2->obj.time_low) ? -1 : 1);
+ if ((r = (int)uuid1->obj.time_mid
+ - (int)uuid2->obj.time_mid) != 0)
+ RESULT((r < 0) ? -1 : 1);
+ if ((r = (int)uuid1->obj.time_hi_and_version
+ - (int)uuid2->obj.time_hi_and_version) != 0)
+ RESULT((r < 0) ? -1 : 1);
+ if ((r = (int)uuid1->obj.clock_seq_hi_and_reserved
+ - (int)uuid2->obj.clock_seq_hi_and_reserved) != 0)
+ RESULT((r < 0) ? -1 : 1);
+ if ((r = (int)uuid1->obj.clock_seq_low
+ - (int)uuid2->obj.clock_seq_low) != 0)
+ RESULT((r < 0) ? -1 : 1);
+ if ((r = memcmp(uuid1->obj.node, uuid2->obj.node, sizeof(uuid1->obj.node))) != 0)
+ RESULT((r < 0) ? -1 : 1);
+
+ /* default case: the keys are equal */
+ *result = 0;
+
+ result_exit:
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: unpack UUID binary presentation into UUID object
+ (allows in-place operation for internal efficiency!) */
+static uuid_rc_t uuid_import_bin(uuid_t *uuid, const void *data_ptr, size_t data_len)
+{
+ const uuid_uint8_t *in;
+ uuid_uint32_t tmp32;
+ uuid_uint16_t tmp16;
+ unsigned int i;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL || data_len < UUID_LEN_BIN)
+ return UUID_RC_ARG;
+
+ /* treat input data buffer as octet stream */
+ in = (const uuid_uint8_t *)data_ptr;
+
+ /* unpack "time_low" field */
+ tmp32 = (uuid_uint32_t)(*in++);
+ tmp32 = (tmp32 << 8) | (uuid_uint32_t)(*in++);
+ tmp32 = (tmp32 << 8) | (uuid_uint32_t)(*in++);
+ tmp32 = (tmp32 << 8) | (uuid_uint32_t)(*in++);
+ uuid->obj.time_low = tmp32;
+
+ /* unpack "time_mid" field */
+ tmp16 = (uuid_uint16_t)(*in++);
+ tmp16 = (uuid_uint16_t)(tmp16 << 8) | (uuid_uint16_t)(*in++);
+ uuid->obj.time_mid = tmp16;
+
+ /* unpack "time_hi_and_version" field */
+ tmp16 = (uuid_uint16_t)*in++;
+ tmp16 = (uuid_uint16_t)(tmp16 << 8) | (uuid_uint16_t)(*in++);
+ uuid->obj.time_hi_and_version = tmp16;
+
+ /* unpack "clock_seq_hi_and_reserved" field */
+ uuid->obj.clock_seq_hi_and_reserved = *in++;
+
+ /* unpack "clock_seq_low" field */
+ uuid->obj.clock_seq_low = *in++;
+
+ /* unpack "node" field */
+ for (i = 0; i < (unsigned int)sizeof(uuid->obj.node); i++)
+ uuid->obj.node[i] = *in++;
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: pack UUID object into binary representation
+ (allows in-place operation for internal efficiency!) */
+static uuid_rc_t uuid_export_bin(const uuid_t *uuid, void *_data_ptr, size_t *data_len)
+{
+ uuid_uint8_t **data_ptr;
+ uuid_uint8_t *out;
+ uuid_uint32_t tmp32;
+ uuid_uint16_t tmp16;
+ unsigned int i;
+
+ /* cast generic data pointer to particular pointer to pointer type */
+ data_ptr = (uuid_uint8_t **)_data_ptr;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL)
+ return UUID_RC_ARG;
+
+ /* optionally allocate octet data buffer */
+ if (*data_ptr == NULL) {
+ if ((*data_ptr = (uuid_uint8_t *)malloc(sizeof(uuid_t))) == NULL)
+ return UUID_RC_MEM;
+ if (data_len != NULL)
+ *data_len = UUID_LEN_BIN;
+ }
+ else {
+ if (data_len == NULL)
+ return UUID_RC_ARG;
+ if (*data_len < UUID_LEN_BIN)
+ return UUID_RC_MEM;
+ *data_len = UUID_LEN_BIN;
+ }
+
+ /* treat output data buffer as octet stream */
+ out = *data_ptr;
+
+ /* pack "time_low" field */
+ tmp32 = uuid->obj.time_low;
+ out[3] = (uuid_uint8_t)(tmp32 & 0xff); tmp32 >>= 8;
+ out[2] = (uuid_uint8_t)(tmp32 & 0xff); tmp32 >>= 8;
+ out[1] = (uuid_uint8_t)(tmp32 & 0xff); tmp32 >>= 8;
+ out[0] = (uuid_uint8_t)(tmp32 & 0xff);
+
+ /* pack "time_mid" field */
+ tmp16 = uuid->obj.time_mid;
+ out[5] = (uuid_uint8_t)(tmp16 & 0xff); tmp16 >>= 8;
+ out[4] = (uuid_uint8_t)(tmp16 & 0xff);
+
+ /* pack "time_hi_and_version" field */
+ tmp16 = uuid->obj.time_hi_and_version;
+ out[7] = (uuid_uint8_t)(tmp16 & 0xff); tmp16 >>= 8;
+ out[6] = (uuid_uint8_t)(tmp16 & 0xff);
+
+ /* pack "clock_seq_hi_and_reserved" field */
+ out[8] = uuid->obj.clock_seq_hi_and_reserved;
+
+ /* pack "clock_seq_low" field */
+ out[9] = uuid->obj.clock_seq_low;
+
+ /* pack "node" field */
+ for (i = 0; i < (unsigned int)sizeof(uuid->obj.node); i++)
+ out[10+i] = uuid->obj.node[i];
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: check for valid UUID string representation syntax */
+static int uuid_isstr(const char *str, size_t str_len)
+{
+ int i;
+ const char *cp;
+
+ /* example reference:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ 012345678901234567890123456789012345
+ 0 1 2 3 */
+ if (str == NULL)
+ return UUID_FALSE;
+ if (str_len == 0)
+ str_len = strlen(str);
+ if (str_len < UUID_LEN_STR)
+ return UUID_FALSE;
+ for (i = 0, cp = str; i < UUID_LEN_STR; i++, cp++) {
+ if ((i == 8) || (i == 13) || (i == 18) || (i == 23)) {
+ if (*cp == '-')
+ continue;
+ else
+ return UUID_FALSE;
+ }
+ if (!isxdigit((int)(*cp)))
+ return UUID_FALSE;
+ }
+ return UUID_TRUE;
+}
+
+/* INTERNAL: import UUID object from string representation */
+static uuid_rc_t uuid_import_str(uuid_t *uuid, const void *data_ptr, size_t data_len)
+{
+ uuid_uint16_t tmp16;
+ const char *cp;
+ char hexbuf[3];
+ const char *str;
+ unsigned int i;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL || data_len < UUID_LEN_STR)
+ return UUID_RC_ARG;
+
+ /* check for correct UUID string representation syntax */
+ str = (const char *)data_ptr;
+ if (!uuid_isstr(str, 0))
+ return UUID_RC_ARG;
+
+ /* parse hex values of "time" parts */
+ uuid->obj.time_low = (uuid_uint32_t)strtoul(str, NULL, 16);
+ uuid->obj.time_mid = (uuid_uint16_t)strtoul(str+9, NULL, 16);
+ uuid->obj.time_hi_and_version = (uuid_uint16_t)strtoul(str+14, NULL, 16);
+
+ /* parse hex values of "clock" parts */
+ tmp16 = (uuid_uint16_t)strtoul(str+19, NULL, 16);
+ uuid->obj.clock_seq_low = (uuid_uint8_t)(tmp16 & 0xff); tmp16 >>= 8;
+ uuid->obj.clock_seq_hi_and_reserved = (uuid_uint8_t)(tmp16 & 0xff);
+
+ /* parse hex values of "node" part */
+ cp = str+24;
+ hexbuf[2] = '\0';
+ for (i = 0; i < (unsigned int)sizeof(uuid->obj.node); i++) {
+ hexbuf[0] = *cp++;
+ hexbuf[1] = *cp++;
+ uuid->obj.node[i] = (uuid_uint8_t)strtoul(hexbuf, NULL, 16);
+ }
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: import UUID object from single integer value representation */
+static uuid_rc_t uuid_import_siv(uuid_t *uuid, const void *data_ptr, size_t data_len)
+{
+ const char *str;
+ uuid_uint8_t tmp_bin[UUID_LEN_BIN];
+ ui128_t ui, ui2;
+ uuid_rc_t rc;
+ int i;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL || data_len < 1)
+ return UUID_RC_ARG;
+
+ /* check for correct UUID single integer value syntax */
+ str = (const char *)data_ptr;
+ for (i = 0; i < (int)data_len; i++)
+ if (!isdigit((int)str[i]))
+ return UUID_RC_ARG;
+
+ /* parse single integer value representation (SIV) */
+ ui = ui128_s2i(str, NULL, 10);
+
+ /* import octets into UUID binary representation */
+ for (i = 0; i < UUID_LEN_BIN; i++) {
+ ui = ui128_rol(ui, 8, &ui2);
+ tmp_bin[i] = (uuid_uint8_t)(ui128_i2n(ui2) & 0xff);
+ }
+
+ /* import into internal UUID representation */
+ if ((rc = uuid_import(uuid, UUID_FMT_BIN, (void *)&tmp_bin, UUID_LEN_BIN)) != UUID_RC_OK)
+ return rc;
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: export UUID object to string representation */
+static uuid_rc_t uuid_export_str(const uuid_t *uuid, void *_data_ptr, size_t *data_len)
+{
+ char **data_ptr;
+ char *data_buf;
+
+ /* cast generic data pointer to particular pointer to pointer type */
+ data_ptr = (char **)_data_ptr;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL)
+ return UUID_RC_ARG;
+
+ /* determine output buffer */
+ if (*data_ptr == NULL) {
+ if ((data_buf = (char *)malloc(UUID_LEN_STR+1)) == NULL)
+ return UUID_RC_MEM;
+ if (data_len != NULL)
+ *data_len = UUID_LEN_STR+1;
+ }
+ else {
+ data_buf = (char *)(*data_ptr);
+ if (data_len == NULL)
+ return UUID_RC_ARG;
+ if (*data_len < UUID_LEN_STR+1)
+ return UUID_RC_MEM;
+ *data_len = UUID_LEN_STR+1;
+ }
+
+ /* format UUID into string representation */
+ if (str_snprintf(data_buf, UUID_LEN_STR+1,
+ "%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ (unsigned long)uuid->obj.time_low,
+ (unsigned int)uuid->obj.time_mid,
+ (unsigned int)uuid->obj.time_hi_and_version,
+ (unsigned int)uuid->obj.clock_seq_hi_and_reserved,
+ (unsigned int)uuid->obj.clock_seq_low,
+ (unsigned int)uuid->obj.node[0],
+ (unsigned int)uuid->obj.node[1],
+ (unsigned int)uuid->obj.node[2],
+ (unsigned int)uuid->obj.node[3],
+ (unsigned int)uuid->obj.node[4],
+ (unsigned int)uuid->obj.node[5]) != UUID_LEN_STR) {
+ if (*data_ptr == NULL)
+ free(data_buf);
+ return UUID_RC_INT;
+ }
+
+ /* pass back new buffer if locally allocated */
+ if (*data_ptr == NULL)
+ *data_ptr = data_buf;
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: export UUID object to single integer value representation */
+static uuid_rc_t uuid_export_siv(const uuid_t *uuid, void *_data_ptr, size_t *data_len)
+{
+ char **data_ptr;
+ char *data_buf;
+ void *tmp_ptr;
+ size_t tmp_len;
+ uuid_uint8_t tmp_bin[UUID_LEN_BIN];
+ ui128_t ui, ui2;
+ uuid_rc_t rc;
+ int i;
+
+ /* cast generic data pointer to particular pointer to pointer type */
+ data_ptr = (char **)_data_ptr;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL)
+ return UUID_RC_ARG;
+
+ /* determine output buffer */
+ if (*data_ptr == NULL) {
+ if ((data_buf = (char *)malloc(UUID_LEN_SIV+1)) == NULL)
+ return UUID_RC_MEM;
+ if (data_len != NULL)
+ *data_len = UUID_LEN_SIV+1;
+ }
+ else {
+ data_buf = (char *)(*data_ptr);
+ if (data_len == NULL)
+ return UUID_RC_ARG;
+ if (*data_len < UUID_LEN_SIV+1)
+ return UUID_RC_MEM;
+ *data_len = UUID_LEN_SIV+1;
+ }
+
+ /* export into UUID binary representation */
+ tmp_ptr = (void *)&tmp_bin;
+ tmp_len = sizeof(tmp_bin);
+ if ((rc = uuid_export(uuid, UUID_FMT_BIN, &tmp_ptr, &tmp_len)) != UUID_RC_OK) {
+ if (*data_ptr == NULL)
+ free(data_buf);
+ return rc;
+ }
+
+ /* import from UUID binary representation */
+ ui = ui128_zero();
+ for (i = 0; i < UUID_LEN_BIN; i++) {
+ ui2 = ui128_n2i((unsigned long)tmp_bin[i]);
+ ui = ui128_rol(ui, 8, NULL);
+ ui = ui128_or(ui, ui2);
+ }
+
+ /* format into single integer value representation */
+ (void)ui128_i2s(ui, data_buf, UUID_LEN_SIV+1, 10);
+
+ /* pass back new buffer if locally allocated */
+ if (*data_ptr == NULL)
+ *data_ptr = data_buf;
+
+ return UUID_RC_OK;
+}
+
+/* decoding tables */
+static struct {
+ uuid_uint8_t num;
+ const char *desc;
+} uuid_dectab_variant[] = {
+ { (uuid_uint8_t)BM_OCTET(0,0,0,0,0,0,0,0), "reserved (NCS backward compatible)" },
+ { (uuid_uint8_t)BM_OCTET(1,0,0,0,0,0,0,0), "DCE 1.1, ISO/IEC 11578:1996" },
+ { (uuid_uint8_t)BM_OCTET(1,1,0,0,0,0,0,0), "reserved (Microsoft GUID)" },
+ { (uuid_uint8_t)BM_OCTET(1,1,1,0,0,0,0,0), "reserved (future use)" }
+};
+static struct {
+ int num;
+ const char *desc;
+} uuid_dectab_version[] = {
+ { 1, "time and node based" },
+ { 3, "name based, MD5" },
+ { 4, "random data based" },
+ { 5, "name based, SHA-1" }
+};
+
+/* INTERNAL: dump UUID object as descriptive text */
+static uuid_rc_t uuid_export_txt(const uuid_t *uuid, void *_data_ptr, size_t *data_len)
+{
+ char **data_ptr;
+ uuid_rc_t rc;
+ char **out;
+ char *out_ptr;
+ size_t out_len;
+ const char *version;
+ const char *variant;
+ char *content;
+ int isnil;
+ uuid_uint8_t tmp8;
+ uuid_uint16_t tmp16;
+ uuid_uint32_t tmp32;
+ uuid_uint8_t tmp_bin[UUID_LEN_BIN];
+ char tmp_str[UUID_LEN_STR+1];
+ char tmp_siv[UUID_LEN_SIV+1];
+ void *tmp_ptr;
+ size_t tmp_len;
+ ui64_t t;
+ ui64_t t_offset;
+ int t_nsec;
+ int t_usec;
+ time_t t_sec;
+ char t_buf[19+1]; /* YYYY-MM-DD HH:MM:SS */
+ struct tm *tm;
+ int i;
+
+ /* cast generic data pointer to particular pointer to pointer type */
+ data_ptr = (char **)_data_ptr;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL)
+ return UUID_RC_ARG;
+
+ /* initialize output buffer */
+ out_ptr = NULL;
+ out = &out_ptr;
+
+ /* check for special case of "Nil UUID" */
+ if ((rc = uuid_isnil(uuid, &isnil)) != UUID_RC_OK)
+ return rc;
+
+ /* decode into various representations */
+ tmp_ptr = (void *)&tmp_str;
+ tmp_len = sizeof(tmp_str);
+ if ((rc = uuid_export(uuid, UUID_FMT_STR, &tmp_ptr, &tmp_len)) != UUID_RC_OK)
+ return rc;
+ tmp_ptr = (void *)&tmp_siv;
+ tmp_len = sizeof(tmp_siv);
+ if ((rc = uuid_export(uuid, UUID_FMT_SIV, &tmp_ptr, &tmp_len)) != UUID_RC_OK)
+ return rc;
+ (void)str_rsprintf(out, "encode: STR: %s\n", tmp_str);
+ (void)str_rsprintf(out, " SIV: %s\n", tmp_siv);
+
+ /* decode UUID variant */
+ tmp8 = uuid->obj.clock_seq_hi_and_reserved;
+ if (isnil)
+ variant = "n.a.";
+ else {
+ variant = "unknown";
+ for (i = 7; i >= 0; i--) {
+ if ((tmp8 & (uuid_uint8_t)BM_BIT(i,1)) == 0) {
+ tmp8 &= ~(uuid_uint8_t)BM_MASK(i,0);
+ break;
+ }
+ }
+ for (i = 0; i < (int)(sizeof(uuid_dectab_variant)/sizeof(uuid_dectab_variant[0])); i++) {
+ if (uuid_dectab_variant[i].num == tmp8) {
+ variant = uuid_dectab_variant[i].desc;
+ break;
+ }
+ }
+ }
+ (void)str_rsprintf(out, "decode: variant: %s\n", variant);
+
+ /* decode UUID version */
+ tmp16 = (BM_SHR(uuid->obj.time_hi_and_version, 12) & (uuid_uint16_t)BM_MASK(3,0));
+ if (isnil)
+ version = "n.a.";
+ else {
+ version = "unknown";
+ for (i = 0; i < (int)(sizeof(uuid_dectab_version)/sizeof(uuid_dectab_version[0])); i++) {
+ if (uuid_dectab_version[i].num == (int)tmp16) {
+ version = uuid_dectab_version[i].desc;
+ break;
+ }
+ }
+ }
+ str_rsprintf(out, " version: %d (%s)\n", (int)tmp16, version);
+
+ /*
+ * decode UUID content
+ */
+
+ if (tmp8 == BM_OCTET(1,0,0,0,0,0,0,0) && tmp16 == 1) {
+ /* decode DCE 1.1 version 1 UUID */
+
+ /* decode system time */
+ t = ui64_rol(ui64_n2i((unsigned long)(uuid->obj.time_hi_and_version & BM_MASK(11,0))), 48, NULL),
+ t = ui64_or(t, ui64_rol(ui64_n2i((unsigned long)(uuid->obj.time_mid)), 32, NULL));
+ t = ui64_or(t, ui64_n2i((unsigned long)(uuid->obj.time_low)));
+ t_offset = ui64_s2i(UUID_TIMEOFFSET, NULL, 16);
+ t = ui64_sub(t, t_offset, NULL);
+ t = ui64_divn(t, 10, &t_nsec);
+ t = ui64_divn(t, 1000000, &t_usec);
+ t_sec = (time_t)ui64_i2n(t);
+ tm = gmtime(&t_sec);
+ (void)strftime(t_buf, sizeof(t_buf), "%Y-%m-%d %H:%M:%S", tm);
+ (void)str_rsprintf(out, " content: time: %s.%06d.%d UTC\n", t_buf, t_usec, t_nsec);
+
+ /* decode clock sequence */
+ tmp32 = ((uuid->obj.clock_seq_hi_and_reserved & BM_MASK(5,0)) << 8)
+ + uuid->obj.clock_seq_low;
+ (void)str_rsprintf(out, " clock: %ld (usually random)\n", (long)tmp32);
+
+ /* decode node MAC address */
+ (void)str_rsprintf(out, " node: %02x:%02x:%02x:%02x:%02x:%02x (%s %s)\n",
+ (unsigned int)uuid->obj.node[0],
+ (unsigned int)uuid->obj.node[1],
+ (unsigned int)uuid->obj.node[2],
+ (unsigned int)uuid->obj.node[3],
+ (unsigned int)uuid->obj.node[4],
+ (unsigned int)uuid->obj.node[5],
+ (uuid->obj.node[0] & IEEE_MAC_LOBIT ? "local" : "global"),
+ (uuid->obj.node[0] & IEEE_MAC_MCBIT ? "multicast" : "unicast"));
+ }
+ else {
+ /* decode anything else as hexadecimal byte-string only */
+
+ /* determine annotational hint */
+ content = "not decipherable: unknown UUID version";
+ if (isnil)
+ content = "special case: DCE 1.1 Nil UUID";
+ else if (tmp16 == 3)
+ content = "not decipherable: MD5 message digest only";
+ else if (tmp16 == 4)
+ content = "no semantics: random data only";
+ else if (tmp16 == 5)
+ content = "not decipherable: truncated SHA-1 message digest only";
+
+ /* pack UUID into binary representation */
+ tmp_ptr = (void *)&tmp_bin;
+ tmp_len = sizeof(tmp_bin);
+ if ((rc = uuid_export(uuid, UUID_FMT_BIN, &tmp_ptr, &tmp_len)) != UUID_RC_OK)
+ return rc;
+
+ /* mask out version and variant parts */
+ tmp_bin[6] &= BM_MASK(3,0);
+ tmp_bin[8] &= BM_MASK(5,0);
+
+ /* dump as colon-seperated hexadecimal byte-string */
+ (void)str_rsprintf(out,
+ " content: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n"
+ " (%s)\n",
+ (unsigned int)tmp_bin[0], (unsigned int)tmp_bin[1], (unsigned int)tmp_bin[2],
+ (unsigned int)tmp_bin[3], (unsigned int)tmp_bin[4], (unsigned int)tmp_bin[5],
+ (unsigned int)tmp_bin[6], (unsigned int)tmp_bin[7], (unsigned int)tmp_bin[8],
+ (unsigned int)tmp_bin[9], (unsigned int)tmp_bin[10], (unsigned int)tmp_bin[11],
+ (unsigned int)tmp_bin[12], (unsigned int)tmp_bin[13], (unsigned int)tmp_bin[14],
+ (unsigned int)tmp_bin[15], content);
+ }
+
+ /* provide result */
+ out_len = strlen(out_ptr)+1;
+ if (*data_ptr == NULL) {
+ *data_ptr = (void *)out_ptr;
+ if (data_len != NULL)
+ *data_len = out_len;
+ }
+ else {
+ if (data_len == NULL)
+ return UUID_RC_ARG;
+ if (*data_len < out_len)
+ return UUID_RC_MEM;
+ memcpy(*data_ptr, out_ptr, out_len);
+ }
+
+ return UUID_RC_OK;
+}
+
+/* UUID importing */
+uuid_rc_t uuid_import(uuid_t *uuid, uuid_fmt_t fmt, const void *data_ptr, size_t data_len)
+{
+ uuid_rc_t rc;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL)
+ return UUID_RC_ARG;
+
+ /* dispatch into format-specific functions */
+ switch (fmt) {
+ case UUID_FMT_BIN: rc = uuid_import_bin(uuid, data_ptr, data_len); break;
+ case UUID_FMT_STR: rc = uuid_import_str(uuid, data_ptr, data_len); break;
+ case UUID_FMT_SIV: rc = uuid_import_siv(uuid, data_ptr, data_len); break;
+ case UUID_FMT_TXT: rc = UUID_RC_IMP; /* not implemented */ break;
+ default: rc = UUID_RC_ARG;
+ }
+
+ return rc;
+}
+
+/* UUID exporting */
+uuid_rc_t uuid_export(const uuid_t *uuid, uuid_fmt_t fmt, void *data_ptr, size_t *data_len)
+{
+ uuid_rc_t rc;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || data_ptr == NULL)
+ return UUID_RC_ARG;
+
+ /* dispatch into format-specific functions */
+ switch (fmt) {
+ case UUID_FMT_BIN: rc = uuid_export_bin(uuid, data_ptr, data_len); break;
+ case UUID_FMT_STR: rc = uuid_export_str(uuid, data_ptr, data_len); break;
+ case UUID_FMT_SIV: rc = uuid_export_siv(uuid, data_ptr, data_len); break;
+ case UUID_FMT_TXT: rc = uuid_export_txt(uuid, data_ptr, data_len); break;
+ default: rc = UUID_RC_ARG;
+ }
+
+ return rc;
+}
+
+/* INTERNAL: brand UUID with version and variant */
+static void uuid_brand(uuid_t *uuid, unsigned int version)
+{
+ /* set version (as given) */
+ uuid->obj.time_hi_and_version &= BM_MASK(11,0);
+ uuid->obj.time_hi_and_version |= (uuid_uint16_t)BM_SHL(version, 12);
+
+ /* set variant (always DCE 1.1 only) */
+ uuid->obj.clock_seq_hi_and_reserved &= BM_MASK(5,0);
+ uuid->obj.clock_seq_hi_and_reserved |= BM_SHL(0x02, 6);
+ return;
+}
+
+/* INTERNAL: generate UUID version 1: time, clock and node based */
+static uuid_rc_t uuid_make_v1(uuid_t *uuid, unsigned int mode, va_list ap)
+{
+ struct timeval time_now;
+ ui64_t t;
+ ui64_t offset;
+ ui64_t ov;
+ uuid_uint16_t clck;
+
+ /*
+ * GENERATE TIME
+ */
+
+ /* determine current system time and sequence counter */
+ for (;;) {
+ /* determine current system time */
+ if (time_gettimeofday(&time_now) == -1)
+ return UUID_RC_SYS;
+
+ /* check whether system time changed since last retrieve */
+ if (!( time_now.tv_sec == uuid->time_last.tv_sec
+ && time_now.tv_usec == uuid->time_last.tv_usec)) {
+ /* reset time sequence counter and continue */
+ uuid->time_seq = 0;
+ break;
+ }
+
+ /* until we are out of UUIDs per tick, increment
+ the time/tick sequence counter and continue */
+ if (uuid->time_seq < UUIDS_PER_TICK) {
+ uuid->time_seq++;
+ break;
+ }
+
+ /* stall the UUID generation until the system clock (which
+ has a gettimeofday(2) resolution of 1us) catches up */
+ time_usleep(1);
+ }
+
+ /* convert from timeval (sec,usec) to OSSP ui64 (100*nsec) format */
+ t = ui64_n2i((unsigned long)time_now.tv_sec);
+ t = ui64_muln(t, 1000000, NULL);
+ t = ui64_addn(t, (int)time_now.tv_usec, NULL);
+ t = ui64_muln(t, 10, NULL);
+
+ /* adjust for offset between UUID and Unix Epoch time */
+ offset = ui64_s2i(UUID_TIMEOFFSET, NULL, 16);
+ t = ui64_add(t, offset, NULL);
+
+ /* compensate for low resolution system clock by adding
+ the time/tick sequence counter */
+ if (uuid->time_seq > 0)
+ t = ui64_addn(t, (int)uuid->time_seq, NULL);
+
+ /* store the 60 LSB of the time in the UUID */
+ t = ui64_rol(t, 16, &ov);
+ uuid->obj.time_hi_and_version =
+ (uuid_uint16_t)(ui64_i2n(ov) & 0x00000fff); /* 12 of 16 bit only! */
+ t = ui64_rol(t, 16, &ov);
+ uuid->obj.time_mid =
+ (uuid_uint16_t)(ui64_i2n(ov) & 0x0000ffff); /* all 16 bit */
+ t = ui64_rol(t, 32, &ov);
+ uuid->obj.time_low =
+ (uuid_uint32_t)(ui64_i2n(ov) & 0xffffffff); /* all 32 bit */
+
+ /*
+ * GENERATE CLOCK
+ */
+
+ /* retrieve current clock sequence */
+ clck = ((uuid->obj.clock_seq_hi_and_reserved & BM_MASK(5,0)) << 8)
+ + uuid->obj.clock_seq_low;
+
+ /* generate new random clock sequence (initially or if the
+ time has stepped backwards) or else just increase it */
+ if ( clck == 0
+ || ( time_now.tv_sec < uuid->time_last.tv_sec
+ || ( time_now.tv_sec == uuid->time_last.tv_sec
+ && time_now.tv_usec < uuid->time_last.tv_usec))) {
+ if (prng_data(uuid->prng, (void *)&clck, sizeof(clck)) != PRNG_RC_OK)
+ return UUID_RC_INT;
+ }
+ else
+ clck++;
+ clck %= BM_POW2(14);
+
+ /* store back new clock sequence */
+ uuid->obj.clock_seq_hi_and_reserved =
+ (uuid->obj.clock_seq_hi_and_reserved & BM_MASK(7,6))
+ | (uuid_uint8_t)((clck >> 8) & 0xff);
+ uuid->obj.clock_seq_low =
+ (uuid_uint8_t)(clck & 0xff);
+
+ /*
+ * GENERATE NODE
+ */
+
+ if ((mode & UUID_MAKE_MC) || (uuid->mac[0] & BM_OCTET(1,0,0,0,0,0,0,0))) {
+ /* generate random IEEE 802 local multicast MAC address */
+ if (prng_data(uuid->prng, (void *)&(uuid->obj.node), sizeof(uuid->obj.node)) != PRNG_RC_OK)
+ return UUID_RC_INT;
+ uuid->obj.node[0] |= IEEE_MAC_MCBIT;
+ uuid->obj.node[0] |= IEEE_MAC_LOBIT;
+ }
+ else {
+ /* use real regular MAC address */
+ memcpy(uuid->obj.node, uuid->mac, sizeof(uuid->mac));
+ }
+
+ /*
+ * FINISH
+ */
+
+ /* remember current system time for next iteration */
+ uuid->time_last.tv_sec = time_now.tv_sec;
+ uuid->time_last.tv_usec = time_now.tv_usec;
+
+ /* brand with version and variant */
+ uuid_brand(uuid, 1);
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: pre-defined UUID values.
+ (defined as network byte ordered octet stream) */
+#define UUID_MAKE(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16) \
+ { (uuid_uint8_t)(a1), (uuid_uint8_t)(a2), (uuid_uint8_t)(a3), (uuid_uint8_t)(a4), \
+ (uuid_uint8_t)(a5), (uuid_uint8_t)(a6), (uuid_uint8_t)(a7), (uuid_uint8_t)(a8), \
+ (uuid_uint8_t)(a9), (uuid_uint8_t)(a10), (uuid_uint8_t)(a11), (uuid_uint8_t)(a12), \
+ (uuid_uint8_t)(a13), (uuid_uint8_t)(a14), (uuid_uint8_t)(a15), (uuid_uint8_t)(a16) }
+static struct {
+ char *name;
+ uuid_uint8_t uuid[UUID_LEN_BIN];
+} uuid_value_table[] = {
+ { "nil", /* 00000000-0000-0000-0000-000000000000 ("Nil UUID") */
+ UUID_MAKE(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00) },
+ { "ns:DNS", /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 (see RFC 4122) */
+ UUID_MAKE(0x6b,0xa7,0xb8,0x10,0x9d,0xad,0x11,0xd1,0x80,0xb4,0x00,0xc0,0x4f,0xd4,0x30,0xc8) },
+ { "ns:URL", /* 6ba7b811-9dad-11d1-80b4-00c04fd430c8 (see RFC 4122) */
+ UUID_MAKE(0x6b,0xa7,0xb8,0x11,0x9d,0xad,0x11,0xd1,0x80,0xb4,0x00,0xc0,0x4f,0xd4,0x30,0xc8) },
+ { "ns:OID", /* 6ba7b812-9dad-11d1-80b4-00c04fd430c8 (see RFC 4122) */
+ UUID_MAKE(0x6b,0xa7,0xb8,0x12,0x9d,0xad,0x11,0xd1,0x80,0xb4,0x00,0xc0,0x4f,0xd4,0x30,0xc8) },
+ { "ns:X500", /* 6ba7b814-9dad-11d1-80b4-00c04fd430c8 (see RFC 4122) */
+ UUID_MAKE(0x6b,0xa7,0xb8,0x14,0x9d,0xad,0x11,0xd1,0x80,0xb4,0x00,0xc0,0x4f,0xd4,0x30,0xc8) }
+};
+
+/* load UUID object with pre-defined value */
+uuid_rc_t uuid_load(uuid_t *uuid, const char *name)
+{
+ uuid_uint8_t *uuid_octets;
+ uuid_rc_t rc;
+ unsigned int i;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL || name == NULL)
+ return UUID_RC_ARG;
+
+ /* search for UUID in table */
+ uuid_octets = NULL;
+ for (i = 0; i < (unsigned int)sizeof(uuid_value_table)/sizeof(uuid_value_table[0]); i++) {
+ if (strcmp(uuid_value_table[i].name, name) == 0) {
+ uuid_octets = uuid_value_table[i].uuid;
+ break;
+ }
+ }
+ if (uuid_octets == NULL)
+ return UUID_RC_ARG;
+
+ /* import value into UUID object */
+ if ((rc = uuid_import(uuid, UUID_FMT_BIN, uuid_octets, UUID_LEN_BIN)) != UUID_RC_OK)
+ return rc;
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: generate UUID version 3: name based with MD5 */
+static uuid_rc_t uuid_make_v3(uuid_t *uuid, unsigned int mode, va_list ap)
+{
+ char *str;
+ uuid_t *uuid_ns;
+ uuid_uint8_t uuid_buf[UUID_LEN_BIN];
+ void *uuid_ptr;
+ size_t uuid_len;
+ uuid_rc_t rc;
+
+ /* determine namespace UUID and name string arguments */
+ if ((uuid_ns = (uuid_t *)va_arg(ap, void *)) == NULL)
+ return UUID_RC_ARG;
+ if ((str = (char *)va_arg(ap, char *)) == NULL)
+ return UUID_RC_ARG;
+
+ /* initialize MD5 context */
+ if (md5_init(uuid->md5) != MD5_RC_OK)
+ return UUID_RC_MEM;
+
+ /* load the namespace UUID into MD5 context */
+ uuid_ptr = (void *)&uuid_buf;
+ uuid_len = sizeof(uuid_buf);
+ if ((rc = uuid_export(uuid_ns, UUID_FMT_BIN, &uuid_ptr, &uuid_len)) != UUID_RC_OK)
+ return rc;
+ if (md5_update(uuid->md5, uuid_buf, uuid_len) != MD5_RC_OK)
+ return UUID_RC_INT;
+
+ /* load the argument name string into MD5 context */
+ if (md5_update(uuid->md5, str, strlen(str)) != MD5_RC_OK)
+ return UUID_RC_INT;
+
+ /* store MD5 result into UUID
+ (requires MD5_LEN_BIN space, UUID_LEN_BIN space is available,
+ and both are equal in size, so we are safe!) */
+ uuid_ptr = (void *)&(uuid->obj);
+ if (md5_store(uuid->md5, &uuid_ptr, NULL) != MD5_RC_OK)
+ return UUID_RC_INT;
+
+ /* fulfill requirement of standard and convert UUID data into
+ local/host byte order (this uses fact that uuid_import_bin() is
+ able to operate in-place!) */
+ if ((rc = uuid_import(uuid, UUID_FMT_BIN, (void *)&(uuid->obj), UUID_LEN_BIN)) != UUID_RC_OK)
+ return rc;
+
+ /* brand UUID with version and variant */
+ uuid_brand(uuid, 3);
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: generate UUID version 4: random number based */
+static uuid_rc_t uuid_make_v4(uuid_t *uuid, unsigned int mode, va_list ap)
+{
+ /* fill UUID with random data */
+ if (prng_data(uuid->prng, (void *)&(uuid->obj), sizeof(uuid->obj)) != PRNG_RC_OK)
+ return UUID_RC_INT;
+
+ /* brand UUID with version and variant */
+ uuid_brand(uuid, 4);
+
+ return UUID_RC_OK;
+}
+
+/* INTERNAL: generate UUID version 5: name based with SHA-1 */
+static uuid_rc_t uuid_make_v5(uuid_t *uuid, unsigned int mode, va_list ap)
+{
+ char *str;
+ uuid_t *uuid_ns;
+ uuid_uint8_t uuid_buf[UUID_LEN_BIN];
+ void *uuid_ptr;
+ size_t uuid_len;
+ uuid_uint8_t sha1_buf[SHA1_LEN_BIN];
+ void *sha1_ptr;
+ uuid_rc_t rc;
+
+ /* determine namespace UUID and name string arguments */
+ if ((uuid_ns = (uuid_t *)va_arg(ap, void *)) == NULL)
+ return UUID_RC_ARG;
+ if ((str = (char *)va_arg(ap, char *)) == NULL)
+ return UUID_RC_ARG;
+
+ /* initialize SHA-1 context */
+ if (sha1_init(uuid->sha1) != SHA1_RC_OK)
+ return UUID_RC_INT;
+
+ /* load the namespace UUID into SHA-1 context */
+ uuid_ptr = (void *)&uuid_buf;
+ uuid_len = sizeof(uuid_buf);
+ if ((rc = uuid_export(uuid_ns, UUID_FMT_BIN, &uuid_ptr, &uuid_len)) != UUID_RC_OK)
+ return rc;
+ if (sha1_update(uuid->sha1, uuid_buf, uuid_len) != SHA1_RC_OK)
+ return UUID_RC_INT;
+
+ /* load the argument name string into SHA-1 context */
+ if (sha1_update(uuid->sha1, str, strlen(str)) != SHA1_RC_OK)
+ return UUID_RC_INT;
+
+ /* store SHA-1 result into UUID
+ (requires SHA1_LEN_BIN space, but UUID_LEN_BIN space is available
+ only, so use a temporary buffer to store SHA-1 results and then
+ use lower part only according to standard */
+ sha1_ptr = (void *)sha1_buf;
+ if (sha1_store(uuid->sha1, &sha1_ptr, NULL) != SHA1_RC_OK)
+ return UUID_RC_INT;
+ uuid_ptr = (void *)&(uuid->obj);
+ memcpy(uuid_ptr, sha1_ptr, UUID_LEN_BIN);
+
+ /* fulfill requirement of standard and convert UUID data into
+ local/host byte order (this uses fact that uuid_import_bin() is
+ able to operate in-place!) */
+ if ((rc = uuid_import(uuid, UUID_FMT_BIN, (void *)&(uuid->obj), UUID_LEN_BIN)) != UUID_RC_OK)
+ return rc;
+
+ /* brand UUID with version and variant */
+ uuid_brand(uuid, 5);
+
+ return UUID_RC_OK;
+}
+
+/* generate UUID */
+uuid_rc_t uuid_make(uuid_t *uuid, unsigned int mode, ...)
+{
+ va_list ap;
+ uuid_rc_t rc;
+
+ /* sanity check argument(s) */
+ if (uuid == NULL)
+ return UUID_RC_ARG;
+
+ /* dispatch into version dependent generation functions */
+ va_start(ap, mode);
+ if (mode & UUID_MAKE_V1)
+ rc = uuid_make_v1(uuid, mode, ap);
+ else if (mode & UUID_MAKE_V3)
+ rc = uuid_make_v3(uuid, mode, ap);
+ else if (mode & UUID_MAKE_V4)
+ rc = uuid_make_v4(uuid, mode, ap);
+ else if (mode & UUID_MAKE_V5)
+ rc = uuid_make_v5(uuid, mode, ap);
+ else
+ rc = UUID_RC_ARG;
+ va_end(ap);
+
+ return rc;
+}
+
+/* translate UUID API error code into corresponding error string */
+char *uuid_error(uuid_rc_t rc)
+{
+ char *str;
+
+ switch (rc) {
+ case UUID_RC_OK: str = "everything ok"; break;
+ case UUID_RC_ARG: str = "invalid argument"; break;
+ case UUID_RC_MEM: str = "out of memory"; break;
+ case UUID_RC_SYS: str = "system error"; break;
+ case UUID_RC_INT: str = "internal error"; break;
+ case UUID_RC_IMP: str = "not implemented"; break;
+ default: str = NULL; break;
+ }
+ return str;
+}
+
+/* OSSP uuid version (link-time information) */
+unsigned long uuid_version(void)
+{
+ return (unsigned long)(_UUID_VERSION);
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidhin"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid.h.in (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid.h.in         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid.h.in        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,120 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid.h: library API definition
+*/
+
+#ifndef __UUID_H__
+#define __UUID_H__
+
+/* workaround conflicts with system headers */
+#define uuid_t __vendor_uuid_t
+#define uuid_create __vendor_uuid_create
+#define uuid_compare __vendor_uuid_compare
+#include <sys/types.h>
+#include <unistd.h>
+#undef uuid_t
+#undef uuid_create
+#undef uuid_compare
+
+/* required system headers */
+#include <string.h>
+
+/* minimum C++ support */
+#ifdef __cplusplus
+#define DECLARATION_BEGIN extern "C" {
+#define DECLARATION_END }
+#else
+#define DECLARATION_BEGIN
+#define DECLARATION_END
+#endif
+
+DECLARATION_BEGIN
+
+/* OSSP uuid version (compile-time information) */
+#define UUID_VERSION @UUID_VERSION_HEX@
+
+/* encoding octet stream lengths */
+#define UUID_LEN_BIN (128 /*bit*/ / 8 /*bytes*/)
+#define UUID_LEN_STR (128 /*bit*/ / 4 /*nibbles*/ + 4 /*hyphens*/)
+#define UUID_LEN_SIV (39 /*int(log(10,exp(2,128)-1)+1) digits*/)
+
+/* API return codes */
+typedef enum {
+ UUID_RC_OK = 0, /* everything ok */
+ UUID_RC_ARG = 1, /* invalid argument */
+ UUID_RC_MEM = 2, /* out of memory */
+ UUID_RC_SYS = 3, /* system error */
+ UUID_RC_INT = 4, /* internal error */
+ UUID_RC_IMP = 5 /* not implemented */
+} uuid_rc_t;
+
+/* UUID make modes */
+enum {
+ UUID_MAKE_V1 = (1 << 0), /* DCE 1.1 v1 UUID */
+ UUID_MAKE_V3 = (1 << 1), /* DCE 1.1 v3 UUID */
+ UUID_MAKE_V4 = (1 << 2), /* DCE 1.1 v4 UUID */
+ UUID_MAKE_V5 = (1 << 3), /* DCE 1.1 v5 UUID */
+ UUID_MAKE_MC = (1 << 4) /* enforce multi-cast MAC address */
+};
+
+/* UUID import/export formats */
+typedef enum {
+ UUID_FMT_BIN = 0, /* binary representation (import/export) */
+ UUID_FMT_STR = 1, /* string representation (import/export) */
+ UUID_FMT_SIV = 2, /* single integer value (import/export) */
+ UUID_FMT_TXT = 3 /* textual description (export only) */
+} uuid_fmt_t;
+
+/* UUID abstract data type */
+struct uuid_st;
+typedef struct uuid_st uuid_t;
+
+/* UUID object handling */
+extern uuid_rc_t uuid_create ( uuid_t **_uuid);
+extern uuid_rc_t uuid_destroy ( uuid_t *_uuid);
+extern uuid_rc_t uuid_clone (const uuid_t *_uuid, uuid_t **_clone);
+
+/* UUID generation */
+extern uuid_rc_t uuid_load ( uuid_t *_uuid, const char *_name);
+extern uuid_rc_t uuid_make ( uuid_t *_uuid, unsigned int _mode, ...);
+
+/* UUID comparison */
+extern uuid_rc_t uuid_isnil (const uuid_t *_uuid, int *_result);
+extern uuid_rc_t uuid_compare (const uuid_t *_uuid, const uuid_t *_uuid2, int *_result);
+
+/* UUID import/export */
+extern uuid_rc_t uuid_import ( uuid_t *_uuid, uuid_fmt_t _fmt, const void *_data_ptr, size_t _data_len);
+extern uuid_rc_t uuid_export (const uuid_t *_uuid, uuid_fmt_t _fmt, void *_data_ptr, size_t *_data_len);
+
+/* library utilities */
+extern char *uuid_error (uuid_rc_t _rc);
+extern unsigned long uuid_version (void);
+
+DECLARATION_END
+
+#endif /* __UUID_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidpcin"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid.pc.in (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid.pc.in         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid.pc.in        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.pc.in: pkg-config(1) specification
+##
+
+prefix=@prefix@
+exec_prefix=${prefix}
+includedir=${prefix}/include
+libdir=${exec_prefix}/lib
+
+Name: OSSP uuid
+Description: Universally Unique Identifier (UUID) Library
+Version: @UUID_VERSION_RAW@
+URL: http://www.ossp.org/pkg/lib/uuid/
+Cflags: -I${includedir}
+Libs: -L${libdir} -luuid
+Libs.private: @LIBS@
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuidpod"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid.pod (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid.pod         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid.pod        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,529 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid.pod: manual page
+##
+
+=pod
+
+=head1 NAME
+
+B<OSSP uuid> - B<Universally Unique Identifier>
+
+=head1 VERSION
+
+OSSP uuid UUID_VERSION_STR
+
+=head1 DESCRIPTION
+
+B<OSSP uuid> is a ISO-C:1999 application programming interface (API) and
+corresponding command line interface (CLI) for the generation of DCE
+1.1, ISO/IEC 11578:1996 and IETF RFC-4122 compliant I<Universally Unique
+Identifier> (UUID). It supports DCE 1.1 variant UUIDs of version 1 (time
+and node based), version 3 (name based, MD5), version 4 (random number
+based) and version 5 (name based, SHA-1). Additional API bindings are
+provided for the languages ISO-C++:1998, Perl:5 and PHP:4/5. Optional
+backward compatibility exists for the ISO-C DCE-1.1 and Perl Data::UUID
+APIs.
+
+UUIDs are 128 bit numbers which are intended to have a high likelihood
+of uniqueness over space and time and are computationally difficult
+to guess. They are globally unique identifiers which can be locally
+generated without contacting a global registration authority. UUIDs
+are intended as unique identifiers for both mass tagging objects
+with an extremely short lifetime and to reliably identifying very
+persistent objects across a network.
+
+This is the ISO-C application programming interface (API) of B<OSSP uuid>.
+
+=head2 UUID Binary Representation
+
+According to the DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122
+standards, a DCE 1.1 variant UUID is a 128 bit number defined out of 7
+fields, each field a multiple of an octet in size and stored in network
+byte order:
+
+ [4]
+ version
+ -->| |<--
+ | |
+ | | [16]
+ [32] [16] | |time_hi
+ time_low time_mid | _and_version
+ |<---------------------------->||<------------>||<------------>|
+ | MSB || || | |
+ | / || || | |
+ |/ || || | |
+
+ +------++------++------++------++------++------++------++------+~~
+ | 15 || 14 || 13 || 12 || 11 || 10 |####9 || 8 |
+ | MSO || || || || || |#### || |
+ +------++------++------++------++------++------++------++------+~~
+ 7654321076543210765432107654321076543210765432107654321076543210
+
+ ~~+------++------++------++------++------++------++------++------+
+ ##* 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 |
+ ##* || || || || || || || LSO |
+ ~~+------++------++------++------++------++------++------++------+
+ 7654321076543210765432107654321076543210765432107654321076543210
+
+ | | || || /|
+ | | || || / |
+ | | || || LSB |
+ |<---->||<---->||<-------------------------------------------->|
+ |clk_seq clk_seq node
+ |_hi_res _low [48]
+ |[5-6] [8]
+ | |
+ -->| |<--
+ variant
+ [2-3]
+
+An example of a UUID binary representation is the octet stream C<0xF8
+0x1D 0x4F 0xAE 0x7D 0xEC 0x11 0xD0 0xA7 0x65 0x00 0xA0 0xC9 0x1E 0x6B
+0xF6>. The binary representation format is exactly what the B<OSSP uuid>
+API functions B<uuid_import>() and B<uuid_export>() deal with under
+C<UUID_FMT_BIN>.
+
+=head2 UUID ASCII String Representation
+
+According to the DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122
+standards, a DCE 1.1 variant UUID is represented as an ASCII string
+consisting of 8 hexadecimal digits followed by a hyphen, then three
+groups of 4 hexadecimal digits each followed by a hyphen, then 12
+hexadecimal digits. Formally, the string representation is defined by
+the following grammar:
+
+ uuid = <time_low> "-"
+ <time_mid> "-"
+ <time_high_and_version> "-"
+ <clock_seq_high_and_reserved>
+ <clock_seq_low> "-"
+ <node>
+ time_low = 4*<hex_octet>
+ time_mid = 2*<hex_octet>
+ time_high_and_version = 2*<hex_octet>
+ clock_seq_high_and_reserved = <hex_octet>
+ clock_seq_low = <hex_octet>
+ node = 6*<hex_octet>
+ hex_octet = <hex_digit> <hex_digit>
+ hex_digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
+ |"a"|"b"|"c"|"d"|"e"|"f"
+ |"A"|"B"|"C"|"D"|"E"|"F"
+
+An example of a UUID string representation is the ASCII string
+"C<f81d4fae-7dec-11d0-a765-00a0c91e6bf6>". The string representation
+format is exactly what the B<OSSP uuid> API functions B<uuid_import>()
+and B<uuid_export>() deal with under C<UUID_FMT_STR>.
+
+Notice: a corresponding URL can be generated out of a ASCII string
+representation of an UUID by prefixing with "C<urn:uuid:>" as in
+"C<urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>".
+
+=head2 UUID Single Integer Value Representation
+
+According to the ISO/IEC 11578:1996 and ITU-T Rec. X.667 standards, a
+DCE 1.1 variant UUID can be also represented as a single integer value
+consisting of a decimal number with up to 39 digits.
+
+An example of a UUID single integer value representation is the decimal
+number "C<329800735698586629295641978511506172918>". The string
+representation format is exactly what the B<OSSP uuid> API functions
+B<uuid_import>() and B<uuid_export>() deal with under C<UUID_FMT_SIV>.
+
+Notice: a corresponding ISO OID can be generated under the
+"{joint-iso-itu-t(2) uuid(25)}" arc out of a single integer value
+representation of a UUID by prefixing with "C<2.25.>". An example OID
+is "C<2.25.329800735698586629295641978511506172918>". Additionally,
+an URL can be generated by further prefixing with "C<urn:oid:>" as in
+"C<urn:oid:2.25.329800735698586629295641978511506172918>".
+
+=head2 UUID Variants and Versions
+
+A UUID has a variant and version. The variant defines the layout of the
+UUID. The version defines the content of the UUID. The UUID variant
+supported in B<OSSP uuid> is the DCE 1.1 variant only. The DCE 1.1 UUID
+variant versions supported in B<OSSP uuid> are:
+
+=over 4
+
+=item B<Version 1> (time and node based)
+
+These are the classical UUIDs, created out of a 60-bit system time,
+a 14-bit local clock sequence and 48-bit system MAC address. The MAC
+address can be either the real one of a physical network interface card
+(NIC) or a random multi-cast MAC address. Version 1 UUIDs are usually
+used as one-time global unique identifiers.
+
+=item B<Version 3> (name based, MD5)
+
+These are UUIDs which are based on the 128-bit MD5 message digest of the
+concatenation of a 128-bit namespace UUID and a name string of arbitrary
+length. Version 3 UUIDs are usually used for non-unique but repeatable
+message digest identifiers.
+
+=item B<Version 4> (random data based)
+
+These are UUIDs which are based on just 128-bit of random data. Version
+4 UUIDs are usually used as one-time local unique identifiers.
+
+=item B<Version 5> (name based, SHA-1)
+
+These are UUIDs which are based on the 160-bit SHA-1 message digest of the
+concatenation of a 128-bit namespace UUID and a name string of arbitrary
+length. Version 5 UUIDs are usually used for non-unique but repeatable
+message digest identifiers.
+
+=back
+
+=head2 UUID Uniqueness
+
+Version 1 UUIDs are guaranteed to be unique through combinations of
+hardware addresses, time stamps and random seeds. There is a reference
+in the UUID to the hardware (MAC) address of the first network interface
+card (NIC) on the host which generated the UUID -- this reference
+is intended to ensure the UUID will be unique in space as the MAC
+address of every network card is assigned by a single global authority
+(IEEE) and is guaranteed to be unique. The next component in a UUID
+is a timestamp which, as clock always (should) move forward, will
+be unique in time. Just in case some part of the above goes wrong
+(the hardware address cannot be determined or the clock moved steps
+backward), there is a random clock sequence component placed into the
+UUID as a "catch-all" for uniqueness.
+
+Version 3 and version 5 UUIDs are guaranteed to be inherently globally
+unique if the combination of namespace and name used to generate them is
+unique.
+
+Version 4 UUIDs are not guaranteed to be globally unique, because they
+are generated out of locally gathered pseudo-random numbers only.
+Nevertheless there is still a high likelihood of uniqueness over space
+and time and that they are computationally difficult to guess.
+
+=head2 Nil UUID
+
+There is a special I<Nil> UUID consisting of all octets set to zero in
+the binary representation. It can be used as a special UUID value which does
+not conflict with real UUIDs.
+
+=head1 APPLICATION PROGRAMMING INTERFACE
+
+The ISO-C Application Programming Interface (API) of B<OSSP uuid>
+consists of the following components.
+
+=head2 CONSTANTS
+
+The following constants are provided:
+
+=over 4
+
+=item B<UUID_VERSION>
+
+The hexadecimal encoded B<OSSP uuid> version. This allows compile-time
+checking of the B<OSSP uuid> version. For run-time checking use
+B<uuid_version>() instead.
+
+The hexadecimal encoding for a version "$I<v>.$I<r>$I<t>$I<l>" is
+calculated with the B<GNU shtool> B<version> command and is (in
+Perl-style for concise description) "sprintf('0x%x%02x%d%02x', $I<v>,
+$I<r>, {qw(s 9 . 2 b 1 a 0)}->{$I<t>}, ($I<t> eq 's' ? 99 : $I<l>))",
+i.e., the version 0.9.6 is encoded as "0x009206".
+
+=item B<UUID_LEN_BIN>, B<UUID_LEN_STR>, B<UUID_LEN_SIV>
+
+The number of octets of the UUID binary and string representations.
+Notice that the lengths of the string representation (B<UUID_LEN_STR>)
+and the lengths of the single integer value representation
+(B<UUID_LEN_SIV>) does I<not> include the necessary C<NUL> termination
+character.
+
+=item B<UUID_MAKE_V1>, B<UUID_MAKE_V3>, B<UUID_MAKE_V4>, B<UUID_MAKE_V5>, B<UUID_MAKE_MC>
+
+The I<mode> bits for use with B<uuid_make>(). The B<UUID_MAKE_V>I<N>
+specify which UUID version to generate. The B<UUID_MAKE_MC> forces the
+use of a random multi-cast MAC address instead of the real physical MAC
+address in version 1 UUIDs.
+
+=item B<UUID_RC_OK>, B<UUID_RC_ARG>, B<UUID_RC_MEM>, B<UUID_RC_SYS>, B<UUID_RC_INT>, B<UUID_RC_IMP>
+
+The possible numerical return-codes of API functions.
+The C<UUID_RC_OK> indicates success, the others indicate errors.
+Use B<uuid_error>() to translate them into string versions.
+
+=item B<UUID_FMT_BIN>, B<UUID_FMT_STR>, B<UUID_FMT_SIV>, B<UUID_FMT_TXT>
+
+The I<fmt> formats for use with B<uuid_import>() and B<uuid_export>().
+The B<UUID_FMT_BIN> indicates the UUID binary representation (of
+length B<UUID_LEN_BIN>), the B<UUID_FMT_STR> indicates the UUID string
+representation (of length B<UUID_LEN_STR>), the B<UUID_FMT_SIV>
+indicates the UUID single integer value representation (of maximum
+length B<UUID_LEN_SIV>) and the B<UUID_FMT_TXT> indicates the textual
+description (of arbitrary length) of a UUID.
+
+=back
+
+=head2 FUNCTIONS
+
+The following functions are provided:
+
+=over 4
+
+=item uuid_rc_t B<uuid_create>(uuid_t **I<uuid>);
+
+Create a new UUID object and store a pointer to it in C<*>I<uuid>.
+A UUID object consists of an internal representation of a UUID, the
+internal PRNG and MD5 generator contexts, and cached MAC address and
+timestamp information. The initial UUID is the I<Nil> UUID.
+
+=item uuid_rc_t B<uuid_destroy>(uuid_t *I<uuid>);
+
+Destroy UUID object I<uuid>.
+
+=item uuid_rc_t B<uuid_clone>(const uuid_t *I<uuid>, uuid_t **I<uuid_clone>);
+
+Clone UUID object I<uuid> and store new UUID object in I<uuid_clone>.
+
+=item uuid_rc_t B<uuid_isnil>(const uuid_t *I<uuid>, int *I<result>);
+
+Checks whether the UUID in I<uuid> is the I<Nil> UUID.
+If this is the case, it returns I<true> in C<*>I<result>.
+Else it returns I<false> in C<*>I<result>.
+
+=item uuid_rc_t B<uuid_compare>(const uuid_t *I<uuid>, const uuid_t *I<uuid2>, int *I<result>);
+
+Compares the order of the two UUIDs in I<uuid1> and I<uuid2>
+and returns the result in C<*>I<result>: C<-1> if I<uuid1> is
+smaller than I<uuid2>, C<0> if I<uuid1> is equal to I<uuid2>
+and C<+1> if I<uuid1> is greater than I<uuid2>.
+
+=item uuid_rc_t B<uuid_import>(uuid_t *I<uuid>, uuid_fmt_t I<fmt>, const void *I<data_ptr>, size_t I<data_len>);
+
+Imports a UUID I<uuid> from an external representation of format I<fmt>.
+The data is read from the buffer at I<data_ptr> which contains at least
+I<data_len> bytes.
+
+The format of the external representation is specified by I<fmt> and the
+minimum expected length in I<data_len> depends on it. Valid values for
+I<fmt> are B<UUID_FMT_BIN>, B<UUID_FMT_STR> and B<UUID_FMT_SIV>.
+
+=item uuid_rc_t B<uuid_export>(const uuid_t *I<uuid>, uuid_fmt_t I<fmt>, void *I<data_ptr>, size_t *I<data_len>);
+
+Exports a UUID I<uuid> into an external representation of format
+I<fmt>. Valid values for I<fmt> are B<UUID_FMT_BIN>, B<UUID_FMT_STR>,
+B<UUID_FMT_SIV> and B<UUID_FMT_TXT>.
+
+The data is written to the buffer whose location is obtained
+by dereferencing I<data_ptr> after a "cast" to the appropriate
+pointer-to-pointer type. Hence the generic pointer argument I<data_ptr>
+is expected to be a pointer to a "pointer of a particular type", i.e.,
+it has to be of type "C<unsigned char **>" for B<UUID_FMT_BIN> and
+"C<char **>" for B<UUID_FMT_STR>, B<UUID_FMT_SIV> and B<UUID_FMT_TXT>.
+
+The buffer has to be room for at least C<*>I<data_len> bytes. If the
+value of the pointer after "casting" and dereferencing I<data_ptr>
+is C<NULL>, I<data_len> is ignored as input and a new buffer is
+allocated and returned in the pointer after "casting" and dereferencing
+I<data_ptr> (the caller has to free(3) it later on).
+
+If I<data_len> is not C<NULL>, the number of available bytes in the
+buffer has to be provided in C<*>I<data_len> and the number of actually
+written bytes are returned in C<*>I<data_len> again. The minimum
+required buffer length depends on the external representation as
+specified by I<fmt> and is at least B<UUID_LEN_BIN> for B<UUID_FMT_BIN>,
+B<UUID_LEN_STR> for B<UUID_FMT_STR> and B<UUID_LEN_SIV> for
+B<UUID_FMT_SIV>. For B<UUID_FMT_TXT> a buffer of unspecified length is
+required and hence it is recommended to allow B<OSSP uuid> to allocate
+the buffer as necessary.
+
+=item uuid_rc_t B<uuid_load>(uuid_t *I<uuid>, const char *I<name>);
+
+Loads a pre-defined UUID value into the UUID object I<uuid>. The
+following I<name> arguments are currently known:
+
+=over 4
+
+=item I<name> I<UUID>
+
+=item nil 00000000-0000-0000-0000-000000000000
+
+=item ns:DNS 6ba7b810-9dad-11d1-80b4-00c04fd430c8
+
+=item ns:URL 6ba7b811-9dad-11d1-80b4-00c04fd430c8
+
+=item ns:OID 6ba7b812-9dad-11d1-80b4-00c04fd430c8
+
+=item ns:X500 6ba7b814-9dad-11d1-80b4-00c04fd430c8
+
+=back
+
+The "C<ns:>I<XXX>" are names of pre-defined name-space UUIDs for use in
+the generation of DCE 1.1 version 3 and version 5 UUIDs.
+
+=item uuid_rc_t B<uuid_make>(uuid_t *I<uuid>, unsigned int I<mode>, ...);
+
+Generates a new UUID in I<uuid> according to I<mode> and optional
+arguments (dependent on I<mode>).
+
+If I<mode> contains the C<UUID_MAKE_V1> bit, a DCE 1.1 variant UUID of
+version 1 is generated. Then optionally the bit C<UUID_MAKE_MC> forces
+the use of random multi-cast MAC address instead of the real physical
+MAC address (the default). The UUID is generated out of the 60-bit current
+system time, a 12-bit clock sequence and the 48-bit MAC address.
+
+If I<mode> contains the C<UUID_MAKE_V3> or C<UUID_MAKE_V5> bit, a DCE
+1.1 variant UUID of version 3 or 5 is generated and two additional
+arguments are expected: first, a namespace UUID object (C<uuid_t *>).
+Second, a name string of arbitrary length (C<const char *>). The UUID is
+generated out of the 128-bit MD5 or 160-bit SHA-1 from the concatenated
+octet stream of namespace UUID and name string.
+
+If I<mode> contains the C<UUID_MAKE_V4> bit, a DCE 1.1 variant UUID
+of version 4 is generated. The UUID is generated out of 128-bit random
+data.
+
+=item char *B<uuid_error>(uuid_rc_t I<rc>);
+
+Returns a constant string representation corresponding to the
+return-code I<rc> for use in displaying B<OSSP uuid> errors.
+
+=item unsigned long B<uuid_version>(void);
+
+Returns the hexadecimal encoded B<OSSP uuid> version as compiled into
+the library object files. This allows run-time checking of the B<OSSP
+uuid> version. For compile-time checking use C<UUID_VERSION> instead.
+
+=back
+
+=head1 EXAMPLE
+
+The following shows an example usage of the API. Error handling is
+omitted for code simplification and has to be re-added for production
+code.
+
+ /* generate a DCE 1.1 v1 UUID from system environment */
+ char *uuid_v1(void)
+ {
+ uuid_t *uuid;
+ char *str;
+
+ uuid_create(&uuid);
+ uuid_make(uuid, UUID_MAKE_V1);
+ str = NULL;
+ uuid_export(uuid, UUID_FMT_STR, &str, NULL);
+ uuid_destroy(uuid);
+ return str;
+ }
+
+ /* generate a DCE 1.1 v3 UUID from an URL */
+ char *uuid_v3(const char *url)
+ {
+ uuid_t *uuid;
+ uuid_t *uuid_ns;
+ char *str;
+
+ uuid_create(&uuid);
+ uuid_create(&uuid_ns);
+ uuid_load(uuid_ns, "ns:URL");
+ uuid_make(uuid, UUID_MAKE_V3, uuid_ns, url);
+ str = NULL;
+ uuid_export(uuid, UUID_FMT_STR, &str, NULL);
+ uuid_destroy(uuid_ns);
+ uuid_destroy(uuid);
+ return str;
+ }
+
+=head1 SEE ALSO
+
+The following are references to B<UUID> documentation and specifications:
+
+=over 4
+
+=item
+
+B<A Universally Unique IDentifier (UUID) URN Namespace>,
+P. Leach, M. Mealling, R. Salz,
+IETF RFC-4122,
+July 2005, 32 pages,
+http://www.ietf.org/rfc/rfc4122.txt
+
+=item
+
+Information Technology -- Open Systems Interconnection (OSI),
+B<Procedures for the operation of OSI Registration Authorities:
+Generation and Registration of Universally Unique Identifiers (UUIDs)
+and their Use as ASN.1 Object Identifier Components>,
+ISO/IEC 9834-8:2004 / ITU-T Rec. X.667, 2004,
+December 2004, 25 pages,
+http://www.itu.int/ITU-T/studygroups/com17/oid/X.667-E.pdf
+
+=item
+
+B<DCE 1.1: Remote Procedure Call>,
+appendix B<Universally Unique Identifier>,
+Open Group Technical Standard
+Document Number C706, August 1997, 737 pages,
+(supersedes C309 DCE: Remote Procedure Call 8/1994,
+which was basis for ISO/IEC 11578:1996 specification),
+http://www.opengroup.org/publications/catalog/c706.htm
+
+=item
+
+Information technology -- Open Systems Interconnection (OSI),
+B<Remote Procedure Call (RPC)>,
+ISO/IEC 11578:1996,
+August 2001, 570 pages, (CHF 340,00),
+http://www.iso.ch/cate/d2229.html
+
+=item
+
+B<HTTP Extensions for Distributed Authoring (WebDAV)>,
+section B<6.4.1 Node Field Generation Without the IEEE 802 Address>,
+IETF RFC-2518,
+February 1999, 94 pages,
+http://www.ietf.org/rfc/rfc2518.txt
+
+=item
+
+B<DCE 1.1 compliant UUID functions>,
+FreeBSD manual pages uuid(3) and uuidgen(2),
+http://www.freebsd.org/cgi/man.cgi?query=uuid&manpath=FreeBSD+6.0-RELEASE
+
+=back
+
+=head1 HISTORY
+
+B<OSSP uuid> was implemented in January 2004 by Ralf S. Engelschall
+E<lt>rse@engelschall.comE<gt>. It was prompted by the use of UUIDs
+in the B<OSSP as> and B<OpenPKG> projects. It is a clean room
+implementation intended to be strictly standards compliant and maximum
+portable.
+
+=head1 SEE ALSO
+
+uuid(1), uuid-config(1), OSSP::uuid(3).
+
+=cut
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_ach"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_ac.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_ac.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_ac.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,109 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_ac.c: auto-configuration
+*/
+
+#ifndef __UUID_AC_H__
+#define __UUID_AC_H__
+
+/* include GNU autoconf results */
+#include "config.h" /* HAVE_xxx */
+
+/* include standard system headers */
+#include <stdio.h> /* NULL, etc. */
+#include <stdlib.h> /* malloc, NULL, etc. */
+#include <stdarg.h> /* va_list, etc. */
+#include <string.h> /* size_t, strlen, etc. */
+#include <unistd.h> /* dmalloc pre-loading */
+
+/* enable optional "dmalloc" support */
+#ifdef WITH_DMALLOC
+#include <dmalloc.h> /* malloc override, etc */
+#endif
+
+/* define boolean values */
+#define UUID_FALSE 0
+#define UUID_TRUE (/*lint -save -e506*/ !UUID_FALSE /*lint -restore*/)
+
+/* determine types of 8-bit size */
+#if SIZEOF_CHAR == 1
+typedef char uuid_int8_t;
+#else
+#error unexpected: sizeof(char) != 1 !?
+#endif
+#if SIZEOF_UNSIGNED_CHAR == 1
+typedef unsigned char uuid_uint8_t;
+#else
+#error unexpected: sizeof(unsigned char) != 1 !?
+#endif
+
+/* determine types of 16-bit size */
+#if SIZEOF_SHORT == 2
+typedef short uuid_int16_t;
+#elif SIZEOF_INT == 2
+typedef int uuid_int16_t;
+#elif SIZEOF_LONG == 2
+typedef long uuid_int16_t;
+#else
+#error unexpected: no type found for uuid_int16_t
+#endif
+#if SIZEOF_UNSIGNED_SHORT == 2
+typedef unsigned short uuid_uint16_t;
+#elif SIZEOF_UNSIGNED_INT == 2
+typedef unsigned int uuid_uint16_t;
+#elif SIZEOF_UNSIGNED_LONG == 2
+typedef unsigned long uuid_uint16_t;
+#else
+#error unexpected: no type found for uuid_uint16_t
+#endif
+
+/* determine types of 32-bit size */
+#if SIZEOF_SHORT == 4
+typedef short uuid_int32_t;
+#elif SIZEOF_INT == 4
+typedef int uuid_int32_t;
+#elif SIZEOF_LONG == 4
+typedef long uuid_int32_t;
+#elif SIZEOF_LONG_LONG == 4
+typedef long long uuid_int32_t;
+#else
+#error unexpected: no type found for uuid_int32_t
+#endif
+#if SIZEOF_UNSIGNED_SHORT == 4
+typedef unsigned short uuid_uint32_t;
+#elif SIZEOF_UNSIGNED_INT == 4
+typedef unsigned int uuid_uint32_t;
+#elif SIZEOF_UNSIGNED_LONG == 4
+typedef unsigned long uuid_uint32_t;
+#elif SIZEOF_UNSIGNED_LONG_LONG == 4
+typedef unsigned long long uuid_uint32_t;
+#else
+#error unexpected: no type found for uuid_uint32_t
+#endif
+
+#endif /* __UUID_AC_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_bmh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_bm.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_bm.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_bm.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,80 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_bm.c: bitmask API implementation
+*/
+
+#ifndef __UUID_BM_H__
+#define __UUID_BM_H__
+
+/*
+ * Bitmask Calculation Macros (up to 32 bit only)
+ * (Notice: bit positions are counted n...0, i.e. lowest bit is position 0)
+ */
+
+/* generate a bitmask consisting of 1 bits from (and including)
+ bit position `l' (left) to (and including) bit position `r' */
+#define BM_MASK(l,r) \
+ ((((unsigned int)1<<(((l)-(r))+1))-1)<<(r))
+
+/* extract a value v from a word w at position `l' to `r' and return value */
+#define BM_GET(w,l,r) \
+ (((w)>>(r))&BM_MASK((l)-(r),0))
+
+/* insert a value v into a word w at position `l' to `r' and return word */
+#define BM_SET(w,l,r,v) \
+ ((w)|(((v)&BM_MASK((l)-(r),0))<<(r)))
+
+/* generate a single bit `b' (0 or 1) at bit position `n' */
+#define BM_BIT(n,b) \
+ ((b)<<(n))
+
+/* generate a quad word octet of bits (a half byte, i.e. bit positions 3 to 0) */
+#define BM_QUAD(b3,b2,b1,b0) \
+ (BM_BIT(3,(b3))|BM_BIT(2,(b2))|BM_BIT(1,(b1))|BM_BIT(0,(b0)))
+
+/* generate an octet word of bits (a byte, i.e. bit positions 7 to 0) */
+#define BM_OCTET(b7,b6,b5,b4,b3,b2,b1,b0) \
+ ((BM_QUAD(b7,b6,b5,b4)<<4)|BM_QUAD(b3,b2,b1,b0))
+
+/* generate the value 2^n */
+#define BM_POW2(n) \
+ BM_BIT(n,1)
+
+/* shift word w k bits to the left or to the right */
+#define BM_SHL(w,k) \
+ ((w)<<(k))
+#define BM_SHR(w,k) \
+ ((w)>>(k))
+
+/* rotate word w (of bits n..0) k bits to the left or to the right */
+#define BM_ROL(w,n,k) \
+ ((BM_SHL((w),(k))&BM_MASK(n,0))|BM_SHR(((w)&BM_MASK(n,0)),(n)-(k)))
+#define BM_ROR(w,n,k) \
+ ((BM_SHR(((w)&BM_MASK(n,0)),(k)))|BM_SHL(((w),(n)-(k))&BM_MASK(n,0)))
+
+#endif /* __UUID_BM_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_clic"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_cli.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_cli.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_cli.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,283 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_cli.c: command line tool
+*/
+
+/* own headers */
+#include "uuid.h"
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+/* error handler */
+static void
+error(int ec, const char *str, ...)
+{
+ va_list ap;
+
+ va_start(ap, str);
+ fprintf(stderr, "uuid:ERROR: ");
+ vfprintf(stderr, str, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(ec);
+}
+
+/* usage handler */
+static void
+usage(const char *str, ...)
+{
+ va_list ap;
+
+ va_start(ap, str);
+ if (str != NULL) {
+ fprintf(stderr, "uuid:ERROR: ");
+ vfprintf(stderr, str, ap);
+ fprintf(stderr, "\n");
+ }
+ fprintf(stderr, "usage: uuid [-v version] [-m] [-n count] [-1] [-F format] [-o filename] [namespace name]\n");
+ fprintf(stderr, "usage: uuid -d [-F format] [-o filename] [uuid]\n");
+ va_end(ap);
+ exit(1);
+}
+
+/* main procedure */
+int main(int argc, char *argv[])
+{
+ char uuid_buf_bin[UUID_LEN_BIN];
+ char uuid_buf_str[UUID_LEN_STR+1];
+ char uuid_buf_siv[UUID_LEN_SIV+1];
+ uuid_t *uuid;
+ uuid_t *uuid_ns;
+ uuid_rc_t rc;
+ FILE *fp;
+ char *p;
+ int ch;
+ int count;
+ int i;
+ int iterate;
+ uuid_fmt_t fmt;
+ int decode;
+ void *vp;
+ size_t n;
+ unsigned int version;
+
+ /* command line parsing */
+ count = -1; /* no count yet */
+ fp = stdout; /* default output file */
+ iterate = 0; /* not one at a time */
+ fmt = UUID_FMT_STR; /* default is ASCII output */
+ decode = 0; /* default is to encode */
+ version = UUID_MAKE_V1;
+ while ((ch = getopt(argc, argv, "1n:rF:dmo:v:h")) != -1) {
+ switch (ch) {
+ case '1':
+ iterate = 1;
+ break;
+ case 'n':
+ if (count > 0)
+ usage("option 'n' specified multiple times");
+ count = strtol(optarg, &p, 10);
+ if (*p != '\0' || count < 1)
+ usage("invalid argument to option 'n'");
+ break;
+ case 'r':
+ fmt = UUID_FMT_BIN;
+ break;
+ case 'F':
+ if (strcasecmp(optarg, "bin") == 0)
+ fmt = UUID_FMT_BIN;
+ else if (strcasecmp(optarg, "str") == 0)
+ fmt = UUID_FMT_STR;
+ else if (strcasecmp(optarg, "siv") == 0)
+ fmt = UUID_FMT_SIV;
+ else
+ error(1, "invalid format \"%s\" (has to be \"bin\", \"str\" or \"siv\")", optarg);
+ break;
+ case 'd':
+ decode = 1;
+ break;
+ case 'o':
+ if (fp != stdout)
+ error(1, "multiple output files are not allowed");
+ if ((fp = fopen(optarg, "w")) == NULL)
+ error(1, "fopen: %s", strerror(errno));
+ break;
+ case 'm':
+ version |= UUID_MAKE_MC;
+ break;
+ case 'v':
+ i = strtol(optarg, &p, 10);
+ if (*p != '\0')
+ usage("invalid argument to option 'v'");
+ switch (i) {
+ case 1: version = UUID_MAKE_V1; break;
+ case 3: version = UUID_MAKE_V3; break;
+ case 4: version = UUID_MAKE_V4; break;
+ case 5: version = UUID_MAKE_V5; break;
+ default:
+ usage("invalid version on option 'v'");
+ break;
+ }
+ break;
+ case 'h':
+ usage(NULL);
+ break;
+ default:
+ usage("invalid option '%c'", optopt);
+ }
+ }
+ argv += optind;
+ argc -= optind;
+ if (count == -1)
+ count = 1;
+
+ if (decode) {
+ /* decoding */
+ if ((rc = uuid_create(&uuid)) != UUID_RC_OK)
+ error(1, "uuid_create: %s", uuid_error(rc));
+ if (argc != 1)
+ usage("invalid number of arguments");
+ if (strcmp(argv[0], "-") == 0) {
+ if (fmt == UUID_FMT_BIN) {
+ if (fread(uuid_buf_bin, UUID_LEN_BIN, 1, stdin) != 1)
+ error(1, "fread: failed to read %d (UUID_LEN_BIN) bytes from stdin", UUID_LEN_BIN);
+ if ((rc = uuid_import(uuid, UUID_FMT_BIN, uuid_buf_bin, UUID_LEN_BIN)) != UUID_RC_OK)
+ error(1, "uuid_import: %s", uuid_error(rc));
+ }
+ else if (fmt == UUID_FMT_STR) {
+ if (fread(uuid_buf_str, UUID_LEN_STR, 1, stdin) != 1)
+ error(1, "fread: failed to read %d (UUID_LEN_STR) bytes from stdin", UUID_LEN_STR);
+ uuid_buf_str[UUID_LEN_STR] = '\0';
+ if ((rc = uuid_import(uuid, UUID_FMT_STR, uuid_buf_str, UUID_LEN_STR)) != UUID_RC_OK)
+ error(1, "uuid_import: %s", uuid_error(rc));
+ }
+ else if (fmt == UUID_FMT_SIV) {
+ if (fread(uuid_buf_siv, UUID_LEN_SIV, 1, stdin) != 1)
+ error(1, "fread: failed to read %d (UUID_LEN_SIV) bytes from stdin", UUID_LEN_SIV);
+ uuid_buf_siv[UUID_LEN_SIV] = '\0';
+ if ((rc = uuid_import(uuid, UUID_FMT_SIV, uuid_buf_siv, UUID_LEN_SIV)) != UUID_RC_OK)
+ error(1, "uuid_import: %s", uuid_error(rc));
+ }
+ }
+ else {
+ if (fmt == UUID_FMT_BIN) {
+ error(1, "binary input mode only possible if reading from stdin");
+ }
+ else if (fmt == UUID_FMT_STR) {
+ if ((rc = uuid_import(uuid, UUID_FMT_STR, argv[0], strlen(argv[0]))) != UUID_RC_OK)
+ error(1, "uuid_import: %s", uuid_error(rc));
+ }
+ else if (fmt == UUID_FMT_SIV) {
+ if ((rc = uuid_import(uuid, UUID_FMT_SIV, argv[0], strlen(argv[0]))) != UUID_RC_OK)
+ error(1, "uuid_import: %s", uuid_error(rc));
+ }
+ }
+ vp = NULL;
+ if ((rc = uuid_export(uuid, UUID_FMT_TXT, &vp, NULL)) != UUID_RC_OK)
+ error(1, "uuid_export: %s", uuid_error(rc));
+ fprintf(stdout, "%s", (char *)vp);
+ free(vp);
+ if ((rc = uuid_destroy(uuid)) != UUID_RC_OK)
+ error(1, "uuid_destroy: %s", uuid_error(rc));
+ }
+ else {
+ /* encoding */
+ if ( (version == UUID_MAKE_V1 && argc != 0)
+ || (version == UUID_MAKE_V3 && argc != 2)
+ || (version == UUID_MAKE_V4 && argc != 0)
+ || (version == UUID_MAKE_V5 && argc != 2))
+ usage("invalid number of arguments");
+ if ((rc = uuid_create(&uuid)) != UUID_RC_OK)
+ error(1, "uuid_create: %s", uuid_error(rc));
+ if (argc == 1) {
+ /* load initial UUID for setting old generator state */
+ if (strlen(argv[0]) != UUID_LEN_STR)
+ error(1, "invalid length of UUID string representation");
+ if ((rc = uuid_import(uuid, UUID_FMT_STR, argv[0], strlen(argv[0]))) != UUID_RC_OK)
+ error(1, "uuid_import: %s", uuid_error(rc));
+ }
+ for (i = 0; i < count; i++) {
+ if (iterate) {
+ if ((rc = uuid_load(uuid, "nil")) != UUID_RC_OK)
+ error(1, "uuid_load: %s", uuid_error(rc));
+ }
+ if (version == UUID_MAKE_V3 || version == UUID_MAKE_V5) {
+ if ((rc = uuid_create(&uuid_ns)) != UUID_RC_OK)
+ error(1, "uuid_create: %s", uuid_error(rc));
+ if ((rc = uuid_load(uuid_ns, argv[0])) != UUID_RC_OK) {
+ if ((rc = uuid_import(uuid_ns, UUID_FMT_STR, argv[0], strlen(argv[0]))) != UUID_RC_OK)
+ error(1, "uuid_import: %s", uuid_error(rc));
+ }
+ if ((rc = uuid_make(uuid, version, uuid_ns, argv[1])) != UUID_RC_OK)
+ error(1, "uuid_make: %s", uuid_error(rc));
+ if ((rc = uuid_destroy(uuid_ns)) != UUID_RC_OK)
+ error(1, "uuid_destroy: %s", uuid_error(rc));
+ }
+ else {
+ if ((rc = uuid_make(uuid, version)) != UUID_RC_OK)
+ error(1, "uuid_make: %s", uuid_error(rc));
+ }
+ if (fmt == UUID_FMT_BIN) {
+ vp = NULL;
+ if ((rc = uuid_export(uuid, UUID_FMT_BIN, &vp, &n)) != UUID_RC_OK)
+ error(1, "uuid_export: %s", uuid_error(rc));
+ fwrite(vp, n, 1, fp);
+ free(vp);
+ }
+ else if (fmt == UUID_FMT_STR) {
+ vp = NULL;
+ if ((rc = uuid_export(uuid, UUID_FMT_STR, &vp, &n)) != UUID_RC_OK)
+ error(1, "uuid_export: %s", uuid_error(rc));
+ fprintf(fp, "%s\n", (char *)vp);
+ free(vp);
+ }
+ else if (fmt == UUID_FMT_SIV) {
+ vp = NULL;
+ if ((rc = uuid_export(uuid, UUID_FMT_SIV, &vp, &n)) != UUID_RC_OK)
+ error(1, "uuid_export: %s", uuid_error(rc));
+ fprintf(fp, "%s\n", (char *)vp);
+ free(vp);
+ }
+ }
+ if ((rc = uuid_destroy(uuid)) != UUID_RC_OK)
+ error(1, "uuid_destroy: %s", uuid_error(rc));
+ }
+
+ /* close output channel */
+ if (fp != stdout)
+ fclose(fp);
+
+ return 0;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_clipod"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_cli.pod (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_cli.pod         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_cli.pod        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,201 @@
</span><ins>+##
+## OSSP uuid - Universally Unique Identifier
+## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+##
+## This file is part of OSSP uuid, a library for the generation
+## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+## uuid_cli.pod: manual page
+##
+
+=pod
+
+=head1 NAME
+
+B<OSSP uuid> - B<Universally Unique Identifier Command-Line Tool>
+
+=head1 VERSION
+
+OSSP uuid UUID_VERSION_STR
+
+=head1 SYNOPSIS
+
+B<uuid>
+[B<-v> I<version>]
+[B<-m>]
+[B<-n> I<count>]
+[B<-1>]
+[B<-F> I<format>]
+[B<-o> I<filename>]
+[I<namespace> I<name>]
+
+B<uuid>
+B<-d>
+[B<-r>]
+[B<-o> I<filename>]
+I<uuid>
+
+=head1 DESCRIPTION
+
+B<OSSP uuid> is a ISO-C:1999 application programming interface (API) and
+corresponding command line interface (CLI) for the generation of DCE
+1.1, ISO/IEC 11578:1996 and IETF RFC-4122 compliant I<Universally Unique
+Identifier> (UUID). It supports DCE 1.1 variant UUIDs of version 1 (time
+and node based), version 3 (name based, MD5), version 4 (random number
+based) and version 5 (name based, SHA-1). Additional API bindings are
+provided for the languages ISO-C++:1998, Perl:5 and PHP:4/5. Optional
+backward compatibility exists for the ISO-C DCE-1.1 and Perl Data::UUID
+APIs.
+
+UUIDs are 128 bit numbers which are intended to have a high likelihood
+of uniqueness over space and time and are computationally difficult
+to guess. They are globally unique identifiers which can be locally
+generated without contacting a global registration authority. UUIDs
+are intended as unique identifiers for both mass tagging objects
+with an extremely short lifetime and to reliably identifying very
+persistent objects across a network.
+
+This is the command line interface (CLI) of B<OSSP uuid>. For a
+detailed description of UUIDs see the documentation of the application
+programming interface (API) in uuid(3).
+
+=head1 OPTIONS
+
+=over 3
+
+=item B<-v> I<version>
+
+Sets the version of the generated DCE 1.1 variant UUID. Supported
+are I<version> "C<1>", "C<3>", "C<4>" and "C<5>". The default is "C<1>".
+
+For version 3 and version 5 UUIDs the additional command line arguments
+I<namespace> and I<name> have to be given. The I<namespace> is either
+a UUID in string representation or an identifier for internally
+pre-defined namespace UUIDs (currently known are "C<ns:DNS>",
+"C<ns:URL>", "C<ns:OID>", and "C<ns:X500>"). The I<name> is a string of
+arbitrary length.
+
+=item B<-m>
+
+Forces the use of a random multi-cast MAC address when generating
+version 1 UUIDs. By default the real physical MAC address of the system
+is used.
+
+=item B<-n> I<count>
+
+Generate I<count> UUIDs instead of just a single one (the default).
+
+=item B<-1>
+
+If option B<-n> is used with a I<count> greater than C<1>, then this
+option can enforce the reset the UUID context for each generated UUID.
+This makes no difference for I<version> C<3>, C<4> and C<5> UUIDs. But
+version C<1> UUIDs are based on the previously generated UUID which is
+remembered in the UUID context of the API. Option B<-1> deletes the
+remembered UUID on each iteration.
+
+=item B<-F> I<format>
+
+Representation format for importing or exporting an UUID. The
+following (case insensitive) format identifiers are currently recognized:
+
+=over 4
+
+=item C<BIN> (binary representation)
+
+This is the raw 128 bit network byte order binary representation of a
+UUID. Example is the octet stream C<0xF8 0x1D 0x4F 0xAE 0x7D 0xEC 0x11
+0xD0 0xA7 0x65 0x00 0xA0 0xC9 0x1E 0x6B 0xF6>.
+
+=item C<STR> (string representation)
+
+This is the 36 character hexadecimal ASCII string representation of a
+UUID. Example is the string "C<f81d4fae-7dec-11d0-a765-00a0c91e6bf6>".
+
+=item C<SIV> (single integer value representation)
+
+This is the maximum 39 character long single integer
+value representation of a UUID. Example is the string
+"C<329800735698586629295641978511506172918>".
+
+=back
+
+=item B<-o> I<filename>
+
+Write output to I<filename> instead of to F<stdout>.
+
+=item B<-d>
+
+Decode a given UUID (given as a command line argument or if the command
+line argument is "C<->" the UUID is read from F<stdin>) and dump textual
+information about the UUID.
+
+=back
+
+=head1 EXAMPLES
+
+ # generate DCE 1.1 v1 UUID (time and node based)
+ $ uuid -v1
+ 01c47915-4777-11d8-bc70-0090272ff725
+
+ # decode and dump DCE 1.1 v1 UUID (time and node based)
+ $ uuid -d 01c47915-4777-11d8-bc70-0090272ff725
+ encode: STR: 01c47915-4777-11d8-bc70-0090272ff725
+ SIV: 2349374037528578887923094374772111141
+ decode: variant: DCE 1.1, ISO/IEC 11578:1996
+ version: 1 (time and node based)
+ content: time: 2004-01-15 16:22:26.376322.1 UTC
+ clock: 15472 (usually random)
+ node: 00:90:27:2f:f7:25 (global unicast)
+
+ # generate DCE 1.1 v3 UUID (name based)
+ $ uuid -v3 ns:URL http://www.ossp.org/
+ 02d9e6d5-9467-382e-8f9b-9300a64ac3cd
+
+ # decode and dump DCE 1.1 v3 UUID (name based)
+ $ uuid -d 02d9e6d5-9467-382e-8f9b-9300a64ac3cd
+ encode: STR: 02d9e6d5-9467-382e-8f9b-9300a64ac3cd
+ SIV: 3789866285607910888100818383505376205
+ decode: variant: DCE 1.1, ISO/IEC 11578:1996
+ version: 3 (name based, MD5)
+ content: 02:D9:E6:D5:94:67:08:2E:0F:9B:93:00:A6:4A:C3:CD
+ (not decipherable: MD5 message digest only)
+
+ # generate DCE 1.1 v4 UUID 4 (random data based)
+ $ uuid -v4
+ eb424026-6f54-4ef8-a4d0-bb658a1fc6cf
+
+ # decode and dump DCE 1.1 v4 UUID 4 (random data based)
+ $ uuid -d eb424026-6f54-4ef8-a4d0-bb658a1fc6cf
+ encode: STR: eb424026-6f54-4ef8-a4d0-bb658a1fc6cf
+ SIV: 312712571721458096795100956955942831823
+ decode: variant: DCE 1.1, ISO/IEC 11578:1996
+ version: 4 (random data based)
+ content: EB:42:40:26:6F:54:0E:F8:24:D0:BB:65:8A:1F:C6:CF
+ (no semantics: random data only)
+
+=head1 SEE ALSO
+
+uuid(3), OSSP::uuid(3).
+
+=cut
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_dcec"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_dce.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_dce.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_dce.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,294 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_dce.c: DCE 1.1 compatibility API implementation
+*/
+
+/* include DCE 1.1 API */
+#define uuid_t uuid_dce_t
+#include "uuid_dce.h"
+#undef uuid_t
+#undef uuid_create
+#undef uuid_create_nil
+#undef uuid_is_nil
+#undef uuid_compare
+#undef uuid_equal
+#undef uuid_from_string
+#undef uuid_to_string
+#undef uuid_hash
+
+/* include regular API */
+#include "uuid.h"
+
+/* helper macro */
+#define LEAVE /*lint -save -e801*/ goto leave /*lint -restore*/
+
+/* create a UUID (v1 only) */
+void uuid_dce_create(uuid_dce_t *uuid_dce, int *status)
+{
+ uuid_t *uuid;
+ size_t len;
+ void *vp;
+
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (uuid_dce == NULL)
+ return;
+
+ /* create UUID and export as binary representation */
+ if (uuid_create(&uuid) != UUID_RC_OK)
+ return;
+ if (uuid_make(uuid, UUID_MAKE_V1) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ return;
+ }
+ vp = uuid_dce;
+ len = UUID_LEN_BIN;
+ if (uuid_export(uuid, UUID_FMT_BIN, &vp, &len) != UUID_RC_OK) {
+ uuid_destroy(uuid);
+ return;
+ }
+ uuid_destroy(uuid);
+
+ /* return successfully */
+ if (status != NULL)
+ *status = uuid_s_ok;
+ return;
+}
+
+/* create a Nil UUID */
+void uuid_dce_create_nil(uuid_dce_t *uuid_dce, int *status)
+{
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (uuid_dce == NULL)
+ return;
+
+ /* short-circuit implementation, because Nil UUID is trivial to
+ create, so no need to use regular OSSP uuid API */
+ memset(uuid_dce, 0, UUID_LEN_BIN);
+
+ /* return successfully */
+ if (status != NULL)
+ *status = uuid_s_ok;
+ return;
+}
+
+/* check whether it is Nil UUID */
+int uuid_dce_is_nil(uuid_dce_t *uuid_dce, int *status)
+{
+ int i;
+ int result;
+ unsigned char *ucp;
+
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (uuid_dce == NULL)
+ return 0;
+
+ /* short-circuit implementation, because Nil UUID is trivial to
+ check, so no need to use regular OSSP uuid API */
+ result = 1;
+ ucp = (unsigned char *)uuid_dce;
+ for (i = 0; i < UUID_LEN_BIN; i++) {
+ if (ucp[i] != '\0') {
+ result = 0;
+ break;
+ }
+ }
+
+ /* return successfully with result */
+ if (status != NULL)
+ *status = uuid_s_ok;
+ return result;
+}
+
+/* compare two UUIDs */
+int uuid_dce_compare(uuid_dce_t *uuid_dce1, uuid_dce_t *uuid_dce2, int *status)
+{
+ uuid_t *uuid1 = NULL;
+ uuid_t *uuid2 = NULL;
+ int result = 0;
+
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (uuid_dce1 == NULL || uuid_dce2 == NULL)
+ return 0;
+
+ /* import both UUID binary representations and compare them */
+ if (uuid_create(&uuid1) != UUID_RC_OK)
+ LEAVE;
+ if (uuid_create(&uuid2) != UUID_RC_OK)
+ LEAVE;
+ if (uuid_import(uuid1, UUID_FMT_BIN, uuid_dce1, UUID_LEN_BIN) != UUID_RC_OK)
+ LEAVE;
+ if (uuid_import(uuid2, UUID_FMT_BIN, uuid_dce2, UUID_LEN_BIN) != UUID_RC_OK)
+ LEAVE;
+ if (uuid_compare(uuid1, uuid2, &result) != UUID_RC_OK)
+ LEAVE;
+
+ /* indicate successful operation */
+ if (status != NULL)
+ *status = uuid_s_ok;
+
+ /* cleanup and return */
+ leave:
+ if (uuid1 != NULL)
+ uuid_destroy(uuid1);
+ if (uuid2 != NULL)
+ uuid_destroy(uuid2);
+ return result;
+}
+
+/* compare two UUIDs (equality only) */
+int uuid_dce_equal(uuid_dce_t *uuid_dce1, uuid_dce_t *uuid_dce2, int *status)
+{
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (uuid_dce1 == NULL || uuid_dce2 == NULL)
+ return 0;
+
+ /* pass through to generic compare function */
+ return (uuid_dce_compare(uuid_dce1, uuid_dce2, status) == 0 ? 1 : 0);
+}
+
+/* import UUID from string representation */
+void uuid_dce_from_string(const char *str, uuid_dce_t *uuid_dce, int *status)
+{
+ uuid_t *uuid = NULL;
+ size_t len;
+ void *vp;
+
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (str == NULL || uuid_dce == NULL)
+ return;
+
+ /* import string representation and export binary representation */
+ if (uuid_create(&uuid) != UUID_RC_OK)
+ LEAVE;
+ if (uuid_import(uuid, UUID_FMT_STR, str, UUID_LEN_STR) != UUID_RC_OK)
+ LEAVE;
+ vp = uuid_dce;
+ len = UUID_LEN_BIN;
+ if (uuid_export(uuid, UUID_FMT_BIN, &vp, &len) != UUID_RC_OK)
+ LEAVE;
+
+ /* indicate successful operation */
+ if (status != NULL)
+ *status = uuid_s_ok;
+
+ /* cleanup and return */
+ leave:
+ if (uuid != NULL)
+ uuid_destroy(uuid);
+ return;
+}
+
+/* export UUID to string representation */
+void uuid_dce_to_string(uuid_dce_t *uuid_dce, char **str, int *status)
+{
+ uuid_t *uuid = NULL;
+ size_t len;
+ void *vp;
+
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (str == NULL || uuid_dce == NULL)
+ return;
+
+ /* import binary representation and export string representation */
+ if (uuid_create(&uuid) != UUID_RC_OK)
+ LEAVE;
+ if (uuid_import(uuid, UUID_FMT_BIN, uuid_dce, UUID_LEN_BIN) != UUID_RC_OK)
+ LEAVE;
+ vp = str;
+ len = UUID_LEN_STR;
+ if (uuid_export(uuid, UUID_FMT_STR, &vp, &len) != UUID_RC_OK)
+ LEAVE;
+
+ /* indicate successful operation */
+ if (status != NULL)
+ *status = uuid_s_ok;
+
+ /* cleanup and return */
+ leave:
+ if (uuid != NULL)
+ uuid_destroy(uuid);
+ return;
+}
+
+/* export UUID into hash value */
+unsigned int uuid_dce_hash(uuid_dce_t *uuid_dce, int *status)
+{
+ int i;
+ unsigned char *ucp;
+ unsigned int hash;
+
+ /* initialize status */
+ if (status != NULL)
+ *status = uuid_s_error;
+
+ /* sanity check argument(s) */
+ if (uuid_dce == NULL)
+ return 0;
+
+ /* generate a hash value
+ (DCE 1.1 actually requires 16-bit only) */
+ hash = 0;
+ ucp = (unsigned char *)uuid_dce;
+ for (i = UUID_LEN_BIN-1; i >= 0; i--) {
+ hash <<= 8;
+ hash |= ucp[i];
+ }
+
+ /* return successfully */
+ if (status != NULL)
+ *status = uuid_s_ok;
+ return hash;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_dceh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_dce.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_dce.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_dce.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,88 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_dce.h: DCE 1.1 compatibility API definition
+*/
+
+#ifndef __UUID_DCE_H___
+#define __UUID_DCE_H___
+
+/* sanity check usage */
+#ifdef __UUID_H__
+#error the regular OSSP uuid API and the DCE 1.1 backward compatibility API are mutually exclusive -- you cannot use them at the same time.
+#endif
+
+/* resolve namespace conflicts (at linking level) with regular OSSP uuid API */
+#define uuid_create uuid_dce_create
+#define uuid_create_nil uuid_dce_create_nil
+#define uuid_is_nil uuid_dce_is_nil
+#define uuid_compare uuid_dce_compare
+#define uuid_equal uuid_dce_equal
+#define uuid_from_string uuid_dce_from_string
+#define uuid_to_string uuid_dce_to_string
+#define uuid_hash uuid_dce_hash
+
+/* DCE 1.1 uuid_t type */
+typedef struct {
+#if 0
+ /* stricter but unportable version */
+ uuid_uint32_t time_low;
+ uuid_uint16_t time_mid;
+ uuid_uint16_t time_hi_and_version;
+ uuid_uint8_t clock_seq_hi_and_reserved;
+ uuid_uint8_t clock_seq_low;
+ uuid_uint8_t node[6];
+#else
+ /* sufficient and portable version */
+ unsigned char data[16];
+#endif
+} uuid_t;
+typedef uuid_t *uuid_p_t;
+
+/* DCE 1.1 uuid_vector_t type */
+typedef struct {
+ unsigned int count;
+ uuid_t *uuid[1];
+} uuid_vector_t;
+
+/* DCE 1.1 UUID API status codes */
+enum {
+ uuid_s_ok = 0, /* standardized */
+ uuid_s_error = 1 /* implementation specific */
+};
+
+/* DCE 1.1 UUID API functions */
+extern void uuid_create (uuid_t *, int *);
+extern void uuid_create_nil (uuid_t *, int *);
+extern int uuid_is_nil (uuid_t *, int *);
+extern int uuid_compare (uuid_t *, uuid_t *, int *);
+extern int uuid_equal (uuid_t *, uuid_t *, int *);
+extern void uuid_from_string (const char *, uuid_t *, int *);
+extern void uuid_to_string (uuid_t *, char **, int *);
+extern unsigned int uuid_hash (uuid_t *, int *);
+
+#endif /* __UUID_DCE_H___ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_macc"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_mac.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_mac.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_mac.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,183 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_mac.c: Media Access Control (MAC) resolver implementation
+*/
+
+/* own headers (part (1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SYS_SOCKIO_H
+#include <sys/sockio.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#ifdef HAVE_NET_IF_DL_H
+#include <net/if_dl.h>
+#endif
+#ifdef HAVE_NET_IF_ARP_H
+#include <net/if_arp.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_IFADDRS_H
+#include <ifaddrs.h>
+#endif
+
+/* own headers (part (1/2) */
+#include "uuid_mac.h"
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE (/*lint -save -e506*/ !FALSE /*lint -restore*/)
+#endif
+
+/* return the Media Access Control (MAC) address of
+ the FIRST network interface card (NIC) */
+int mac_address(unsigned char *data_ptr, size_t data_len)
+{
+ /* sanity check arguments */
+ if (data_ptr == NULL || data_len < MAC_LEN)
+ return FALSE;
+
+#if defined(HAVE_IFADDRS_H) && defined(HAVE_NET_IF_DL_H) && defined(HAVE_GETIFADDRS)
+ /* use getifaddrs(3) on BSD class platforms (xxxBSD, MacOS X, etc) */
+ {
+ struct ifaddrs *ifap;
+ struct ifaddrs *ifap_head;
+ const struct sockaddr_dl *sdl;
+ unsigned char *ucp;
+ int i;
+
+ if (getifaddrs(&ifap_head) < 0)
+ return FALSE;
+ for (ifap = ifap_head; ifap != NULL; ifap = ifap->ifa_next) {
+ if (ifap->ifa_addr != NULL && ifap->ifa_addr->sa_family == AF_LINK) {
+ sdl = (const struct sockaddr_dl *)(void *)ifap->ifa_addr;
+ ucp = (unsigned char *)(sdl->sdl_data + sdl->sdl_nlen);
+ if (sdl->sdl_alen > 0) {
+ for (i = 0; i < MAC_LEN && i < sdl->sdl_alen; i++, ucp++)
+ data_ptr[i] = (unsigned char)(*ucp & 0xff);
+ freeifaddrs(ifap_head);
+ return TRUE;
+ }
+ }
+ }
+ freeifaddrs(ifap_head);
+ }
+#endif
+
+#if defined(HAVE_NET_IF_H) && defined(SIOCGIFHWADDR)
+ /* use SIOCGIFHWADDR ioctl(2) on Linux class platforms */
+ {
+ struct ifreq ifr;
+ struct sockaddr *sa;
+ int s;
+ int i;
+
+ if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
+ return FALSE;
+ sprintf(ifr.ifr_name, "eth0");
+ if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
+ close(s);
+ return FALSE;
+ }
+ sa = (struct sockaddr *)&ifr.ifr_addr;
+ for (i = 0; i < MAC_LEN; i++)
+ data_ptr[i] = (unsigned char)(sa->sa_data[i] & 0xff);
+ close(s);
+ return TRUE;
+ }
+#endif
+
+#if defined(SIOCGARP)
+ /* use SIOCGARP ioctl(2) on SVR4 class platforms (Solaris, etc) */
+ {
+ char hostname[MAXHOSTNAMELEN];
+ struct hostent *he;
+ struct arpreq ar;
+ struct sockaddr_in *sa;
+ int s;
+ int i;
+
+ if (gethostname(hostname, sizeof(hostname)) < 0)
+ return FALSE;
+ if ((he = gethostbyname(hostname)) == NULL)
+ return FALSE;
+ if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
+ return FALSE;
+ memset(&ar, 0, sizeof(ar));
+ sa = (struct sockaddr_in *)((void *)&(ar.arp_pa));
+ sa->sin_family = AF_INET;
+ memcpy(&(sa->sin_addr), *(he->h_addr_list), sizeof(struct in_addr));
+ if (ioctl(s, SIOCGARP, &ar) < 0) {
+ close(s);
+ return FALSE;
+ }
+ close(s);
+ if (!(ar.arp_flags & ATF_COM))
+ return FALSE;
+ for (i = 0; i < MAC_LEN; i++)
+ data_ptr[i] = (unsigned char)(ar.arp_ha.sa_data[i] & 0xff);
+ return TRUE;
+ }
+#endif
+
+ return FALSE;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_mach"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_mac.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_mac.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_mac.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,54 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_mac.h: Media Access Control (MAC) resolver API definition
+*/
+
+#ifndef __UUID_MAC_H__
+#define __UUID_MAC_H__
+
+#include <string.h> /* size_t */
+
+#define MAC_PREFIX uuid_
+
+/* embedding support */
+#ifdef MAC_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __MAC_CONCAT(x,y) x ## y
+#define MAC_CONCAT(x,y) __MAC_CONCAT(x,y)
+#else
+#define __MAC_CONCAT(x) x
+#define MAC_CONCAT(x,y) __MAC_CONCAT(x)y
+#endif
+#define mac_address MAC_CONCAT(MAC_PREFIX,mac_address)
+#endif
+
+#define MAC_LEN 6
+
+extern int mac_address(unsigned char *_data_ptr, size_t _data_len);
+
+#endif /* __UUID_MAC_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_md5c"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_md5.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_md5.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_md5.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,471 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_md5.c: MD5 API implementation
+*/
+
+/* own headers (part 1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdlib.h>
+#include <string.h>
+
+/* own headers (part 2/2) */
+#include "uuid_md5.h"
+
+/*
+ * This is a RFC 1321 compliant Message Digest 5 (MD5) algorithm
+ * implementation. It is directly derived from the RSA code published in
+ * RFC 1321 with just the following functionality preserving changes:
+ * - converted function definitions from K&R to ANSI C
+ * - included contents of the "global.h" and "md5.h" headers
+ * - moved the SXX defines into the MD5Transform function
+ * - replaced MD5_memcpy() with memcpy(3) and MD5_memset() with memset(3)
+ * - renamed "index" variables to "idx" to avoid namespace conflicts
+ * - reformatted C style to conform with OSSP C style
+ * - added own OSSP style frontend API
+ */
+
+/*
+** ==== BEGIN RFC 1321 CODE ====
+*/
+
+/*
+ * RSA Data Security, Inc., MD5 message-digest algorithm
+ * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991.
+ * All rights reserved.
+ *
+ * License to copy and use this software is granted provided that it
+ * is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ * Algorithm" in all material mentioning or referencing this software
+ * or this function.
+ *
+ * License is also granted to make and use derivative works provided
+ * that such works are identified as "derived from the RSA Data
+ * Security, Inc. MD5 Message-Digest Algorithm" in all material
+ * mentioning or referencing the derived work.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either
+ * the merchantability of this software or the suitability of this
+ * software for any particular purpose. It is provided "as is"
+ * without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+/* POINTER defines a generic pointer type */
+typedef unsigned char *POINTER;
+
+/* UINT4 defines a four byte word */
+#if SIZEOF_UNSIGNED_SHORT == 4
+typedef unsigned short int UINT4;
+#elif SIZEOF_UNSIGNED_INT == 4
+typedef unsigned int UINT4;
+#elif SIZEOF_UNSIGNED_LONG == 4
+typedef unsigned long int UINT4;
+#elif SIZEOF_UNSIGNED_LONG_LONG == 4
+typedef unsigned long long int UINT4;
+#else
+#error ERROR: unable to determine UINT4 type (four byte word)
+#endif
+
+/* MD5 context. */
+typedef struct {
+ UINT4 state[4]; /* state (ABCD) */
+ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} MD5_CTX;
+
+/* prototypes for internal functions */
+static void MD5Init (MD5_CTX *_ctx);
+static void MD5Update (MD5_CTX *_ctx, unsigned char *, unsigned int);
+static void MD5Final (unsigned char [], MD5_CTX *);
+static void MD5Transform (UINT4 [], unsigned char []);
+static void Encode (unsigned char *, UINT4 *, unsigned int);
+static void Decode (UINT4 *, unsigned char *, unsigned int);
+
+/* finalization padding */
+static unsigned char PADDING[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* F, G, H and I are basic MD5 functions. */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits. */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ Rotation is separate from addition to prevent recomputation. */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+}
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+}
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+}
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+}
+
+/* MD5 initialization. Begins an MD5 operation, writing a new context. */
+static void MD5Init(
+ MD5_CTX *context)
+{
+ context->count[0] = context->count[1] = 0;
+
+ /* Load magic initialization constants. */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+ return;
+}
+
+/* MD5 block update operation. Continues an MD5 message-digest
+ operation, processing another message block, and updating the
+ context. */
+static void MD5Update(
+ MD5_CTX *context, /* context */
+ unsigned char *input, /* input block */
+ unsigned int inputLen) /* length of input block */
+{
+ unsigned int i, idx, partLen;
+
+ /* Compute number of bytes mod 64 */
+ idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3))
+ context->count[1]++;
+ context->count[1] += ((UINT4)inputLen >> 29);
+
+ partLen = (unsigned int)64 - idx;
+
+ /* Transform as many times as possible. */
+ if (inputLen >= partLen) {
+ memcpy((POINTER)&context->buffer[idx], (POINTER)input, (size_t)partLen);
+ MD5Transform(context->state, context->buffer);
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ MD5Transform(context->state, &input[i]);
+ idx = 0;
+ }
+ else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy((POINTER)&context->buffer[idx], (POINTER)&input[i], (size_t)(inputLen - i));
+}
+
+/* MD5 finalization. Ends an MD5 message-digest operation, writing the
+ the message digest and zeroizing the context. */
+static void MD5Final(
+ unsigned char digest[], /* message digest */
+ MD5_CTX *context) /* context */
+{
+ unsigned char bits[8];
+ unsigned int idx, padLen;
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+ /* Pad out to 56 mod 64. */
+ idx = (unsigned int)((context->count[0] >> 3) & 0x3f);
+ padLen = (idx < 56) ? ((unsigned int)56 - idx) : ((unsigned int)120 - idx);
+ MD5Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ MD5Update(context, bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, context->state, 16);
+
+ /* Zeroize sensitive information. */
+ memset((POINTER)context, 0, sizeof(*context));
+}
+
+/* MD5 basic transformation. Transforms state based on block. */
+static void MD5Transform(
+ UINT4 state[],
+ unsigned char block[])
+{
+ UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
+ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
+ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
+ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
+ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
+ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
+ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
+ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
+ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
+ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
+ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
+ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
+ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
+ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
+ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
+ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
+ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
+ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
+ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
+ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
+ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
+ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
+ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
+ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
+ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
+ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
+ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
+ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
+ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
+ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
+ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
+ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
+ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
+ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
+ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
+ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
+ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
+ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
+ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+ /* Zeroize sensitive information. */
+ memset((POINTER)x, 0, sizeof(x));
+}
+
+/* Encodes input (UINT4) into output (unsigned char).
+ Assumes len is a multiple of 4. */
+static void Encode(
+ unsigned char *output,
+ UINT4 *input,
+ unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j] = (unsigned char)( input[i] & 0xff);
+ output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
+ output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
+ output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
+ }
+ return;
+}
+
+/* Decodes input (unsigned char) into output (UINT4).
+ Assumes len is a multiple of 4. */
+static void Decode(
+ UINT4 *output,
+ unsigned char *input,
+ unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ( (UINT4)input[j])
+ | (((UINT4)input[j+1]) << 8 )
+ | (((UINT4)input[j+2]) << 16)
+ | (((UINT4)input[j+3]) << 24);
+ return;
+}
+
+/*
+** ==== END RFC 1321 CODE ====
+*/
+
+struct md5_st {
+ MD5_CTX ctx;
+};
+
+md5_rc_t md5_create(md5_t **md5)
+{
+ if (md5 == NULL)
+ return MD5_RC_ARG;
+ if ((*md5 = (md5_t *)malloc(sizeof(md5_t))) == NULL)
+ return MD5_RC_MEM;
+ MD5Init(&((*md5)->ctx));
+ return MD5_RC_OK;
+}
+
+md5_rc_t md5_init(md5_t *md5)
+{
+ if (md5 == NULL)
+ return MD5_RC_ARG;
+ MD5Init(&(md5->ctx));
+ return MD5_RC_OK;
+}
+
+md5_rc_t md5_update(md5_t *md5, const void *data_ptr, size_t data_len)
+{
+ if (md5 == NULL)
+ return MD5_RC_ARG;
+ MD5Update(&(md5->ctx), (unsigned char *)data_ptr, (unsigned int)data_len);
+ return MD5_RC_OK;
+}
+
+md5_rc_t md5_store(md5_t *md5, void **data_ptr, size_t *data_len)
+{
+ MD5_CTX ctx;
+
+ if (md5 == NULL || data_ptr == NULL)
+ return MD5_RC_ARG;
+ if (*data_ptr == NULL) {
+ if ((*data_ptr = malloc(MD5_LEN_BIN)) == NULL)
+ return MD5_RC_MEM;
+ if (data_len != NULL)
+ *data_len = MD5_LEN_BIN;
+ }
+ else {
+ if (data_len != NULL) {
+ if (*data_len < MD5_LEN_BIN)
+ return MD5_RC_MEM;
+ *data_len = MD5_LEN_BIN;
+ }
+ }
+ memcpy((void *)(&ctx), (void *)(&(md5->ctx)), sizeof(MD5_CTX));
+ MD5Final((unsigned char *)(*data_ptr), &(ctx));
+ return MD5_RC_OK;
+}
+
+md5_rc_t md5_format(md5_t *md5, char **data_ptr, size_t *data_len)
+{
+ static const char hex[] = "0123456789abcdef";
+ unsigned char buf[MD5_LEN_BIN];
+ unsigned char *bufptr;
+ size_t buflen;
+ md5_rc_t rc;
+ int i;
+
+ if (md5 == NULL || data_ptr == NULL)
+ return MD5_RC_ARG;
+ if (*data_ptr == NULL) {
+ if ((*data_ptr = (char *)malloc(MD5_LEN_STR+1)) == NULL)
+ return MD5_RC_MEM;
+ if (data_len != NULL)
+ *data_len = MD5_LEN_STR+1;
+ }
+ else {
+ if (data_len != NULL) {
+ if (*data_len < MD5_LEN_STR+1)
+ return MD5_RC_MEM;
+ *data_len = MD5_LEN_STR+1;
+ }
+ }
+
+ bufptr = buf;
+ buflen = sizeof(buf);
+ if ((rc = md5_store(md5, (void **)((void *)&bufptr), &buflen)) != MD5_RC_OK)
+ return rc;
+
+ for (i = 0; i < (int)buflen; i++) {
+         (*data_ptr)[(i*2)+0] = hex[(int)(bufptr[i] >> 4)];
+         (*data_ptr)[(i*2)+1] = hex[(int)(bufptr[i] & 0x0f)];
+ }
+ (*data_ptr)[(i*2)] = '\0';
+ return MD5_RC_OK;
+}
+
+md5_rc_t md5_destroy(md5_t *md5)
+{
+ if (md5 == NULL)
+ return MD5_RC_ARG;
+ free(md5);
+ return MD5_RC_OK;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_md5h"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_md5.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_md5.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_md5.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_md5.h: MD5 API definition
+*/
+
+#ifndef __MD5_H___
+#define __MD5_H___
+
+#include <string.h> /* size_t */
+
+#define MD5_PREFIX uuid_
+
+/* embedding support */
+#ifdef MD5_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __MD5_CONCAT(x,y) x ## y
+#define MD5_CONCAT(x,y) __MD5_CONCAT(x,y)
+#else
+#define __MD5_CONCAT(x) x
+#define MD5_CONCAT(x,y) __MD5_CONCAT(x)y
+#endif
+#define md5_st MD5_CONCAT(MD5_PREFIX,md5_st)
+#define md5_t MD5_CONCAT(MD5_PREFIX,md5_t)
+#define md5_create MD5_CONCAT(MD5_PREFIX,md5_create)
+#define md5_init MD5_CONCAT(MD5_PREFIX,md5_init)
+#define md5_update MD5_CONCAT(MD5_PREFIX,md5_update)
+#define md5_store MD5_CONCAT(MD5_PREFIX,md5_store)
+#define md5_format MD5_CONCAT(MD5_PREFIX,md5_format)
+#define md5_destroy MD5_CONCAT(MD5_PREFIX,md5_destroy)
+#endif
+
+struct md5_st;
+typedef struct md5_st md5_t;
+
+#define MD5_LEN_BIN 16
+#define MD5_LEN_STR 32
+
+typedef enum {
+ MD5_RC_OK = 0,
+ MD5_RC_ARG = 1,
+ MD5_RC_MEM = 2
+} md5_rc_t;
+
+extern md5_rc_t md5_create (md5_t **md5);
+extern md5_rc_t md5_init (md5_t *md5);
+extern md5_rc_t md5_update (md5_t *md5, const void *data_ptr, size_t data_len);
+extern md5_rc_t md5_store (md5_t *md5, void **data_ptr, size_t *data_len);
+extern md5_rc_t md5_format (md5_t *md5, char **data_ptr, size_t *data_len);
+extern md5_rc_t md5_destroy (md5_t *md5);
+
+#endif /* __MD5_H___ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_prngc"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_prng.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_prng.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_prng.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,198 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_prng.c: PRNG API implementation
+*/
+
+/* own headers (part 1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#if defined(WIN32)
+#define WINVER 0x0500
+#include <windows.h>
+#include <wincrypt.h>
+#endif
+
+/* own headers (part 2/2) */
+#include "uuid_time.h"
+#include "uuid_prng.h"
+#include "uuid_md5.h"
+
+struct prng_st {
+ int dev; /* system PRNG device */
+ md5_t *md5; /* local MD5 PRNG engine */
+ long cnt; /* time resolution compensation counter */
+};
+
+prng_rc_t prng_create(prng_t **prng)
+{
+#if !defined(WIN32)
+ int fd = -1;
+#endif
+ struct timeval tv;
+ pid_t pid;
+ unsigned int i;
+
+ /* sanity check argument(s) */
+ if (prng == NULL)
+ return PRNG_RC_ARG;
+
+ /* allocate object */
+ if ((*prng = (prng_t *)malloc(sizeof(prng_t))) == NULL)
+ return PRNG_RC_MEM;
+
+ /* try to open the system PRNG device */
+ (*prng)->dev = -1;
+#if !defined(WIN32)
+ if ((fd = open("/dev/urandom", O_RDONLY)) == -1)
+ fd = open("/dev/random", O_RDONLY|O_NONBLOCK);
+ if (fd != -1) {
+ (void)fcntl(fd, F_SETFD, FD_CLOEXEC);
+ (*prng)->dev = fd;
+ }
+#endif
+
+ /* initialize MD5 engine */
+ if (md5_create(&((*prng)->md5)) != MD5_RC_OK) {
+ free(*prng);
+ return PRNG_RC_INT;
+ }
+
+ /* initialize time resolution compensation counter */
+ (*prng)->cnt = 0;
+
+ /* seed the C library PRNG once */
+ (void)time_gettimeofday(&tv);
+ pid = getpid();
+ srand((unsigned int)(
+ ((unsigned int)pid << 16)
+ ^ (unsigned int)pid
+ ^ (unsigned int)tv.tv_sec
+ ^ (unsigned int)tv.tv_usec));
+ for (i = (unsigned int)((tv.tv_sec ^ tv.tv_usec) & 0x1F); i > 0; i--)
+ (void)rand();
+
+ return PRNG_RC_OK;
+}
+
+prng_rc_t prng_data(prng_t *prng, void *data_ptr, size_t data_len)
+{
+ size_t n;
+ unsigned char *p;
+ struct {
+ struct timeval tv;
+ long cnt;
+ int rnd;
+ } entropy;
+ unsigned char md5_buf[MD5_LEN_BIN];
+ unsigned char *md5_ptr;
+ size_t md5_len;
+ int retries;
+ int i;
+#if defined(WIN32)
+ HCRYPTPROV hProv;
+#endif
+
+ /* sanity check argument(s) */
+ if (prng == NULL || data_len == 0)
+ return PRNG_RC_ARG;
+
+ /* prepare for generation */
+ p = (unsigned char *)data_ptr;
+ n = data_len;
+
+ /* approach 1: try to gather data via stronger system PRNG device */
+ if (prng->dev != -1) {
+ retries = 0;
+ while (n > 0) {
+ i = (int)read(prng->dev, (void *)p, n);
+ if (i <= 0) {
+ if (retries++ > 16)
+ break;
+ continue;
+ }
+ retries = 0;
+ n -= (unsigned int)i;
+ p += (unsigned int)i;
+ }
+ }
+#if defined(WIN32)
+ else {
+ if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
+ CryptGenRandom(hProv, n, p);
+ }
+#endif
+
+ /* approach 2: try to gather data via weaker libc PRNG API. */
+ while (n > 0) {
+ /* gather new entropy */
+ (void)time_gettimeofday(&(entropy.tv)); /* source: libc time */
+ entropy.rnd = rand(); /* source: libc PRNG */
+ entropy.cnt = prng->cnt++; /* source: local counter */
+
+ /* pass entropy into MD5 engine */
+ if (md5_update(prng->md5, (void *)&entropy, sizeof(entropy)) != MD5_RC_OK)
+ return PRNG_RC_INT;
+
+ /* store MD5 engine state as PRN output */
+ md5_ptr = md5_buf;
+ md5_len = sizeof(md5_buf);
+ if (md5_store(prng->md5, (void **)(void *)&md5_ptr, &md5_len) != MD5_RC_OK)
+ return PRNG_RC_INT;
+ for (i = 0; i < MD5_LEN_BIN && n > 0; i++, n--)
+ *p++ ^= md5_buf[i]; /* intentionally no assignment because arbitrary
+ caller buffer content is leveraged, too */
+ }
+
+ return PRNG_RC_OK;
+}
+
+prng_rc_t prng_destroy(prng_t *prng)
+{
+ /* sanity check argument(s) */
+ if (prng == NULL)
+ return PRNG_RC_ARG;
+
+ /* close PRNG device */
+ if (prng->dev != -1)
+ (void)close(prng->dev);
+
+ /* destroy MD5 engine */
+ (void)md5_destroy(prng->md5);
+
+ /* free object */
+ free(prng);
+
+ return PRNG_RC_OK;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_prngh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_prng.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_prng.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_prng.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_prng.h: PRNG API definition
+*/
+
+#ifndef __PRNG_H___
+#define __PRNG_H___
+
+#include <string.h> /* size_t */
+
+#define PRNG_PREFIX uuid_
+
+/* embedding support */
+#ifdef PRNG_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __PRNG_CONCAT(x,y) x ## y
+#define PRNG_CONCAT(x,y) __PRNG_CONCAT(x,y)
+#else
+#define __PRNG_CONCAT(x) x
+#define PRNG_CONCAT(x,y) __PRNG_CONCAT(x)y
+#endif
+#define prng_st PRNG_CONCAT(PRNG_PREFIX,prng_st)
+#define prng_t PRNG_CONCAT(PRNG_PREFIX,prng_t)
+#define prng_create PRNG_CONCAT(PRNG_PREFIX,prng_create)
+#define prng_data PRNG_CONCAT(PRNG_PREFIX,prng_data)
+#define prng_destroy PRNG_CONCAT(PRNG_PREFIX,prng_destroy)
+#endif
+
+struct prng_st;
+typedef struct prng_st prng_t;
+
+typedef enum {
+ PRNG_RC_OK = 0,
+ PRNG_RC_ARG = 1,
+ PRNG_RC_MEM = 2,
+ PRNG_RC_INT = 3
+} prng_rc_t;
+
+extern prng_rc_t prng_create (prng_t **prng);
+extern prng_rc_t prng_data (prng_t *prng, void *data_ptr, size_t data_len);
+extern prng_rc_t prng_destroy (prng_t *prng);
+
+#endif /* __PRNG_H___ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_sha1c"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_sha1.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_sha1.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_sha1.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,450 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_sha1.c: SHA-1 API implementation
+*/
+
+/* own headers (part 1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdlib.h>
+#include <string.h>
+
+/* own headers (part 2/2) */
+#include "uuid_sha1.h"
+
+/*
+ * This is a RFC 3174 compliant Secure Hash Function (SHA-1) algorithm
+ * implementation. It is directly derived from the SHA-1 reference
+ * code published in RFC 3174 with just the following functionality
+ * preserving changes:
+ * - reformatted C style to conform with OSSP C style
+ * - added own OSSP style frontend API
+ * - added Autoconf based determination of sha1_uintX_t types
+ */
+
+/*
+** ==== BEGIN RFC 3174 CODE ====
+*/
+
+/*
+ * This implements the Secure Hashing Algorithm 1 as defined in
+ * FIPS PUB 180-1 published April 17, 1995.
+ *
+ * The SHA-1, produces a 160-bit message digest for a given data
+ * stream. It should take about 2**n steps to find a message with the
+ * same digest as a given message and 2**(n/2) to find any two messages
+ * with the same digest, when n is the digest size in bits. Therefore,
+ * this algorithm can serve as a means of providing a "fingerprint" for
+ * a message.
+ *
+ * Caveats: SHA-1 is designed to work with messages less than 2^64 bits
+ * long. Although SHA-1 allows a message digest to be generated for
+ * messages of any number of bits less than 2^64, this implementation
+ * only works with messages with a length that is a multiple of the
+ * size of an 8-bit character.
+ */
+
+typedef unsigned char sha1_uint8_t;
+
+#if SIZEOF_SHORT > 2
+typedef short int sha1_int16plus_t;
+#elif SIZEOF_INT > 2
+typedef int sha1_int16plus_t;
+#elif SIZEOF_LONG > 2
+typedef long int sha1_int16plus_t;
+#else
+#error ERROR: unable to determine sha1_int16plus_t type (at least two byte word)
+#endif
+
+#if SIZEOF_UNSIGNED_SHORT == 4
+typedef unsigned short int sha1_uint32_t;
+#elif SIZEOF_UNSIGNED_INT == 4
+typedef unsigned int sha1_uint32_t;
+#elif SIZEOF_UNSIGNED_LONG == 4
+typedef unsigned long int sha1_uint32_t;
+#elif SIZEOF_UNSIGNED_LONG_LONG == 4
+typedef unsigned long long int sha1_uint32_t;
+#else
+#error ERROR: unable to determine sha1_uint32_t type (four byte word)
+#endif
+
+enum {
+ shaSuccess = 0,
+ shaNull, /* null pointer parameter */
+ shaStateError /* called Input after Result */
+};
+
+#define SHA1HashSize 20
+
+/* This structure will hold context information for the SHA-1 hashing operation */
+typedef struct SHA1Context {
+ sha1_uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */
+ sha1_uint32_t Length_Low; /* Message length in bits */
+ sha1_uint32_t Length_High; /* Message length in bits */
+ sha1_int16plus_t Message_Block_Index; /* Index into message block array */
+ sha1_uint8_t Message_Block[64]; /* 512-bit message blocks */
+ int Computed; /* Is the digest computed? */
+ int Corrupted; /* Is the message digest corrupted? */
+} SHA1Context;
+
+/* Function Prototypes */
+static int SHA1Reset (SHA1Context *);
+static int SHA1Input (SHA1Context *, const sha1_uint8_t *, unsigned int);
+static int SHA1Result (SHA1Context *, sha1_uint8_t Message_Digest[]);
+
+/* Local Function Prototyptes */
+static void SHA1PadMessage (SHA1Context *);
+static void SHA1ProcessMessageBlock(SHA1Context *);
+
+/* Define the SHA1 circular left shift macro */
+#define SHA1CircularShift(bits,word) \
+ (((word) << (bits)) | ((word) >> (32-(bits))))
+
+/*
+ * This function will initialize the SHA1Context in preparation for
+ * computing a new SHA1 message digest.
+ */
+static int SHA1Reset(SHA1Context *context)
+{
+ if (context == NULL)
+ return shaNull;
+
+ context->Length_Low = 0;
+ context->Length_High = 0;
+ context->Message_Block_Index = 0;
+
+ context->Intermediate_Hash[0] = 0x67452301;
+ context->Intermediate_Hash[1] = 0xEFCDAB89;
+ context->Intermediate_Hash[2] = 0x98BADCFE;
+ context->Intermediate_Hash[3] = 0x10325476;
+ context->Intermediate_Hash[4] = 0xC3D2E1F0;
+
+ context->Computed = 0;
+ context->Corrupted = 0;
+
+ return shaSuccess;
+}
+
+/*
+ * This function will return the 160-bit message digest into the
+ * Message_Digest array provided by the caller. NOTE: The first octet
+ * of hash is stored in the 0th element, the last octet of hash in the
+ * 19th element.
+ */
+static int SHA1Result(SHA1Context *context, sha1_uint8_t Message_Digest[])
+{
+ int i;
+
+ if (context == NULL || Message_Digest == NULL)
+ return shaNull;
+ if (context->Corrupted)
+ return context->Corrupted;
+
+ if (!context->Computed) {
+ SHA1PadMessage(context);
+ for (i = 0; i < 64; i++) {
+ /* message may be sensitive, clear it out */
+ context->Message_Block[i] = (sha1_uint8_t)0;
+ }
+ context->Length_Low = 0; /* and clear length */
+ context->Length_High = 0;
+ context->Computed = 1;
+ }
+ for (i = 0; i < SHA1HashSize; i++)
+ Message_Digest[i] = (sha1_uint8_t)(context->Intermediate_Hash[i>>2] >> (8 * (3 - (i & 0x03))));
+
+ return shaSuccess;
+}
+
+/*
+ * This function accepts an array of octets as the next portion of the
+ * message.
+ */
+static int SHA1Input(SHA1Context *context, const sha1_uint8_t *message_array, unsigned int length)
+{
+ if (length == 0)
+ return shaSuccess;
+ if (context == NULL || message_array == NULL)
+ return shaNull;
+
+ if (context->Computed) {
+ context->Corrupted = shaStateError;
+ return shaStateError;
+ }
+ if (context->Corrupted)
+ return context->Corrupted;
+ while (length-- && !context->Corrupted) {
+ context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF);
+ context->Length_Low += 8;
+ if (context->Length_Low == 0) {
+ context->Length_High++;
+ if (context->Length_High == 0)
+ context->Corrupted = 1; /* Message is too long */
+ }
+ if (context->Message_Block_Index == 64)
+ SHA1ProcessMessageBlock(context);
+ message_array++;
+ }
+
+ return shaSuccess;
+}
+
+/*
+ * This function will process the next 512 bits of the message stored
+ * in the Message_Block array. NOTICE: Many of the variable names in
+ * this code, especially the single character names, were used because
+ * those were the names used in the publication.
+ */
+static void SHA1ProcessMessageBlock(SHA1Context *context)
+{
+ const sha1_uint32_t K[] = { /* Constants defined in SHA-1 */
+ 0x5A827999,
+ 0x6ED9EBA1,
+ 0x8F1BBCDC,
+ 0xCA62C1D6
+ };
+ int t; /* Loop counter */
+ sha1_uint32_t temp; /* Temporary word value */
+ sha1_uint32_t W[80]; /* Word sequence */
+ sha1_uint32_t A, B, C, D, E; /* Word buffers */
+
+ /* Initialize the first 16 words in the array W */
+ for (t = 0; t < 16; t++) {
+ W[t] = (sha1_uint32_t)(context->Message_Block[t * 4 ] << 24);
+ W[t] |= (sha1_uint32_t)(context->Message_Block[t * 4 + 1] << 16);
+ W[t] |= (sha1_uint32_t)(context->Message_Block[t * 4 + 2] << 8);
+ W[t] |= (sha1_uint32_t)(context->Message_Block[t * 4 + 3] );
+ }
+
+ for (t = 16; t < 80; t++)
+ W[t] = SHA1CircularShift(1, W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
+
+ A = context->Intermediate_Hash[0];
+ B = context->Intermediate_Hash[1];
+ C = context->Intermediate_Hash[2];
+ D = context->Intermediate_Hash[3];
+ E = context->Intermediate_Hash[4];
+
+ for (t = 0; t < 20; t++) {
+ temp = SHA1CircularShift(5, A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30, B);
+ B = A;
+ A = temp;
+ }
+
+ for (t = 20; t < 40; t++) {
+ temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[t] + K[1];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30, B);
+ B = A;
+ A = temp;
+ }
+
+ for (t = 40; t < 60; t++) {
+ temp = SHA1CircularShift(5, A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30, B);
+ B = A;
+ A = temp;
+ }
+
+ for (t = 60; t < 80; t++) {
+ temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[t] + K[3];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30, B);
+ B = A;
+ A = temp;
+ }
+
+ context->Intermediate_Hash[0] += A;
+ context->Intermediate_Hash[1] += B;
+ context->Intermediate_Hash[2] += C;
+ context->Intermediate_Hash[3] += D;
+ context->Intermediate_Hash[4] += E;
+
+ context->Message_Block_Index = 0;
+
+ return;
+}
+
+/*
+ * According to the standard, the message must be padded to an even
+ * 512 bits. The first padding bit must be a '1'. The last 64 bits
+ * represent the length of the original message. All bits in between
+ * should be 0. This function will pad the message according to those
+ * rules by filling the Message_Block array accordingly. It will also
+ * call the ProcessMessageBlock function provided appropriately. When
+ * it returns, it can be assumed that the message digest has been
+ * computed.
+ */
+static void SHA1PadMessage(SHA1Context *context)
+{
+ /* Check to see if the current message block is too small to hold
+ the initial padding bits and length. If so, we will pad the block,
+ process it, and then continue padding into a second block. */
+ if (context->Message_Block_Index > 55) {
+ context->Message_Block[context->Message_Block_Index++] = (sha1_uint8_t)0x80;
+ while (context->Message_Block_Index < 64)
+ context->Message_Block[context->Message_Block_Index++] = (sha1_uint8_t)0;
+ SHA1ProcessMessageBlock(context);
+ while(context->Message_Block_Index < 56)
+ context->Message_Block[context->Message_Block_Index++] = (sha1_uint8_t)0;
+ }
+ else {
+ context->Message_Block[context->Message_Block_Index++] = (sha1_uint8_t)0x80;
+ while(context->Message_Block_Index < 56)
+ context->Message_Block[context->Message_Block_Index++] = (sha1_uint8_t)0;
+ }
+
+ /* Store the message length as the last 8 octets */
+ context->Message_Block[56] = (sha1_uint8_t)(context->Length_High >> 24);
+ context->Message_Block[57] = (sha1_uint8_t)(context->Length_High >> 16);
+ context->Message_Block[58] = (sha1_uint8_t)(context->Length_High >> 8);
+ context->Message_Block[59] = (sha1_uint8_t)(context->Length_High );
+ context->Message_Block[60] = (sha1_uint8_t)(context->Length_Low >> 24);
+ context->Message_Block[61] = (sha1_uint8_t)(context->Length_Low >> 16);
+ context->Message_Block[62] = (sha1_uint8_t)(context->Length_Low >> 8);
+ context->Message_Block[63] = (sha1_uint8_t)(context->Length_Low );
+
+ SHA1ProcessMessageBlock(context);
+ return;
+}
+
+/*
+** ==== END RFC 3174 CODE ====
+*/
+
+struct sha1_st {
+ SHA1Context ctx;
+};
+
+sha1_rc_t sha1_create(sha1_t **sha1)
+{
+ if (sha1 == NULL)
+ return SHA1_RC_ARG;
+ if ((*sha1 = (sha1_t *)malloc(sizeof(sha1_t))) == NULL)
+ return SHA1_RC_MEM;
+ if (SHA1Reset(&((*sha1)->ctx)) != shaSuccess)
+ return SHA1_RC_INT;
+ return SHA1_RC_OK;
+}
+
+sha1_rc_t sha1_init(sha1_t *sha1)
+{
+ if (sha1 == NULL)
+ return SHA1_RC_ARG;
+ if (SHA1Reset(&(sha1->ctx)) != shaSuccess)
+ return SHA1_RC_INT;
+ return SHA1_RC_OK;
+}
+
+sha1_rc_t sha1_update(sha1_t *sha1, const void *data_ptr, size_t data_len)
+{
+ if (sha1 == NULL)
+ return SHA1_RC_ARG;
+ if (SHA1Input(&(sha1->ctx), (unsigned char *)data_ptr, (unsigned int)data_len) != shaSuccess)
+ return SHA1_RC_INT;
+ return SHA1_RC_OK;
+}
+
+sha1_rc_t sha1_store(sha1_t *sha1, void **data_ptr, size_t *data_len)
+{
+ SHA1Context ctx;
+
+ if (sha1 == NULL || data_ptr == NULL)
+ return SHA1_RC_ARG;
+ if (*data_ptr == NULL) {
+ if ((*data_ptr = malloc(SHA1_LEN_BIN)) == NULL)
+ return SHA1_RC_MEM;
+ if (data_len != NULL)
+ *data_len = SHA1_LEN_BIN;
+ }
+ else {
+ if (data_len != NULL) {
+ if (*data_len < SHA1_LEN_BIN)
+ return SHA1_RC_MEM;
+ *data_len = SHA1_LEN_BIN;
+ }
+ }
+ memcpy((void *)(&ctx), (void *)(&(sha1->ctx)), sizeof(SHA1Context));
+ if (SHA1Result(&(ctx), (unsigned char *)(*data_ptr)) != shaSuccess)
+ return SHA1_RC_INT;
+ return SHA1_RC_OK;
+}
+
+sha1_rc_t sha1_format(sha1_t *sha1, char **data_ptr, size_t *data_len)
+{
+ static const char hex[] = "0123456789abcdef";
+ unsigned char buf[SHA1_LEN_BIN];
+ unsigned char *bufptr;
+ size_t buflen;
+ sha1_rc_t rc;
+ int i;
+
+ if (sha1 == NULL || data_ptr == NULL)
+ return SHA1_RC_ARG;
+ if (*data_ptr == NULL) {
+ if ((*data_ptr = (char *)malloc(SHA1_LEN_STR+1)) == NULL)
+ return SHA1_RC_MEM;
+ if (data_len != NULL)
+ *data_len = SHA1_LEN_STR+1;
+ }
+ else {
+ if (data_len != NULL) {
+ if (*data_len < SHA1_LEN_STR+1)
+ return SHA1_RC_MEM;
+ *data_len = SHA1_LEN_STR+1;
+ }
+ }
+
+ bufptr = buf;
+ buflen = sizeof(buf);
+ if ((rc = sha1_store(sha1, (void **)((void *)&bufptr), &buflen)) != SHA1_RC_OK)
+ return rc;
+
+ for (i = 0; i < (int)buflen; i++) {
+         (*data_ptr)[(i*2)+0] = hex[(int)(bufptr[i] >> 4)];
+         (*data_ptr)[(i*2)+1] = hex[(int)(bufptr[i] & 0x0f)];
+ }
+ (*data_ptr)[(i*2)] = '\0';
+ return SHA1_RC_OK;
+}
+
+sha1_rc_t sha1_destroy(sha1_t *sha1)
+{
+ if (sha1 == NULL)
+ return SHA1_RC_ARG;
+ free(sha1);
+ return SHA1_RC_OK;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_sha1h"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_sha1.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_sha1.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_sha1.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_sha1.h: SHA-1 API definition
+*/
+
+#ifndef __SHA1_H___
+#define __SHA1_H___
+
+#include <string.h> /* size_t */
+
+#define SHA1_PREFIX uuid_
+
+/* embedding support */
+#ifdef SHA1_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __SHA1_CONCAT(x,y) x ## y
+#define SHA1_CONCAT(x,y) __SHA1_CONCAT(x,y)
+#else
+#define __SHA1_CONCAT(x) x
+#define SHA1_CONCAT(x,y) __SHA1_CONCAT(x)y
+#endif
+#define sha1_st SHA1_CONCAT(SHA1_PREFIX,sha1_st)
+#define sha1_t SHA1_CONCAT(SHA1_PREFIX,sha1_t)
+#define sha1_create SHA1_CONCAT(SHA1_PREFIX,sha1_create)
+#define sha1_init SHA1_CONCAT(SHA1_PREFIX,sha1_init)
+#define sha1_update SHA1_CONCAT(SHA1_PREFIX,sha1_update)
+#define sha1_store SHA1_CONCAT(SHA1_PREFIX,sha1_store)
+#define sha1_format SHA1_CONCAT(SHA1_PREFIX,sha1_format)
+#define sha1_destroy SHA1_CONCAT(SHA1_PREFIX,sha1_destroy)
+#endif
+
+struct sha1_st;
+typedef struct sha1_st sha1_t;
+
+#define SHA1_LEN_BIN 20
+#define SHA1_LEN_STR 40
+
+typedef enum {
+ SHA1_RC_OK = 0,
+ SHA1_RC_ARG = 1,
+ SHA1_RC_MEM = 2,
+ SHA1_RC_INT = 3
+} sha1_rc_t;
+
+extern sha1_rc_t sha1_create (sha1_t **sha1);
+extern sha1_rc_t sha1_init (sha1_t *sha1);
+extern sha1_rc_t sha1_update (sha1_t *sha1, const void *data_ptr, size_t data_len);
+extern sha1_rc_t sha1_store (sha1_t *sha1, void **data_ptr, size_t *data_len);
+extern sha1_rc_t sha1_format (sha1_t *sha1, char **data_ptr, size_t *data_len);
+extern sha1_rc_t sha1_destroy (sha1_t *sha1);
+
+#endif /* __SHA1_H___ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_strc"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_str.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_str.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_str.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,762 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_str.c: string formatting functions
+*/
+
+/*
+ * Copyright Patrick Powell 1995
+ * This code is based on code written by Patrick Powell <papowell@astart.com>
+ * It may be used for any purpose as long as this notice remains intact
+ * on all source code distributions.
+ */
+
+/*
+ * This code contains numerious changes and enhancements which were
+ * made by lots of contributors over the last years to Patrick Powell's
+ * original code:
+ *
+ * o Patrick Powell <papowell@astart.com> (1995)
+ * o Brandon Long <blong@fiction.net> (1996, for Mutt)
+ * o Thomas Roessler <roessler@guug.de> (1998, for Mutt)
+ * o Michael Elkins <me@cs.hmc.edu> (1998, for Mutt)
+ * o Andrew Tridgell <tridge@samba.org> (1998, for Samba)
+ * o Luke Mewburn <lukem@netbsd.org> (1999, for LukemFTP)
+ * o Ralf S. Engelschall <rse@engelschall.com> (1999, for OSSP)
+ */
+
+/* own headers (part 1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+/* own headers (part 2/2) */
+#include "uuid_str.h"
+
+#if HAVE_LONG_LONG
+#define LLONG long long
+#else
+#define LLONG long
+#endif
+
+#if HAVE_LONG_DOUBLE
+#define LDOUBLE long double
+#else
+#define LDOUBLE double
+#endif
+
+static void fmtstr (char *, size_t *, size_t, char *, int, int, int);
+static void fmtint (char *, size_t *, size_t, LLONG, int, int, int, int);
+static void fmtfp (char *, size_t *, size_t, LDOUBLE, int, int, int);
+static void dopr_outch (char *, size_t *, size_t, int);
+
+/* format read states */
+#define DP_S_DEFAULT 0
+#define DP_S_FLAGS 1
+#define DP_S_MIN 2
+#define DP_S_DOT 3
+#define DP_S_MAX 4
+#define DP_S_MOD 5
+#define DP_S_CONV 6
+#define DP_S_DONE 7
+
+/* format flags - Bits */
+#define DP_F_MINUS (1 << 0)
+#define DP_F_PLUS (1 << 1)
+#define DP_F_SPACE (1 << 2)
+#define DP_F_NUM (1 << 3)
+#define DP_F_ZERO (1 << 4)
+#define DP_F_UP (1 << 5)
+#define DP_F_UNSIGNED (1 << 6)
+
+/* conversion flags */
+#define DP_C_SHORT 1
+#define DP_C_LONG 2
+#define DP_C_LDOUBLE 3
+#define DP_C_LLONG 4
+
+/* some handy macros */
+#define char_to_int(p) (p - '0')
+#define STR_MAX(p,q) ((p >= q) ? p : q)
+#define NUL '\0'
+
+static void
+dopr(
+ char *buffer,
+ size_t maxlen,
+ size_t *retlen,
+ const char *format,
+ va_list args)
+{
+ char ch;
+ LLONG value;
+ LDOUBLE fvalue;
+ char *strvalue;
+ int min;
+ int max;
+ int state;
+ int flags;
+ int cflags;
+ size_t currlen;
+
+ state = DP_S_DEFAULT;
+ flags = currlen = cflags = min = 0;
+ max = -1;
+ ch = *format++;
+
+ if (buffer == NULL)
+ maxlen = 999999;
+
+ while (state != DP_S_DONE) {
+ if ((ch == NUL) || (currlen >= maxlen))
+ state = DP_S_DONE;
+
+ switch (state) {
+ case DP_S_DEFAULT:
+ if (ch == '%')
+ state = DP_S_FLAGS;
+ else
+ dopr_outch(buffer, &currlen, maxlen, ch);
+ ch = *format++;
+ break;
+ case DP_S_FLAGS:
+ switch (ch) {
+ case '-':
+ flags |= DP_F_MINUS;
+ ch = *format++;
+ break;
+ case '+':
+ flags |= DP_F_PLUS;
+ ch = *format++;
+ break;
+ case ' ':
+ flags |= DP_F_SPACE;
+ ch = *format++;
+ break;
+ case '#':
+ flags |= DP_F_NUM;
+ ch = *format++;
+ break;
+ case '0':
+ flags |= DP_F_ZERO;
+ ch = *format++;
+ break;
+ default:
+ state = DP_S_MIN;
+ break;
+ }
+ break;
+ case DP_S_MIN:
+ if (isdigit((unsigned char)ch)) {
+ min = 10 * min + char_to_int(ch);
+ ch = *format++;
+ } else if (ch == '*') {
+ min = va_arg(args, int);
+ ch = *format++;
+ state = DP_S_DOT;
+ } else
+ state = DP_S_DOT;
+ break;
+ case DP_S_DOT:
+ if (ch == '.') {
+ state = DP_S_MAX;
+ ch = *format++;
+ } else
+ state = DP_S_MOD;
+ break;
+ case DP_S_MAX:
+ if (isdigit((unsigned char)ch)) {
+ if (max < 0)
+ max = 0;
+ max = 10 * max + char_to_int(ch);
+ ch = *format++;
+ } else if (ch == '*') {
+ max = va_arg(args, int);
+ ch = *format++;
+ state = DP_S_MOD;
+ } else
+ state = DP_S_MOD;
+ break;
+ case DP_S_MOD:
+ switch (ch) {
+ case 'h':
+ cflags = DP_C_SHORT;
+ ch = *format++;
+ break;
+ case 'l':
+ if (*format == 'l') {
+ cflags = DP_C_LLONG;
+ format++;
+ } else
+ cflags = DP_C_LONG;
+ ch = *format++;
+ break;
+ case 'q':
+ cflags = DP_C_LLONG;
+ ch = *format++;
+ break;
+ case 'L':
+ cflags = DP_C_LDOUBLE;
+ ch = *format++;
+ break;
+ default:
+ break;
+ }
+ state = DP_S_CONV;
+ break;
+ case DP_S_CONV:
+ switch (ch) {
+ case 'd':
+ case 'i':
+ switch (cflags) {
+ case DP_C_SHORT:
+ value = (short int)va_arg(args, int);
+ break;
+ case DP_C_LONG:
+ value = va_arg(args, long int);
+ break;
+ case DP_C_LLONG:
+ value = va_arg(args, LLONG);
+ break;
+ default:
+ value = va_arg(args, int);
+ break;
+ }
+ fmtint(buffer, &currlen, maxlen, value, 10, min, max, flags);
+ break;
+ case 'X':
+ flags |= DP_F_UP;
+ /* FALLTHROUGH */
+ case 'x':
+ case 'o':
+ case 'u':
+ flags |= DP_F_UNSIGNED;
+ switch (cflags) {
+ case DP_C_SHORT:
+ value = (unsigned short int)va_arg(args, unsigned int);
+ break;
+ case DP_C_LONG:
+ value = (LLONG)va_arg(args, unsigned long int);
+ break;
+ case DP_C_LLONG:
+ value = va_arg(args, unsigned LLONG);
+ break;
+ default:
+ value = (LLONG)va_arg(args, unsigned int);
+ break;
+ }
+ fmtint(buffer, &currlen, maxlen, value,
+ ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
+ min, max, flags);
+ break;
+ case 'f':
+ if (cflags == DP_C_LDOUBLE)
+ fvalue = va_arg(args, LDOUBLE);
+ else
+ fvalue = va_arg(args, double);
+ fmtfp(buffer, &currlen, maxlen, fvalue, min, max, flags);
+ break;
+ case 'E':
+ flags |= DP_F_UP;
+ /* FALLTHROUGH */
+ case 'e':
+ if (cflags == DP_C_LDOUBLE)
+ fvalue = va_arg(args, LDOUBLE);
+ else
+ fvalue = va_arg(args, double);
+ break;
+ case 'G':
+ flags |= DP_F_UP;
+ /* FALLTHROUGH */
+ case 'g':
+ if (cflags == DP_C_LDOUBLE)
+ fvalue = va_arg(args, LDOUBLE);
+ else
+ fvalue = va_arg(args, double);
+ break;
+ case 'c':
+ dopr_outch(buffer, &currlen, maxlen, va_arg(args, int));
+ break;
+ case 's':
+ strvalue = va_arg(args, char *);
+ if (max < 0)
+ max = maxlen;
+ fmtstr(buffer, &currlen, maxlen, strvalue, flags, min, max);
+ break;
+ case 'p':
+ value = (long)va_arg(args, void *);
+ fmtint(buffer, &currlen, maxlen, value, 16, min, max, flags);
+ break;
+ case 'n': /* XXX */
+ if (cflags == DP_C_SHORT) {
+ short int *num;
+ num = va_arg(args, short int *);
+ *num = currlen;
+ } else if (cflags == DP_C_LONG) { /* XXX */
+ long int *num;
+ num = va_arg(args, long int *);
+ *num = (long int) currlen;
+ } else if (cflags == DP_C_LLONG) { /* XXX */
+ LLONG *num;
+ num = va_arg(args, LLONG *);
+ *num = (LLONG) currlen;
+ } else {
+ int *num;
+ num = va_arg(args, int *);
+ *num = currlen;
+ }
+ break;
+ case '%':
+ dopr_outch(buffer, &currlen, maxlen, ch);
+ break;
+ case 'w':
+ /* not supported yet, treat as next char */
+ ch = *format++;
+ break;
+ default:
+ /* unknown, skip */
+ break;
+ }
+ ch = *format++;
+ state = DP_S_DEFAULT;
+ flags = cflags = min = 0;
+ max = -1;
+ break;
+ case DP_S_DONE:
+ break;
+ default:
+ break;
+ }
+ }
+ if (currlen >= maxlen - 1)
+ currlen = maxlen - 1;
+ if (buffer != NULL)
+ buffer[currlen] = NUL;
+ *retlen = currlen;
+ return;
+}
+
+static void
+fmtstr(
+ char *buffer,
+ size_t *currlen,
+ size_t maxlen,
+ char *value,
+ int flags,
+ int min,
+ int max)
+{
+ int padlen, strln;
+ int cnt = 0;
+
+ if (value == NULL)
+ value = "<NULL>";
+ for (strln = 0; value[strln] != '\0'; strln++)
+ ;
+ padlen = min - strln;
+ if (padlen < 0)
+ padlen = 0;
+ if (flags & DP_F_MINUS)
+ padlen = -padlen;
+
+ while ((padlen > 0) && (cnt < max)) {
+ dopr_outch(buffer, currlen, maxlen, ' ');
+ --padlen;
+ ++cnt;
+ }
+ while (*value && (cnt < max)) {
+ dopr_outch(buffer, currlen, maxlen, *value++);
+ ++cnt;
+ }
+ while ((padlen < 0) && (cnt < max)) {
+ dopr_outch(buffer, currlen, maxlen, ' ');
+ ++padlen;
+ ++cnt;
+ }
+}
+
+static void
+fmtint(
+ char *buffer,
+ size_t *currlen,
+ size_t maxlen,
+ LLONG value,
+ int base,
+ int min,
+ int max,
+ int flags)
+{
+ int signvalue = 0;
+ unsigned LLONG uvalue;
+ char convert[20];
+ int place = 0;
+ int spadlen = 0;
+ int zpadlen = 0;
+ int caps = 0;
+
+ if (max < 0)
+ max = 0;
+ uvalue = value;
+ if (!(flags & DP_F_UNSIGNED)) {
+ if (value < 0) {
+ signvalue = '-';
+ uvalue = -value;
+ } else if (flags & DP_F_PLUS)
+ signvalue = '+';
+ else if (flags & DP_F_SPACE)
+ signvalue = ' ';
+ }
+ if (flags & DP_F_UP)
+ caps = 1;
+ do {
+ convert[place++] =
+ (caps ? "0123456789ABCDEF" : "0123456789abcdef")
+ [uvalue % (unsigned) base];
+ uvalue = (uvalue / (unsigned) base);
+ } while (uvalue && (place < 20));
+ if (place == 20)
+ place--;
+ convert[place] = 0;
+
+ zpadlen = max - place;
+ spadlen = min - STR_MAX(max, place) - (signvalue ? 1 : 0);
+ if (zpadlen < 0)
+ zpadlen = 0;
+ if (spadlen < 0)
+ spadlen = 0;
+ if (flags & DP_F_ZERO) {
+ zpadlen = STR_MAX(zpadlen, spadlen);
+ spadlen = 0;
+ }
+ if (flags & DP_F_MINUS)
+ spadlen = -spadlen;
+
+ /* spaces */
+ while (spadlen > 0) {
+ dopr_outch(buffer, currlen, maxlen, ' ');
+ --spadlen;
+ }
+
+ /* sign */
+ if (signvalue)
+ dopr_outch(buffer, currlen, maxlen, signvalue);
+
+ /* zeros */
+ if (zpadlen > 0) {
+ while (zpadlen > 0) {
+ dopr_outch(buffer, currlen, maxlen, '0');
+ --zpadlen;
+ }
+ }
+ /* digits */
+ while (place > 0)
+ dopr_outch(buffer, currlen, maxlen, convert[--place]);
+
+ /* left justified spaces */
+ while (spadlen < 0) {
+ dopr_outch(buffer, currlen, maxlen, ' ');
+ ++spadlen;
+ }
+ return;
+}
+
+static LDOUBLE
+math_abs(LDOUBLE value)
+{
+ LDOUBLE result = value;
+ if (value < 0)
+ result = -value;
+ return result;
+}
+
+static LDOUBLE
+math_pow10(int exponent)
+{
+ LDOUBLE result = 1;
+ while (exponent > 0) {
+ result *= 10;
+ exponent--;
+ }
+ return result;
+}
+
+static long
+math_round(LDOUBLE value)
+{
+ long intpart;
+ intpart = (long) value;
+ value = value - intpart;
+ if (value >= 0.5)
+ intpart++;
+ return intpart;
+}
+
+static void
+fmtfp(
+ char *buffer,
+ size_t *currlen,
+ size_t maxlen,
+ LDOUBLE fvalue,
+ int min,
+ int max,
+ int flags)
+{
+ int signvalue = 0;
+ LDOUBLE ufvalue;
+ char iconvert[20];
+ char fconvert[20];
+ int iplace = 0;
+ int fplace = 0;
+ int padlen = 0;
+ int zpadlen = 0;
+ int caps = 0;
+ long intpart;
+ long fracpart;
+
+ if (max < 0)
+ max = 6;
+ ufvalue = math_abs(fvalue);
+ if (fvalue < 0)
+ signvalue = '-';
+ else if (flags & DP_F_PLUS)
+ signvalue = '+';
+ else if (flags & DP_F_SPACE)
+ signvalue = ' ';
+
+ intpart = (long)ufvalue;
+
+ /* sorry, we only support 9 digits past the decimal because of our
+ conversion method */
+ if (max > 9)
+ max = 9;
+
+ /* we "cheat" by converting the fractional part to integer by
+ multiplying by a factor of 10 */
+ fracpart = math_round((math_pow10(max)) * (ufvalue - intpart));
+
+ if (fracpart >= math_pow10(max)) {
+ intpart++;
+ fracpart -= (long)math_pow10(max);
+ }
+
+ /* convert integer part */
+ do {
+ iconvert[iplace++] =
+ (caps ? "0123456789ABCDEF"
+ : "0123456789abcdef")[intpart % 10];
+ intpart = (intpart / 10);
+ } while (intpart && (iplace < 20));
+ if (iplace == 20)
+ iplace--;
+ iconvert[iplace] = 0;
+
+ /* convert fractional part */
+ do {
+ fconvert[fplace++] =
+ (caps ? "0123456789ABCDEF"
+ : "0123456789abcdef")[fracpart % 10];
+ fracpart = (fracpart / 10);
+ } while (fracpart && (fplace < 20));
+ if (fplace == 20)
+ fplace--;
+ fconvert[fplace] = 0;
+
+ /* -1 for decimal point, another -1 if we are printing a sign */
+ padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
+ zpadlen = max - fplace;
+ if (zpadlen < 0)
+ zpadlen = 0;
+ if (padlen < 0)
+ padlen = 0;
+ if (flags & DP_F_MINUS)
+ padlen = -padlen;
+
+ if ((flags & DP_F_ZERO) && (padlen > 0)) {
+ if (signvalue) {
+ dopr_outch(buffer, currlen, maxlen, signvalue);
+ --padlen;
+ signvalue = 0;
+ }
+ while (padlen > 0) {
+ dopr_outch(buffer, currlen, maxlen, '0');
+ --padlen;
+ }
+ }
+ while (padlen > 0) {
+ dopr_outch(buffer, currlen, maxlen, ' ');
+ --padlen;
+ }
+ if (signvalue)
+ dopr_outch(buffer, currlen, maxlen, signvalue);
+
+ while (iplace > 0)
+ dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]);
+
+ /*
+ * Decimal point. This should probably use locale to find the correct
+ * char to print out.
+ */
+ if (max > 0) {
+ dopr_outch(buffer, currlen, maxlen, '.');
+
+ while (fplace > 0)
+ dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]);
+ }
+ while (zpadlen > 0) {
+ dopr_outch(buffer, currlen, maxlen, '0');
+ --zpadlen;
+ }
+
+ while (padlen < 0) {
+ dopr_outch(buffer, currlen, maxlen, ' ');
+ ++padlen;
+ }
+ return;
+}
+
+static void
+dopr_outch(
+ char *buffer,
+ size_t *currlen,
+ size_t maxlen,
+ int c)
+{
+ if (*currlen < maxlen) {
+ if (buffer != NULL)
+ buffer[(*currlen)] = (char)c;
+ (*currlen)++;
+ }
+ return;
+}
+
+int
+str_vsnprintf(
+ char *str,
+ size_t count,
+ const char *fmt,
+ va_list args)
+{
+ size_t retlen;
+
+ if (str != NULL)
+ str[0] = NUL;
+ dopr(str, count, &retlen, fmt, args);
+ return retlen;
+}
+
+int
+str_snprintf(
+ char *str,
+ size_t count,
+ const char *fmt,
+ ...)
+{
+ va_list ap;
+ int rv;
+
+ va_start(ap, fmt);
+ rv = str_vsnprintf(str, count, fmt, ap);
+ va_end(ap);
+ return rv;
+}
+
+char *
+str_vasprintf(
+ const char *fmt,
+ va_list ap)
+{
+ char *rv;
+ int n;
+ va_list ap_tmp;
+
+ va_copy(ap_tmp, ap);
+ n = str_vsnprintf(NULL, 0, fmt, ap_tmp);
+ if ((rv = (char *)malloc(n+1)) == NULL)
+ return NULL;
+ str_vsnprintf(rv, n+1, fmt, ap);
+ return rv;
+}
+
+char *
+str_asprintf(
+ const char *fmt,
+ ...)
+{
+ va_list ap;
+ char *rv;
+
+ va_start(ap, fmt);
+ rv = str_vasprintf(fmt, ap);
+ va_end(ap);
+ return rv;
+}
+
+int
+str_vrsprintf(
+ char **str,
+ const char *fmt,
+ va_list ap)
+{
+ int rv;
+ size_t n;
+ va_list ap_tmp;
+
+ if (str == NULL)
+ return -1;
+ if (*str == NULL) {
+ *str = str_vasprintf(fmt, ap);
+ rv = strlen(*str);
+ }
+ else {
+ va_copy(ap_tmp, ap);
+ n = strlen(*str);
+ rv = str_vsnprintf(NULL, 0, fmt, ap_tmp);
+ if ((*str = (char *)realloc(*str, n+rv+1)) == NULL)
+ return -1;
+ str_vsnprintf((*str)+n, rv+1, fmt, ap);
+ }
+ return rv;
+}
+
+int
+str_rsprintf(
+ char **str,
+ const char *fmt,
+ ...)
+{
+ va_list ap;
+ int rv;
+
+ va_start(ap, fmt);
+ rv = str_vrsprintf(str, fmt, ap);
+ va_end(ap);
+ return rv;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_strh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_str.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_str.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_str.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_str.h: string formatting functions
+*/
+
+#ifndef __UUID_STR_H__
+#define __UUID_STR_H__
+
+#include <stdarg.h>
+#include <string.h>
+
+#define STR_PREFIX uuid_
+
+/* embedding support */
+#ifdef STR_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __STR_CONCAT(x,y) x ## y
+#define STR_CONCAT(x,y) __STR_CONCAT(x,y)
+#else
+#define __STR_CONCAT(x) x
+#define STR_CONCAT(x,y) __STR_CONCAT(x)y
+#endif
+#define str_vsnprintf STR_CONCAT(STR_PREFIX,str_vsnprintf)
+#define str_snprintf STR_CONCAT(STR_PREFIX,str_snprintf)
+#define str_vrsprintf STR_CONCAT(STR_PREFIX,str_vrsprintf)
+#define str_rsprintf STR_CONCAT(STR_PREFIX,str_rsprintf)
+#define str_vasprintf STR_CONCAT(STR_PREFIX,str_vasprintf)
+#define str_asprintf STR_CONCAT(STR_PREFIX,str_asprintf)
+#endif
+
+extern int str_vsnprintf (char *, size_t, const char *, va_list);
+extern int str_snprintf (char *, size_t, const char *, ...);
+extern int str_vrsprintf (char **, const char *, va_list);
+extern int str_rsprintf (char **, const char *, ...);
+extern char *str_vasprintf ( const char *, va_list);
+extern char *str_asprintf ( const char *, ...);
+
+#endif /* __UUID_STR_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_timec"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_time.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_time.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_time.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,117 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_time.c: Time Management
+*/
+
+/* own headers (part (1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+/* own headers (part (1/2) */
+#include "uuid_time.h"
+
+/* POSIX gettimeofday(2) abstraction (without timezone) */
+int time_gettimeofday(struct timeval *tv)
+{
+#if defined(HAVE_GETTIMEOFDAY)
+ /* Unix/POSIX pass-through */
+ return gettimeofday(tv, NULL);
+#elif defined(HAVE_CLOCK_GETTIME)
+ /* POSIX emulation */
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
+ return -1;
+ if (tv != NULL) {
+ tv->tv_sec = (long)ts.tv_sec;
+ tv->tv_usec = (long)ts.tv_nsec / 1000;
+ }
+ return 0;
+#elif defined(WIN32)
+ /* Windows emulation */
+ FILETIME ft;
+ LARGE_INTEGER li;
+ __int64 t;
+ static int tzflag;
+#if !defined(__GNUC__)
+#define EPOCHFILETIME 116444736000000000i64
+#else
+#define EPOCHFILETIME 116444736000000000LL
+#endif
+ if (tv != NULL) {
+ GetSystemTimeAsFileTime(&ft);
+ li.LowPart = ft.dwLowDateTime;
+ li.HighPart = ft.dwHighDateTime;
+ t = li.QuadPart;
+ t -= EPOCHFILETIME;
+ t /= 10;
+ tv->tv_sec = (long)(t / 1000000);
+ tv->tv_usec = (long)(t % 1000000);
+ }
+ return 0;
+#else
+#error neither Win32 GetSystemTimeAsFileTime() nor Unix gettimeofday() nor POSIX clock_gettime() available!
+#endif
+}
+
+/* BSD usleep(3) abstraction */
+int time_usleep(long usec)
+{
+#if defined(WIN32) && defined(HAVE_SLEEP)
+ /* Win32 newer Sleep(3) variant */
+ Sleep(usec / 1000);
+#elif defined(WIN32)
+ /* Win32 older _sleep(3) variant */
+ _sleep(usec / 1000);
+#elif defined(HAVE_NANOSLEEP)
+ /* POSIX newer nanosleep(3) variant */
+ struct timespec ts;
+ ts.tv_sec = 0;
+ ts.tv_nsec = 1000 * usec;
+ nanosleep(&ts, NULL);
+#else
+ /* POSIX older select(2) variant */
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = usec;
+ select(0, NULL, NULL, NULL, &tv);
+#endif
+ return 0;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_timeh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_time.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_time.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_time.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+/*
+** OSSP uuid - Universally Unique Identifier
+** Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP uuid, a library for the generation
+** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** uuid_time.h: Time Management API
+*/
+
+#ifndef __UUID_TIME_H__
+#define __UUID_TIME_H__
+
+#include "uuid_ac.h"
+
+#if defined(WIN32)
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+#include <time.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#define TIME_PREFIX uuid_
+
+/* embedding support */
+#ifdef TIME_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __TIME_CONCAT(x,y) x ## y
+#define TIME_CONCAT(x,y) __TIME_CONCAT(x,y)
+#else
+#define __TIME_CONCAT(x) x
+#define TIME_CONCAT(x,y) __TIME_CONCAT(x)y
+#endif
+#define time_gettimeofday TIME_CONCAT(TIME_PREFIX,time_gettimeofday)
+#define time_usleep TIME_CONCAT(TIME_PREFIX,time_usleep)
+#endif
+
+/* minimum C++ support */
+#ifdef __cplusplus
+#define DECLARATION_BEGIN extern "C" {
+#define DECLARATION_END }
+#else
+#define DECLARATION_BEGIN
+#define DECLARATION_END
+#endif
+
+DECLARATION_BEGIN
+
+#ifndef HAVE_STRUCT_TIMEVAL
+struct timeval { long tv_sec; long tv_usec; };
+#endif
+
+extern int time_gettimeofday(struct timeval *);
+extern int time_usleep(long usec);
+
+DECLARATION_END
+
+#endif /* __UUID_TIME_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_ui128c"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_ui128.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_ui128.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_ui128.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,591 @@
</span><ins>+/*
+** OSSP ui128 - 128-Bit Arithmetic
+** Copyright (c) 2002-2005 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2002-2005 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP ui128, a 128-bit arithmetic library
+** which can be found at http://www.ossp.org/pkg/lib/ui128/.
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** ui128.c: implementation of 128-bit unsigned integer arithmetic
+*/
+
+/* own headers (part 1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <string.h>
+#include <ctype.h>
+
+/* own headers (part 2/2) */
+#include "uuid_ui128.h"
+
+#define UI128_BASE 256 /* 2^8 */
+#define UI128_DIGITS 16 /* 8*16 = 128 bit */
+#define UIXX_T(n) struct { unsigned char x[n]; }
+
+/* fill an ui128_t with a sequence of a particular digit */
+#define ui128_fill(__x, __n) \
+ /*lint -save -e717*/ \
+ do { int __i; \
+ for (__i = 0; __i < UI128_DIGITS; __i++) \
+ (__x).x[__i] = (__n); \
+ } while (0) \
+ /*lint -restore*/
+
+/* the value zero */
+ui128_t ui128_zero(void)
+{
+ ui128_t z;
+
+ ui128_fill(z, 0);
+ return z;
+}
+
+/* the maximum value */
+ui128_t ui128_max(void)
+{
+ ui128_t z;
+
+ ui128_fill(z, UI128_BASE-1);
+ return z;
+}
+
+/* convert ISO-C "unsigned long" into internal format */
+ui128_t ui128_n2i(unsigned long n)
+{
+ ui128_t z;
+ int i;
+
+ i = 0;
+ do {
+ z.x[i++] = (n % UI128_BASE);
+ } while ((n /= UI128_BASE) > 0 && i < UI128_DIGITS);
+ for ( ; i < UI128_DIGITS; i++)
+ z.x[i] = 0;
+ return z;
+}
+
+/* convert internal format into ISO-C "unsigned long";
+ truncates if sizeof(unsigned long) is less than UI128_DIGITS! */
+unsigned long ui128_i2n(ui128_t x)
+{
+ unsigned long n;
+ int i;
+
+ n = 0;
+ i = (int)sizeof(n);
+ /*lint -save -e774*/
+ if (i > UI128_DIGITS)
+ i = UI128_DIGITS;
+ /*lint -restore*/
+ while (--i >= 0) {
+ n = (n * UI128_BASE) + x.x[i];
+ }
+ return n;
+}
+
+/* convert string representation of arbitrary base into internal format */
+ui128_t ui128_s2i(const char *str, char **end, int base)
+{
+ ui128_t z;
+ const char *cp;
+ int carry;
+ static char map[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* 0...9 */
+ 36, 36, 36, 36, 36, 36, 36, /* illegal chars */
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, /* A...M */
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, /* N...Z */
+ 36, 36, 36, 36, 36, 36, /* illegal chars */
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, /* a...m */
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 /* m...z */
+ };
+
+ ui128_fill(z, 0);
+ if (str == NULL || (base < 2 || base > 36))
+ return z;
+ cp = str;
+ while (*cp != '\0' && isspace((int)(*cp)))
+ cp++;
+ while ( *cp != '\0'
+ && isalnum((int)(*cp))
+ && map[(int)(*cp)-'0'] < base) {
+ z = ui128_muln(z, base, &carry);
+ if (carry)
+ break;
+ z = ui128_addn(z, map[(int)(*cp)-'0'], &carry);
+ if (carry)
+ break;
+ cp++;
+ }
+ if (end != NULL)
+ *end = (char *)cp;
+ return z;
+}
+
+/* convert internal format into string representation of arbitrary base */
+char *ui128_i2s(ui128_t x, char *str, size_t len, int base)
+{
+ static char map[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ char c;
+ int r;
+ int n;
+ int i, j;
+
+ if (str == NULL || len < 2 || (base < 2 || base > 36))
+ return NULL;
+ n = ui128_len(x);
+ i = 0;
+ do {
+ x = ui128_divn(x, base, &r);
+ str[i++] = map[r];
+ while (n > 1 && x.x[n-1] == 0)
+ n--;
+ } while (i < ((int)len-1) && (n > 1 || x.x[0] != 0));
+ str[i] = '\0';
+ for (j = 0; j < --i; j++) {
+ c = str[j];
+ str[j] = str[i];
+ str[i] = c;
+ }
+ return str;
+}
+
+/* addition of two ui128_t */
+ui128_t ui128_add(ui128_t x, ui128_t y, ui128_t *ov)
+{
+ ui128_t z;
+ int carry;
+ int i;
+
+ carry = 0;
+ for (i = 0; i < UI128_DIGITS; i++) {
+ carry += (x.x[i] + y.x[i]);
+ z.x[i] = (carry % UI128_BASE);
+ carry /= UI128_BASE;
+ }
+ if (ov != NULL)
+ *ov = ui128_n2i((unsigned long)carry);
+ return z;
+}
+
+/* addition of an ui128_t and a single digit */
+ui128_t ui128_addn(ui128_t x, int y, int *ov)
+{
+ ui128_t z;
+ int i;
+
+ for (i = 0; i < UI128_DIGITS; i++) {
+ y += x.x[i];
+ z.x[i] = (y % UI128_BASE);
+ y /= UI128_BASE;
+ }
+ if (ov != NULL)
+ *ov = y;
+ return z;
+}
+
+/* subtraction of two ui128_t */
+ui128_t ui128_sub(ui128_t x, ui128_t y, ui128_t *ov)
+{
+ ui128_t z;
+ int borrow;
+ int i;
+ int d;
+
+ borrow = 0;
+ for (i = 0; i < UI128_DIGITS; i++) {
+ d = ((x.x[i] + UI128_BASE) - borrow - y.x[i]);
+ z.x[i] = (d % UI128_BASE);
+ borrow = (1 - (d/UI128_BASE));
+ }
+ if (ov != NULL)
+ *ov = ui128_n2i((unsigned long)borrow);
+ return z;
+}
+
+/* subtraction of an ui128_t and a single digit */
+ui128_t ui128_subn(ui128_t x, int y, int *ov)
+{
+ ui128_t z;
+ int i;
+ int d;
+
+ for (i = 0; i < UI128_DIGITS; i++) {
+ d = (x.x[i] + UI128_BASE) - y;
+ z.x[i] = (d % UI128_BASE);
+ y = (1 - (d/UI128_BASE));
+ }
+ if (ov != NULL)
+ *ov = y;
+ return z;
+}
+
+/*
+ 7 3 2
+ * 9 4 2 8
+ ---------
+ 5 8 5 6
+ + 1 4 6 4
+ + 2 9 2 8
+ + 6 5 8 8
+ ---------------
+ = 6 9 0 1 2 9 6
+*/
+
+ui128_t ui128_mul(ui128_t x, ui128_t y, ui128_t *ov)
+{
+ UIXX_T(UI128_DIGITS+UI128_DIGITS) zx;
+ ui128_t z;
+ int carry;
+ int i, j;
+
+ /* clear temporary result buffer */
+ for (i = 0; i < (UI128_DIGITS+UI128_DIGITS); i++)
+ zx.x[i] = 0;
+
+ /* perform multiplication operation */
+ for (i = 0; i < UI128_DIGITS; i++) {
+ /* calculate partial product and immediately add to z */
+ carry = 0;
+ for (j = 0; j < UI128_DIGITS; j++) {
+ carry += (x.x[i] * y.x[j]) + zx.x[i+j];
+ zx.x[i+j] = (carry % UI128_BASE);
+ carry /= UI128_BASE;
+ }
+ /* add carry to remaining digits in z */
+ for ( ; j < UI128_DIGITS + UI128_DIGITS - i; j++) {
+ carry += zx.x[i+j];
+ zx.x[i+j] = (carry % UI128_BASE);
+ carry /= UI128_BASE;
+ }
+ }
+
+ /* provide result by splitting zx into z and ov */
+ memcpy(z.x, zx.x, UI128_DIGITS);
+ if (ov != NULL)
+ memcpy((*ov).x, &zx.x[UI128_DIGITS], UI128_DIGITS);
+
+ return z;
+}
+
+ui128_t ui128_muln(ui128_t x, int y, int *ov)
+{
+ ui128_t z;
+ int carry;
+ int i;
+
+ carry = 0;
+ for (i = 0; i < UI128_DIGITS; i++) {
+ carry += (x.x[i] * y);
+ z.x[i] = (carry % UI128_BASE);
+ carry /= UI128_BASE;
+ }
+ if (ov != NULL)
+ *ov = carry;
+ return z;
+}
+
+/*
+ = 2078 [q]
+ 0615367 [x] : 296 [y]
+ -0592 [dq]
+ -----
+ = 0233
+ -0000 [dq]
+ -----
+ = 2336
+ -2072 [dq]
+ -----
+ = 2647
+ -2308 [dq]
+ -----
+ = 279 [r]
+ */
+ui128_t ui128_div(ui128_t x, ui128_t y, ui128_t *ov)
+{
+ ui128_t q;
+ ui128_t r;
+ int i;
+ int n, m;
+ int ovn;
+
+ /* determine actual number of involved digits */
+ n = ui128_len(x);
+ m = ui128_len(y);
+
+ if (m == 1) {
+ /* simple case #1: reduceable to ui128_divn() */
+ if (y.x[0] == 0) {
+ /* error case: division by zero! */
+ ui128_fill(q, 0);
+ ui128_fill(r, 0);
+ }
+ else {
+ q = ui128_divn(x, y.x[0], &ovn);
+ ui128_fill(r, 0);
+ r.x[0] = (unsigned char)ovn;
+ }
+
+ } else if (n < m) {
+ /* simple case #2: everything is in the remainder */
+ ui128_fill(q, 0);
+ r = x;
+
+ } else { /* n >= m, m > 1 */
+ /* standard case: x[0..n] / y[0..m] */
+ UIXX_T(UI128_DIGITS+1) rx;
+ UIXX_T(UI128_DIGITS+1) dq;
+ ui128_t t;
+ int km;
+ int k;
+ int qk;
+ unsigned long y2;
+ unsigned long r3;
+ int borrow;
+ int d;
+
+ /* rx is x with a leading zero in order to make
+ sure that n > m and not just n >= m */
+ memcpy(rx.x, x.x, UI128_DIGITS);
+ rx.x[UI128_DIGITS] = 0;
+
+ for (k = n - m; k >= 0; k--) {
+ /* efficiently compute qk by guessing
+ qk := rx[k+m-2...k+m]/y[m-2...m-1] */
+ km = k + m;
+ y2 = (y.x[m-1]*UI128_BASE) + y.x[m-2];
+ r3 = (rx.x[km]*(UI128_BASE*UI128_BASE)) +
+ (rx.x[km-1]*UI128_BASE) + rx.x[km-2];
+ qk = r3 / y2;
+ if (qk >= UI128_BASE)
+ qk = UI128_BASE - 1;
+
+ /* dq := y*qk (post-adjust qk if guessed incorrectly) */
+ t = ui128_muln(y, qk, &ovn);
+ memcpy(dq.x, t.x, UI128_DIGITS);
+ dq.x[m] = (unsigned char)ovn;
+ for (i = m; i > 0; i--)
+ if (rx.x[i+k] != dq.x[i])
+ break;
+ if (rx.x[i+k] < dq.x[i]) {
+ t = ui128_muln(y, --qk, &ovn);
+ memcpy(dq.x, t.x, UI128_DIGITS);
+ dq.x[m] = (unsigned char)ovn;
+ }
+
+ /* store qk */
+ q.x[k] = (unsigned char)qk;
+
+ /* rx := rx - dq*(b^k) */
+ borrow = 0;
+ for (i = 0; i < m+1; i++) {
+ d = ((rx.x[k+i] + UI128_BASE) - borrow - dq.x[i]);
+ rx.x[k+i] = (d % UI128_BASE);
+ borrow = (1 - (d/UI128_BASE));
+ }
+ }
+ memcpy(r.x, rx.x, m);
+
+ /* fill out results with leading zeros */
+ for (i = n-m+1; i < UI128_DIGITS; i++)
+ q.x[i] = 0;
+ for (i = m; i < UI128_DIGITS; i++)
+ r.x[i] = 0;
+ }
+
+ /* provide results */
+ if (ov != NULL)
+ *ov = r;
+ return q;
+}
+
+ui128_t ui128_divn(ui128_t x, int y, int *ov)
+{
+ ui128_t z;
+ unsigned int carry;
+ int i;
+
+ carry = 0;
+ for (i = (UI128_DIGITS - 1); i >= 0; i--) {
+ carry = (carry * UI128_BASE) + x.x[i];
+ z.x[i] = (carry / y);
+ carry %= y;
+ }
+ if (ov != NULL)
+ *ov = carry;
+ return z;
+}
+
+ui128_t ui128_and(ui128_t x, ui128_t y)
+{
+ ui128_t z;
+ int i;
+
+ for (i = 0; i < UI128_DIGITS; i++)
+ z.x[i] = (x.x[i] & y.x[i]);
+ return z;
+}
+
+ui128_t ui128_or(ui128_t x, ui128_t y)
+{
+ ui128_t z;
+ int i;
+
+ for (i = 0; i < UI128_DIGITS; i++)
+ z.x[i] = (x.x[i] | y.x[i]);
+ return z;
+}
+
+ui128_t ui128_xor(ui128_t x, ui128_t y)
+{
+ ui128_t z;
+ int i;
+
+ for (i = 0; i < UI128_DIGITS; i++)
+ z.x[i] = ((x.x[i] & ~(y.x[i])) | (~(x.x[i]) & (y.x[i])));
+ return z;
+}
+
+ui128_t ui128_not(ui128_t x)
+{
+ ui128_t z;
+ int i;
+
+ for (i = 0; i < UI128_DIGITS; i++)
+ z.x[i] = ~(x.x[i]);
+ return z;
+}
+
+ui128_t ui128_rol(ui128_t x, int s, ui128_t *ov)
+{
+ UIXX_T(UI128_DIGITS+UI128_DIGITS) zx;
+ ui128_t z;
+ int i;
+ int carry;
+
+ if (s <= 0) {
+ /* no shift at all */
+ if (ov != NULL)
+ *ov = ui128_zero();
+ return x;
+ }
+ else if (s > 128) {
+ /* too large shift */
+ if (ov != NULL)
+ *ov = ui128_zero();
+ return ui128_zero();
+ }
+ else if (s == 128) {
+ /* maximum shift */
+ if (ov != NULL)
+ *ov = x;
+ return ui128_zero();
+ }
+ else { /* regular shift */
+ /* shift (logically) left by s/8 bytes */
+ for (i = 0; i < UI128_DIGITS+UI128_DIGITS; i++)
+ zx.x[i] = 0;
+ for (i = 0; i < UI128_DIGITS; i++)
+ zx.x[i+(s/8)] = x.x[i];
+ /* shift (logically) left by remaining s%8 bits */
+ s %= 8;
+ if (s > 0) {
+ carry = 0;
+ for (i = 0; i < UI128_DIGITS+UI128_DIGITS; i++) {
+ carry += (zx.x[i] * (1 << s));
+ zx.x[i] = (carry % UI128_BASE);
+ carry /= UI128_BASE;
+ }
+ }
+ memcpy(z.x, zx.x, UI128_DIGITS);
+ if (ov != NULL)
+ memcpy((*ov).x, &zx.x[UI128_DIGITS], UI128_DIGITS);
+ }
+ return z;
+}
+
+ui128_t ui128_ror(ui128_t x, int s, ui128_t *ov)
+{
+ UIXX_T(UI128_DIGITS+UI128_DIGITS) zx;
+ ui128_t z;
+ int i;
+ int carry;
+
+ if (s <= 0) {
+ /* no shift at all */
+ if (ov != NULL)
+ *ov = ui128_zero();
+ return x;
+ }
+ else if (s > 128) {
+ /* too large shift */
+ if (ov != NULL)
+ *ov = ui128_zero();
+ return ui128_zero();
+ }
+ else if (s == 128) {
+ /* maximum shift */
+ if (ov != NULL)
+ *ov = x;
+ return ui128_zero();
+ }
+ else { /* regular shift */
+ /* shift (logically) right by s/8 bytes */
+ for (i = 0; i < UI128_DIGITS+UI128_DIGITS; i++)
+ zx.x[i] = 0;
+ for (i = 0; i < UI128_DIGITS; i++)
+ zx.x[UI128_DIGITS+i-(s/8)] = x.x[i];
+ /* shift (logically) right by remaining s%8 bits */
+ s %= 8;
+ if (s > 0) {
+ carry = 0;
+ for (i = (UI128_DIGITS+UI128_DIGITS - 1); i >= 0; i--) {
+ carry = (carry * UI128_BASE) + zx.x[i];
+ zx.x[i] = (carry / (1 << s));
+ carry %= (1 << s);
+ }
+ }
+ memcpy(z.x, &zx.x[UI128_DIGITS], UI128_DIGITS);
+ if (ov != NULL)
+ memcpy((*ov).x, zx.x, UI128_DIGITS);
+ }
+ return z;
+}
+
+int ui128_cmp(ui128_t x, ui128_t y)
+{
+ int i;
+
+ i = UI128_DIGITS - 1;
+ while (i > 0 && x.x[i] == y.x[i])
+ i--;
+ return (x.x[i] - y.x[i]);
+}
+
+int ui128_len(ui128_t x)
+{
+ int i;
+
+ for (i = UI128_DIGITS; i > 1 && x.x[i-1] == 0; i--)
+ ;
+ return i;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_ui128h"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_ui128.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_ui128.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_ui128.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,114 @@
</span><ins>+/*
+** OSSP ui128 - 128-Bit Arithmetic
+** Copyright (c) 2002-2005 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2002-2005 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP ui128, a 128-bit arithmetic library
+** which can be found at http://www.ossp.org/pkg/lib/ui128/.
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** ui128.h: API declaration
+*/
+
+#ifndef __UI128_H__
+#define __UI128_H__
+
+#include <string.h>
+
+#define UI128_PREFIX uuid_
+
+/* embedding support */
+#ifdef UI128_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __UI128_CONCAT(x,y) x ## y
+#define UI128_CONCAT(x,y) __UI128_CONCAT(x,y)
+#else
+#define __UI128_CONCAT(x) x
+#define UI128_CONCAT(x,y) __UI128_CONCAT(x)y
+#endif
+#define ui128_t UI128_CONCAT(UI128_PREFIX,ui128_t)
+#define ui128_zero UI128_CONCAT(UI128_PREFIX,ui128_zero)
+#define ui128_max UI128_CONCAT(UI128_PREFIX,ui128_max)
+#define ui128_n2i UI128_CONCAT(UI128_PREFIX,ui128_n2i)
+#define ui128_i2n UI128_CONCAT(UI128_PREFIX,ui128_i2n)
+#define ui128_s2i UI128_CONCAT(UI128_PREFIX,ui128_s2i)
+#define ui128_i2s UI128_CONCAT(UI128_PREFIX,ui128_i2s)
+#define ui128_add UI128_CONCAT(UI128_PREFIX,ui128_add)
+#define ui128_addn UI128_CONCAT(UI128_PREFIX,ui128_addn)
+#define ui128_sub UI128_CONCAT(UI128_PREFIX,ui128_sub)
+#define ui128_subn UI128_CONCAT(UI128_PREFIX,ui128_subn)
+#define ui128_mul UI128_CONCAT(UI128_PREFIX,ui128_mul)
+#define ui128_muln UI128_CONCAT(UI128_PREFIX,ui128_muln)
+#define ui128_div UI128_CONCAT(UI128_PREFIX,ui128_div)
+#define ui128_divn UI128_CONCAT(UI128_PREFIX,ui128_divn)
+#define ui128_and UI128_CONCAT(UI128_PREFIX,ui128_and)
+#define ui128_or UI128_CONCAT(UI128_PREFIX,ui128_or)
+#define ui128_xor UI128_CONCAT(UI128_PREFIX,ui128_xor)
+#define ui128_not UI128_CONCAT(UI128_PREFIX,ui128_not)
+#define ui128_rol UI128_CONCAT(UI128_PREFIX,ui128_rol)
+#define ui128_ror UI128_CONCAT(UI128_PREFIX,ui128_ror)
+#define ui128_len UI128_CONCAT(UI128_PREFIX,ui128_len)
+#define ui128_cmp UI128_CONCAT(UI128_PREFIX,ui128_cmp)
+#endif
+
+typedef struct {
+ unsigned char x[16]; /* x_0, ..., x_15 */
+} ui128_t;
+
+#define ui128_cons(x15,x14,x13,x12,x11,x10,x9,x8,x7,x6,x5,x4,x3,x2,x1,x0) \
+ { { 0x##x0, 0x##x1, 0x##x2, 0x##x3, 0x##x4, 0x##x5, 0x##x6, 0x##x7, \
+ { { 0x##x8, 0x##x9, 0x##x10, 0x##x11, 0x##x12, 0x##x13, 0x##x14, 0x##x15 } }
+
+/* particular values */
+extern ui128_t ui128_zero (void);
+extern ui128_t ui128_max (void);
+
+/* import and export via ISO-C "unsigned long" */
+extern ui128_t ui128_n2i (unsigned long n);
+extern unsigned long ui128_i2n (ui128_t x);
+
+/* import and export via ISO-C string of arbitrary base */
+extern ui128_t ui128_s2i (const char *str, char **end, int base);
+extern char * ui128_i2s (ui128_t x, char *str, size_t len, int base);
+
+/* arithmetical operations */
+extern ui128_t ui128_add (ui128_t x, ui128_t y, ui128_t *ov);
+extern ui128_t ui128_addn (ui128_t x, int y, int *ov);
+extern ui128_t ui128_sub (ui128_t x, ui128_t y, ui128_t *ov);
+extern ui128_t ui128_subn (ui128_t x, int y, int *ov);
+extern ui128_t ui128_mul (ui128_t x, ui128_t y, ui128_t *ov);
+extern ui128_t ui128_muln (ui128_t x, int y, int *ov);
+extern ui128_t ui128_div (ui128_t x, ui128_t y, ui128_t *ov);
+extern ui128_t ui128_divn (ui128_t x, int y, int *ov);
+
+/* bit operations */
+extern ui128_t ui128_and (ui128_t x, ui128_t y);
+extern ui128_t ui128_or (ui128_t x, ui128_t y);
+extern ui128_t ui128_xor (ui128_t x, ui128_t y);
+extern ui128_t ui128_not (ui128_t x);
+extern ui128_t ui128_rol (ui128_t x, int s, ui128_t *ov);
+extern ui128_t ui128_ror (ui128_t x, int s, ui128_t *ov);
+
+/* other operations */
+extern int ui128_len (ui128_t x);
+extern int ui128_cmp (ui128_t x, ui128_t y);
+
+#endif /* __UI128_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_ui64c"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_ui64.c (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_ui64.c         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_ui64.c        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,591 @@
</span><ins>+/*
+** OSSP ui64 - 64-Bit Arithmetic
+** Copyright (c) 2002-2005 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2002-2005 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP ui64, a 64-bit arithmetic library
+** which can be found at http://www.ossp.org/pkg/lib/ui64/.
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** ui64.c: implementation of 64-bit unsigned integer arithmetic
+*/
+
+/* own headers (part 1/2) */
+#include "uuid_ac.h"
+
+/* system headers */
+#include <string.h>
+#include <ctype.h>
+
+/* own headers (part 2/2) */
+#include "uuid_ui64.h"
+
+#define UI64_BASE 256 /* 2^8 */
+#define UI64_DIGITS 8 /* 8*8 = 64 bit */
+#define UIXX_T(n) struct { unsigned char x[n]; }
+
+/* fill an ui64_t with a sequence of a particular digit */
+#define ui64_fill(__x, __n) \
+ /*lint -save -e717*/ \
+ do { int __i; \
+ for (__i = 0; __i < UI64_DIGITS; __i++) \
+ (__x).x[__i] = (__n); \
+ } while (0) \
+ /*lint -restore*/
+
+/* the value zero */
+ui64_t ui64_zero(void)
+{
+ ui64_t z;
+
+ ui64_fill(z, 0);
+ return z;
+}
+
+/* the maximum value */
+ui64_t ui64_max(void)
+{
+ ui64_t z;
+
+ ui64_fill(z, UI64_BASE-1);
+ return z;
+}
+
+/* convert ISO-C "unsigned long" into internal format */
+ui64_t ui64_n2i(unsigned long n)
+{
+ ui64_t z;
+ int i;
+
+ i = 0;
+ do {
+ z.x[i++] = (n % UI64_BASE);
+ } while ((n /= UI64_BASE) > 0 && i < UI64_DIGITS);
+ for ( ; i < UI64_DIGITS; i++)
+ z.x[i] = 0;
+ return z;
+}
+
+/* convert internal format into ISO-C "unsigned long";
+ truncates if sizeof(unsigned long) is less than UI64_DIGITS! */
+unsigned long ui64_i2n(ui64_t x)
+{
+ unsigned long n;
+ int i;
+
+ n = 0;
+ i = (int)sizeof(n);
+ /*lint -save -e774*/
+ if (i > UI64_DIGITS)
+ i = UI64_DIGITS;
+ /*lint -restore*/
+ while (--i >= 0) {
+ n = (n * UI64_BASE) + x.x[i];
+ }
+ return n;
+}
+
+/* convert string representation of arbitrary base into internal format */
+ui64_t ui64_s2i(const char *str, char **end, int base)
+{
+ ui64_t z;
+ const char *cp;
+ int carry;
+ static char map[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* 0...9 */
+ 36, 36, 36, 36, 36, 36, 36, /* illegal chars */
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, /* A...M */
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, /* N...Z */
+ 36, 36, 36, 36, 36, 36, /* illegal chars */
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, /* a...m */
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 /* m...z */
+ };
+
+ ui64_fill(z, 0);
+ if (str == NULL || (base < 2 || base > 36))
+ return z;
+ cp = str;
+ while (*cp != '\0' && isspace((int)(*cp)))
+ cp++;
+ while ( *cp != '\0'
+ && isalnum((int)(*cp))
+ && map[(int)(*cp)-'0'] < base) {
+ z = ui64_muln(z, base, &carry);
+ if (carry)
+ break;
+ z = ui64_addn(z, map[(int)(*cp)-'0'], &carry);
+ if (carry)
+ break;
+ cp++;
+ }
+ if (end != NULL)
+ *end = (char *)cp;
+ return z;
+}
+
+/* convert internal format into string representation of arbitrary base */
+char *ui64_i2s(ui64_t x, char *str, size_t len, int base)
+{
+ static char map[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ char c;
+ int r;
+ int n;
+ int i, j;
+
+ if (str == NULL || len < 2 || (base < 2 || base > 36))
+ return NULL;
+ n = ui64_len(x);
+ i = 0;
+ do {
+ x = ui64_divn(x, base, &r);
+ str[i++] = map[r];
+ while (n > 1 && x.x[n-1] == 0)
+ n--;
+ } while (i < ((int)len-1) && (n > 1 || x.x[0] != 0));
+ str[i] = '\0';
+ for (j = 0; j < --i; j++) {
+ c = str[j];
+ str[j] = str[i];
+ str[i] = c;
+ }
+ return str;
+}
+
+/* addition of two ui64_t */
+ui64_t ui64_add(ui64_t x, ui64_t y, ui64_t *ov)
+{
+ ui64_t z;
+ int carry;
+ int i;
+
+ carry = 0;
+ for (i = 0; i < UI64_DIGITS; i++) {
+ carry += (x.x[i] + y.x[i]);
+ z.x[i] = (carry % UI64_BASE);
+ carry /= UI64_BASE;
+ }
+ if (ov != NULL)
+ *ov = ui64_n2i((unsigned long)carry);
+ return z;
+}
+
+/* addition of an ui64_t and a single digit */
+ui64_t ui64_addn(ui64_t x, int y, int *ov)
+{
+ ui64_t z;
+ int i;
+
+ for (i = 0; i < UI64_DIGITS; i++) {
+ y += x.x[i];
+ z.x[i] = (y % UI64_BASE);
+ y /= UI64_BASE;
+ }
+ if (ov != NULL)
+ *ov = y;
+ return z;
+}
+
+/* subtraction of two ui64_t */
+ui64_t ui64_sub(ui64_t x, ui64_t y, ui64_t *ov)
+{
+ ui64_t z;
+ int borrow;
+ int i;
+ int d;
+
+ borrow = 0;
+ for (i = 0; i < UI64_DIGITS; i++) {
+ d = ((x.x[i] + UI64_BASE) - borrow - y.x[i]);
+ z.x[i] = (d % UI64_BASE);
+ borrow = (1 - (d/UI64_BASE));
+ }
+ if (ov != NULL)
+ *ov = ui64_n2i((unsigned long)borrow);
+ return z;
+}
+
+/* subtraction of an ui64_t and a single digit */
+ui64_t ui64_subn(ui64_t x, int y, int *ov)
+{
+ ui64_t z;
+ int i;
+ int d;
+
+ for (i = 0; i < UI64_DIGITS; i++) {
+ d = (x.x[i] + UI64_BASE) - y;
+ z.x[i] = (d % UI64_BASE);
+ y = (1 - (d/UI64_BASE));
+ }
+ if (ov != NULL)
+ *ov = y;
+ return z;
+}
+
+/*
+ 7 3 2
+ * 9 4 2 8
+ ---------
+ 5 8 5 6
+ + 1 4 6 4
+ + 2 9 2 8
+ + 6 5 8 8
+ ---------------
+ = 6 9 0 1 2 9 6
+*/
+
+ui64_t ui64_mul(ui64_t x, ui64_t y, ui64_t *ov)
+{
+ UIXX_T(UI64_DIGITS+UI64_DIGITS) zx;
+ ui64_t z;
+ int carry;
+ int i, j;
+
+ /* clear temporary result buffer */
+ for (i = 0; i < (UI64_DIGITS+UI64_DIGITS); i++)
+ zx.x[i] = 0;
+
+ /* perform multiplication operation */
+ for (i = 0; i < UI64_DIGITS; i++) {
+ /* calculate partial product and immediately add to z */
+ carry = 0;
+ for (j = 0; j < UI64_DIGITS; j++) {
+ carry += (x.x[i] * y.x[j]) + zx.x[i+j];
+ zx.x[i+j] = (carry % UI64_BASE);
+ carry /= UI64_BASE;
+ }
+ /* add carry to remaining digits in z */
+ for ( ; j < UI64_DIGITS + UI64_DIGITS - i; j++) {
+ carry += zx.x[i+j];
+ zx.x[i+j] = (carry % UI64_BASE);
+ carry /= UI64_BASE;
+ }
+ }
+
+ /* provide result by splitting zx into z and ov */
+ memcpy(z.x, zx.x, UI64_DIGITS);
+ if (ov != NULL)
+ memcpy((*ov).x, &zx.x[UI64_DIGITS], UI64_DIGITS);
+
+ return z;
+}
+
+ui64_t ui64_muln(ui64_t x, int y, int *ov)
+{
+ ui64_t z;
+ int carry;
+ int i;
+
+ carry = 0;
+ for (i = 0; i < UI64_DIGITS; i++) {
+ carry += (x.x[i] * y);
+ z.x[i] = (carry % UI64_BASE);
+ carry /= UI64_BASE;
+ }
+ if (ov != NULL)
+ *ov = carry;
+ return z;
+}
+
+/*
+ = 2078 [q]
+ 0615367 [x] : 296 [y]
+ -0592 [dq]
+ -----
+ = 0233
+ -0000 [dq]
+ -----
+ = 2336
+ -2072 [dq]
+ -----
+ = 2647
+ -2308 [dq]
+ -----
+ = 279 [r]
+ */
+ui64_t ui64_div(ui64_t x, ui64_t y, ui64_t *ov)
+{
+ ui64_t q;
+ ui64_t r;
+ int i;
+ int n, m;
+ int ovn;
+
+ /* determine actual number of involved digits */
+ n = ui64_len(x);
+ m = ui64_len(y);
+
+ if (m == 1) {
+ /* simple case #1: reduceable to ui64_divn() */
+ if (y.x[0] == 0) {
+ /* error case: division by zero! */
+ ui64_fill(q, 0);
+ ui64_fill(r, 0);
+ }
+ else {
+ q = ui64_divn(x, y.x[0], &ovn);
+ ui64_fill(r, 0);
+ r.x[0] = (unsigned char)ovn;
+ }
+
+ } else if (n < m) {
+ /* simple case #2: everything is in the remainder */
+ ui64_fill(q, 0);
+ r = x;
+
+ } else { /* n >= m, m > 1 */
+ /* standard case: x[0..n] / y[0..m] */
+ UIXX_T(UI64_DIGITS+1) rx;
+ UIXX_T(UI64_DIGITS+1) dq;
+ ui64_t t;
+ int km;
+ int k;
+ int qk;
+ unsigned long y2;
+ unsigned long r3;
+ int borrow;
+ int d;
+
+ /* rx is x with a leading zero in order to make
+ sure that n > m and not just n >= m */
+ memcpy(rx.x, x.x, UI64_DIGITS);
+ rx.x[UI64_DIGITS] = 0;
+
+ for (k = n - m; k >= 0; k--) {
+ /* efficiently compute qk by guessing
+ qk := rx[k+m-2...k+m]/y[m-2...m-1] */
+ km = k + m;
+ y2 = (y.x[m-1]*UI64_BASE) + y.x[m-2];
+ r3 = (rx.x[km]*(UI64_BASE*UI64_BASE)) +
+ (rx.x[km-1]*UI64_BASE) + rx.x[km-2];
+ qk = r3 / y2;
+ if (qk >= UI64_BASE)
+ qk = UI64_BASE - 1;
+
+ /* dq := y*qk (post-adjust qk if guessed incorrectly) */
+ t = ui64_muln(y, qk, &ovn);
+ memcpy(dq.x, t.x, UI64_DIGITS);
+ dq.x[m] = (unsigned char)ovn;
+ for (i = m; i > 0; i--)
+ if (rx.x[i+k] != dq.x[i])
+ break;
+ if (rx.x[i+k] < dq.x[i]) {
+ t = ui64_muln(y, --qk, &ovn);
+ memcpy(dq.x, t.x, UI64_DIGITS);
+ dq.x[m] = (unsigned char)ovn;
+ }
+
+ /* store qk */
+ q.x[k] = (unsigned char)qk;
+
+ /* rx := rx - dq*(b^k) */
+ borrow = 0;
+ for (i = 0; i < m+1; i++) {
+ d = ((rx.x[k+i] + UI64_BASE) - borrow - dq.x[i]);
+ rx.x[k+i] = (d % UI64_BASE);
+ borrow = (1 - (d/UI64_BASE));
+ }
+ }
+ memcpy(r.x, rx.x, m);
+
+ /* fill out results with leading zeros */
+ for (i = n-m+1; i < UI64_DIGITS; i++)
+ q.x[i] = 0;
+ for (i = m; i < UI64_DIGITS; i++)
+ r.x[i] = 0;
+ }
+
+ /* provide results */
+ if (ov != NULL)
+ *ov = r;
+ return q;
+}
+
+ui64_t ui64_divn(ui64_t x, int y, int *ov)
+{
+ ui64_t z;
+ unsigned int carry;
+ int i;
+
+ carry = 0;
+ for (i = (UI64_DIGITS - 1); i >= 0; i--) {
+ carry = (carry * UI64_BASE) + x.x[i];
+ z.x[i] = (carry / y);
+ carry %= y;
+ }
+ if (ov != NULL)
+ *ov = carry;
+ return z;
+}
+
+ui64_t ui64_and(ui64_t x, ui64_t y)
+{
+ ui64_t z;
+ int i;
+
+ for (i = 0; i < UI64_DIGITS; i++)
+ z.x[i] = (x.x[i] & y.x[i]);
+ return z;
+}
+
+ui64_t ui64_or(ui64_t x, ui64_t y)
+{
+ ui64_t z;
+ int i;
+
+ for (i = 0; i < UI64_DIGITS; i++)
+ z.x[i] = (x.x[i] | y.x[i]);
+ return z;
+}
+
+ui64_t ui64_xor(ui64_t x, ui64_t y)
+{
+ ui64_t z;
+ int i;
+
+ for (i = 0; i < UI64_DIGITS; i++)
+ z.x[i] = ((x.x[i] & ~(y.x[i])) | (~(x.x[i]) & (y.x[i])));
+ return z;
+}
+
+ui64_t ui64_not(ui64_t x)
+{
+ ui64_t z;
+ int i;
+
+ for (i = 0; i < UI64_DIGITS; i++)
+ z.x[i] = ~(x.x[i]);
+ return z;
+}
+
+ui64_t ui64_rol(ui64_t x, int s, ui64_t *ov)
+{
+ UIXX_T(UI64_DIGITS+UI64_DIGITS) zx;
+ ui64_t z;
+ int i;
+ int carry;
+
+ if (s <= 0) {
+ /* no shift at all */
+ if (ov != NULL)
+ *ov = ui64_zero();
+ return x;
+ }
+ else if (s > 64) {
+ /* too large shift */
+ if (ov != NULL)
+ *ov = ui64_zero();
+ return ui64_zero();
+ }
+ else if (s == 64) {
+ /* maximum shift */
+ if (ov != NULL)
+ *ov = x;
+ return ui64_zero();
+ }
+ else { /* regular shift */
+ /* shift (logically) left by s/8 bytes */
+ for (i = 0; i < UI64_DIGITS+UI64_DIGITS; i++)
+ zx.x[i] = 0;
+ for (i = 0; i < UI64_DIGITS; i++)
+ zx.x[i+(s/8)] = x.x[i];
+ /* shift (logically) left by remaining s%8 bits */
+ s %= 8;
+ if (s > 0) {
+ carry = 0;
+ for (i = 0; i < UI64_DIGITS+UI64_DIGITS; i++) {
+ carry += (zx.x[i] * (1 << s));
+ zx.x[i] = (carry % UI64_BASE);
+ carry /= UI64_BASE;
+ }
+ }
+ memcpy(z.x, zx.x, UI64_DIGITS);
+ if (ov != NULL)
+ memcpy((*ov).x, &zx.x[UI64_DIGITS], UI64_DIGITS);
+ }
+ return z;
+}
+
+ui64_t ui64_ror(ui64_t x, int s, ui64_t *ov)
+{
+ UIXX_T(UI64_DIGITS+UI64_DIGITS) zx;
+ ui64_t z;
+ int i;
+ int carry;
+
+ if (s <= 0) {
+ /* no shift at all */
+ if (ov != NULL)
+ *ov = ui64_zero();
+ return x;
+ }
+ else if (s > 64) {
+ /* too large shift */
+ if (ov != NULL)
+ *ov = ui64_zero();
+ return ui64_zero();
+ }
+ else if (s == 64) {
+ /* maximum shift */
+ if (ov != NULL)
+ *ov = x;
+ return ui64_zero();
+ }
+ else { /* regular shift */
+ /* shift (logically) right by s/8 bytes */
+ for (i = 0; i < UI64_DIGITS+UI64_DIGITS; i++)
+ zx.x[i] = 0;
+ for (i = 0; i < UI64_DIGITS; i++)
+ zx.x[UI64_DIGITS+i-(s/8)] = x.x[i];
+ /* shift (logically) right by remaining s%8 bits */
+ s %= 8;
+ if (s > 0) {
+ carry = 0;
+ for (i = (UI64_DIGITS+UI64_DIGITS - 1); i >= 0; i--) {
+ carry = (carry * UI64_BASE) + zx.x[i];
+ zx.x[i] = (carry / (1 << s));
+ carry %= (1 << s);
+ }
+ }
+ memcpy(z.x, &zx.x[UI64_DIGITS], UI64_DIGITS);
+ if (ov != NULL)
+ memcpy((*ov).x, zx.x, UI64_DIGITS);
+ }
+ return z;
+}
+
+int ui64_cmp(ui64_t x, ui64_t y)
+{
+ int i;
+
+ i = UI64_DIGITS - 1;
+ while (i > 0 && x.x[i] == y.x[i])
+ i--;
+ return (x.x[i] - y.x[i]);
+}
+
+int ui64_len(ui64_t x)
+{
+ int i;
+
+ for (i = UI64_DIGITS; i > 1 && x.x[i-1] == 0; i--)
+ ;
+ return i;
+}
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_ui64h"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_ui64.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_ui64.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_ui64.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,113 @@
</span><ins>+/*
+** OSSP ui64 - 64-Bit Arithmetic
+** Copyright (c) 2002-2005 Ralf S. Engelschall <rse@engelschall.com>
+** Copyright (c) 2002-2005 The OSSP Project <http://www.ossp.org/>
+**
+** This file is part of OSSP ui64, a 64-bit arithmetic library
+** which can be found at http://www.ossp.org/pkg/lib/ui64/.
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** ui64.h: API declaration
+*/
+
+#ifndef __UI64_H__
+#define __UI64_H__
+
+#include <string.h>
+
+#define UI64_PREFIX uuid_
+
+/* embedding support */
+#ifdef UI64_PREFIX
+#if defined(__STDC__) || defined(__cplusplus)
+#define __UI64_CONCAT(x,y) x ## y
+#define UI64_CONCAT(x,y) __UI64_CONCAT(x,y)
+#else
+#define __UI64_CONCAT(x) x
+#define UI64_CONCAT(x,y) __UI64_CONCAT(x)y
+#endif
+#define ui64_t UI64_CONCAT(UI64_PREFIX,ui64_t)
+#define ui64_zero UI64_CONCAT(UI64_PREFIX,ui64_zero)
+#define ui64_max UI64_CONCAT(UI64_PREFIX,ui64_max)
+#define ui64_n2i UI64_CONCAT(UI64_PREFIX,ui64_n2i)
+#define ui64_i2n UI64_CONCAT(UI64_PREFIX,ui64_i2n)
+#define ui64_s2i UI64_CONCAT(UI64_PREFIX,ui64_s2i)
+#define ui64_i2s UI64_CONCAT(UI64_PREFIX,ui64_i2s)
+#define ui64_add UI64_CONCAT(UI64_PREFIX,ui64_add)
+#define ui64_addn UI64_CONCAT(UI64_PREFIX,ui64_addn)
+#define ui64_sub UI64_CONCAT(UI64_PREFIX,ui64_sub)
+#define ui64_subn UI64_CONCAT(UI64_PREFIX,ui64_subn)
+#define ui64_mul UI64_CONCAT(UI64_PREFIX,ui64_mul)
+#define ui64_muln UI64_CONCAT(UI64_PREFIX,ui64_muln)
+#define ui64_div UI64_CONCAT(UI64_PREFIX,ui64_div)
+#define ui64_divn UI64_CONCAT(UI64_PREFIX,ui64_divn)
+#define ui64_and UI64_CONCAT(UI64_PREFIX,ui64_and)
+#define ui64_or UI64_CONCAT(UI64_PREFIX,ui64_or)
+#define ui64_xor UI64_CONCAT(UI64_PREFIX,ui64_xor)
+#define ui64_not UI64_CONCAT(UI64_PREFIX,ui64_not)
+#define ui64_rol UI64_CONCAT(UI64_PREFIX,ui64_rol)
+#define ui64_ror UI64_CONCAT(UI64_PREFIX,ui64_ror)
+#define ui64_len UI64_CONCAT(UI64_PREFIX,ui64_len)
+#define ui64_cmp UI64_CONCAT(UI64_PREFIX,ui64_cmp)
+#endif
+
+typedef struct {
+ unsigned char x[8]; /* x_0, ..., x_7 */
+} ui64_t;
+
+#define ui64_cons(x7,x6,x5,x4,x3,x2,x1,x0) \
+ { { 0x##x0, 0x##x1, 0x##x2, 0x##x3, 0x##x4, 0x##x5, 0x##x6, 0x##x7 } }
+
+/* particular values */
+extern ui64_t ui64_zero (void);
+extern ui64_t ui64_max (void);
+
+/* import and export via ISO-C "unsigned long" */
+extern ui64_t ui64_n2i (unsigned long n);
+extern unsigned long ui64_i2n (ui64_t x);
+
+/* import and export via ISO-C string of arbitrary base */
+extern ui64_t ui64_s2i (const char *str, char **end, int base);
+extern char * ui64_i2s (ui64_t x, char *str, size_t len, int base);
+
+/* arithmetical operations */
+extern ui64_t ui64_add (ui64_t x, ui64_t y, ui64_t *ov);
+extern ui64_t ui64_addn (ui64_t x, int y, int *ov);
+extern ui64_t ui64_sub (ui64_t x, ui64_t y, ui64_t *ov);
+extern ui64_t ui64_subn (ui64_t x, int y, int *ov);
+extern ui64_t ui64_mul (ui64_t x, ui64_t y, ui64_t *ov);
+extern ui64_t ui64_muln (ui64_t x, int y, int *ov);
+extern ui64_t ui64_div (ui64_t x, ui64_t y, ui64_t *ov);
+extern ui64_t ui64_divn (ui64_t x, int y, int *ov);
+
+/* bit operations */
+extern ui64_t ui64_and (ui64_t x, ui64_t y);
+extern ui64_t ui64_or (ui64_t x, ui64_t y);
+extern ui64_t ui64_xor (ui64_t x, ui64_t y);
+extern ui64_t ui64_not (ui64_t x);
+extern ui64_t ui64_rol (ui64_t x, int s, ui64_t *ov);
+extern ui64_t ui64_ror (ui64_t x, int s, ui64_t *ov);
+
+/* other operations */
+extern int ui64_len (ui64_t x);
+extern int ui64_cmp (ui64_t x, ui64_t y);
+
+#endif /* __UI64_H__ */
+
</ins></span></pre></div>
<a id="freeswitchtrunklibsuuiduuid_versh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/libs/uuid/uuid_vers.h (0 => 16021)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/uuid/uuid_vers.h         (rev 0)
+++ freeswitch/trunk/libs/uuid/uuid_vers.h        2009-12-22 19:10:16 UTC (rev 16021)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+/*
+** uuid_vers.h -- Version Information for OSSP uuid (syntax: C/C++)
+** [automatically generated and maintained by GNU shtool]
+*/
+
+#ifdef _UUID_VERS_H_AS_HEADER_
+
+#ifndef _UUID_VERS_H_
+#define _UUID_VERS_H_
+
+#define _UUID_VERSION 0x106202
+
+typedef struct {
+ const int v_hex;
+ const char *v_short;
+ const char *v_long;
+ const char *v_tex;
+ const char *v_gnu;
+ const char *v_web;
+ const char *v_sccs;
+ const char *v_rcs;
+} _uuid_version_t;
+
+extern _uuid_version_t _uuid_version;
+
+#endif /* _UUID_VERS_H_ */
+
+#else /* _UUID_VERS_H_AS_HEADER_ */
+
+#define _UUID_VERS_H_AS_HEADER_
+#include "uuid_vers.h"
+#undef _UUID_VERS_H_AS_HEADER_
+
+_uuid_version_t _uuid_version = {
+ 0x106202,
+ "1.6.2",
+ "1.6.2 (04-Jul-2008)",
+ "This is OSSP uuid, Version 1.6.2 (04-Jul-2008)",
+ "OSSP uuid 1.6.2 (04-Jul-2008)",
+ "OSSP uuid/1.6.2",
+ "@(#)OSSP uuid 1.6.2 (04-Jul-2008)",
+ "$Id: OSSP uuid 1.6.2 (04-Jul-2008) $"
+};
+
+#endif /* _UUID_VERS_H_AS_HEADER_ */
+
</ins></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>
</body>
</html>