[lttng-dev] [babeltrace RFC PATCH 06/28] Add MinGW implementation of UUID

Jérémie Galarneau jeremie.galarneau at efficios.com
Mon May 13 16:21:15 EDT 2013


On Thu, May 2, 2013 at 7:47 AM, Ikaheimonen, JP
<jp_ikaheimonen at mentor.com> wrote:
> Implementation of UUID functions for MinGW32, using Windows API.
> ---
>  compat/Makefile.am               |  3 ++
>  compat/compat_uuid.c             | 75 ++++++++++++++++++++++++++++++++++++++++
>  configure.ac                     |  5 ++-
>  include/babeltrace/compat/uuid.h | 32 ++++++++++++++++-
>  4 files changed, 113 insertions(+), 2 deletions(-)
>  create mode 100644 compat/compat_uuid.c
>
> diff --git a/compat/Makefile.am b/compat/Makefile.am
> index d756aa7..e624a79 100644
> --- a/compat/Makefile.am
> +++ b/compat/Makefile.am
> @@ -8,3 +8,6 @@ libcompat_la_SOURCES = \
>  libcompat_la_LDFLAGS = \
>         -Wl,--no-as-needed
>
> +if BABELTRACE_BUILD_WITH_MINGW
> +libcompat_la_SOURCES += compat_uuid.c
> +endif
> \ No newline at end of file
> diff --git a/compat/compat_uuid.c b/compat/compat_uuid.c
> new file mode 100644
> index 0000000..0e67f73
> --- /dev/null
> +++ b/compat/compat_uuid.c
> @@ -0,0 +1,75 @@
> +/* This file is only built under MINGW32 */
> +
> +#include <windows.h>
> +#include <stdlib.h>
> +#include <babeltrace/compat/uuid.h>
> +
> +static void fix_uuid_endian(struct UUID * uuid)
> +{
> +       unsigned char * ptr;
> +       unsigned char tmp;
> +       #define SWAP(p, i, j) tmp=*(p+i);*(p+i)=*(p+j);*(p+j)=tmp;
> +       ptr = (unsigned char *)uuid;
> +       SWAP(ptr, 0, 3)
> +       SWAP(ptr, 1, 2)
> +       SWAP(ptr, 4, 5)
> +       SWAP(ptr, 6, 7)
> +
> +}
> +
> +int compat_uuid_generate(unsigned char *uuid_out)
> +{
> +       RPC_STATUS status;
> +       status = UuidCreate((struct UUID *)uuid_out);
> +       if (status == RPC_S_OK)
> +               return 0;
> +       else
> +               return -1;
> +}
> +
> +int compat_uuid_unparse(const unsigned char *uuid_in, char *str_out)
> +{
> +       RPC_STATUS status;
> +       unsigned char *alloc_str;
> +       int ret;
> +       fix_uuid_endian(uuid_in);
> +       status = UuidToString((struct UUID *)uuid_in, &alloc_str);
> +       fix_uuid_endian(uuid_in);
> +       if (status == RPC_S_OK) {
> +               strcpy(str_out, alloc_str);
> +               ret = 0;
> +       } else {
> +               ret = -1;
> +       }
> +       RpcStringFree(alloc_str);
> +       return ret;
> +}
> +
> +int compat_uuid_parse(const char *str_in, unsigned char *uuid_out)
> +{
> +       RPC_STATUS status;
> +
> +       status = UuidFromString(str_in, (struct UUID *)uuid_out);
> +       fix_uuid_endian(uuid_out);
> +
> +       if (status == RPC_S_OK)
> +               return 0;
> +       else
> +               return -1;
> +}
> +
> +int compat_uuid_compare(const unsigned char *uuid_a,
> +               const unsigned char *uuid_b)
> +{
> +       RPC_STATUS status;
> +       int ret;
> +
> +       if (UuidCompare((struct UUID *)uuid_a, (struct UUID *)uuid_b, &status) == 0)
> +               ret = 0;
> +       else
> +       {
> +               ret = -1;
> +       }
> +       return ret;
> +
> +}
> diff --git a/configure.ac b/configure.ac
> index 65e867c..5f9e38d 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -60,7 +60,10 @@ AC_CHECK_LIB([uuid], [uuid_generate],
>                 have_libc_uuid=yes
>         ],
>         [
> -               AC_MSG_ERROR([Cannot find libuuid uuid_generate nor libc uuid_create. Use [LDFLAGS]=-Ldir to specify their location.])
> +               # for MinGW32 we have our own internal implemenation of uuid using Windows functions.
> +               if test "x$MINGW32" = xno; then
> +                       AC_MSG_ERROR([Cannot find libuuid uuid_generate nor libc uuid_create. Use [LDFLAGS]=-Ldir to specify their location.])
> +               fi
>         ])
>  ]
>  )
> diff --git a/include/babeltrace/compat/uuid.h b/include/babeltrace/compat/uuid.h
> index 2ce7467..a916a49 100644
> --- a/include/babeltrace/compat/uuid.h
> +++ b/include/babeltrace/compat/uuid.h
> @@ -122,8 +122,38 @@ int babeltrace_uuid_compare(const unsigned char *uuid_a,
>                 return -1;
>  }
>
> +#elif defined(__MINGW32__)
> +static inline
> +int babeltrace_uuid_generate(unsigned char *uuid_out)
> +{
> +       extern int compat_uuid_generate(unsigned char *uuid_out);
> +       return compat_uuid_generate(uuid_out);
> +}
> +
> +static inline
> +int babeltrace_uuid_unparse(const unsigned char *uuid_in, char *str_out)
> +{
> +       extern int compat_uuid_unparse(const unsigned char *uuid_in, char *str_out);
> +       return compat_uuid_unparse(uuid_in, str_out);
> +}
> +
> +static inline
> +int babeltrace_uuid_parse(const char *str_in, unsigned char *uuid_out)
> +{
> +       extern int compat_uuid_parse(const char *str_in, unsigned char *uuid_out);
> +       return compat_uuid_parse(str_in, uuid_out);
> +}
> +
> +static inline
> +int babeltrace_uuid_compare(const unsigned char *uuid_a,
> +               const unsigned char *uuid_b)
> +{
> +       extern int compat_uuid_compare(const unsigned char *uuid_a,
> +               const unsigned char *uuid_b);
> +       return compat_uuid_compare(uuid_a, uuid_b);
> +}
>  #else
>  #error "Babeltrace needs to have a UUID generator configured."
>  #endif
>
> -#endif /* _BABELTRACE_UUID_H */
> +#endif /* _BABELTRACE_INCLUDE_COMPAT_UUID_H */

Please change this at the beginning of the file too.

> --
> 1.8.1.msysgit.1
>
>
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list