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

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Tue May 14 08:12:01 EDT 2013


* Jérémie Galarneau (jeremie.galarneau at efficios.com) wrote:
> 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;

surprising. Isn't there a standard byteswap in windows ?

> > +       ptr = (unsigned char *)uuid;
> > +       SWAP(ptr, 0, 3)
> > +       SWAP(ptr, 1, 2)
> > +       SWAP(ptr, 4, 5)
> > +       SWAP(ptr, 6, 7)
> > +

Please remove whiteline.

> > +}
> > +
> > +int compat_uuid_generate(unsigned char *uuid_out)
> > +{
> > +       RPC_STATUS status;

valid here and elsewhere: please put an empty line between variable
declarations and code.

Thanks,

Mathieu

> > +       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
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list