You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by bt...@apache.org on 2020/07/22 04:48:29 UTC

[incubator-nuttx] branch master updated: libc: Add uuid implemenation

This is an automated email from the ASF dual-hosted git repository.

btashton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 6c03a4e  libc: Add uuid implemenation
6c03a4e is described below

commit 6c03a4e4d5f6cab954fc65c511b3e4322e5ffaad
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Tue Jul 21 14:54:28 2020 +0800

    libc: Add uuid implemenation
    
    specified by OpenGroup here:
    https://pubs.opengroup.org/onlinepubs/009629399/toc.htm
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
    Change-Id: I3bc585e7f4d41f6c2ea70e170276ab0d0399b088
---
 include/uuid.h                        | 108 ++++++++++++++++++++++++++++++++
 libs/libc/Makefile                    |   1 +
 libs/libc/uuid/Make.defs              |  28 +++++++++
 libs/libc/uuid/lib_uuid_compare.c     |  92 +++++++++++++++++++++++++++
 libs/libc/uuid/lib_uuid_create.c      |  70 +++++++++++++++++++++
 libs/libc/uuid/lib_uuid_create_nil.c  |  51 +++++++++++++++
 libs/libc/uuid/lib_uuid_equal.c       |  70 +++++++++++++++++++++
 libs/libc/uuid/lib_uuid_from_string.c | 113 ++++++++++++++++++++++++++++++++++
 libs/libc/uuid/lib_uuid_hash.c        |  54 ++++++++++++++++
 libs/libc/uuid/lib_uuid_is_nil.c      |  58 +++++++++++++++++
 libs/libc/uuid/lib_uuid_stream.c      |  79 ++++++++++++++++++++++++
 libs/libc/uuid/lib_uuid_to_string.c   |  75 ++++++++++++++++++++++
 12 files changed, 799 insertions(+)

diff --git a/include/uuid.h b/include/uuid.h
new file mode 100644
index 0000000..8907a7c
--- /dev/null
+++ b/include/uuid.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * include/uuid.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __INCLUDE_UUID_H
+#define __INCLUDE_UUID_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/types.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Status codes returned by the functions. */
+
+#define uuid_s_ok                       0
+#define uuid_s_bad_version              1
+#define uuid_s_invalid_string_uuid      2
+#define uuid_s_no_memory                3
+
+/* Length of a node address (an IEEE 802 address). */
+
+#define UUID_NODE_LEN                   6
+
+/* Length of a UUID. */
+
+#define UUID_STR_LEN                    36
+
+/****************************************************************************
+ * Public Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * A DCE 1.1 compatible source representation of UUIDs.
+ * 0                   1                   2                   3
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                          time_low                             |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |       time_mid                |         time_hi_and_version   |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                         node (2-5)                            |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ ****************************************************************************/
+
+struct uuid
+{
+  uint32_t time_low;
+  uint16_t time_mid;
+  uint16_t time_hi_and_version;
+  uint8_t  clock_seq_hi_and_reserved;
+  uint8_t  clock_seq_low;
+  uint8_t  node[UUID_NODE_LEN];
+};
+
+typedef struct uuid uuid_t;
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+int32_t  uuid_compare(const uuid_t *, const uuid_t *, uint32_t *);
+void     uuid_create(uuid_t *, uint32_t *);
+void     uuid_create_nil(uuid_t *, uint32_t *);
+int32_t  uuid_equal(const uuid_t *, const uuid_t *, uint32_t *);
+void     uuid_from_string(const char *, uuid_t *, uint32_t *);
+uint16_t uuid_hash(const uuid_t *, uint32_t *);
+int32_t  uuid_is_nil(const uuid_t *, uint32_t *);
+void     uuid_to_string(const uuid_t *, char **, uint32_t *);
+
+void     uuid_enc_le(void *, const uuid_t *);
+void     uuid_dec_le(const void *, uuid_t *);
+void     uuid_enc_be(void *, const uuid_t *);
+void     uuid_dec_be(const void *, uuid_t *);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __INCLUDE_UUID_H */
diff --git a/libs/libc/Makefile b/libs/libc/Makefile
index 89d4856..2306995 100644
--- a/libs/libc/Makefile
+++ b/libs/libc/Makefile
@@ -59,6 +59,7 @@ include tls/Make.defs
 include uio/Make.defs
 include unistd/Make.defs
 include userfs/Make.defs
+include uuid/Make.defs
 include wchar/Make.defs
 include wctype/Make.defs
 include wqueue/Make.defs
diff --git a/libs/libc/uuid/Make.defs b/libs/libc/uuid/Make.defs
new file mode 100644
index 0000000..f5ef987
--- /dev/null
+++ b/libs/libc/uuid/Make.defs
@@ -0,0 +1,28 @@
+############################################################################
+# libs/libc/uuid/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+CSRCS += lib_uuid_compare.c lib_uuid_create.c lib_uuid_create_nil.c
+CSRCS += lib_uuid_equal.c lib_uuid_from_string.c lib_uuid_hash.c
+CSRCS += lib_uuid_is_nil.c lib_uuid_stream.c lib_uuid_to_string.c
+
+# Add the uuid directory to the build
+
+DEPPATH += --dep-path uuid
+VPATH += :uuid
diff --git a/libs/libc/uuid/lib_uuid_compare.c b/libs/libc/uuid/lib_uuid_compare.c
new file mode 100644
index 0000000..642f3ac
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_compare.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_compare.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <string.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Pre-processor definitions
+ ****************************************************************************/
+
+/* A macro used to improve the readability of uuid_compare(). */
+
+#define DIFF_RETURN(a, b, field)                   \
+  do                                               \
+    {                                              \
+      if ((a)->field != (b)->field)                \
+        {                                          \
+          return (a)->field < (b)->field ? -1 : 1; \
+        }                                          \
+    }                                              \
+  while (0)
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * uuid_compare
+ *
+ * Description:
+ *   Compare two UUIDs.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_compare.htm
+ *
+ ****************************************************************************/
+
+int32_t uuid_compare(const uuid_t *a, const uuid_t *b, uint32_t *status)
+{
+  if (status != NULL)
+    {
+      *status = uuid_s_ok;
+    }
+
+  /* Deal with NULL or equal pointers. */
+
+  if (a == b)
+    {
+      return 0;
+    }
+
+  if (a == NULL)
+    {
+      return uuid_is_nil(b, NULL) ? 0 : -1;
+    }
+
+  if (b == NULL)
+    {
+      return uuid_is_nil(a, NULL) ? 0 : 1;
+    }
+
+  /* We have to compare the hard way. */
+
+  DIFF_RETURN(a, b, time_low);
+  DIFF_RETURN(a, b, time_mid);
+  DIFF_RETURN(a, b, time_hi_and_version);
+  DIFF_RETURN(a, b, clock_seq_hi_and_reserved);
+  DIFF_RETURN(a, b, clock_seq_low);
+
+  return memcmp(a->node, b->node, sizeof(a->node));
+}
diff --git a/libs/libc/uuid/lib_uuid_create.c b/libs/libc/uuid/lib_uuid_create.c
new file mode 100644
index 0000000..29b415f
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_create.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_create.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/random.h>
+#include <stdlib.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * uuid_create_nil
+ *
+ * Description:
+ *   Create an UUID.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_create.htm
+ *
+ ****************************************************************************/
+
+void uuid_create(uuid_t *u, uint32_t *status)
+{
+#ifdef CONFIG_CRYPTO_RANDOM_POOL
+  getrandom(u, sizeof(uuid_t));
+#else
+  unsigned long *beg = (unsigned long *)u;
+  unsigned long *end = (unsigned long *)(u + 1);
+
+  while (beg < end)
+    {
+      *beg++ = rand();
+    }
+#endif
+
+  u->clock_seq_hi_and_reserved &= ~(1 << 6);
+  u->clock_seq_hi_and_reserved |= (1 << 7);
+
+  u->time_hi_and_version &= ~(1 << 12);
+  u->time_hi_and_version &= ~(1 << 13);
+  u->time_hi_and_version |= (1 << 14);
+  u->time_hi_and_version &= ~(1 << 15);
+
+  if (status)
+    {
+      *status = uuid_s_ok;
+    }
+}
diff --git a/libs/libc/uuid/lib_uuid_create_nil.c b/libs/libc/uuid/lib_uuid_create_nil.c
new file mode 100644
index 0000000..e864235
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_create_nil.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_create_nil.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <string.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * uuid_create_nil
+ *
+ * Description:
+ *   Create a nil UUID.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_create_nil.htm
+ *
+ ****************************************************************************/
+
+void uuid_create_nil(uuid_t *u, uint32_t *status)
+{
+  memset(u, 0, sizeof(*u));
+
+  if (status)
+    {
+      *status = uuid_s_ok;
+    }
+}
diff --git a/libs/libc/uuid/lib_uuid_equal.c b/libs/libc/uuid/lib_uuid_equal.c
new file mode 100644
index 0000000..9305a93
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_equal.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_equal.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <string.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * uuid_equal
+ *
+ * Description:
+ *   Compare for equality.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_equal.htm
+ *
+ ****************************************************************************/
+
+int32_t uuid_equal(const uuid_t *a, const uuid_t *b, uint32_t *status)
+{
+  if (status != NULL)
+    {
+      *status = uuid_s_ok;
+    }
+
+  /* Deal with equal or NULL pointers. */
+
+  if (a == b)
+    {
+      return 1;
+    }
+
+  if (a == NULL)
+    {
+      return uuid_is_nil(b, NULL);
+    }
+
+  if (b == NULL)
+    {
+      return uuid_is_nil(a, NULL);
+    }
+
+  /* Do a byte for byte comparison. */
+
+  return !memcmp(a, b, sizeof(uuid_t));
+}
diff --git a/libs/libc/uuid/lib_uuid_from_string.c b/libs/libc/uuid/lib_uuid_from_string.c
new file mode 100644
index 0000000..4b6e962
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_from_string.c
@@ -0,0 +1,113 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_from_string.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * uuid_from_string
+ *
+ * Description:
+ *   convert a string representation of an UUID into a binary representation.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_from_string.htm
+ *
+ ****************************************************************************/
+
+void uuid_from_string(const char *s, uuid_t *u, uint32_t *status)
+{
+  int n;
+
+  /* Short-circuit 2 special cases: NULL pointer and empty string. */
+
+  if (s == NULL || *s == '\0')
+    {
+      uuid_create_nil(u, status);
+      return;
+    }
+
+  /* Assume the worst. */
+
+  if (status != NULL)
+    {
+      *status = uuid_s_invalid_string_uuid;
+    }
+
+  /* The UUID string representation has a fixed length. */
+
+  if (strnlen(s, UUID_STR_LEN + 1) != UUID_STR_LEN)
+    {
+      return;
+    }
+
+  /* We only work with "new" UUIDs. New UUIDs have the form:
+   *  01234567-89ab-cdef-0123-456789abcdef
+   * The so called "old" UUIDs, which we don't support, have the form:
+   *  0123456789ab.cd.ef.01.23.45.67.89.ab
+   */
+
+  if (s[8] != '-')
+    {
+      return;
+    }
+
+  n = sscanf(s,
+        "%8x-%4hx-%4hx-%2hhx%2hhx-%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx",
+        &u->time_low, &u->time_mid, &u->time_hi_and_version,
+        &u->clock_seq_hi_and_reserved, &u->clock_seq_low, &u->node[0],
+        &u->node[1], &u->node[2], &u->node[3], &u->node[4], &u->node[5]);
+
+  /* Make sure we have all conversions. */
+
+  if (n != 11)
+    {
+      return;
+    }
+
+  /* We have a successful scan. Check semantics... */
+
+  n = u->clock_seq_hi_and_reserved;
+  if ((n & 0x80) != 0x00 && /* variant 0? */
+      (n & 0xc0) != 0x80 && /* variant 1? */
+      (n & 0xe0) != 0xc0)   /* variant 2? */
+    {
+      if (status != NULL)
+        {
+          *status = uuid_s_bad_version;
+        }
+    }
+  else
+    {
+      if (status != NULL)
+        {
+          *status = uuid_s_ok;
+        }
+    }
+}
diff --git a/libs/libc/uuid/lib_uuid_hash.c b/libs/libc/uuid/lib_uuid_hash.c
new file mode 100644
index 0000000..688430d
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_hash.c
@@ -0,0 +1,54 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_hash.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * uuid_hash
+ *
+ * Description:
+ *   Generate a hash value.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_hash.htm
+ *
+ ****************************************************************************/
+
+uint16_t uuid_hash(const uuid_t *u, uint32_t *status)
+{
+  if (status)
+    {
+      *status = uuid_s_ok;
+    }
+
+  /* Use the most frequently changing bits in the UUID as the hash
+   * value. This should yield a good enough distribution...
+   */
+
+  return u ? u->time_low & 0xffff : 0;
+}
diff --git a/libs/libc/uuid/lib_uuid_is_nil.c b/libs/libc/uuid/lib_uuid_is_nil.c
new file mode 100644
index 0000000..6e5b721
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_is_nil.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_is_nil.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <string.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name uuid_is_nil()
+ *
+ * Description:
+ *   Return whether the UUID is a nil UUID.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_is_nil.htm
+ *
+ ****************************************************************************/
+
+int32_t uuid_is_nil(const uuid_t *u, uint32_t *status)
+{
+  static const uuid_t nil;
+
+  if (status)
+    {
+      *status = uuid_s_ok;
+    }
+
+  if (!u)
+    {
+      return 1;
+    }
+
+  return memcmp(u, &nil, sizeof(uuid_t)) == 0 ? 1 : 0;
+}
diff --git a/libs/libc/uuid/lib_uuid_stream.c b/libs/libc/uuid/lib_uuid_stream.c
new file mode 100644
index 0000000..aa3e125
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_stream.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_stream.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <endian.h>
+#include <string.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void uuid_enc_le(void *buf, const uuid_t *uuid)
+{
+  uuid_t *temp = buf;
+
+  memcpy(temp, uuid, sizeof(*uuid));
+#if BYTE_ORDER == BIG_ENDIAN
+  temp->time_low = htole32(temp->time_low);
+  temp->time_mid = htole16(temp->time_mid);
+  temp->time_hi_and_version = htole16(temp->time_hi_and_version);
+#endif
+}
+
+void uuid_dec_le(const void *buf, uuid_t *uuid)
+{
+  const uuid_t *temp = buf;
+
+  memcpy(uuid, temp, sizeof(*uuid));
+#if BYTE_ORDER == BIG_ENDIAN
+  uuid->time_low = le32toh(uuid->time_low);
+  uuid->time_mid = le16toh(uuid->time_mid);
+  uuid->time_hi_and_version = le16toh(uuid->time_hi_and_version);
+#endif
+}
+
+void uuid_enc_be(void *buf, const uuid_t *uuid)
+{
+  uuid_t *temp = buf;
+
+  memcpy(temp, uuid, sizeof(*uuid));
+#if BYTE_ORDER == LITTLE_ENDIAN
+  temp->time_low = htobe32(temp->time_low);
+  temp->time_mid = htobe16(temp->time_mid);
+  temp->time_hi_and_version = htobe16(temp->time_hi_and_version);
+#endif
+}
+
+void uuid_dec_be(const void *buf, uuid_t *uuid)
+{
+  const uuid_t *temp = buf;
+
+  memcpy(uuid, temp, sizeof(*uuid));
+#if BYTE_ORDER == LITTLE_ENDIAN
+  uuid->time_low = be32toh(uuid->time_low);
+  uuid->time_mid = be16toh(uuid->time_mid);
+  uuid->time_hi_and_version = be16toh(uuid->time_hi_and_version);
+#endif
+}
diff --git a/libs/libc/uuid/lib_uuid_to_string.c b/libs/libc/uuid/lib_uuid_to_string.c
new file mode 100644
index 0000000..dc8c561
--- /dev/null
+++ b/libs/libc/uuid/lib_uuid_to_string.c
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * libs/libc/uuid/lib_uuid_to_string.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <uuid.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * uuid_to_string
+ *
+ * Description:
+ *   Convert a binary UUID into a string representation.
+ *
+ * See also:
+ *   http://www.opengroup.org/onlinepubs/009629399/uuid_to_string.htm
+ *
+ ****************************************************************************/
+
+void uuid_to_string(const uuid_t *u, char **s, uint32_t *status)
+{
+  static const uuid_t nil;
+  int c;
+
+  if (status != NULL)
+    {
+      *status = uuid_s_ok;
+    }
+
+  /* Why allow a NULL-pointer here? */
+
+  if (s == NULL)
+    {
+      return;
+    }
+
+  if (u == NULL)
+    {
+      u = &nil;
+    }
+
+  c = asprintf(s,
+        "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+        u->time_low, u->time_mid, u->time_hi_and_version,
+        u->clock_seq_hi_and_reserved, u->clock_seq_low, u->node[0],
+        u->node[1], u->node[2], u->node[3], u->node[4], u->node[5]);
+  if (c == -1 && status != NULL)
+    {
+      *status = uuid_s_no_memory;
+    }
+}