]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
Generation of 32bit tun number in main branch,
authorhadaq <hadaq>
Wed, 20 Nov 2002 04:49:02 +0000 (04:49 +0000)
committerhadaq <hadaq>
Wed, 20 Nov 2002 04:49:02 +0000 (04:49 +0000)
used during the night -- mm

hadaq/Makefile.am
hadaq/Makefile.in
hadaq/configure
hadaq/configure.in
hadaq/evtbuild.c
hadaq/genid32.c [new file with mode: 0644]
hadaq/genid32.h [new file with mode: 0644]

index 0b73b1af4fba231da6047d39c2e7ec9becdafbd9..e28f362f73618b7c127131d161d6c8c557f0b68d 100644 (file)
@@ -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 \
index bde2f68fa255ad764659e1ae9365cbdb3fb2e334..9e80c87e898090675eaec5be5ff7e816d0b5b264 100644 (file)
@@ -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 \
index adcaf87c0795b99658f0c1b2b7620201aa75584e..867d85409301ae66c81719dd8f01eac5e6df962a 100644 (file)
@@ -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),
index fd8cf799b4395f573518f45fcc4b9aadda52ac05..a3ff17296e1106fd632bb429403143d99981fe7f 100644 (file)
@@ -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
index 186a2f30baf3f4a70515f42fd58d9e8d416fdc26..a98393e52f3256192e38d90f312eb6923672c283 100644 (file)
@@ -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 (file)
index 0000000..f050d60
--- /dev/null
@@ -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 <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#ifdef HAVE_SYS_SOCKIO_H
+#include <sys/sockio.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#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 (file)
index 0000000..15cd22a
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef GENID32_H
+#define GENID32_H
+
+#include <stdint.h>
+
+uint32_t genId32(void);
+
+#endif