Annotation of libelwix/src/uuid.c, revision 1.2

1.2     ! 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: uuid.c,v 1.1.2.1 2025/11/17 19:53:08 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>