From cfe5e3905201349e9cf3f95d52ff4bd100bde37d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 14 Apr 2024 21:10:49 +0200 Subject: Adding upstream version 2.39.3. Signed-off-by: Daniel Baumann --- libuuid/COPYING | 5 + libuuid/Makemodule.am | 10 + libuuid/man/Makemodule.am | 27 ++ libuuid/man/uuid.3 | 64 ++++ libuuid/man/uuid.3.adoc | 80 ++++ libuuid/man/uuid_clear.3 | 59 +++ libuuid/man/uuid_clear.3.adoc | 75 ++++ libuuid/man/uuid_compare.3 | 58 +++ libuuid/man/uuid_compare.3.adoc | 77 ++++ libuuid/man/uuid_copy.3 | 62 +++ libuuid/man/uuid_copy.3.adoc | 79 ++++ libuuid/man/uuid_generate.3 | 90 +++++ libuuid/man/uuid_generate.3.adoc | 103 +++++ libuuid/man/uuid_generate_random.3 | 1 + libuuid/man/uuid_generate_time.3 | 1 + libuuid/man/uuid_generate_time_safe.3 | 1 + libuuid/man/uuid_is_null.3 | 60 +++ libuuid/man/uuid_is_null.3.adoc | 76 ++++ libuuid/man/uuid_parse.3 | 71 ++++ libuuid/man/uuid_parse.3.adoc | 87 +++++ libuuid/man/uuid_time.3 | 63 +++ libuuid/man/uuid_time.3.adoc | 80 ++++ libuuid/man/uuid_unparse.3 | 69 ++++ libuuid/man/uuid_unparse.3.adoc | 84 ++++ libuuid/meson.build | 51 +++ libuuid/src/Makemodule.am | 67 ++++ libuuid/src/clear.c | 43 +++ libuuid/src/compare.c | 55 +++ libuuid/src/copy.c | 45 +++ libuuid/src/gen_uuid.c | 704 ++++++++++++++++++++++++++++++++++ libuuid/src/isnull.c | 44 +++ libuuid/src/libuuid.sym | 67 ++++ libuuid/src/pack.c | 69 ++++ libuuid/src/parse.c | 98 +++++ libuuid/src/predefined.c | 83 ++++ libuuid/src/test_uuid.c | 121 ++++++ libuuid/src/unpack.c | 63 +++ libuuid/src/unparse.c | 76 ++++ libuuid/src/uuid.h | 123 ++++++ libuuid/src/uuidP.h | 94 +++++ libuuid/src/uuid_time.c | 171 +++++++++ libuuid/src/uuidd.h | 55 +++ libuuid/uuid.pc.in | 11 + 43 files changed, 3422 insertions(+) create mode 100644 libuuid/COPYING create mode 100644 libuuid/Makemodule.am create mode 100644 libuuid/man/Makemodule.am create mode 100644 libuuid/man/uuid.3 create mode 100644 libuuid/man/uuid.3.adoc create mode 100644 libuuid/man/uuid_clear.3 create mode 100644 libuuid/man/uuid_clear.3.adoc create mode 100644 libuuid/man/uuid_compare.3 create mode 100644 libuuid/man/uuid_compare.3.adoc create mode 100644 libuuid/man/uuid_copy.3 create mode 100644 libuuid/man/uuid_copy.3.adoc create mode 100644 libuuid/man/uuid_generate.3 create mode 100644 libuuid/man/uuid_generate.3.adoc create mode 100644 libuuid/man/uuid_generate_random.3 create mode 100644 libuuid/man/uuid_generate_time.3 create mode 100644 libuuid/man/uuid_generate_time_safe.3 create mode 100644 libuuid/man/uuid_is_null.3 create mode 100644 libuuid/man/uuid_is_null.3.adoc create mode 100644 libuuid/man/uuid_parse.3 create mode 100644 libuuid/man/uuid_parse.3.adoc create mode 100644 libuuid/man/uuid_time.3 create mode 100644 libuuid/man/uuid_time.3.adoc create mode 100644 libuuid/man/uuid_unparse.3 create mode 100644 libuuid/man/uuid_unparse.3.adoc create mode 100644 libuuid/meson.build create mode 100644 libuuid/src/Makemodule.am create mode 100644 libuuid/src/clear.c create mode 100644 libuuid/src/compare.c create mode 100644 libuuid/src/copy.c create mode 100644 libuuid/src/gen_uuid.c create mode 100644 libuuid/src/isnull.c create mode 100644 libuuid/src/libuuid.sym create mode 100644 libuuid/src/pack.c create mode 100644 libuuid/src/parse.c create mode 100644 libuuid/src/predefined.c create mode 100644 libuuid/src/test_uuid.c create mode 100644 libuuid/src/unpack.c create mode 100644 libuuid/src/unparse.c create mode 100644 libuuid/src/uuid.h create mode 100644 libuuid/src/uuidP.h create mode 100644 libuuid/src/uuid_time.c create mode 100644 libuuid/src/uuidd.h create mode 100644 libuuid/uuid.pc.in (limited to 'libuuid') diff --git a/libuuid/COPYING b/libuuid/COPYING new file mode 100644 index 0000000..8a40936 --- /dev/null +++ b/libuuid/COPYING @@ -0,0 +1,5 @@ +This library is free software; you can redistribute it and/or +modify it under the terms of the Modified BSD License. + +The complete text of the license is available in the +../Documentation/licenses/COPYING.BSD-3-Clause file. diff --git a/libuuid/Makemodule.am b/libuuid/Makemodule.am new file mode 100644 index 0000000..166be5c --- /dev/null +++ b/libuuid/Makemodule.am @@ -0,0 +1,10 @@ +if BUILD_LIBUUID + +include libuuid/man/Makemodule.am +include libuuid/src/Makemodule.am + +pkgconfig_DATA += libuuid/uuid.pc +PATHFILES += libuuid/uuid.pc +EXTRA_DIST += libuuid/COPYING + +endif # BUILD_LIBUUID diff --git a/libuuid/man/Makemodule.am b/libuuid/man/Makemodule.am new file mode 100644 index 0000000..1cdc1b0 --- /dev/null +++ b/libuuid/man/Makemodule.am @@ -0,0 +1,27 @@ + +MANPAGES += \ + libuuid/man/uuid.3 \ + libuuid/man/uuid_clear.3 \ + libuuid/man/uuid_compare.3 \ + libuuid/man/uuid_copy.3 \ + libuuid/man/uuid_generate.3 \ + libuuid/man/uuid_is_null.3 \ + libuuid/man/uuid_parse.3 \ + libuuid/man/uuid_time.3 \ + libuuid/man/uuid_unparse.3 + +dist_noinst_DATA += \ + libuuid/man/uuid.3.adoc \ + libuuid/man/uuid_clear.3.adoc \ + libuuid/man/uuid_compare.3.adoc \ + libuuid/man/uuid_copy.3.adoc \ + libuuid/man/uuid_generate.3.adoc \ + libuuid/man/uuid_is_null.3.adoc \ + libuuid/man/uuid_parse.3.adoc \ + libuuid/man/uuid_time.3.adoc \ + libuuid/man/uuid_unparse.3.adoc + +MANLINKS += \ + libuuid/man/uuid_generate_random.3 \ + libuuid/man/uuid_generate_time.3 \ + libuuid/man/uuid_generate_time_safe.3 diff --git a/libuuid/man/uuid.3 b/libuuid/man/uuid.3 new file mode 100644 index 0000000..ce71643 --- /dev/null +++ b/libuuid/man/uuid.3 @@ -0,0 +1,64 @@ +'\" t +.\" Title: uuid +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid \- DCE compatible Universally Unique Identifier library +.SH "SYNOPSIS" +.sp +\fB#include \fP +.SH "DESCRIPTION" +.sp +The UUID library is used to generate unique identifiers for objects that may be accessible beyond the local system. This library generates UUIDs compatible with those created by the Open Software Foundation (OSF) Distributed Computing Environment (DCE) utility \fBuuidgen\fP(1). +.sp +The UUIDs generated by this library can be reasonably expected to be unique within a system, and unique across all systems. They could be used, for instance, to generate unique HTTP cookies across multiple web servers without communication between the servers, and without fear of a name clash. +.SH "CONFORMING TO" +.sp +This library generates UUIDs compatible with OSF DCE 1.1, and hash based UUIDs V3 and V5 compatible with \c +.URL "https://tools.ietf.org/html/rfc4122" "RFC\-4122" "." +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid_clear\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_parse\fP(3), +\fBuuid_time\fP(3), +\fBuuid_unparse\fP(3) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid.3.adoc b/libuuid/man/uuid.3.adoc new file mode 100644 index 0000000..c8c6d66 --- /dev/null +++ b/libuuid/man/uuid.3.adoc @@ -0,0 +1,80 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid - DCE compatible Universally Unique Identifier library + +== SYNOPSIS + +*#include * + +== DESCRIPTION + +The UUID library is used to generate unique identifiers for objects that may be accessible beyond the local system. This library generates UUIDs compatible with those created by the Open Software Foundation (OSF) Distributed Computing Environment (DCE) utility *uuidgen*(1). + +The UUIDs generated by this library can be reasonably expected to be unique within a system, and unique across all systems. They could be used, for instance, to generate unique HTTP cookies across multiple web servers without communication between the servers, and without fear of a name clash. + +== CONFORMING TO + +This library generates UUIDs compatible with OSF DCE 1.1, and hash based UUIDs V3 and V5 compatible with link:https://tools.ietf.org/html/rfc4122[RFC-4122]. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid_clear*(3), +*uuid_compare*(3), +*uuid_copy*(3), +*uuid_generate*(3), +*uuid_is_null*(3), +*uuid_parse*(3), +*uuid_time*(3), +*uuid_unparse*(3) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_clear.3 b/libuuid/man/uuid_clear.3 new file mode 100644 index 0000000..ef242ea --- /dev/null +++ b/libuuid/man/uuid_clear.3 @@ -0,0 +1,59 @@ +'\" t +.\" Title: uuid_clear +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_CLEAR" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_clear \- reset value of UUID variable to the NULL value +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBvoid uuid_clear(uuid_t \fIuu\fP);\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_clear\fP() function sets the value of the supplied uuid variable \fIuu\fP to the NULL value. +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_parse\fP(3), +\fBuuid_unparse\fP(3) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_clear.3.adoc b/libuuid/man/uuid_clear.3.adoc new file mode 100644 index 0000000..48c3a59 --- /dev/null +++ b/libuuid/man/uuid_clear.3.adoc @@ -0,0 +1,75 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_clear(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_clear - reset value of UUID variable to the NULL value + +== SYNOPSIS + +*#include * + +*void uuid_clear(uuid_t __uu__);* + +== DESCRIPTION + +The *uuid_clear*() function sets the value of the supplied uuid variable _uu_ to the NULL value. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid*(3), +*uuid_compare*(3), +*uuid_copy*(3), +*uuid_generate*(3), +*uuid_is_null*(3), +*uuid_parse*(3), +*uuid_unparse*(3) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_compare.3 b/libuuid/man/uuid_compare.3 new file mode 100644 index 0000000..18ee6e0 --- /dev/null +++ b/libuuid/man/uuid_compare.3 @@ -0,0 +1,58 @@ +'\" t +.\" Title: uuid_compare +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_COMPARE" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_compare \- compare whether two UUIDs are the same +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBint uuid_compare(uuid_t \fIuu1\fP, uuid_t \fIuu2\fP)\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_compare\fP() function compares the two supplied uuid variables \fIuu1\fP and \fIuu2\fP to each other. +.SH "RETURN VALUE" +.sp +Returns an integer less than, equal to, or greater than zero if \fIuu1\fP is found, respectively, to be lexicographically less than, equal, or greater than \fIuu2\fP. +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid\fP(3), +\fBuuid_clear\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_parse\fP(3), +\fBuuid_unparse\fP(3) +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_compare.3.adoc b/libuuid/man/uuid_compare.3.adoc new file mode 100644 index 0000000..1d32475 --- /dev/null +++ b/libuuid/man/uuid_compare.3.adoc @@ -0,0 +1,77 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_compare(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_compare - compare whether two UUIDs are the same + +== SYNOPSIS + +*#include * + +*int uuid_compare(uuid_t __uu1__, uuid_t __uu2__)* + +== DESCRIPTION + +The *uuid_compare*() function compares the two supplied uuid variables _uu1_ and _uu2_ to each other. + +== RETURN VALUE + +Returns an integer less than, equal to, or greater than zero if _uu1_ is found, respectively, to be lexicographically less than, equal, or greater than _uu2_. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid*(3), +*uuid_clear*(3), +*uuid_copy*(3), +*uuid_generate*(3), +*uuid_is_null*(3), +*uuid_parse*(3), +*uuid_unparse*(3) + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_copy.3 b/libuuid/man/uuid_copy.3 new file mode 100644 index 0000000..ed08bd3 --- /dev/null +++ b/libuuid/man/uuid_copy.3 @@ -0,0 +1,62 @@ +'\" t +.\" Title: uuid_copy +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_COPY" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_copy \- copy a UUID value +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBvoid uuid_copy(uuid_t \fIdst\fP, uuid_t \fIsrc\fP);\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_copy\fP() function copies the UUID variable \fIsrc\fP to \fIdst\fP. +.SH "RETURN VALUE" +.sp +The copied UUID is returned in the location pointed to by \fIdst\fP. +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid\fP(3), +\fBuuid_clear\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_parse\fP(3), +\fBuuid_unparse\fP(3) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_copy.3.adoc b/libuuid/man/uuid_copy.3.adoc new file mode 100644 index 0000000..fee40d6 --- /dev/null +++ b/libuuid/man/uuid_copy.3.adoc @@ -0,0 +1,79 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_copy(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_copy - copy a UUID value + +== SYNOPSIS + +*#include * + +*void uuid_copy(uuid_t __dst__, uuid_t __src__);* + +== DESCRIPTION + +The *uuid_copy*() function copies the UUID variable _src_ to _dst_. + +== RETURN VALUE + +The copied UUID is returned in the location pointed to by _dst_. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid*(3), +*uuid_clear*(3), +*uuid_compare*(3), +*uuid_generate*(3), +*uuid_is_null*(3), +*uuid_parse*(3), +*uuid_unparse*(3) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_generate.3 b/libuuid/man/uuid_generate.3 new file mode 100644 index 0000000..dba2eee --- /dev/null +++ b/libuuid/man/uuid_generate.3 @@ -0,0 +1,90 @@ +'\" t +.\" Title: uuid_generate +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_GENERATE" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_generate, uuid_generate_random, uuid_generate_time, uuid_generate_time_safe \- create a new unique UUID value +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBvoid uuid_generate(uuid_t \fIout\fP);\fP +.br +\fBvoid uuid_generate_random(uuid_t \fIout\fP);\fP +.br +\fBvoid uuid_generate_time(uuid_t \fIout\fP);\fP +.br +\fBint uuid_generate_time_safe(uuid_t \fIout\fP);\fP +.br +\fBvoid uuid_generate_md5(uuid_t \fIout\fP, const uuid_t \fIns\fP, const char \fI*name\fP, size_t \fIlen\fP);\fP +.br +\fBvoid uuid_generate_sha1(uuid_t \fIout\fP, const uuid_t \fIns\fP, const char \fI*name\fP, size_t \fIlen\fP);\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_generate\fP() function creates a new universally unique identifier (UUID). The uuid will be generated based on high\-quality randomness from \fBgetrandom\fP(2), \fI/dev/urandom\fP, or \fI/dev/random\fP if available. If it is not available, then \fBuuid_generate\fP() will use an alternative algorithm which uses the current time, the local ethernet MAC address (if available), and random data generated using a pseudo\-random generator. +.sp +The \fBuuid_generate_random\fP() function forces the use of the all\-random UUID format, even if a high\-quality random number generator is not available, in which case a pseudo\-random generator will be substituted. Note that the use of a pseudo\-random generator may compromise the uniqueness of UUIDs generated in this fashion. +.sp +The \fBuuid_generate_time\fP() function forces the use of the alternative algorithm which uses the current time and the local ethernet MAC address (if available). This algorithm used to be the default one used to generate UUIDs, but because of the use of the ethernet MAC address, it can leak information about when and where the UUID was generated. This can cause privacy problems in some applications, so the \fBuuid_generate\fP() function only uses this algorithm if a high\-quality source of randomness is not available. To guarantee uniqueness of UUIDs generated by concurrently running processes, the uuid library uses a global clock state counter (if the process has permissions to gain exclusive access to this file) and/or the \fBuuidd\fP(8) daemon, if it is running already or can be spawned by the process (if installed and the process has enough permissions to run it). If neither of these two synchronization mechanisms can be used, it is theoretically possible that two concurrently running processes obtain the same UUID(s). To tell whether the UUID has been generated in a safe manner, use \fBuuid_generate_time_safe\fP. +.sp +The \fBuuid_generate_time_safe\fP() function is similar to \fBuuid_generate_time\fP(), except that it returns a value which denotes whether any of the synchronization mechanisms (see above) has been used. +.sp +The UUID is 16 bytes (128 bits) long, which gives approximately 3.4x10^38 unique values (there are approximately 10^80 elementary particles in the universe according to Carl Sagan\(cqs \fICosmos\fP). The new UUID can reasonably be considered unique among all UUIDs created on the local system, and among UUIDs created on other systems in the past and in the future. +.sp +The \fBuuid_generate_md5\fP() and \fBuuid_generate_sha1\fP() functions generate an MD5 and SHA1 hashed (predictable) UUID based on a well\-known UUID providing the namespace and an arbitrary binary string. The UUIDs conform to V3 and V5 UUIDs per \c +.URL "https://tools.ietf.org/html/rfc4122" "RFC\-4122" "." +.SH "RETURN VALUE" +.sp +The newly created UUID is returned in the memory location pointed to by \fIout\fP. \fBuuid_generate_time_safe\fP() returns zero if the UUID has been generated in a safe manner, \-1 otherwise. +.SH "CONFORMING TO" +.sp +This library generates UUIDs compatible with OSF DCE 1.1, and hash based UUIDs V3 and V5 compatible with \c +.URL "https://tools.ietf.org/html/rfc4122" "RFC\-4122" "." +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuidgen\fP(1), +\fBuuid\fP(3), +\fBuuid_clear\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_parse\fP(3), +\fBuuid_time\fP(3), +\fBuuid_unparse\fP(3), +\fBuuidd\fP(8) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_generate.3.adoc b/libuuid/man/uuid_generate.3.adoc new file mode 100644 index 0000000..420634d --- /dev/null +++ b/libuuid/man/uuid_generate.3.adoc @@ -0,0 +1,103 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +%Begin-Header% +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. +%End-Header% + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_generate(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_generate, uuid_generate_random, uuid_generate_time, uuid_generate_time_safe - create a new unique UUID value + +== SYNOPSIS + +*#include * + +*void uuid_generate(uuid_t __out__);* + +*void uuid_generate_random(uuid_t __out__);* + +*void uuid_generate_time(uuid_t __out__);* + +*int uuid_generate_time_safe(uuid_t __out__);* + +*void uuid_generate_md5(uuid_t __out__, const uuid_t __ns__, const char __*name__, size_t __len__);* + +*void uuid_generate_sha1(uuid_t __out__, const uuid_t __ns__, const char __*name__, size_t __len__);* + +== DESCRIPTION + +The *uuid_generate*() function creates a new universally unique identifier (UUID). The uuid will be generated based on high-quality randomness from *getrandom*(2), _/dev/urandom_, or _/dev/random_ if available. If it is not available, then *uuid_generate*() will use an alternative algorithm which uses the current time, the local ethernet MAC address (if available), and random data generated using a pseudo-random generator. + +The *uuid_generate_random*() function forces the use of the all-random UUID format, even if a high-quality random number generator is not available, in which case a pseudo-random generator will be substituted. Note that the use of a pseudo-random generator may compromise the uniqueness of UUIDs generated in this fashion. + +The *uuid_generate_time*() function forces the use of the alternative algorithm which uses the current time and the local ethernet MAC address (if available). This algorithm used to be the default one used to generate UUIDs, but because of the use of the ethernet MAC address, it can leak information about when and where the UUID was generated. This can cause privacy problems in some applications, so the *uuid_generate*() function only uses this algorithm if a high-quality source of randomness is not available. To guarantee uniqueness of UUIDs generated by concurrently running processes, the uuid library uses a global clock state counter (if the process has permissions to gain exclusive access to this file) and/or the *uuidd*(8) daemon, if it is running already or can be spawned by the process (if installed and the process has enough permissions to run it). If neither of these two synchronization mechanisms can be used, it is theoretically possible that two concurrently running processes obtain the same UUID(s). To tell whether the UUID has been generated in a safe manner, use *uuid_generate_time_safe*. + +The *uuid_generate_time_safe*() function is similar to *uuid_generate_time*(), except that it returns a value which denotes whether any of the synchronization mechanisms (see above) has been used. + +The UUID is 16 bytes (128 bits) long, which gives approximately 3.4x10^38 unique values (there are approximately 10^80 elementary particles in the universe according to Carl Sagan's _Cosmos_). The new UUID can reasonably be considered unique among all UUIDs created on the local system, and among UUIDs created on other systems in the past and in the future. + +The *uuid_generate_md5*() and *uuid_generate_sha1*() functions generate an MD5 and SHA1 hashed (predictable) UUID based on a well-known UUID providing the namespace and an arbitrary binary string. The UUIDs conform to V3 and V5 UUIDs per link:https://tools.ietf.org/html/rfc4122[RFC-4122]. + +== RETURN VALUE + +The newly created UUID is returned in the memory location pointed to by _out_. *uuid_generate_time_safe*() returns zero if the UUID has been generated in a safe manner, -1 otherwise. + +== CONFORMING TO + +This library generates UUIDs compatible with OSF DCE 1.1, and hash based UUIDs V3 and V5 compatible with link:https://tools.ietf.org/html/rfc4122[RFC-4122]. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuidgen*(1), +*uuid*(3), +*uuid_clear*(3), +*uuid_compare*(3), +*uuid_copy*(3), +*uuid_is_null*(3), +*uuid_parse*(3), +*uuid_time*(3), +*uuid_unparse*(3), +*uuidd*(8) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_generate_random.3 b/libuuid/man/uuid_generate_random.3 new file mode 100644 index 0000000..1e51c4e --- /dev/null +++ b/libuuid/man/uuid_generate_random.3 @@ -0,0 +1 @@ +.so uuid_generate.3 \ No newline at end of file diff --git a/libuuid/man/uuid_generate_time.3 b/libuuid/man/uuid_generate_time.3 new file mode 100644 index 0000000..1e51c4e --- /dev/null +++ b/libuuid/man/uuid_generate_time.3 @@ -0,0 +1 @@ +.so uuid_generate.3 \ No newline at end of file diff --git a/libuuid/man/uuid_generate_time_safe.3 b/libuuid/man/uuid_generate_time_safe.3 new file mode 100644 index 0000000..1e51c4e --- /dev/null +++ b/libuuid/man/uuid_generate_time_safe.3 @@ -0,0 +1 @@ +.so uuid_generate.3 \ No newline at end of file diff --git a/libuuid/man/uuid_is_null.3 b/libuuid/man/uuid_is_null.3 new file mode 100644 index 0000000..a4cf3cc --- /dev/null +++ b/libuuid/man/uuid_is_null.3 @@ -0,0 +1,60 @@ +'\" t +.\" Title: uuid_is_null +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_IS_NULL" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_is_null \- compare the value of the UUID to the NULL value +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBint uuid_is_null(uuid_t \fIuu\fP);\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_is_null\fP() function compares the value of the supplied UUID variable \fIuu\fP to the NULL value. If the value is equal to the NULL UUID, 1 is returned, otherwise 0 is returned. +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid\fP(3), +\fBuuid_clear\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_time\fP(3), +\fBuuid_parse\fP(3), +\fBuuid_unparse\fP(3) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_is_null.3.adoc b/libuuid/man/uuid_is_null.3.adoc new file mode 100644 index 0000000..6fed1d8 --- /dev/null +++ b/libuuid/man/uuid_is_null.3.adoc @@ -0,0 +1,76 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_is_null(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_is_null - compare the value of the UUID to the NULL value + +== SYNOPSIS + +*#include * + +*int uuid_is_null(uuid_t __uu__);* + +== DESCRIPTION + +The *uuid_is_null*() function compares the value of the supplied UUID variable _uu_ to the NULL value. If the value is equal to the NULL UUID, 1 is returned, otherwise 0 is returned. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid*(3), +*uuid_clear*(3), +*uuid_compare*(3), +*uuid_copy*(3), +*uuid_generate*(3), +*uuid_time*(3), +*uuid_parse*(3), +*uuid_unparse*(3) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_parse.3 b/libuuid/man/uuid_parse.3 new file mode 100644 index 0000000..c70980e --- /dev/null +++ b/libuuid/man/uuid_parse.3 @@ -0,0 +1,71 @@ +'\" t +.\" Title: uuid_parse +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_PARSE" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_parse \- convert an input UUID string into binary representation +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBint uuid_parse(char *\fIin\fP, uuid_t \fIuu\fP);\fP +.br +\fBint uuid_parse_range(char *\fIin_start\fP, char *\fIin_end\fP, uuid_t \fIuu\fP);\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_parse\fP() function converts the UUID string given by \fIin\fP into the binary representation. The input UUID is a string of the form 1b4e28ba\-2fa1\-11d2\-883f\-b9a761bde3fb (in \fBprintf\fP(3) format "%08x\-%04x\-%04x\-%04x\-%012x", 36 bytes plus the trailing \*(Aq\(rs0\*(Aq). +.sp +The \fBuuid_parse_range\fP() function works like \fBuuid_parse\fP() but parses only range in string specified by \fIin_start\fP and \fIin_end\fP pointers. +.SH "RETURN VALUE" +.sp +Upon successfully parsing the input string, 0 is returned, and the UUID is stored in the location pointed to by \fIuu\fP, otherwise \-1 is returned. +.SH "CONFORMING TO" +.sp +This library parses UUIDs compatible with OSF DCE 1.1, and hash based UUIDs V3 and V5 compatible with \c +.URL "https://tools.ietf.org/html/rfc4122" "RFC\-4122" "." +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid\fP(3), +\fBuuid_clear\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_time\fP(3), +\fBuuid_unparse\fP(3) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_parse.3.adoc b/libuuid/man/uuid_parse.3.adoc new file mode 100644 index 0000000..8129aae --- /dev/null +++ b/libuuid/man/uuid_parse.3.adoc @@ -0,0 +1,87 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_parse(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_parse - convert an input UUID string into binary representation + +== SYNOPSIS + +*#include * + +*int uuid_parse(char *__in__, uuid_t __uu__);* + +*int uuid_parse_range(char *__in_start__, char *__in_end__, uuid_t __uu__);* + +== DESCRIPTION + +The *uuid_parse*() function converts the UUID string given by _in_ into the binary representation. The input UUID is a string of the form 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb (in *printf*(3) format "%08x-%04x-%04x-%04x-%012x", 36 bytes plus the trailing '\0'). + +The *uuid_parse_range*() function works like *uuid_parse*() but parses only range in string specified by _in_start_ and _in_end_ pointers. + +== RETURN VALUE + +Upon successfully parsing the input string, 0 is returned, and the UUID is stored in the location pointed to by _uu_, otherwise -1 is returned. + +== CONFORMING TO + +This library parses UUIDs compatible with OSF DCE 1.1, and hash based UUIDs V3 and V5 compatible with link:https://tools.ietf.org/html/rfc4122[RFC-4122]. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid*(3), +*uuid_clear*(3), +*uuid_compare*(3), +*uuid_copy*(3), +*uuid_generate*(3), +*uuid_is_null*(3), +*uuid_time*(3), +*uuid_unparse*(3) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_time.3 b/libuuid/man/uuid_time.3 new file mode 100644 index 0000000..475f095 --- /dev/null +++ b/libuuid/man/uuid_time.3 @@ -0,0 +1,63 @@ +'\" t +.\" Title: uuid_time +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_TIME" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_time \- extract the time at which the UUID was created +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBtime_t uuid_time(uuid_t \fIuu\fP, struct timeval *\fIret_tv\fP)\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_time\fP() function extracts the time at which the supplied time\-based UUID \fIuu\fP was created. Note that the UUID creation time is only encoded within certain types of UUIDs. This function can only reasonably expect to extract the creation time for UUIDs created with the \fBuuid_generate_time\fP(3) and \fBuuid_generate_time_safe\fP(3) functions. It may or may not work with UUIDs created by other mechanisms. +.SH "RETURN VALUE" +.sp +The time at which the UUID was created, in seconds since January 1, 1970 GMT (the epoch), is returned (see \fBtime\fP(2)). The time at which the UUID was created, in seconds and microseconds since the epoch, is also stored in the location pointed to by \fIret_tv\fP (see \fBgettimeofday\fP(2)). +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid\fP(3), +\fBuuid_clear\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_parse\fP(3), +\fBuuid_unparse\fP(3) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_time.3.adoc b/libuuid/man/uuid_time.3.adoc new file mode 100644 index 0000000..5497583 --- /dev/null +++ b/libuuid/man/uuid_time.3.adoc @@ -0,0 +1,80 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_time(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_time - extract the time at which the UUID was created + +== SYNOPSIS + +*#include * + +*time_t uuid_time(uuid_t __uu__, struct timeval *__ret_tv__)* + +== DESCRIPTION + +The *uuid_time*() function extracts the time at which the supplied time-based UUID _uu_ was created. Note that the UUID creation time is only encoded within certain types of UUIDs. This function can only reasonably expect to extract the creation time for UUIDs created with the *uuid_generate_time*(3) and *uuid_generate_time_safe*(3) functions. It may or may not work with UUIDs created by other mechanisms. + +== RETURN VALUE + +The time at which the UUID was created, in seconds since January 1, 1970 GMT (the epoch), is returned (see *time*(2)). The time at which the UUID was created, in seconds and microseconds since the epoch, is also stored in the location pointed to by _ret_tv_ (see *gettimeofday*(2)). + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid*(3), +*uuid_clear*(3), +*uuid_compare*(3), +*uuid_copy*(3), +*uuid_generate*(3), +*uuid_is_null*(3), +*uuid_parse*(3), +*uuid_unparse*(3) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/man/uuid_unparse.3 b/libuuid/man/uuid_unparse.3 new file mode 100644 index 0000000..a1f96fd --- /dev/null +++ b/libuuid/man/uuid_unparse.3 @@ -0,0 +1,69 @@ +'\" t +.\" Title: uuid_unparse +.\" Author: [see the "AUTHOR(S)" section] +.\" Generator: Asciidoctor 2.0.20 +.\" Date: 2023-10-23 +.\" Manual: Programmer's Manual +.\" Source: util-linux 2.39.3 +.\" Language: English +.\" +.TH "UUID_UNPARSE" "3" "2023-10-23" "util\-linux 2.39.3" "Programmer\*(Aqs Manual" +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.ss \n[.ss] 0 +.nh +.ad l +.de URL +\fI\\$2\fP <\\$1>\\$3 +.. +.als MTO URL +.if \n[.g] \{\ +. mso www.tmac +. am URL +. ad l +. . +. am MTO +. ad l +. . +. LINKSTYLE blue R < > +.\} +.SH "NAME" +uuid_unparse \- convert a UUID from binary representation to a string +.SH "SYNOPSIS" +.sp +\fB#include \fP +.sp +\fBvoid uuid_unparse(uuid_t \fIuu\fP, char *\fIout\fP);\fP +.br +\fBvoid uuid_unparse_upper(uuid_t \fIuu\fP, char *\fIout\fP);\fP +.br +\fBvoid uuid_unparse_lower(uuid_t \fIuu\fP, char *\fIout\fP);\fP +.SH "DESCRIPTION" +.sp +The \fBuuid_unparse\fP() function converts the supplied UUID \fIuu\fP from the binary representation into a 36\-byte string (plus trailing \*(Aq\(rs0\*(Aq) of the form 1b4e28ba\-2fa1\-11d2\-883f\-0016d3cca427 and stores this value in the character string pointed to by \fIout\fP. The case of the hex digits returned by \fBuuid_unparse\fP() may be upper or lower case, and is dependent on the system\-dependent local default. +.sp +If the case of the hex digits is important then the functions \fBuuid_unparse_upper\fP() and \fBuuid_unparse_lower\fP() may be used. +.SH "CONFORMING TO" +.sp +This library unparses UUIDs compatible with OSF DCE 1.1. +.SH "AUTHORS" +.sp +Theodore Y. Ts\(cqo +.SH "SEE ALSO" +.sp +\fBuuid\fP(3), +\fBuuid_clear\fP(3), +\fBuuid_compare\fP(3), +\fBuuid_copy\fP(3), +\fBuuid_generate\fP(3), +\fBuuid_time\fP(3), +\fBuuid_is_null\fP(3), +\fBuuid_parse\fP(3) +.SH "REPORTING BUGS" +.sp +For bug reports, use the issue tracker at \c +.URL "https://github.com/util\-linux/util\-linux/issues" "" "." +.SH "AVAILABILITY" +.sp +The \fBlibuuid\fP library is part of the util\-linux package since version 2.15.1. It can be downloaded from \c +.URL "https://www.kernel.org/pub/linux/utils/util\-linux/" "Linux Kernel Archive" "." \ No newline at end of file diff --git a/libuuid/man/uuid_unparse.3.adoc b/libuuid/man/uuid_unparse.3.adoc new file mode 100644 index 0000000..a14dc8c --- /dev/null +++ b/libuuid/man/uuid_unparse.3.adoc @@ -0,0 +1,84 @@ +//po4a: entry man manual +//// +Copyright 1999 Andreas Dilger (adilger@enel.ucalgary.ca) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +Created Wed Mar 10 17:42:12 1999, Andreas Dilger +//// += uuid_unparse(3) +:doctype: manpage +:man manual: Programmer's Manual +:man source: util-linux {release-version} +:page-layout: base +:lib: libuuid +:firstversion: 2.15.1 + +== NAME + +uuid_unparse - convert a UUID from binary representation to a string + +== SYNOPSIS + +*#include * + +*void uuid_unparse(uuid_t __uu__, char *__out__);* + +*void uuid_unparse_upper(uuid_t __uu__, char *__out__);* + +*void uuid_unparse_lower(uuid_t __uu__, char *__out__);* + +== DESCRIPTION + +The *uuid_unparse*() function converts the supplied UUID _uu_ from the binary representation into a 36-byte string (plus trailing '\0') of the form 1b4e28ba-2fa1-11d2-883f-0016d3cca427 and stores this value in the character string pointed to by _out_. The case of the hex digits returned by *uuid_unparse*() may be upper or lower case, and is dependent on the system-dependent local default. + +If the case of the hex digits is important then the functions *uuid_unparse_upper*() and *uuid_unparse_lower*() may be used. + +== CONFORMING TO + +This library unparses UUIDs compatible with OSF DCE 1.1. + +== AUTHORS + +Theodore Y. Ts'o + +== SEE ALSO + +*uuid*(3), +*uuid_clear*(3), +*uuid_compare*(3), +*uuid_copy*(3), +*uuid_generate*(3), +*uuid_time*(3), +*uuid_is_null*(3), +*uuid_parse*(3) + +include::man-common/bugreports.adoc[] + +include::man-common/footer-lib.adoc[] + +ifdef::translation[] +include::man-common/translation.adoc[] +endif::[] diff --git a/libuuid/meson.build b/libuuid/meson.build new file mode 100644 index 0000000..a801b4e --- /dev/null +++ b/libuuid/meson.build @@ -0,0 +1,51 @@ +dir_libuuid = include_directories('src') + +lib_uuid_sources = ''' + src/uuidP.h + src/clear.c + src/compare.c + src/copy.c + src/gen_uuid.c + src/isnull.c + src/pack.c + src/parse.c + src/uuidd.h + src/uuid_time.c +'''.split() + +predefined_c = files('src/predefined.c') +unpack_c = files('src/unpack.c') +unparse_c = files('src/unparse.c') + +libuuid_sym = 'src/libuuid.sym' +libuuid_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libuuid_sym) + +lib_uuid = both_libraries( + 'uuid', + list_h, + lib_uuid_sources, + predefined_c, + unpack_c, + unparse_c, + randutils_c, + md5_c, + sha1_c, + include_directories : [dir_include, dir_libuuid], + link_depends : libuuid_sym, + version : libuuid_version, + link_args : ['-Wl,--version-script=@0@'.format(libuuid_sym_path)], + dependencies : [socket_libs, + build_libuuid ? [] : disabler()], + install : build_libuuid) +uuid_dep = declare_dependency(link_with: lib_uuid, include_directories: dir_libuuid) + +if build_libuuid + pkgconfig.generate(lib_uuid, + description : 'Universally unique id library', + subdirs : 'uuid', + version : pc_version) + install_headers('src/uuid.h', subdir : 'uuid') + if meson.version().version_compare('>=0.54.0') + meson.override_dependency('uuid', uuid_dep) + endif +endif diff --git a/libuuid/src/Makemodule.am b/libuuid/src/Makemodule.am new file mode 100644 index 0000000..e58fa26 --- /dev/null +++ b/libuuid/src/Makemodule.am @@ -0,0 +1,67 @@ + +check_PROGRAMS += test_uuid_parser +test_uuid_parser_SOURCES = libuuid/src/test_uuid.c +test_uuid_parser_LDADD = libuuid.la $(SOCKET_LIBS) $(LDADD) +test_uuid_parser_CFLAGS = $(AM_CFLAGS) -I$(ul_libuuid_incdir) + +# includes +uuidincdir = $(includedir)/uuid +uuidinc_HEADERS = libuuid/src/uuid.h + +usrlib_exec_LTLIBRARIES += libuuid.la + +libuuid_la_SOURCES = \ + libuuid/src/uuidP.h \ + libuuid/src/clear.c \ + libuuid/src/compare.c \ + libuuid/src/copy.c \ + libuuid/src/gen_uuid.c \ + libuuid/src/isnull.c \ + libuuid/src/pack.c \ + libuuid/src/parse.c \ + libuuid/src/unpack.c \ + libuuid/src/unparse.c \ + libuuid/src/uuidd.h \ + libuuid/src/uuid_time.c \ + libuuid/src/predefined.c \ + lib/randutils.c \ + lib/md5.c \ + lib/sha1.c + +EXTRA_libuuid_la_DEPENDENCIES = \ + libuuid/src/libuuid.sym + +libuuid_la_LIBADD = $(LDADD) $(SOCKET_LIBS) + +libuuid_la_CFLAGS = \ + $(AM_CFLAGS) \ + $(SOLIB_CFLAGS) \ + -I$(ul_libuuid_incdir) \ + -Ilibuuid/src + +libuuid_la_LDFLAGS = $(SOLIB_LDFLAGS) +if HAVE_VSCRIPT +libuuid_la_LDFLAGS += libuuid_la_LDFLAGS += $(VSCRIPT_LDFLAGS),$(top_srcdir)/libuuid/src/libuuid.sym +endif +libuuid_la_LDFLAGS += -version-info $(LIBUUID_VERSION_INFO) + + +EXTRA_DIST += libuuid/src/libuuid.sym + +# move lib from $(usrlib_execdir) to $(libdir) if needed +install-exec-hook-libuuid: + if test "$(usrlib_execdir)" != "$(libdir)" -a -f "$(DESTDIR)$(usrlib_execdir)/libuuid.so"; then \ + $(MKDIR_P) $(DESTDIR)$(libdir); \ + mv $(DESTDIR)$(usrlib_execdir)/libuuid.so.* $(DESTDIR)$(libdir); \ + so_img_name=$$(readlink $(DESTDIR)$(usrlib_execdir)/libuuid.so); \ + so_img_rel_target=$$(echo $(usrlib_execdir) | sed 's,\(^/\|\)[^/][^/]*,..,g'); \ + (cd $(DESTDIR)$(usrlib_execdir) && \ + rm -f libuuid.so && \ + $(LN_S) $$so_img_rel_target$(libdir)/$$so_img_name libuuid.so); \ + fi + +uninstall-hook-libuuid: + rm -f $(DESTDIR)$(libdir)/libuuid.so* + +INSTALL_EXEC_HOOKS += install-exec-hook-libuuid +UNINSTALL_HOOKS += uninstall-hook-libuuid diff --git a/libuuid/src/clear.c b/libuuid/src/clear.c new file mode 100644 index 0000000..2d91fee --- /dev/null +++ b/libuuid/src/clear.c @@ -0,0 +1,43 @@ +/* + * clear.c -- Clear a UUID + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "string.h" + +#include "uuidP.h" + +void uuid_clear(uuid_t uu) +{ + memset(uu, 0, 16); +} + diff --git a/libuuid/src/compare.c b/libuuid/src/compare.c new file mode 100644 index 0000000..8f3437a --- /dev/null +++ b/libuuid/src/compare.c @@ -0,0 +1,55 @@ +/* + * compare.c --- compare whether or not two UUIDs are the same + * + * Returns 0 if the two UUIDs are different, and 1 if they are the same. + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "uuidP.h" +#include + +#define UUCMP(u1,u2) if (u1 != u2) return((u1 < u2) ? -1 : 1); + +int uuid_compare(const uuid_t uu1, const uuid_t uu2) +{ + struct uuid uuid1, uuid2; + + uuid_unpack(uu1, &uuid1); + uuid_unpack(uu2, &uuid2); + + UUCMP(uuid1.time_low, uuid2.time_low); + UUCMP(uuid1.time_mid, uuid2.time_mid); + UUCMP(uuid1.time_hi_and_version, uuid2.time_hi_and_version); + UUCMP(uuid1.clock_seq, uuid2.clock_seq); + return memcmp(uuid1.node, uuid2.node, 6); +} + diff --git a/libuuid/src/copy.c b/libuuid/src/copy.c new file mode 100644 index 0000000..ead33aa --- /dev/null +++ b/libuuid/src/copy.c @@ -0,0 +1,45 @@ +/* + * copy.c --- copy UUIDs + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "uuidP.h" + +void uuid_copy(uuid_t dst, const uuid_t src) +{ + unsigned char *cp1; + const unsigned char *cp2; + int i; + + for (i=0, cp1 = dst, cp2 = src; i < 16; i++) + *cp1++ = *cp2++; +} diff --git a/libuuid/src/gen_uuid.c b/libuuid/src/gen_uuid.c new file mode 100644 index 0000000..826cd22 --- /dev/null +++ b/libuuid/src/gen_uuid.c @@ -0,0 +1,704 @@ +/* + * gen_uuid.c --- generate a DCE-compatible uuid + * + * Copyright (C) 1996, 1997, 1998, 1999 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#include +#define UUID MYUUID +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#ifdef HAVE_SYS_FILE_H +#include +#endif +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_UN_H +#include +#endif +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif +#ifdef HAVE_NET_IF_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NET_IF_DL_H +#include +#endif +#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H) +#include +#endif + +#include "all-io.h" +#include "uuidP.h" +#include "uuidd.h" +#include "randutils.h" +#include "strutils.h" +#include "c.h" +#include "md5.h" +#include "sha1.h" + +#ifdef HAVE_TLS +#define THREAD_LOCAL static __thread +#else +#define THREAD_LOCAL static +#endif + +#ifdef _WIN32 +static void gettimeofday (struct timeval *tv, void *dummy) +{ + FILETIME ftime; + uint64_t n; + + GetSystemTimeAsFileTime (&ftime); + n = (((uint64_t) ftime.dwHighDateTime << 32) + + (uint64_t) ftime.dwLowDateTime); + if (n) { + n /= 10; + n -= ((369 * 365 + 89) * (uint64_t) 86400) * 1000000; + } + + tv->tv_sec = n / 1000000; + tv->tv_usec = n % 1000000; +} + +static int getuid (void) +{ + return 1; +} +#endif + +/* + * Get the ethernet hardware address, if we can find it... + * + * XXX for a windows version, probably should use GetAdaptersInfo: + * http://www.codeguru.com/cpp/i-n/network/networkinformation/article.php/c5451 + * commenting out get_node_id just to get gen_uuid to compile under windows + * is not the right way to go! + */ +static int get_node_id(unsigned char *node_id) +{ +#ifdef HAVE_NET_IF_H + int sd; + struct ifreq ifr, *ifrp; + struct ifconf ifc; + char buf[1024]; + int n, i; + unsigned char *a = NULL; +#ifdef HAVE_NET_IF_DL_H + struct sockaddr_dl *sdlp; +#endif + +/* + * BSD 4.4 defines the size of an ifreq to be + * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len + * However, under earlier systems, sa_len isn't present, so the size is + * just sizeof(struct ifreq) + */ +#ifdef HAVE_SA_LEN +#define ifreq_size(i) max(sizeof(struct ifreq),\ + sizeof((i).ifr_name)+(i).ifr_addr.sa_len) +#else +#define ifreq_size(i) sizeof(struct ifreq) +#endif /* HAVE_SA_LEN */ + + sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sd < 0) { + return -1; + } + memset(buf, 0, sizeof(buf)); + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0) { + close(sd); + return -1; + } + n = ifc.ifc_len; + for (i = 0; i < n; i+= ifreq_size(*ifrp) ) { + ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i); + strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ); +#ifdef SIOCGIFHWADDR + if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) + continue; + a = (unsigned char *) &ifr.ifr_hwaddr.sa_data; +#else +#ifdef SIOCGENADDR + if (ioctl(sd, SIOCGENADDR, &ifr) < 0) + continue; + a = (unsigned char *) ifr.ifr_enaddr; +#else +#ifdef HAVE_NET_IF_DL_H + sdlp = (struct sockaddr_dl *) &ifrp->ifr_addr; + if ((sdlp->sdl_family != AF_LINK) || (sdlp->sdl_alen != 6)) + continue; + a = (unsigned char *) &sdlp->sdl_data[sdlp->sdl_nlen]; +#else + /* + * XXX we don't have a way of getting the hardware + * address + */ + close(sd); + return 0; +#endif /* HAVE_NET_IF_DL_H */ +#endif /* SIOCGENADDR */ +#endif /* SIOCGIFHWADDR */ + if (a == NULL || (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5])) + continue; + if (node_id) { + memcpy(node_id, a, 6); + close(sd); + return 1; + } + } + close(sd); +#endif + return 0; +} + +/* Assume that the gettimeofday() has microsecond granularity */ +#define MAX_ADJUSTMENT 10 +/* Reserve a clock_seq value for the 'continuous clock' implementation */ +#define CLOCK_SEQ_CONT 0 + +/* + * Get clock from global sequence clock counter. + * + * Return -1 if the clock counter could not be opened/locked (in this case + * pseudorandom value is returned in @ret_clock_seq), otherwise return 0. + */ +static int get_clock(uint32_t *clock_high, uint32_t *clock_low, + uint16_t *ret_clock_seq, int *num) +{ + THREAD_LOCAL int adjustment = 0; + THREAD_LOCAL struct timeval last = {0, 0}; + THREAD_LOCAL int state_fd = -2; + THREAD_LOCAL FILE *state_f; + THREAD_LOCAL uint16_t clock_seq; + struct timeval tv; + uint64_t clock_reg; + mode_t save_umask; + int ret = 0; + + if (state_fd == -1) + ret = -1; + + if (state_fd == -2) { + save_umask = umask(0); + state_fd = open(LIBUUID_CLOCK_FILE, O_RDWR|O_CREAT|O_CLOEXEC, 0660); + (void) umask(save_umask); + if (state_fd != -1) { + state_f = fdopen(state_fd, "r+" UL_CLOEXECSTR); + if (!state_f) { + close(state_fd); + state_fd = -1; + ret = -1; + } + } + else + ret = -1; + } + if (state_fd >= 0) { + rewind(state_f); + while (flock(state_fd, LOCK_EX) < 0) { + if ((errno == EAGAIN) || (errno == EINTR)) + continue; + fclose(state_f); + close(state_fd); + state_fd = -1; + ret = -1; + break; + } + } + if (state_fd >= 0) { + unsigned int cl; + unsigned long tv1, tv2; + int a; + + if (fscanf(state_f, "clock: %04x tv: %lu %lu adj: %d\n", + &cl, &tv1, &tv2, &a) == 4) { + clock_seq = cl & 0x3FFF; + last.tv_sec = tv1; + last.tv_usec = tv2; + adjustment = a; + } + // reset in case of reserved CLOCK_SEQ_CONT + if (clock_seq == CLOCK_SEQ_CONT) { + last.tv_sec = 0; + last.tv_usec = 0; + } + } + + if ((last.tv_sec == 0) && (last.tv_usec == 0)) { + do { + ul_random_get_bytes(&clock_seq, sizeof(clock_seq)); + clock_seq &= 0x3FFF; + } while (clock_seq == CLOCK_SEQ_CONT); + gettimeofday(&last, NULL); + last.tv_sec--; + } + +try_again: + gettimeofday(&tv, NULL); + if ((tv.tv_sec < last.tv_sec) || + ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec < last.tv_usec))) { + do { + clock_seq = (clock_seq+1) & 0x3FFF; + } while (clock_seq == CLOCK_SEQ_CONT); + adjustment = 0; + last = tv; + } else if ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec == last.tv_usec)) { + if (adjustment >= MAX_ADJUSTMENT) + goto try_again; + adjustment++; + } else { + adjustment = 0; + last = tv; + } + + clock_reg = tv.tv_usec*10 + adjustment; + clock_reg += ((uint64_t) tv.tv_sec)*10000000; + clock_reg += (((uint64_t) 0x01B21DD2) << 32) + 0x13814000; + + if (num && (*num > 1)) { + adjustment += *num - 1; + last.tv_usec += adjustment / 10; + adjustment = adjustment % 10; + last.tv_sec += last.tv_usec / 1000000; + last.tv_usec = last.tv_usec % 1000000; + } + + if (state_fd >= 0) { + rewind(state_f); + fprintf(state_f, + "clock: %04x tv: %016ld %08ld adj: %08d \n", + clock_seq, (long)last.tv_sec, (long)last.tv_usec, adjustment); + fflush(state_f); + rewind(state_f); + flock(state_fd, LOCK_UN); + } + + *clock_high = clock_reg >> 32; + *clock_low = clock_reg; + *ret_clock_seq = clock_seq; + return ret; +} + +/* + * Get current time in 100ns ticks. + */ +static uint64_t get_clock_counter(void) +{ + struct timeval tv; + uint64_t clock_reg; + + gettimeofday(&tv, NULL); + clock_reg = tv.tv_usec*10; + clock_reg += ((uint64_t) tv.tv_sec) * 10000000ULL; + + return clock_reg; +} + +/* + * Get continuous clock value. + * + * Return -1 if there is no further clock counter available, + * otherwise return 0. + * + * This implementation doesn't deliver clock counters based on + * the current time because last_clock_reg is only incremented + * by the number of requested UUIDs. + * max_clock_offset is used to limit the offset of last_clock_reg. + */ +static int get_clock_cont(uint32_t *clock_high, + uint32_t *clock_low, + int num, + uint32_t max_clock_offset) +{ + /* 100ns based time offset according to RFC 4122. 4.1.4. */ + const uint64_t reg_offset = (((uint64_t) 0x01B21DD2) << 32) + 0x13814000; + static uint64_t last_clock_reg = 0; + uint64_t clock_reg; + + if (last_clock_reg == 0) + last_clock_reg = get_clock_counter(); + + clock_reg = get_clock_counter(); + if (max_clock_offset) { + uint64_t clock_offset = max_clock_offset * 10000000ULL; + if (last_clock_reg < (clock_reg - clock_offset)) + last_clock_reg = clock_reg - clock_offset; + } + + clock_reg += MAX_ADJUSTMENT; + + if ((last_clock_reg + num) >= clock_reg) + return -1; + + *clock_high = (last_clock_reg + reg_offset) >> 32; + *clock_low = last_clock_reg + reg_offset; + last_clock_reg += num; + + return 0; +} + +#if defined(HAVE_UUIDD) && defined(HAVE_SYS_UN_H) + +/* + * Try using the uuidd daemon to generate the UUID + * + * Returns 0 on success, non-zero on failure. + */ +static int get_uuid_via_daemon(int op, uuid_t out, int *num) +{ + char op_buf[64]; + int op_len; + int s; + ssize_t ret; + int32_t reply_len = 0, expected = 16; + struct sockaddr_un srv_addr; + + if (sizeof(UUIDD_SOCKET_PATH) > sizeof(srv_addr.sun_path)) + return -1; + + if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + return -1; + + srv_addr.sun_family = AF_UNIX; + xstrncpy(srv_addr.sun_path, UUIDD_SOCKET_PATH, sizeof(srv_addr.sun_path)); + + if (connect(s, (const struct sockaddr *) &srv_addr, + sizeof(struct sockaddr_un)) < 0) + goto fail; + + op_buf[0] = op; + op_len = 1; + if (op == UUIDD_OP_BULK_TIME_UUID) { + memcpy(op_buf+1, num, sizeof(*num)); + op_len += sizeof(*num); + expected += sizeof(*num); + } + + ret = write(s, op_buf, op_len); + if (ret < 1) + goto fail; + + ret = read_all(s, (char *) &reply_len, sizeof(reply_len)); + if (ret < 0) + goto fail; + + if (reply_len != expected) + goto fail; + + ret = read_all(s, op_buf, reply_len); + + if (op == UUIDD_OP_BULK_TIME_UUID) + memcpy(op_buf+16, num, sizeof(int)); + + memcpy(out, op_buf, 16); + + close(s); + return ((ret == expected) ? 0 : -1); + +fail: + close(s); + return -1; +} + +#else /* !defined(HAVE_UUIDD) && defined(HAVE_SYS_UN_H) */ +static int get_uuid_via_daemon(int op __attribute__((__unused__)), + uuid_t out __attribute__((__unused__)), + int *num __attribute__((__unused__))) +{ + return -1; +} +#endif + +static int __uuid_generate_time_internal(uuid_t out, int *num, uint32_t cont_offset) +{ + static unsigned char node_id[6]; + static int has_init = 0; + struct uuid uu; + uint32_t clock_mid; + int ret; + + if (!has_init) { + if (get_node_id(node_id) <= 0) { + ul_random_get_bytes(node_id, 6); + /* + * Set multicast bit, to prevent conflicts + * with IEEE 802 addresses obtained from + * network cards + */ + node_id[0] |= 0x01; + } + has_init = 1; + } + if (cont_offset) { + ret = get_clock_cont(&clock_mid, &uu.time_low, *num, cont_offset); + uu.clock_seq = CLOCK_SEQ_CONT; + if (ret != 0) /* fallback to previous implpementation */ + ret = get_clock(&clock_mid, &uu.time_low, &uu.clock_seq, num); + } else { + ret = get_clock(&clock_mid, &uu.time_low, &uu.clock_seq, num); + } + uu.clock_seq |= 0x8000; + uu.time_mid = (uint16_t) clock_mid; + uu.time_hi_and_version = ((clock_mid >> 16) & 0x0FFF) | 0x1000; + memcpy(uu.node, node_id, 6); + uuid_pack(&uu, out); + return ret; +} + +int __uuid_generate_time(uuid_t out, int *num) +{ + return __uuid_generate_time_internal(out, num, 0); +} + +int __uuid_generate_time_cont(uuid_t out, int *num, uint32_t cont_offset) +{ + return __uuid_generate_time_internal(out, num, cont_offset); +} + +#define CS_MIN (1<<6) +#define CS_MAX (1<<18) +#define CS_FACTOR 2 + +/* + * Generate time-based UUID and store it to @out + * + * Tries to guarantee uniqueness of the generated UUIDs by obtaining them from the uuidd daemon, + * or, if uuidd is not usable, by using the global clock state counter (see get_clock()). + * If neither of these is possible (e.g. because of insufficient permissions), it generates + * the UUID anyway, but returns -1. Otherwise, returns 0. + */ +static int uuid_generate_time_generic(uuid_t out) { +#ifdef HAVE_TLS + /* thread local cache for uuidd based requests */ + THREAD_LOCAL int num = 0; + THREAD_LOCAL int cache_size = CS_MIN; + THREAD_LOCAL int last_used = 0; + THREAD_LOCAL struct uuid uu; + THREAD_LOCAL time_t last_time = 0; + time_t now; + + if (num > 0) { /* expire cache */ + now = time(NULL); + if (now > last_time+1) { + last_used = cache_size - num; + num = 0; + } + } + if (num <= 0) { /* fill cache */ + /* + * num + OP_BULK provides a local cache in each application. + * Start with a small cache size to cover short running applications + * and adjust the cache size over the runntime. + */ + if ((last_used == cache_size) && (cache_size < CS_MAX)) + cache_size *= CS_FACTOR; + else if ((last_used < (cache_size / CS_FACTOR)) && (cache_size > CS_MIN)) + cache_size /= CS_FACTOR; + + num = cache_size; + + if (get_uuid_via_daemon(UUIDD_OP_BULK_TIME_UUID, + out, &num) == 0) { + last_time = time(NULL); + uuid_unpack(out, &uu); + num--; + return 0; + } + /* request to daemon failed, reset cache */ + num = 0; + cache_size = CS_MIN; + } + if (num > 0) { /* serve uuid from cache */ + uu.time_low++; + if (uu.time_low == 0) { + uu.time_mid++; + if (uu.time_mid == 0) + uu.time_hi_and_version++; + } + num--; + uuid_pack(&uu, out); + if (num == 0) + last_used = cache_size; + return 0; + } +#else + if (get_uuid_via_daemon(UUIDD_OP_TIME_UUID, out, 0) == 0) + return 0; +#endif + + return __uuid_generate_time(out, NULL); +} + +/* + * Generate time-based UUID and store it to @out. + * + * Discards return value from uuid_generate_time_generic() + */ +void uuid_generate_time(uuid_t out) +{ + (void)uuid_generate_time_generic(out); +} + + +int uuid_generate_time_safe(uuid_t out) +{ + return uuid_generate_time_generic(out); +} + + +int __uuid_generate_random(uuid_t out, int *num) +{ + uuid_t buf; + struct uuid uu; + int i, n, r = 0; + + if (!num || !*num) + n = 1; + else + n = *num; + + for (i = 0; i < n; i++) { + if (ul_random_get_bytes(buf, sizeof(buf))) + r = -1; + uuid_unpack(buf, &uu); + + uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; + uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) + | 0x4000; + uuid_pack(&uu, out); + out += sizeof(uuid_t); + } + + return r; +} + +void uuid_generate_random(uuid_t out) +{ + int num = 1; + /* No real reason to use the daemon for random uuid's -- yet */ + + __uuid_generate_random(out, &num); +} + +/* + * This is the generic front-end to __uuid_generate_random and + * uuid_generate_time. It uses __uuid_generate_random output + * only if high-quality randomness is available. + */ +void uuid_generate(uuid_t out) +{ + int num = 1; + + if (__uuid_generate_random(out, &num)) + uuid_generate_time(out); +} + +/* + * Generate an MD5 hashed (predictable) UUID based on a well-known UUID + * providing the namespace and an arbitrary binary string. + */ +void uuid_generate_md5(uuid_t out, const uuid_t ns, const char *name, size_t len) +{ + UL_MD5_CTX ctx; + char hash[UL_MD5LENGTH]; + uuid_t buf; + struct uuid uu; + + ul_MD5Init(&ctx); + ul_MD5Update(&ctx, ns, sizeof(uuid_t)); + ul_MD5Update(&ctx, (const unsigned char *)name, len); + ul_MD5Final((unsigned char *)hash, &ctx); + + assert(sizeof(buf) <= sizeof(hash)); + + memcpy(buf, hash, sizeof(buf)); + uuid_unpack(buf, &uu); + + uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; + uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x3000; + uuid_pack(&uu, out); +} + +/* + * Generate a SHA1 hashed (predictable) UUID based on a well-known UUID + * providing the namespace and an arbitrary binary string. + */ +void uuid_generate_sha1(uuid_t out, const uuid_t ns, const char *name, size_t len) +{ + UL_SHA1_CTX ctx; + char hash[UL_SHA1LENGTH]; + uuid_t buf; + struct uuid uu; + + ul_SHA1Init(&ctx); + ul_SHA1Update(&ctx, ns, sizeof(uuid_t)); + ul_SHA1Update(&ctx, (const unsigned char *)name, len); + ul_SHA1Final((unsigned char *)hash, &ctx); + + assert(sizeof(buf) <= sizeof(hash)); + + memcpy(buf, hash, sizeof(buf)); + uuid_unpack(buf, &uu); + + uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; + uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x5000; + uuid_pack(&uu, out); +} diff --git a/libuuid/src/isnull.c b/libuuid/src/isnull.c new file mode 100644 index 0000000..ecb44ea --- /dev/null +++ b/libuuid/src/isnull.c @@ -0,0 +1,44 @@ +/* + * isnull.c --- Check whether or not the UUID is null + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include "uuidP.h" +#include + +/* Returns 1 if the uuid is the NULL uuid */ +int uuid_is_null(const uuid_t uu) +{ + const uuid_t nil = { 0 }; + + return !memcmp(uu, nil, sizeof(nil)); +} diff --git a/libuuid/src/libuuid.sym b/libuuid/src/libuuid.sym new file mode 100644 index 0000000..96372a8 --- /dev/null +++ b/libuuid/src/libuuid.sym @@ -0,0 +1,67 @@ +/* + * The symbol versioning ensures that a new application requiring symbol 'foo' + * can't run with old libbrary.so not providing 'foo' - the global SONAME + * version info can't enforce this since we never change the SONAME. + * + * The original libuuid from e2fsprogs (<=1.41.5) does not to use + * symbol versioning -- all the original symbols are in UUID_1.0 now. + * + * Copyright (C) 2011-2017 Kareil Zak + */ +UUID_1.0 { +global: + uuid_clear; + uuid_compare; + uuid_copy; + uuid_generate; + uuid_generate_random; + uuid_generate_time; + uuid_is_null; + uuid_parse; + uuid_unparse; + uuid_unparse_lower; + uuid_unparse_upper; + uuid_time; + uuid_type; + uuid_variant; +}; + +/* + * version(s) since util-linux 2.20 + */ +UUID_2.20 { +global: + uuid_generate_time_safe; +} UUID_1.0; + +/* + * version(s) since util-linux.2.31 + */ +UUID_2.31 { +global: + uuid_generate_md5; + uuid_generate_sha1; + uuid_get_template; +} UUID_2.20; + +/* + * version(s) since util-linux.2.36 + */ +UUID_2.36 { +global: + uuid_parse_range; +} UUID_2.31; + + +/* + * __uuid_* this is not part of the official API, this is + * uuidd (uuid daemon) specific stuff. Hell. + */ +UUIDD_PRIVATE { +global: + __uuid_generate_time; + __uuid_generate_time_cont; + __uuid_generate_random; +local: + *; +}; diff --git a/libuuid/src/pack.c b/libuuid/src/pack.c new file mode 100644 index 0000000..6e12476 --- /dev/null +++ b/libuuid/src/pack.c @@ -0,0 +1,69 @@ +/* + * Internal routine for packing UUIDs + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include "uuidP.h" + +void uuid_pack(const struct uuid *uu, uuid_t ptr) +{ + uint32_t tmp; + unsigned char *out = ptr; + + tmp = uu->time_low; + out[3] = (unsigned char) tmp; + tmp >>= 8; + out[2] = (unsigned char) tmp; + tmp >>= 8; + out[1] = (unsigned char) tmp; + tmp >>= 8; + out[0] = (unsigned char) tmp; + + tmp = uu->time_mid; + out[5] = (unsigned char) tmp; + tmp >>= 8; + out[4] = (unsigned char) tmp; + + tmp = uu->time_hi_and_version; + out[7] = (unsigned char) tmp; + tmp >>= 8; + out[6] = (unsigned char) tmp; + + tmp = uu->clock_seq; + out[9] = (unsigned char) tmp; + tmp >>= 8; + out[8] = (unsigned char) tmp; + + memcpy(out+10, uu->node, 6); +} + diff --git a/libuuid/src/parse.c b/libuuid/src/parse.c new file mode 100644 index 0000000..c3e2281 --- /dev/null +++ b/libuuid/src/parse.c @@ -0,0 +1,98 @@ +/* + * parse.c --- UUID parsing + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include +#include +#include + +#include "c.h" +#include "uuidP.h" + +int uuid_parse(const char *in, uuid_t uu) +{ + size_t len = strlen(in); + if (len != 36) + return -1; + + return uuid_parse_range(in, in + len, uu); +} + +int uuid_parse_range(const char *in_start, const char *in_end, uuid_t uu) +{ + struct uuid uuid; + int i; + const char *cp; + char buf[3]; + + if ((in_end - in_start) != 36) + return -1; + for (i=0, cp = in_start; i < 36; i++,cp++) { + if ((i == 8) || (i == 13) || (i == 18) || + (i == 23)) { + if (*cp == '-') + continue; + return -1; + } + + if (!isxdigit(*cp)) + return -1; + } + errno = 0; + uuid.time_low = strtoul(in_start, NULL, 16); + + if (!errno) + uuid.time_mid = strtoul(in_start+9, NULL, 16); + if (!errno) + uuid.time_hi_and_version = strtoul(in_start+14, NULL, 16); + if (!errno) + uuid.clock_seq = strtoul(in_start+19, NULL, 16); + if (errno) + return -1; + + cp = in_start+24; + buf[2] = 0; + for (i=0; i < 6; i++) { + buf[0] = *cp++; + buf[1] = *cp++; + + errno = 0; + uuid.node[i] = strtoul(buf, NULL, 16); + if (errno) + return -1; + } + + uuid_pack(&uuid, uu); + return 0; +} diff --git a/libuuid/src/predefined.c b/libuuid/src/predefined.c new file mode 100644 index 0000000..fec1773 --- /dev/null +++ b/libuuid/src/predefined.c @@ -0,0 +1,83 @@ +/* + * predefined.c --- well-known UUIDs from the RFC-4122 namespace + * + * Copyright (C) 2017 Philip Prindeville + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include "uuid.h" + +/* + * These are time-based UUIDs that are well-known in that they've + * been canonized as part of RFC-4122, Appendex C. They are to + * be used as the namespace (ns) argument to the uuid_generate_md5() + * and uuid_generate_sha1() functions. + * + * See Section 4.3 for the particulars of how namespace UUIDs + * are combined with seed values to generate new UUIDs. + */ + +UUID_DEFINE(NameSpace_DNS, + 0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8); + +UUID_DEFINE(NameSpace_URL, + 0x6b, 0xa7, 0xb8, 0x11, 0x9d, 0xad, 0x11, 0xd1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8); + +UUID_DEFINE(NameSpace_OID, + 0x6b, 0xa7, 0xb8, 0x12, 0x9d, 0xad, 0x11, 0xd1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8); + +UUID_DEFINE(NameSpace_X500, + 0x6b, 0xa7, 0xb8, 0x14, 0x9d, 0xad, 0x11, 0xd1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8); + +const uuid_t *uuid_get_template(const char *alias) +{ + if (!alias || !*alias) + return NULL; + + if (!strcmp(alias, "dns")) + return &NameSpace_DNS; + + if (!strcmp(alias, "url")) + return &NameSpace_URL; + + if (!strcmp(alias, "oid")) + return &NameSpace_OID; + + if (!strcmp(alias, "x500") || !strcmp(alias, "x.500")) + return &NameSpace_X500; + + return NULL; +} + diff --git a/libuuid/src/test_uuid.c b/libuuid/src/test_uuid.c new file mode 100644 index 0000000..9907911 --- /dev/null +++ b/libuuid/src/test_uuid.c @@ -0,0 +1,121 @@ +/* + * tst_uuid.c --- test program from the UUID library + * + * Copyright (C) 1996, 1997, 1998 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#include +#define UUID MYUUID +#endif + +#include +#include +#include +#include +#include + +#include "c.h" +#include "uuid.h" + +static int test_uuid(const char * uuid, int isValid) +{ + static const char * validStr[2] = {"invalid", "valid"}; + uuid_t uuidBits; + int parsedOk; + + parsedOk = uuid_parse(uuid, uuidBits) == 0; + + printf("%s is %s", uuid, validStr[isValid]); + if (parsedOk != isValid) { + printf(" but uuid_parse says %s\n", validStr[parsedOk]); + return 1; + } + printf(", OK\n"); + return 0; +} + +static int check_uuids_in_file(const char *file) +{ + int fd, ret = 0; + size_t sz; + char str[UUID_STR_LEN]; + uuid_t uuidBits; + + if ((fd = open(file, O_RDONLY)) < 0) { + warn("%s", file); + return 1; + } + while ((sz = read(fd, str, sizeof(str))) != 0) { + str[sizeof(str) - 1] = '\0'; + if (uuid_parse(str, uuidBits)) { + warnx("%s: %s", file, str); + ret++; + } + } + + close(fd); + return ret; +} + +int +main(int argc, char **argv) +{ + int failed = 0; + + if (argc < 2) { + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981b", 1); + failed += test_uuid("84949CC5-4701-4A84-895B-354C584A981B", 1); + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981bc", 0); + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981", 0); + failed += test_uuid("84949cc5x4701-4a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc504701-4a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc5-470104a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc5-4701-4a840895b-354c584a981b", 0); + failed += test_uuid("84949cc5-4701-4a84-895b0354c584a981b", 0); + failed += test_uuid("g4949cc5-4701-4a84-895b-354c584a981b", 0); + failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981g", 0); + failed += test_uuid("00000000-0000-0000-0000-000000000000", 1); + failed += test_uuid("01234567-89ab-cdef-0134-567890abcedf", 1); + failed += test_uuid("ffffffff-ffff-ffff-ffff-ffffffffffff", 1); + } else { + int i; + + for (i = 1; i < argc; i++) + failed += check_uuids_in_file(argv[i]); + } + if (failed) { + printf("%d failures.\n", failed); + exit(1); + } + return 0; +} diff --git a/libuuid/src/unpack.c b/libuuid/src/unpack.c new file mode 100644 index 0000000..beaaff3 --- /dev/null +++ b/libuuid/src/unpack.c @@ -0,0 +1,63 @@ +/* + * Internal routine for unpacking UUID + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include "uuidP.h" + +void uuid_unpack(const uuid_t in, struct uuid *uu) +{ + const uint8_t *ptr = in; + uint32_t tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_low = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_mid = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_hi_and_version = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->clock_seq = tmp; + + memcpy(uu->node, ptr, 6); +} + diff --git a/libuuid/src/unparse.c b/libuuid/src/unparse.c new file mode 100644 index 0000000..ffeed2e --- /dev/null +++ b/libuuid/src/unparse.c @@ -0,0 +1,76 @@ +/* + * unparse.c -- convert a UUID to string + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#include +#include "c.h" + +#include "uuidP.h" + +static char const hexdigits_lower[16] = "0123456789abcdef"; +static char const hexdigits_upper[16] = "0123456789ABCDEF"; + +static void uuid_fmt(const uuid_t uuid, char *buf, char const *restrict fmt) +{ + char *p = buf; + int i; + + for (i = 0; i < 16; i++) { + if (i == 4 || i == 6 || i == 8 || i == 10) { + *p++ = '-'; + } + size_t tmp = uuid[i]; + *p++ = fmt[tmp >> 4]; + *p++ = fmt[tmp & 15]; + } + *p = '\0'; +} + +void uuid_unparse_lower(const uuid_t uu, char *out) +{ + uuid_fmt(uu, out, hexdigits_lower); +} + +void uuid_unparse_upper(const uuid_t uu, char *out) +{ + uuid_fmt(uu, out, hexdigits_upper); +} + +void uuid_unparse(const uuid_t uu, char *out) +{ +#ifdef UUID_UNPARSE_DEFAULT_UPPER + uuid_fmt(uu, out, hexdigits_upper); +#else + uuid_fmt(uu, out, hexdigits_lower); +#endif +} diff --git a/libuuid/src/uuid.h b/libuuid/src/uuid.h new file mode 100644 index 0000000..e791abf --- /dev/null +++ b/libuuid/src/uuid.h @@ -0,0 +1,123 @@ +/* + * Public include file for the UUID library + * + * Copyright (C) 1996, 1997, 1998 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifndef _UL_LIBUUID_UUID_H +#define _UL_LIBUUID_UUID_H + +#include +#ifndef _WIN32 +#include +#endif +#include + +typedef unsigned char uuid_t[16]; + +/* UUID Variant definitions */ +#define UUID_VARIANT_NCS 0 +#define UUID_VARIANT_DCE 1 +#define UUID_VARIANT_MICROSOFT 2 +#define UUID_VARIANT_OTHER 3 + +#define UUID_VARIANT_SHIFT 5 +#define UUID_VARIANT_MASK 0x7 + +/* UUID Type definitions */ +#define UUID_TYPE_DCE_NIL 0 +#define UUID_TYPE_DCE_TIME 1 +#define UUID_TYPE_DCE_SECURITY 2 +#define UUID_TYPE_DCE_MD5 3 +#define UUID_TYPE_DCE_RANDOM 4 +#define UUID_TYPE_DCE_SHA1 5 + +#define UUID_TYPE_SHIFT 4 +#define UUID_TYPE_MASK 0xf + +#define UUID_STR_LEN 37 + +/* Allow UUID constants to be defined */ +#ifdef __GNUC__ +#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \ + static const uuid_t name __attribute__ ((unused)) = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15} +#else +#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \ + static const uuid_t name = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* clear.c */ +extern void uuid_clear(uuid_t uu); + +/* compare.c */ +extern int uuid_compare(const uuid_t uu1, const uuid_t uu2); + +/* copy.c */ +extern void uuid_copy(uuid_t dst, const uuid_t src); + +/* gen_uuid.c */ +extern void uuid_generate(uuid_t out); +extern void uuid_generate_random(uuid_t out); +extern void uuid_generate_time(uuid_t out); +extern int uuid_generate_time_safe(uuid_t out); + +extern void uuid_generate_md5(uuid_t out, const uuid_t ns, const char *name, size_t len); +extern void uuid_generate_sha1(uuid_t out, const uuid_t ns, const char *name, size_t len); + +/* isnull.c */ +extern int uuid_is_null(const uuid_t uu); + +/* parse.c */ +extern int uuid_parse(const char *in, uuid_t uu); +extern int uuid_parse_range(const char *in_start, const char *in_end, uuid_t uu); + +/* unparse.c */ +extern void uuid_unparse(const uuid_t uu, char *out); +extern void uuid_unparse_lower(const uuid_t uu, char *out); +extern void uuid_unparse_upper(const uuid_t uu, char *out); + +/* uuid_time.c */ +extern time_t uuid_time(const uuid_t uu, struct timeval *ret_tv); +extern int uuid_type(const uuid_t uu); +extern int uuid_variant(const uuid_t uu); + +/* predefined.c */ +extern const uuid_t *uuid_get_template(const char *alias); + +#ifdef __cplusplus +} +#endif + +#endif /* _UL_LIBUUID_UUID_H */ diff --git a/libuuid/src/uuidP.h b/libuuid/src/uuidP.h new file mode 100644 index 0000000..200702c --- /dev/null +++ b/libuuid/src/uuidP.h @@ -0,0 +1,94 @@ +/* + * uuid.h -- private header file for uuids + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ +#ifndef _UUID_UUID_PRIVATE_H +#define _UUID_UUID_PRIVATE_H + +#include +#include + +#include "uuid.h" + +#define LIBUUID_CLOCK_FILE "/var/lib/libuuid/clock.txt" + +/* + * Offset between 15-Oct-1582 and 1-Jan-70 + */ +#define TIME_OFFSET_HIGH 0x01B21DD2 +#define TIME_OFFSET_LOW 0x13814000 + +/* + * Note that RFC4122 defines UUID in more details: + * + * Field Data Type Octet Note + * ------------------------------------------------- + * time_low unsigned 32 0-3 The low field of the + * bit integer timestamp + * + * time_mid unsigned 16 4-5 The middle field of the + * bit integer timestamp + * + * time_hi_and_version unsigned 16 6-7 The high field of the + * bit integer timestamp multiplexed + * with the version number + * + * clock_seq_hi_and_rese unsigned 8 8 The high field of the + * rved bit integer clock sequence + * multiplexed with the + * variant + * + * clock_seq_low unsigned 8 9 The low field of the + * bit integer clock sequence + * + * node unsigned 48 10-15 The spatially unique + * bit integer node identifier + * + * We have clock_seq_hi_and_reserved (8bit) and clock_seq_low (8bit) + * merged into clock_seq (16bit). + */ +struct uuid { + uint32_t time_low; + uint16_t time_mid; + uint16_t time_hi_and_version; + uint16_t clock_seq; + uint8_t node[6]; +}; + + +/* + * prototypes + */ +void uuid_pack(const struct uuid *uu, uuid_t ptr); +void uuid_unpack(const uuid_t in, struct uuid *uu); + +#endif /* _UUID_UUID_PRIVATE_H */ diff --git a/libuuid/src/uuid_time.c b/libuuid/src/uuid_time.c new file mode 100644 index 0000000..6f07d51 --- /dev/null +++ b/libuuid/src/uuid_time.c @@ -0,0 +1,171 @@ +/* + * uuid_time.c --- Interpret the time field from a uuid. This program + * violates the UUID abstraction barrier by reaching into the guts + * of a UUID and interpreting it. + * + * Copyright (C) 1998, 1999 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#include +#define UUID MYUUID +#endif + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include + +#include "uuidP.h" + +time_t uuid_time(const uuid_t uu, struct timeval *ret_tv) +{ + struct timeval tv; + struct uuid uuid; + uint32_t high; + uint64_t clock_reg; + + uuid_unpack(uu, &uuid); + + high = uuid.time_mid | ((uuid.time_hi_and_version & 0xFFF) << 16); + clock_reg = uuid.time_low | ((uint64_t) high << 32); + + clock_reg -= (((uint64_t) 0x01B21DD2) << 32) + 0x13814000; + tv.tv_sec = clock_reg / 10000000; + tv.tv_usec = (clock_reg % 10000000) / 10; + + if (ret_tv) + *ret_tv = tv; + + return tv.tv_sec; +} + +int uuid_type(const uuid_t uu) +{ + struct uuid uuid; + + uuid_unpack(uu, &uuid); + return ((uuid.time_hi_and_version >> 12) & 0xF); +} + +int uuid_variant(const uuid_t uu) +{ + struct uuid uuid; + int var; + + uuid_unpack(uu, &uuid); + var = uuid.clock_seq; + + if ((var & 0x8000) == 0) + return UUID_VARIANT_NCS; + if ((var & 0x4000) == 0) + return UUID_VARIANT_DCE; + if ((var & 0x2000) == 0) + return UUID_VARIANT_MICROSOFT; + return UUID_VARIANT_OTHER; +} + +#ifdef DEBUG +static const char *variant_string(int variant) +{ + switch (variant) { + case UUID_VARIANT_NCS: + return "NCS"; + case UUID_VARIANT_DCE: + return "DCE"; + case UUID_VARIANT_MICROSOFT: + return "Microsoft"; + default: + return "Other"; + } +} + + +int +main(int argc, char **argv) +{ + uuid_t buf; + time_t time_reg; + struct timeval tv; + int type, variant; + + if (argc != 2) { + fprintf(stderr, "Usage: %s uuid\n", argv[0]); + exit(1); + } + if (uuid_parse(argv[1], buf)) { + fprintf(stderr, "Invalid UUID: %s\n", argv[1]); + exit(1); + } + variant = uuid_variant(buf); + type = uuid_type(buf); + time_reg = uuid_time(buf, &tv); + + printf("UUID variant is %d (%s)\n", variant, variant_string(variant)); + if (variant != UUID_VARIANT_DCE) { + printf("Warning: This program only knows how to interpret " + "DCE UUIDs.\n\tThe rest of the output is likely " + "to be incorrect!!\n"); + } + printf("UUID type is %d", type); + switch (type) { + case 1: + printf(" (time based)\n"); + break; + case 2: + printf(" (DCE)\n"); + break; + case 3: + printf(" (name-based)\n"); + break; + case 4: + printf(" (random)\n"); + break; + default: + printf("\n"); + } + if (type != 1) { + printf("Warning: not a time-based UUID, so UUID time " + "decoding will likely not work!\n"); + } + printf("UUID time is: (%"PRId64", %"PRId64"): %s\n", + (int64_t)tv.tv_sec, (int64_t)tv.tv_usec, ctime(&time_reg)); + + return 0; +} +#endif diff --git a/libuuid/src/uuidd.h b/libuuid/src/uuidd.h new file mode 100644 index 0000000..f76acc8 --- /dev/null +++ b/libuuid/src/uuidd.h @@ -0,0 +1,55 @@ +/* + * Definitions used by the uuidd daemon + * + * Copyright (C) 2007 Theodore Ts'o. + * + * %Begin-Header% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * %End-Header% + */ + +#ifndef _UUID_UUIDD_H +#define _UUID_UUIDD_H + +#define UUIDD_DIR _PATH_RUNSTATEDIR "/uuidd" +#define UUIDD_SOCKET_PATH UUIDD_DIR "/request" +#define UUIDD_PIDFILE_PATH UUIDD_DIR "/uuidd.pid" +#define UUIDD_PATH "/usr/sbin/uuidd" + +#define UUIDD_OP_GETPID 0 +#define UUIDD_OP_GET_MAXOP 1 +#define UUIDD_OP_TIME_UUID 2 +#define UUIDD_OP_RANDOM_UUID 3 +#define UUIDD_OP_BULK_TIME_UUID 4 +#define UUIDD_OP_BULK_RANDOM_UUID 5 +#define UUIDD_MAX_OP UUIDD_OP_BULK_RANDOM_UUID + +extern int __uuid_generate_time(uuid_t out, int *num); +extern int __uuid_generate_time_cont(uuid_t out, int *num, uint32_t cont); +extern int __uuid_generate_random(uuid_t out, int *num); + +#endif /* _UUID_UUID_H */ diff --git a/libuuid/uuid.pc.in b/libuuid/uuid.pc.in new file mode 100644 index 0000000..875de19 --- /dev/null +++ b/libuuid/uuid.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@usrlib_execdir@ +includedir=@includedir@ + +Name: uuid +Description: Universally unique id library +Version: @LIBUUID_VERSION@ +Requires: +Cflags: -I${includedir}/uuid +Libs: -L${libdir} -luuid -- cgit v1.2.3