Annotation of libelwix/src/uuid.c, revision 1.1.2.1
1.1.2.1 ! misho 1: /*************************************************************************
! 2: * (C) 2025 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
! 3: * by Michael Pounov <misho@elwix.org>
! 4: *
! 5: * $Author: misho $
! 6: * $Id: str.c,v 1.11 2024/10/28 09:58:51 misho Exp $
! 7: *
! 8: **************************************************************************
! 9: The ELWIX and AITNET software is distributed under the following
! 10: terms:
! 11:
! 12: All of the documentation and software included in the ELWIX and AITNET
! 13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
! 14:
! 15: Copyright 2004 - 2025
! 16: by Michael Pounov <misho@elwix.org>. All rights reserved.
! 17:
! 18: Redistribution and use in source and binary forms, with or without
! 19: modification, are permitted provided that the following conditions
! 20: are met:
! 21: 1. Redistributions of source code must retain the above copyright
! 22: notice, this list of conditions and the following disclaimer.
! 23: 2. Redistributions in binary form must reproduce the above copyright
! 24: notice, this list of conditions and the following disclaimer in the
! 25: documentation and/or other materials provided with the distribution.
! 26: 3. All advertising materials mentioning features or use of this software
! 27: must display the following acknowledgement:
! 28: This product includes software developed by Michael Pounov <misho@elwix.org>
! 29: ELWIX - Embedded LightWeight unIX and its contributors.
! 30: 4. Neither the name of AITNET nor the names of its contributors
! 31: may be used to endorse or promote products derived from this software
! 32: without specific prior written permission.
! 33:
! 34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
! 35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 44: SUCH DAMAGE.
! 45: */
! 46: #include "global.h"
! 47:
! 48:
! 49: /*
! 50: * e_random() - ELWIX Random routine
! 51: *
! 52: * return: random number
! 53: */
! 54: long
! 55: e_random()
! 56: {
! 57: int fd;
! 58: long ret = -1L;
! 59:
! 60: fd = open("/dev/urandom", O_RDONLY);
! 61: if (fd == -1) {
! 62: srandom(time(NULL) ^ getpid());
! 63: return random();
! 64: }
! 65: if (read(fd, &ret, sizeof ret) == -1) {
! 66: srandom(time(NULL) ^ getpid());
! 67: ret = random();
! 68: }
! 69: close(fd);
! 70:
! 71: return ret;
! 72: }
! 73:
! 74: /*
! 75: * e_randbuf() - Fill buffer with random numbers
! 76: *
! 77: * @rnd = Buffer
! 78: * @rndlen = Length of buffer
! 79: *
! 80: * return: -1 error or 0 ok
! 81: */
! 82: int
! 83: e_randbuf(u_char *rnd, int rndlen)
! 84: {
! 85: int fd, ret = 0;
! 86:
! 87: if (!rnd || rndlen < 1)
! 88: return -1;
! 89:
! 90: fd = open("/dev/urandom", O_RDONLY);
! 91: if (fd == -1) {
! 92: elwix_SetErr(errno, "%s", strerror(errno));
! 93: return -1;
! 94: }
! 95: if (read(fd, rnd, rndlen) == -1) {
! 96: elwix_SetErr(errno, "%s", strerror(errno));
! 97: ret = -1;
! 98: }
! 99: close(fd);
! 100:
! 101: return ret;
! 102: }
! 103:
! 104: /*
! 105: * uuid_gen() - Generate UUID
! 106: *
! 107: * @uuid = UUID
! 108: *
! 109: * return: -1 error or 0 ok
! 110: */
! 111: int
! 112: uuid_gen(uuid_t uuid)
! 113: {
! 114: uuid_t id;
! 115:
! 116: if (e_randbuf(id, sizeof id) == -1)
! 117: return -1;
! 118:
! 119: /* UUID v4 */
! 120: id[6] = (id[6] & 0xf) | 0x40;
! 121: /* RFC4122 */
! 122: id[8] = (id[8] & 0x3f) | 0x80;
! 123:
! 124: if (uuid)
! 125: memcpy(uuid, id, sizeof(uuid_t));
! 126: return 0;
! 127: }
! 128:
! 129: /*
! 130: * uuid_str() - Convert UUID to string
! 131: *
! 132: * @uuid = UUID
! 133: * @str = String
! 134: * @len = Length
! 135: *
! 136: * return: -1 error or processed bytes
! 137: */
! 138: int
! 139: uuid_str(uuid_t uuid, char *str, int len)
! 140: {
! 141: if (!uuid || !str || len < 37)
! 142: return -1;
! 143:
! 144: return snprintf(str, len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
! 145: uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
! 146: uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
! 147: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>