[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