From b7cceed4d3524125e42635f212d10d60f38db886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 16 May 2022 15:54:52 +0200 Subject: [PATCH] [core] Create POSIX utils module --- arduino/libretuya/core/LibreTuyaAPI.cpp | 21 ++-- arduino/libretuya/core/LibreTuyaAPI.h | 3 +- .../libraries/NetUtils/ssl/MbedTLSClient.cpp | 11 +-- arduino/libretuya/posix/.clang-format | 2 + arduino/libretuya/posix/lt_posix_api.h | 5 + arduino/libretuya/posix/strcasecmp.c | 97 +++++++++++++++++++ arduino/libretuya/posix/strdup.c | 11 +++ builder/arduino-common.py | 2 + 8 files changed, 133 insertions(+), 19 deletions(-) create mode 100644 arduino/libretuya/posix/.clang-format create mode 100644 arduino/libretuya/posix/lt_posix_api.h create mode 100644 arduino/libretuya/posix/strcasecmp.c create mode 100644 arduino/libretuya/posix/strdup.c diff --git a/arduino/libretuya/core/LibreTuyaAPI.cpp b/arduino/libretuya/core/LibreTuyaAPI.cpp index 9a2525a..6476664 100644 --- a/arduino/libretuya/core/LibreTuyaAPI.cpp +++ b/arduino/libretuya/core/LibreTuyaAPI.cpp @@ -2,16 +2,21 @@ #include "LibreTuyaAPI.h" -__weak char *strdup(const char *s) { - size_t len = strlen(s) + 1; - void *newp = malloc(len); - if (newp == NULL) - return NULL; - return (char *)memcpy(newp, s, len); -} - String ipToString(const IPAddress &ip) { char szRet[16]; sprintf(szRet, "%hhu.%hhu.%hhu.%hhu", ip[0], ip[1], ip[2], ip[3]); return String(szRet); } + +static void lt_random_bytes(uint8_t *buf, size_t len) { + int *data = (int *)buf; + size_t i; + for (i = 0; len >= sizeof(int); len -= sizeof(int)) { + data[i++] = rand(); + } + if (len) { + int rem = rand(); + unsigned char *pRem = (unsigned char *)&rem; + memcpy(buf + i * sizeof(int), pRem, len); + } +} diff --git a/arduino/libretuya/core/LibreTuyaAPI.h b/arduino/libretuya/core/LibreTuyaAPI.h index f3c016f..1acead7 100644 --- a/arduino/libretuya/core/LibreTuyaAPI.h +++ b/arduino/libretuya/core/LibreTuyaAPI.h @@ -24,6 +24,7 @@ extern "C" { #endif // __cplusplus #include "lt_logger.h" +#include "lt_posix_api.h" #ifdef __cplusplus } // extern "C" @@ -43,7 +44,7 @@ extern "C" { #define PGM_VOID_P const void * // C functions -extern char *strdup(const char *); +void lt_rand_bytes(uint8_t *buf, size_t len); // C++ only functions #ifdef __cplusplus diff --git a/arduino/libretuya/libraries/NetUtils/ssl/MbedTLSClient.cpp b/arduino/libretuya/libraries/NetUtils/ssl/MbedTLSClient.cpp index 93a5ee4..d1aeab2 100644 --- a/arduino/libretuya/libraries/NetUtils/ssl/MbedTLSClient.cpp +++ b/arduino/libretuya/libraries/NetUtils/ssl/MbedTLSClient.cpp @@ -80,16 +80,7 @@ int MbedTLSClient::connect(const char *host, uint16_t port, const char *pskIdent } static int ssl_random(void *data, unsigned char *output, size_t len) { - int *buf = (int *)output; - size_t i; - for (i = 0; len >= sizeof(int); len -= sizeof(int)) { - buf[i++] = rand(); - } - if (len) { - int rem = rand(); - unsigned char *pRem = (unsigned char *)&rem; - memcpy(output + i * sizeof(int), pRem, len); - } + lt_rand_bytes((uint8_t *)output, len); return 0; } diff --git a/arduino/libretuya/posix/.clang-format b/arduino/libretuya/posix/.clang-format new file mode 100644 index 0000000..47a38a9 --- /dev/null +++ b/arduino/libretuya/posix/.clang-format @@ -0,0 +1,2 @@ +DisableFormat: true +SortIncludes: Never diff --git a/arduino/libretuya/posix/lt_posix_api.h b/arduino/libretuya/posix/lt_posix_api.h new file mode 100644 index 0000000..b9a5f05 --- /dev/null +++ b/arduino/libretuya/posix/lt_posix_api.h @@ -0,0 +1,5 @@ +/* Copyright (c) Kuba SzczodrzyƄski 2022-05-16. */ + +extern char *strdup(const char *); +extern int strcasecmp(const char *s1, const char *s2); +extern int strncasecmp(const char *s1, const char *s2, size_t n); diff --git a/arduino/libretuya/posix/strcasecmp.c b/arduino/libretuya/posix/strcasecmp.c new file mode 100644 index 0000000..1ce98da --- /dev/null +++ b/arduino/libretuya/posix/strcasecmp.c @@ -0,0 +1,97 @@ +/* $OpenBSD: strcasecmp.c,v 1.6 2005/08/08 08:05:37 espie Exp $ */ +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. 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. Neither the name of the University 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 THE REGENTS 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 +typedef unsigned char u_char; +/* + * This array is designed for mapping upper and lower case letter + * together for a case independent comparison. The mappings are + * based upon ascii character sequences. + */ +static const u_char charmap[] = { + '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', + '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', + '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', + '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', + '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', + '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', + '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', + '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', + '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', + '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', + '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', + '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', + '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', + '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', + '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', + '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', + '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', + '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', + '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', + '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', + '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', + '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', + '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', + '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', + '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307', + '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317', + '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327', + '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337', + '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', + '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', + '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', + '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', +}; +int +strcasecmp(const char *s1, const char *s2) +{ + const u_char *cm = charmap; + const u_char *us1 = (const u_char *)s1; + const u_char *us2 = (const u_char *)s2; + while (cm[*us1] == cm[*us2++]) + if (*us1++ == '\0') + return (0); + return (cm[*us1] - cm[*--us2]); +} +int +strncasecmp(const char *s1, const char *s2, size_t n) +{ + if (n != 0) { + const u_char *cm = charmap; + const u_char *us1 = (const u_char *)s1; + const u_char *us2 = (const u_char *)s2; + do { + if (cm[*us1] != cm[*us2++]) + return (cm[*us1] - cm[*--us2]); + if (*us1++ == '\0') + break; + } while (--n != 0); + } + return (0); +} diff --git a/arduino/libretuya/posix/strdup.c b/arduino/libretuya/posix/strdup.c new file mode 100644 index 0000000..8d1e4ff --- /dev/null +++ b/arduino/libretuya/posix/strdup.c @@ -0,0 +1,11 @@ +/* Copyright (c) Kuba SzczodrzyƄski 2022-05-16. */ + +#include + +__attribute__((weak)) char *strdup(const char *s) { + size_t len = strlen(s) + 1; + void *newp = malloc(len); + if (newp == NULL) + return NULL; + return (char *)memcpy(newp, s, len); +} diff --git a/builder/arduino-common.py b/builder/arduino-common.py index bc63371..c5a47b4 100644 --- a/builder/arduino-common.py +++ b/builder/arduino-common.py @@ -39,12 +39,14 @@ env.AddLibrary( "+", "+", "+", + "+", ], includes=[ "!<.>", "!", "!", "!", + "!", ], )