On Thu, May 2, 2013 at 7:47 AM, Ikaheimonen, JP <[email protected]> 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 > [email protected] > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Jérémie Galarneau EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
