From 719abc7c3cbfbbbb420ed2c1ebfaa7dd284769ce Mon Sep 17 00:00:00 2001 From: hadaq Date: Wed, 20 Nov 2002 04:49:02 +0000 Subject: [PATCH] Generation of 32bit tun number in main branch, used during the night -- mm --- hadaq/Makefile.am | 5 +- hadaq/Makefile.in | 79 +++++---- hadaq/configure | 2 +- hadaq/configure.in | 2 +- hadaq/evtbuild.c | 5 +- hadaq/genid32.c | 407 +++++++++++++++++++++++++++++++++++++++++++++ hadaq/genid32.h | 8 + 7 files changed, 470 insertions(+), 38 deletions(-) create mode 100644 hadaq/genid32.c create mode 100644 hadaq/genid32.h diff --git a/hadaq/Makefile.am b/hadaq/Makefile.am index 0b73b1a..e28f362 100644 --- a/hadaq/Makefile.am +++ b/hadaq/Makefile.am @@ -28,7 +28,8 @@ anal: daq_sniff daq_anal manage: daq_manage xmanage: daq_xmanage anal -bin_PROGRAMS = @daq_xmanage_prog@ @daq_manage_prog@ daq_agent daq_readout daq_memnet daq_netmem daq_evtbuild daq_sniff daq_anal daq_ctrlctu +bin_PROGRAMS = @daq_xmanage_prog@ @daq_manage_prog@ daq_agent daq_memnet daq_netmem daq_evtbuild daq_sniff daq_anal daq_ctrlctu +noinst_PROGRAMS = daq_readout EXTRA_PROGRAMS = daq_xmanage daq_manage lib_LIBRARIES = libhadaq.a @@ -62,7 +63,7 @@ daq_netmem_SOURCES = netmem.c \ psxshm.c \ nettrans.c \ hadtu.c -daq_evtbuild_SOURCES = evtbuild.c \ +daq_evtbuild_SOURCES = evtbuild.c genid32.c \ worker.c \ shmtrans.c hadtuqueue.c \ psxshm.c \ diff --git a/hadaq/Makefile.in b/hadaq/Makefile.in index bde2f68..9e80c87 100644 --- a/hadaq/Makefile.in +++ b/hadaq/Makefile.in @@ -74,7 +74,8 @@ SUFFIXES = .x _clnt.c _svc.c _xdr.c .h BUILT_SOURCES = agent.h online.h -bin_PROGRAMS = @daq_xmanage_prog@ @daq_manage_prog@ daq_agent daq_readout daq_memnet daq_netmem daq_evtbuild daq_sniff daq_anal daq_ctrlctu +bin_PROGRAMS = @daq_xmanage_prog@ @daq_manage_prog@ daq_agent daq_memnet daq_netmem daq_evtbuild daq_sniff daq_anal daq_ctrlctu +noinst_PROGRAMS = daq_readout EXTRA_PROGRAMS = daq_xmanage daq_manage lib_LIBRARIES = libhadaq.a @@ -114,7 +115,7 @@ daq_netmem_SOURCES = netmem.c \ nettrans.c \ hadtu.c -daq_evtbuild_SOURCES = evtbuild.c \ +daq_evtbuild_SOURCES = evtbuild.c genid32.c \ worker.c \ shmtrans.c hadtuqueue.c \ psxshm.c \ @@ -141,7 +142,7 @@ LIBS = @LIBS@ libhadaq_a_LIBADD = libhadaq_a_OBJECTS = worker.o psxshm.o AR = ar -PROGRAMS = $(bin_PROGRAMS) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) daq_xmanage_OBJECTS = tcldaq.o tkAppInit.o agent_clnt.o agent_xdr.o \ worker.o psxshm.o @@ -157,9 +158,6 @@ daq_agent_OBJECTS = agent.o agent_svc.o agent_xdr.o worker.o psxshm.o daq_agent_LDADD = $(LDADD) daq_agent_DEPENDENCIES = daq_agent_LDFLAGS = -daq_readout_OBJECTS = readout.o worker.o subevt.o shmtrans.o \ -hadtuqueue.o psxshm.o hadtu.o -daq_readout_LDFLAGS = daq_memnet_OBJECTS = memnet.o worker.o shmtrans.o hadtuqueue.o psxshm.o \ nettrans.o hadtu.o daq_memnet_LDADD = $(LDADD) @@ -170,9 +168,9 @@ nettrans.o hadtu.o daq_netmem_LDADD = $(LDADD) daq_netmem_DEPENDENCIES = daq_netmem_LDFLAGS = -daq_evtbuild_OBJECTS = evtbuild.o worker.o shmtrans.o hadtuqueue.o \ -psxshm.o online.o online_svc.o online_xdr.o evt.o subevt.o hadtu.o \ -ansiTape.o ansiTapeLabel.o ansiTapeChar.o +daq_evtbuild_OBJECTS = evtbuild.o genid32.o worker.o shmtrans.o \ +hadtuqueue.o psxshm.o online.o online_svc.o online_xdr.o evt.o subevt.o \ +hadtu.o ansiTape.o ansiTapeLabel.o ansiTapeChar.o daq_evtbuild_LDADD = $(LDADD) daq_evtbuild_DEPENDENCIES = daq_evtbuild_LDFLAGS = @@ -188,6 +186,9 @@ daq_ctrlctu_OBJECTS = ctrlctu.o worker.o psxshm.o daq_ctrlctu_LDADD = $(LDADD) daq_ctrlctu_DEPENDENCIES = daq_ctrlctu_LDFLAGS = +daq_readout_OBJECTS = readout.o worker.o subevt.o shmtrans.o \ +hadtuqueue.o psxshm.o hadtu.o +daq_readout_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) @@ -204,16 +205,16 @@ GZIP_ENV = --best DEP_FILES = .deps/agent.P .deps/agent_clnt.P .deps/agent_svc.P \ .deps/agent_xdr.P .deps/ansiTape.P .deps/ansiTapeChar.P \ .deps/ansiTapeLabel.P .deps/ctrlctu.P .deps/evt.P .deps/evtbuild.P \ -.deps/hadtu.P .deps/hadtuqueue.P .deps/hldread.P .deps/hwmdc.P \ -.deps/hwrace.P .deps/hwrich.P .deps/hwsam.P .deps/hwship.P \ -.deps/hwshow.P .deps/hwsoft.P .deps/hwtip.P .deps/hwtrig.P \ -.deps/memnet.P .deps/netmem.P .deps/nettrans.P .deps/online.P \ -.deps/online_clnt.P .deps/online_svc.P .deps/online_xdr.P \ -.deps/psxshm.P .deps/rc.P .deps/readout.P .deps/shmtrans.P \ -.deps/showevt.P .deps/sniff.P .deps/subevt.P .deps/tclAppInit.P \ -.deps/tcldaq.P .deps/tkAppInit.P .deps/worker.P -SOURCES = $(libhadaq_a_SOURCES) $(daq_xmanage_SOURCES) $(daq_manage_SOURCES) $(daq_agent_SOURCES) $(daq_readout_SOURCES) $(EXTRA_daq_readout_SOURCES) $(daq_memnet_SOURCES) $(daq_netmem_SOURCES) $(daq_evtbuild_SOURCES) $(daq_sniff_SOURCES) $(daq_anal_SOURCES) $(daq_ctrlctu_SOURCES) -OBJECTS = $(libhadaq_a_OBJECTS) $(daq_xmanage_OBJECTS) $(daq_manage_OBJECTS) $(daq_agent_OBJECTS) $(daq_readout_OBJECTS) $(daq_memnet_OBJECTS) $(daq_netmem_OBJECTS) $(daq_evtbuild_OBJECTS) $(daq_sniff_OBJECTS) $(daq_anal_OBJECTS) $(daq_ctrlctu_OBJECTS) +.deps/genid32.P .deps/hadtu.P .deps/hadtuqueue.P .deps/hldread.P \ +.deps/hwmdc.P .deps/hwrace.P .deps/hwrich.P .deps/hwsam.P \ +.deps/hwship.P .deps/hwshow.P .deps/hwsoft.P .deps/hwtip.P \ +.deps/hwtrig.P .deps/memnet.P .deps/netmem.P .deps/nettrans.P \ +.deps/online.P .deps/online_clnt.P .deps/online_svc.P \ +.deps/online_xdr.P .deps/psxshm.P .deps/rc.P .deps/readout.P \ +.deps/shmtrans.P .deps/showevt.P .deps/sniff.P .deps/subevt.P \ +.deps/tclAppInit.P .deps/tcldaq.P .deps/tkAppInit.P .deps/worker.P +SOURCES = $(libhadaq_a_SOURCES) $(daq_xmanage_SOURCES) $(daq_manage_SOURCES) $(daq_agent_SOURCES) $(daq_memnet_SOURCES) $(daq_netmem_SOURCES) $(daq_evtbuild_SOURCES) $(daq_sniff_SOURCES) $(daq_anal_SOURCES) $(daq_ctrlctu_SOURCES) $(daq_readout_SOURCES) $(EXTRA_daq_readout_SOURCES) +OBJECTS = $(libhadaq_a_OBJECTS) $(daq_xmanage_OBJECTS) $(daq_manage_OBJECTS) $(daq_agent_OBJECTS) $(daq_memnet_OBJECTS) $(daq_netmem_OBJECTS) $(daq_evtbuild_OBJECTS) $(daq_sniff_OBJECTS) $(daq_anal_OBJECTS) $(daq_ctrlctu_OBJECTS) $(daq_readout_OBJECTS) all: all-redirect .SUFFIXES: @@ -311,6 +312,15 @@ uninstall-binPROGRAMS: rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done +mostlyclean-noinstPROGRAMS: + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +distclean-noinstPROGRAMS: + +maintainer-clean-noinstPROGRAMS: + daq_xmanage: $(daq_xmanage_OBJECTS) $(daq_xmanage_DEPENDENCIES) @rm -f daq_xmanage $(LINK) $(daq_xmanage_LDFLAGS) $(daq_xmanage_OBJECTS) $(daq_xmanage_LDADD) $(LIBS) @@ -323,10 +333,6 @@ daq_agent: $(daq_agent_OBJECTS) $(daq_agent_DEPENDENCIES) @rm -f daq_agent $(LINK) $(daq_agent_LDFLAGS) $(daq_agent_OBJECTS) $(daq_agent_LDADD) $(LIBS) -daq_readout: $(daq_readout_OBJECTS) $(daq_readout_DEPENDENCIES) - @rm -f daq_readout - $(LINK) $(daq_readout_LDFLAGS) $(daq_readout_OBJECTS) $(daq_readout_LDADD) $(LIBS) - daq_memnet: $(daq_memnet_OBJECTS) $(daq_memnet_DEPENDENCIES) @rm -f daq_memnet $(LINK) $(daq_memnet_LDFLAGS) $(daq_memnet_OBJECTS) $(daq_memnet_LDADD) $(LIBS) @@ -351,6 +357,10 @@ daq_ctrlctu: $(daq_ctrlctu_OBJECTS) $(daq_ctrlctu_DEPENDENCIES) @rm -f daq_ctrlctu $(LINK) $(daq_ctrlctu_LDFLAGS) $(daq_ctrlctu_OBJECTS) $(daq_ctrlctu_LDADD) $(LIBS) +daq_readout: $(daq_readout_OBJECTS) $(daq_readout_DEPENDENCIES) + @rm -f daq_readout + $(LINK) $(daq_readout_LDFLAGS) $(daq_readout_OBJECTS) $(daq_readout_LDADD) $(LIBS) + install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(includedir) @@ -520,27 +530,30 @@ distclean-generic: maintainer-clean-generic: -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) mostlyclean-am: mostlyclean-libLIBRARIES mostlyclean-compile \ - mostlyclean-binPROGRAMS mostlyclean-tags \ - mostlyclean-depend mostlyclean-generic + mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \ + mostlyclean-tags mostlyclean-depend mostlyclean-generic mostlyclean: mostlyclean-am -clean-am: clean-libLIBRARIES clean-compile clean-binPROGRAMS clean-tags \ - clean-depend clean-generic mostlyclean-am clean-local +clean-am: clean-libLIBRARIES clean-compile clean-binPROGRAMS \ + clean-noinstPROGRAMS clean-tags clean-depend \ + clean-generic mostlyclean-am clean-local clean: clean-am distclean-am: distclean-libLIBRARIES distclean-compile \ - distclean-binPROGRAMS distclean-tags distclean-depend \ - distclean-generic clean-am + distclean-binPROGRAMS distclean-noinstPROGRAMS \ + distclean-tags distclean-depend distclean-generic \ + clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-libLIBRARIES \ maintainer-clean-compile maintainer-clean-binPROGRAMS \ - maintainer-clean-tags maintainer-clean-depend \ - maintainer-clean-generic distclean-am + maintainer-clean-noinstPROGRAMS maintainer-clean-tags \ + maintainer-clean-depend maintainer-clean-generic \ + distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." @@ -552,7 +565,9 @@ clean-libLIBRARIES maintainer-clean-libLIBRARIES uninstall-libLIBRARIES \ install-libLIBRARIES mostlyclean-compile distclean-compile \ clean-compile maintainer-clean-compile mostlyclean-binPROGRAMS \ distclean-binPROGRAMS clean-binPROGRAMS maintainer-clean-binPROGRAMS \ -uninstall-binPROGRAMS install-binPROGRAMS uninstall-includeHEADERS \ +uninstall-binPROGRAMS install-binPROGRAMS mostlyclean-noinstPROGRAMS \ +distclean-noinstPROGRAMS clean-noinstPROGRAMS \ +maintainer-clean-noinstPROGRAMS uninstall-includeHEADERS \ install-includeHEADERS tags mostlyclean-tags distclean-tags clean-tags \ maintainer-clean-tags distdir mostlyclean-depend distclean-depend \ clean-depend maintainer-clean-depend info-am info dvi-am dvi check \ diff --git a/hadaq/configure b/hadaq/configure index adcaf87..867d854 100644 --- a/hadaq/configure +++ b/hadaq/configure @@ -1170,7 +1170,7 @@ esac if test "$GCC" = yes then - CC="$CC -ansi -pedantic-errors" + CC="$CC -ansi" fi # Find a good install program. We prefer a C program (faster), diff --git a/hadaq/configure.in b/hadaq/configure.in index fd8cf79..a3ff172 100644 --- a/hadaq/configure.in +++ b/hadaq/configure.in @@ -17,7 +17,7 @@ AC_PROG_CC AM_PROG_CC_STDC if test "$GCC" = yes then - CC="$CC -ansi -pedantic-errors" + CC="$CC -ansi" fi AC_PROG_INSTALL diff --git a/hadaq/evtbuild.c b/hadaq/evtbuild.c index 186a2f3..a98393e 100644 --- a/hadaq/evtbuild.c +++ b/hadaq/evtbuild.c @@ -1,4 +1,4 @@ -static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/evtbuild.c,v 6.55 2002-11-19 17:25:40 hadaq Exp $"; +static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/evtbuild.c,v 6.56 2002-11-20 04:49:02 hadaq Exp $"; #define _POSIX_C_SOURCE 199309L @@ -29,6 +29,7 @@ static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hada #include "subevt.h" #include "shmtrans.h" #include "ansiTape.h" +#include "genid32.h" #define NTRIGTYPES 64UL /* must be 2^n */ #define NTRIGTYPES_IN_FILE 16 /* must be 2^n */ @@ -356,7 +357,7 @@ static int openFile(TheArgs *theArgs) { static char outPath[_POSIX_PATH_MAX]; static once = 1; - theArgs->runNr = ourTime; + theArgs->runNr = genId32(); if (once) { strcpy(outPath, theArgs->outPath); diff --git a/hadaq/genid32.c b/hadaq/genid32.c new file mode 100644 index 0000000..f050d60 --- /dev/null +++ b/hadaq/genid32.c @@ -0,0 +1,407 @@ +/* + * gen_uuid.c --- generate a DCE-compatible uuid + * + * Copyright (C) 1996, 1997, 1998, 1999 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU + * Library General Public License. + * %End-Header% + */ + +/* + * Force inclusion of SVID stuff since we need it if we're compiling in + * gcc-wall wall mode + */ +#define _SVID_SOURCE + +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif +#ifdef HAVE_NET_IF_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + + +#ifdef HAVE_SRANDOM +#define srand(x) srandom(x) +#define rand() random() +#endif + +#include "genid32.h" + +/* + * uuid.h -- private header file for uuids + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU + * Library General Public License. + * %End-Header% + */ + +typedef unsigned char uuid_t[16]; + +/* + * Offset between 15-Oct-1582 and 1-Jan-70 + */ +#define TIME_OFFSET_HIGH 0x01B21DD2 +#define TIME_OFFSET_LOW 0x13814000 + +struct uuid { + uint32_t time_low; + uint16_t time_mid; + uint16_t time_hi_and_version; + uint16_t clock_seq; + uint8_t node[6]; +}; + + +/* + * prototypes + */ +static void uuid_pack(const struct uuid *uu, uuid_t ptr); +static void uuid_unpack(const uuid_t in, struct uuid *uu); + +static int get_random_fd(void) +{ + struct timeval tv; + static int fd = -2; + int i; + + if (fd == -2) { + gettimeofday(&tv, 0); + fd = open("/dev/urandom", O_RDONLY); + if (fd == -1) + fd = open("/dev/random", O_RDONLY | O_NONBLOCK); + srand((getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec); + } + /* Crank the random number generator a few times */ + gettimeofday(&tv, 0); + for (i = (tv.tv_sec ^ tv.tv_usec) & 0x1F; i > 0; i--) + rand(); + return fd; +} + + +/* + * Generate a series of random bytes. Use /dev/urandom if possible, + * and if not, use srandom/random. + */ +static void get_random_bytes(void *buf, int nbytes) +{ + int i, fd = get_random_fd(); + int lose_counter = 0; + char *cp = (char *) buf; + + if (fd >= 0) { + while (nbytes > 0) { + i = read(fd, cp, nbytes); + if ((i < 0) && + ((errno == EINTR) || (errno == EAGAIN))) + continue; + if (i <= 0) { + if (lose_counter++ == 8) + break; + continue; + } + nbytes -= i; + cp += i; + lose_counter = 0; + } + } + + /* XXX put something better here if no /dev/random! */ + for (i = 0; i < nbytes; i++) + *cp++ = rand() & 0xFF; + return; +} + +/* + * Get the ethernet hardware address, if we can find it... + */ +static int get_node_id(unsigned char *node_id) +{ +#ifdef HAVE_NET_IF_H + int sd; + struct ifreq ifr, *ifrp; + struct ifconf ifc; + char buf[1024]; + int n, i; + unsigned char *a; + +/* + * BSD 4.4 defines the size of an ifreq to be + * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len + * However, under earlier systems, sa_len isn't present, so the size is + * just sizeof(struct ifreq) + */ +#ifdef HAVE_SA_LEN +#ifndef max +#define max(a,b) ((a) > (b) ? (a) : (b)) +#endif +#define ifreq_size(i) max(sizeof(struct ifreq),\ + sizeof((i).ifr_name)+(i).ifr_addr.sa_len) +#else +#define ifreq_size(i) sizeof(struct ifreq) +#endif /* HAVE_SA_LEN*/ + + sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sd < 0) { + return -1; + } + memset(buf, 0, sizeof(buf)); + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0) { + close(sd); + return -1; + } + n = ifc.ifc_len; + for (i = 0; i < n; i+= ifreq_size(*ifr) ) { + ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i); + strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ); +#ifdef SIOCGIFHWADDR + if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) + continue; + a = (unsigned char *) &ifr.ifr_hwaddr.sa_data; +#else +#ifdef SIOCGENADDR + if (ioctl(sd, SIOCGENADDR, &ifr) < 0) + continue; + a = (unsigned char *) ifr.ifr_enaddr; +#else + /* + * XXX we don't have a way of getting the hardware + * address + */ + close(sd); + return 0; +#endif /* SIOCGENADDR */ +#endif /* SIOCGIFHWADDR */ + if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) + continue; + if (node_id) { + memcpy(node_id, a, 6); + close(sd); + return 1; + } + } + close(sd); +#endif + return 0; +} + +/* Assume that the gettimeofday() has microsecond granularity */ +#define MAX_ADJUSTMENT 10 + +static int get_clock(uint32_t *clock_high, uint32_t *clock_low, uint16_t *ret_clock_seq) +{ + static int adjustment = 0; + static struct timeval last = {0, 0}; + static uint16_t clock_seq; + struct timeval tv; + unsigned long long clock_reg; + +try_again: + gettimeofday(&tv, 0); + if ((last.tv_sec == 0) && (last.tv_usec == 0)) { + get_random_bytes(&clock_seq, sizeof(clock_seq)); + clock_seq &= 0x1FFF; + last = tv; + last.tv_sec--; + } + if ((tv.tv_sec < last.tv_sec) || + ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec < last.tv_usec))) { + clock_seq = (clock_seq+1) & 0x1FFF; + adjustment = 0; + last = tv; + } else if ((tv.tv_sec == last.tv_sec) && + (tv.tv_usec == last.tv_usec)) { + if (adjustment >= MAX_ADJUSTMENT) + goto try_again; + adjustment++; + } else { + adjustment = 0; + last = tv; + } + + clock_reg = tv.tv_usec*10 + adjustment; + clock_reg += ((unsigned long long) tv.tv_sec)*10000000; + clock_reg += (((unsigned long long) 0x01B21DD2) << 32) + 0x13814000; + + *clock_high = clock_reg >> 32; + *clock_low = clock_reg; + *ret_clock_seq = clock_seq; + return 0; +} + +static void uuid_generate_time(uuid_t out) +{ + static unsigned char node_id[6]; + static int has_init = 0; + struct uuid uu; + uint32_t clock_mid; + + if (!has_init) { + if (get_node_id(node_id) <= 0) { + get_random_bytes(node_id, 6); + /* + * Set multicast bit, to prevent conflicts + * with IEEE 802 addresses obtained from + * network cards + */ + node_id[0] |= 0x80; + } + has_init = 1; + } + get_clock(&clock_mid, &uu.time_low, &uu.clock_seq); + uu.clock_seq |= 0x8000; + uu.time_mid = (uint16_t) clock_mid; + uu.time_hi_and_version = (clock_mid >> 16) | 0x1000; + memcpy(uu.node, node_id, 6); + uuid_pack(&uu, out); +} + +static void uuid_generate_random(uuid_t out) +{ + uuid_t buf; + struct uuid uu; + + get_random_bytes(buf, sizeof(buf)); + uuid_unpack(buf, &uu); + + uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000; + uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x4000; + uuid_pack(&uu, out); +} + +/* + * This is the generic front-end to uuid_generate_random and + * uuid_generate_time. It uses uuid_generate_random only if + * /dev/urandom is available, since otherwise we won't have + * high-quality randomness. + */ +static void uuid_generate(uuid_t out) +{ + if (get_random_fd() >= 0) + uuid_generate_random(out); + else + uuid_generate_time(out); +} + +/* + * Internal routine for packing UUID's + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU + * Library General Public License. + * %End-Header% + */ + +static void uuid_pack(const struct uuid *uu, uuid_t ptr) +{ + uint32_t tmp; + unsigned char *out = ptr; + + tmp = uu->time_low; + out[3] = (unsigned char) tmp; + tmp >>= 8; + out[2] = (unsigned char) tmp; + tmp >>= 8; + out[1] = (unsigned char) tmp; + tmp >>= 8; + out[0] = (unsigned char) tmp; + + tmp = uu->time_mid; + out[5] = (unsigned char) tmp; + tmp >>= 8; + out[4] = (unsigned char) tmp; + + tmp = uu->time_hi_and_version; + out[7] = (unsigned char) tmp; + tmp >>= 8; + out[6] = (unsigned char) tmp; + + tmp = uu->clock_seq; + out[9] = (unsigned char) tmp; + tmp >>= 8; + out[8] = (unsigned char) tmp; + + memcpy(out+10, uu->node, 6); +} + + +/* + * Internal routine for unpacking UUID + * + * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU + * Library General Public License. + * %End-Header% + */ + +static void uuid_unpack(const uuid_t in, struct uuid *uu) +{ + const uint8_t *ptr = in; + uint32_t tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_low = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_mid = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->time_hi_and_version = tmp; + + tmp = *ptr++; + tmp = (tmp << 8) | *ptr++; + uu->clock_seq = tmp; + + memcpy(uu->node, ptr, 6); +} + + + +uint32_t genId32(void) { + uuid_t uu; + uint32_t v; + + uuid_generate(uu); + v = ((uu[0]^uu[4]^uu[8]^uu[12])<<0) + |((uu[1]^uu[5]^uu[9]^uu[13])<<8) + |((uu[2]^uu[6]^uu[10]^uu[14])<<16) + |((uu[3]^uu[7]^uu[11]^uu[15])<<24); + return v & 0x7fffffff; +} diff --git a/hadaq/genid32.h b/hadaq/genid32.h new file mode 100644 index 0000000..15cd22a --- /dev/null +++ b/hadaq/genid32.h @@ -0,0 +1,8 @@ +#ifndef GENID32_H +#define GENID32_H + +#include + +uint32_t genId32(void); + +#endif -- 2.43.0