mirror of https://github.com/D4-project/d4-core
chg: [client] embedded util-linux-2.31.1
parent
8d041682b7
commit
d738a68312
|
@ -7,14 +7,32 @@ hmac: hmac.o sha2.o
|
|||
hmac.o: ./others/hmac/hmac_sha2.c ./others/hmac/hmac_sha2.h
|
||||
$(CC) -Wall -c ./others/hmac/hmac_sha2.c -o hmac.o
|
||||
|
||||
unpack.o: others/uuid/unpack.c others/uuid/uuidP.h
|
||||
$(CC) -Wall -c others/uuid/unpack.c -o unpack.o
|
||||
|
||||
parse.o: others/uuid/parse.c others/uuid/uuidP.h
|
||||
$(CC) -Wall -c others/uuid/parse.c -o parse.o
|
||||
|
||||
unparse.o: others/uuid/unparse.c others/uuid/uuidP.h others/uuid/uuid.h
|
||||
$(CC) -Wall -c others/uuid/unparse.c -o unparse.o
|
||||
|
||||
pack.o: others/uuid/pack.c others/uuid/uuidP.h
|
||||
$(CC) -Wall -c others/uuid/pack.c -o pack.o
|
||||
|
||||
gen_uuid.o: others/uuid/gen_uuid.c others/uuid/uuidP.h others/uuid/randutils.h
|
||||
$(CC) -Wall -c others/uuid/gen_uuid.c -o gen_uuid.o
|
||||
|
||||
randutils.o: others/uuid/randutils.c others/uuid/randutils.h
|
||||
$(CC) -Wall -c others/uuid/randutils.c -o randutils.o
|
||||
|
||||
sha2.o: ./others/hmac/sha2.c ./others/hmac/sha2.h
|
||||
$(CC) -c ./others/hmac/sha2.c -o sha2.o
|
||||
|
||||
clean:
|
||||
- rm -rf *.o hmac
|
||||
|
||||
d4: d4.o sha2.o hmac.o
|
||||
gcc -Wall -o d4 d4.o hmac.o sha2.o -luuid
|
||||
d4: d4.o sha2.o hmac.o unpack.o unparse.o pack.o gen_uuid.o randutils.o parse.o
|
||||
gcc -Wall -o d4 d4.o hmac.o sha2.o unpack.o pack.o unparse.o gen_uuid.o randutils.o parse.o
|
||||
|
||||
d4.o: d4.c
|
||||
gcc -Wall -c d4.c
|
||||
|
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* gen_uuid.c --- generate a DCE-compatible uuid
|
||||
*
|
||||
* Copyright (C) 1996, 1997, 1998, 1999 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include "uuidP.h"
|
||||
#include "randutils.h"
|
||||
|
||||
#ifdef HAVE_TLS
|
||||
#define THREAD_LOCAL static __thread
|
||||
#else
|
||||
#define THREAD_LOCAL static
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Try using the uuidd daemon to generate the UUID
|
||||
*
|
||||
* Returns 0 on success, non-zero on failure.
|
||||
*/
|
||||
|
||||
void __uuid_generate_random(uuid_t out, int *num)
|
||||
{
|
||||
uuid_t buf;
|
||||
struct uuid uu;
|
||||
int i, n;
|
||||
|
||||
if (!num || !*num)
|
||||
n = 1;
|
||||
else
|
||||
n = *num;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
random_get_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);
|
||||
out += sizeof(uuid_t);
|
||||
}
|
||||
}
|
||||
|
||||
void uuid_generate_random(uuid_t out)
|
||||
{
|
||||
int num = 1;
|
||||
/* No real reason to use the daemon for random uuid's -- yet */
|
||||
|
||||
__uuid_generate_random(out, &num);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether good random source (/dev/random or /dev/urandom)
|
||||
* is available.
|
||||
*/
|
||||
static int have_random_source(void)
|
||||
{
|
||||
return (access("/dev/random", R_OK) == 0 ||
|
||||
access("/dev/urandom", R_OK) == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
void uuid_generate(uuid_t out)
|
||||
{
|
||||
if (have_random_source())
|
||||
uuid_generate_random(out);
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Internal routine for packing UUIDs
|
||||
*
|
||||
* Copyright (C) 1996, 1997 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "uuidP.h"
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* parse.c --- UUID parsing
|
||||
*
|
||||
* Copyright (C) 1996, 1997 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "uuidP.h"
|
||||
|
||||
int uuid_parse(const char *in, uuid_t uu)
|
||||
{
|
||||
struct uuid uuid;
|
||||
int i;
|
||||
const char *cp;
|
||||
char buf[3];
|
||||
|
||||
if (strlen(in) != 36)
|
||||
return -1;
|
||||
for (i=0, cp = in; i <= 36; i++,cp++) {
|
||||
if ((i == 8) || (i == 13) || (i == 18) ||
|
||||
(i == 23)) {
|
||||
if (*cp == '-')
|
||||
continue;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
if (i== 36)
|
||||
if (*cp == 0)
|
||||
continue;
|
||||
if (!isxdigit(*cp))
|
||||
return -1;
|
||||
}
|
||||
uuid.time_low = strtoul(in, NULL, 16);
|
||||
uuid.time_mid = strtoul(in+9, NULL, 16);
|
||||
uuid.time_hi_and_version = strtoul(in+14, NULL, 16);
|
||||
uuid.clock_seq = strtoul(in+19, NULL, 16);
|
||||
cp = in+24;
|
||||
buf[2] = 0;
|
||||
for (i=0; i < 6; i++) {
|
||||
buf[0] = *cp++;
|
||||
buf[1] = *cp++;
|
||||
uuid.node[i] = strtoul(buf, NULL, 16);
|
||||
}
|
||||
|
||||
uuid_pack(&uuid, uu);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,244 @@
|
|||
/*
|
||||
* General purpose random utilities
|
||||
*
|
||||
* Based on libuuid code.
|
||||
*
|
||||
* This file may be redistributed under the terms of the
|
||||
* GNU Lesser General Public License.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/random.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//#include "c.h"
|
||||
#define UL_BUILD_BUG_ON_ZERO(e) __extension__ (sizeof(struct { int:-!!(e); }))
|
||||
|
||||
# define __must_be_array(a) \
|
||||
UL_BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(__typeof__(a), __typeof__(&a[0])))
|
||||
|
||||
# define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
|
||||
|
||||
#include "randutils.h"
|
||||
//#include "nls.h"
|
||||
|
||||
#ifdef HAVE_TLS
|
||||
#define THREAD_LOCAL static __thread
|
||||
#else
|
||||
#define THREAD_LOCAL static
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_GETRANDOM
|
||||
# include <sys/random.h>
|
||||
#elif defined (__linux__)
|
||||
# if !defined(SYS_getrandom) && defined(__NR_getrandom)
|
||||
/* usable kernel-headers, but old glibc-headers */
|
||||
# define SYS_getrandom __NR_getrandom
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_GETRANDOM) && defined(SYS_getrandom)
|
||||
/* libc without function, but we have syscal */
|
||||
#define GRND_NONBLOCK 0x01
|
||||
#define GRND_RANDOM 0x02
|
||||
//static int getrandom(void *buf, size_t buflen, unsigned int flags)
|
||||
//{
|
||||
// return (syscall(SYS_getrandom, buf, buflen, flags));
|
||||
//}
|
||||
# define HAVE_GETRANDOM
|
||||
#endif
|
||||
|
||||
#if defined(__linux__) && defined(__NR_gettid) && defined(HAVE_JRAND48)
|
||||
#define DO_JRAND_MIX
|
||||
THREAD_LOCAL unsigned short ul_jrand_seed[3];
|
||||
#endif
|
||||
|
||||
int rand_get_number(int low_n, int high_n)
|
||||
{
|
||||
return rand() % (high_n - low_n + 1) + low_n;
|
||||
}
|
||||
|
||||
static void crank_random(void)
|
||||
{
|
||||
int i;
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
srand((getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec);
|
||||
|
||||
#ifdef DO_JRAND_MIX
|
||||
ul_jrand_seed[0] = getpid() ^ (tv.tv_sec & 0xFFFF);
|
||||
ul_jrand_seed[1] = getppid() ^ (tv.tv_usec & 0xFFFF);
|
||||
ul_jrand_seed[2] = (tv.tv_sec ^ tv.tv_usec) >> 16;
|
||||
#endif
|
||||
/* Crank the random number generator a few times */
|
||||
gettimeofday(&tv, NULL);
|
||||
for (i = (tv.tv_sec ^ tv.tv_usec) & 0x1F; i > 0; i--)
|
||||
rand();
|
||||
}
|
||||
|
||||
int random_get_fd(void)
|
||||
{
|
||||
int i, fd;
|
||||
|
||||
fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
||||
if (fd == -1)
|
||||
fd = open("/dev/random", O_RDONLY | O_NONBLOCK | O_CLOEXEC);
|
||||
if (fd >= 0) {
|
||||
i = fcntl(fd, F_GETFD);
|
||||
if (i >= 0)
|
||||
fcntl(fd, F_SETFD, i | FD_CLOEXEC);
|
||||
}
|
||||
crank_random();
|
||||
return fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate a stream of random nbytes into buf.
|
||||
* Use /dev/urandom if possible, and if not,
|
||||
* use glibc pseudo-random functions.
|
||||
*/
|
||||
#define UL_RAND_READ_ATTEMPTS 8
|
||||
#define UL_RAND_READ_DELAY 125000 /* microseconds */
|
||||
|
||||
void random_get_bytes(void *buf, size_t nbytes)
|
||||
{
|
||||
unsigned char *cp = (unsigned char *)buf;
|
||||
size_t i, n = nbytes;
|
||||
int lose_counter = 0;
|
||||
|
||||
#ifdef HAVE_GETRANDOM
|
||||
while (n > 0) {
|
||||
int x;
|
||||
|
||||
errno = 0;
|
||||
x = getrandom(cp, n, GRND_NONBLOCK);
|
||||
if (x > 0) { /* success */
|
||||
n -= x;
|
||||
cp += x;
|
||||
lose_counter = 0;
|
||||
|
||||
} else if (errno == ENOSYS) { /* kernel without getrandom() */
|
||||
break;
|
||||
|
||||
} else if (errno == EAGAIN && lose_counter < UL_RAND_READ_ATTEMPTS) {
|
||||
usleep(UL_RAND_READ_DELAY); /* no etropy, wait and try again */
|
||||
lose_counter++;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
if (errno == ENOSYS)
|
||||
#endif
|
||||
/*
|
||||
* We've been built against headers that support getrandom, but the
|
||||
* running kernel does not. Fallback to reading from /dev/{u,}random
|
||||
* as before
|
||||
*/
|
||||
{
|
||||
int fd = random_get_fd();
|
||||
|
||||
lose_counter = 0;
|
||||
if (fd >= 0) {
|
||||
while (n > 0) {
|
||||
ssize_t x = read(fd, cp, n);
|
||||
if (x <= 0) {
|
||||
if (lose_counter++ > UL_RAND_READ_ATTEMPTS)
|
||||
break;
|
||||
usleep(UL_RAND_READ_DELAY);
|
||||
continue;
|
||||
}
|
||||
n -= x;
|
||||
cp += x;
|
||||
lose_counter = 0;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* We do this all the time, but this is the only source of
|
||||
* randomness if /dev/random/urandom is out to lunch.
|
||||
*/
|
||||
crank_random();
|
||||
for (cp = buf, i = 0; i < nbytes; i++)
|
||||
*cp++ ^= (rand() >> 7) & 0xFF;
|
||||
|
||||
#ifdef DO_JRAND_MIX
|
||||
{
|
||||
unsigned short tmp_seed[3];
|
||||
|
||||
memcpy(tmp_seed, ul_jrand_seed, sizeof(tmp_seed));
|
||||
ul_jrand_seed[2] = ul_jrand_seed[2] ^ syscall(__NR_gettid);
|
||||
for (cp = buf, i = 0; i < nbytes; i++)
|
||||
*cp++ ^= (jrand48(tmp_seed) >> 7) & 0xFF;
|
||||
memcpy(ul_jrand_seed, tmp_seed,
|
||||
sizeof(ul_jrand_seed)-sizeof(unsigned short));
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Tell source of randomness.
|
||||
*/
|
||||
const char *random_tell_source(void)
|
||||
{
|
||||
//#ifdef HAVE_GETRANDOM
|
||||
// return _("getrandom() function");
|
||||
//#else
|
||||
size_t i;
|
||||
static const char *random_sources[] = {
|
||||
"/dev/urandom",
|
||||
"/dev/random"
|
||||
};
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(random_sources); i++) {
|
||||
if (!access(random_sources[i], R_OK))
|
||||
return random_sources[i];
|
||||
}
|
||||
//Non standard if no random sources are available abort
|
||||
abort();
|
||||
}
|
||||
|
||||
#ifdef TEST_PROGRAM_RANDUTILS
|
||||
#include <inttypes.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
size_t i, n;
|
||||
int64_t *vp, v;
|
||||
char *buf;
|
||||
size_t bufsz;
|
||||
|
||||
n = argc == 1 ? 16 : atoi(argv[1]);
|
||||
|
||||
printf("Multiple random calls:\n");
|
||||
for (i = 0; i < n; i++) {
|
||||
random_get_bytes(&v, sizeof(v));
|
||||
printf("#%02zu: %25"PRIu64"\n", i, v);
|
||||
}
|
||||
|
||||
|
||||
printf("One random call:\n");
|
||||
bufsz = n * sizeof(*vp);
|
||||
buf = malloc(bufsz);
|
||||
if (!buf)
|
||||
err(EXIT_FAILURE, "failed to allocate buffer");
|
||||
|
||||
random_get_bytes(buf, bufsz);
|
||||
for (i = 0; i < n; i++) {
|
||||
vp = (int64_t *) (buf + (i * sizeof(*vp)));
|
||||
printf("#%02zu: %25"PRIu64"\n", i, *vp);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
#endif /* TEST_PROGRAM_RANDUTILS */
|
|
@ -0,0 +1,17 @@
|
|||
#ifndef UTIL_LINUX_RANDUTILS
|
||||
#define UTIL_LINUX_RANDUTILS
|
||||
|
||||
#ifdef HAVE_SRANDOM
|
||||
#define srand(x) srandom(x)
|
||||
#define rand() random()
|
||||
#endif
|
||||
|
||||
/* rand() based */
|
||||
extern int rand_get_number(int low_n, int high_n);
|
||||
|
||||
/* /dev/urandom based with fallback to rand() */
|
||||
extern int random_get_fd(void);
|
||||
extern void random_get_bytes(void *buf, size_t nbytes);
|
||||
extern const char *random_tell_source(void);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Internal routine for unpacking UUID
|
||||
*
|
||||
* Copyright (C) 1996, 1997 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "uuidP.h"
|
||||
|
||||
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);
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* unparse.c -- convert a UUID to string
|
||||
*
|
||||
* Copyright (C) 1996, 1997 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "uuidP.h"
|
||||
|
||||
static const char *fmt_lower =
|
||||
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x";
|
||||
|
||||
static const char *fmt_upper =
|
||||
"%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X";
|
||||
|
||||
#ifdef UUID_UNPARSE_DEFAULT_UPPER
|
||||
#define FMT_DEFAULT fmt_upper
|
||||
#else
|
||||
#define FMT_DEFAULT fmt_lower
|
||||
#endif
|
||||
|
||||
static void uuid_unparse_x(const uuid_t uu, char *out, const char *fmt)
|
||||
{
|
||||
struct uuid uuid;
|
||||
|
||||
uuid_unpack(uu, &uuid);
|
||||
sprintf(out, fmt,
|
||||
uuid.time_low, uuid.time_mid, uuid.time_hi_and_version,
|
||||
uuid.clock_seq >> 8, uuid.clock_seq & 0xFF,
|
||||
uuid.node[0], uuid.node[1], uuid.node[2],
|
||||
uuid.node[3], uuid.node[4], uuid.node[5]);
|
||||
}
|
||||
|
||||
void uuid_unparse_lower(const uuid_t uu, char *out)
|
||||
{
|
||||
uuid_unparse_x(uu, out, fmt_lower);
|
||||
}
|
||||
|
||||
void uuid_unparse_upper(const uuid_t uu, char *out)
|
||||
{
|
||||
uuid_unparse_x(uu, out, fmt_upper);
|
||||
}
|
||||
|
||||
void uuid_unparse(const uuid_t uu, char *out)
|
||||
{
|
||||
uuid_unparse_x(uu, out, FMT_DEFAULT);
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
/*
|
||||
* Public include file for the UUID library
|
||||
*
|
||||
* Copyright (C) 1996, 1997, 1998 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#ifndef _UUID_UUID_H
|
||||
#define _UUID_UUID_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifndef _WIN32
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
|
||||
typedef unsigned char uuid_t[16];
|
||||
|
||||
/* UUID Variant definitions */
|
||||
#define UUID_VARIANT_NCS 0
|
||||
#define UUID_VARIANT_DCE 1
|
||||
#define UUID_VARIANT_MICROSOFT 2
|
||||
#define UUID_VARIANT_OTHER 3
|
||||
|
||||
#define UUID_VARIANT_SHIFT 5
|
||||
#define UUID_VARIANT_MASK 0x7
|
||||
|
||||
/* UUID Type definitions */
|
||||
#define UUID_TYPE_DCE_TIME 1
|
||||
#define UUID_TYPE_DCE_SECURITY 2
|
||||
#define UUID_TYPE_DCE_MD5 3
|
||||
#define UUID_TYPE_DCE_RANDOM 4
|
||||
#define UUID_TYPE_DCE_SHA1 5
|
||||
|
||||
#define UUID_TYPE_SHIFT 4
|
||||
#define UUID_TYPE_MASK 0xf
|
||||
|
||||
#define UUID_STR_LEN 37
|
||||
|
||||
/* Allow UUID constants to be defined */
|
||||
#ifdef __GNUC__
|
||||
#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \
|
||||
static const uuid_t name __attribute__ ((unused)) = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15}
|
||||
#else
|
||||
#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \
|
||||
static const uuid_t name = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* clear.c */
|
||||
extern void uuid_clear(uuid_t uu);
|
||||
|
||||
/* compare.c */
|
||||
extern int uuid_compare(const uuid_t uu1, const uuid_t uu2);
|
||||
|
||||
/* copy.c */
|
||||
extern void uuid_copy(uuid_t dst, const uuid_t src);
|
||||
|
||||
/* gen_uuid.c */
|
||||
extern void uuid_generate(uuid_t out);
|
||||
extern void uuid_generate_random(uuid_t out);
|
||||
extern void uuid_generate_time(uuid_t out);
|
||||
extern int uuid_generate_time_safe(uuid_t out);
|
||||
|
||||
extern void uuid_generate_md5(uuid_t out, const uuid_t ns, const char *name, size_t len);
|
||||
extern void uuid_generate_sha1(uuid_t out, const uuid_t ns, const char *name, size_t len);
|
||||
|
||||
/* isnull.c */
|
||||
extern int uuid_is_null(const uuid_t uu);
|
||||
|
||||
/* parse.c */
|
||||
extern int uuid_parse(const char *in, uuid_t uu);
|
||||
|
||||
/* unparse.c */
|
||||
extern void uuid_unparse(const uuid_t uu, char *out);
|
||||
extern void uuid_unparse_lower(const uuid_t uu, char *out);
|
||||
extern void uuid_unparse_upper(const uuid_t uu, char *out);
|
||||
|
||||
/* uuid_time.c */
|
||||
extern time_t uuid_time(const uuid_t uu, struct timeval *ret_tv);
|
||||
extern int uuid_type(const uuid_t uu);
|
||||
extern int uuid_variant(const uuid_t uu);
|
||||
|
||||
/* predefined.c */
|
||||
extern const uuid_t *uuid_get_template(const char *alias);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _UUID_UUID_H */
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* uuid.h -- private header file for uuids
|
||||
*
|
||||
* Copyright (C) 1996, 1997 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "uuid.h"
|
||||
|
||||
#define LIBUUID_CLOCK_FILE "/var/lib/libuuid/clock.txt"
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
void uuid_pack(const struct uuid *uu, uuid_t ptr);
|
||||
void uuid_unpack(const uuid_t in, struct uuid *uu);
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Definitions used by the uuidd daemon
|
||||
*
|
||||
* Copyright (C) 2007 Theodore Ts'o.
|
||||
*
|
||||
* %Begin-Header%
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, and the entire permission notice in its entirety,
|
||||
* including the disclaimer of warranties.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
||||
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
* %End-Header%
|
||||
*/
|
||||
|
||||
#ifndef _UUID_UUIDD_H
|
||||
#define _UUID_UUIDD_H
|
||||
|
||||
#define UUIDD_DIR _PATH_RUNSTATEDIR "/uuidd"
|
||||
#define UUIDD_SOCKET_PATH UUIDD_DIR "/request"
|
||||
#define UUIDD_PIDFILE_PATH UUIDD_DIR "/uuidd.pid"
|
||||
#define UUIDD_PATH "/usr/sbin/uuidd"
|
||||
|
||||
#define UUIDD_OP_GETPID 0
|
||||
#define UUIDD_OP_GET_MAXOP 1
|
||||
#define UUIDD_OP_TIME_UUID 2
|
||||
#define UUIDD_OP_RANDOM_UUID 3
|
||||
#define UUIDD_OP_BULK_TIME_UUID 4
|
||||
#define UUIDD_OP_BULK_RANDOM_UUID 5
|
||||
#define UUIDD_MAX_OP UUIDD_OP_BULK_RANDOM_UUID
|
||||
|
||||
extern int __uuid_generate_time(uuid_t out, int *num);
|
||||
extern void __uuid_generate_random(uuid_t out, int *num);
|
||||
|
||||
#endif /* _UUID_UUID_H */
|
Loading…
Reference in New Issue