|
|
| version 1.1, 2025/11/17 19:53:08 | version 1.1.2.1, 2025/11/17 19:53:08 |
|---|---|
| Line 0 | Line 1 |
| /************************************************************************* | |
| * (C) 2025 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org> | |
| * by Michael Pounov <misho@elwix.org> | |
| * | |
| * $Author$ | |
| * $Id$ | |
| * | |
| ************************************************************************** | |
| The ELWIX and AITNET software is distributed under the following | |
| terms: | |
| All of the documentation and software included in the ELWIX and AITNET | |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> | |
| Copyright 2004 - 2025 | |
| by Michael Pounov <misho@elwix.org>. All rights reserved. | |
| 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, this list of conditions and the following disclaimer. | |
| 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. All advertising materials mentioning features or use of this software | |
| must display the following acknowledgement: | |
| This product includes software developed by Michael Pounov <misho@elwix.org> | |
| ELWIX - Embedded LightWeight unIX and its contributors. | |
| 4. Neither the name of AITNET nor the names of its contributors | |
| may be used to endorse or promote products derived from this software | |
| without specific prior written permission. | |
| THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND | |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS 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 ADVISED OF THE POSSIBILITY OF | |
| SUCH DAMAGE. | |
| */ | |
| #include "global.h" | |
| /* | |
| * e_random() - ELWIX Random routine | |
| * | |
| * return: random number | |
| */ | |
| long | |
| e_random() | |
| { | |
| int fd; | |
| long ret = -1L; | |
| fd = open("/dev/urandom", O_RDONLY); | |
| if (fd == -1) { | |
| srandom(time(NULL) ^ getpid()); | |
| return random(); | |
| } | |
| if (read(fd, &ret, sizeof ret) == -1) { | |
| srandom(time(NULL) ^ getpid()); | |
| ret = random(); | |
| } | |
| close(fd); | |
| return ret; | |
| } | |
| /* | |
| * e_randbuf() - Fill buffer with random numbers | |
| * | |
| * @rnd = Buffer | |
| * @rndlen = Length of buffer | |
| * | |
| * return: -1 error or 0 ok | |
| */ | |
| int | |
| e_randbuf(u_char *rnd, int rndlen) | |
| { | |
| int fd, ret = 0; | |
| if (!rnd || rndlen < 1) | |
| return -1; | |
| fd = open("/dev/urandom", O_RDONLY); | |
| if (fd == -1) { | |
| elwix_SetErr(errno, "%s", strerror(errno)); | |
| return -1; | |
| } | |
| if (read(fd, rnd, rndlen) == -1) { | |
| elwix_SetErr(errno, "%s", strerror(errno)); | |
| ret = -1; | |
| } | |
| close(fd); | |
| return ret; | |
| } | |
| /* | |
| * uuid_gen() - Generate UUID | |
| * | |
| * @uuid = UUID | |
| * | |
| * return: -1 error or 0 ok | |
| */ | |
| int | |
| uuid_gen(uuid_t uuid) | |
| { | |
| uuid_t id; | |
| if (e_randbuf(id, sizeof id) == -1) | |
| return -1; | |
| /* UUID v4 */ | |
| id[6] = (id[6] & 0xf) | 0x40; | |
| /* RFC4122 */ | |
| id[8] = (id[8] & 0x3f) | 0x80; | |
| if (uuid) | |
| memcpy(uuid, id, sizeof(uuid_t)); | |
| return 0; | |
| } | |
| /* | |
| * uuid_str() - Convert UUID to string | |
| * | |
| * @uuid = UUID | |
| * @str = String | |
| * @len = Length | |
| * | |
| * return: -1 error or processed bytes | |
| */ | |
| int | |
| uuid_str(uuid_t uuid, char *str, int len) | |
| { | |
| if (!uuid || !str || len < 37) | |
| return -1; | |
| return snprintf(str, len, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", | |
| uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], | |
| uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); | |
| } |