added support for arc4random_uniform function i know that it's probably an overkill for such stupid little program, but why not :D also refactored strlcat support a bit, to make sure that strncat function is used if strlcat could not be found. FossilOrigin-Name: 1b72489c7f0f5b72bac65f1469c9bec650d7ffdabfa4f88409e15c630ac5a52d
la-ninpre leobrekalini@gmail.com
Fri, 10 Sep 2021 14:06:29 +0000
3 files changed,
99 insertions(+),
36 deletions(-)
M
CMakeLists.txt
→
CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.10) project(nimisewi - VERSION 0.2.0 + VERSION 0.3.0 DESCRIPTION "small program that generates random toki pona noun phrase" HOMEPAGE_URL "https://fsl.aaoth.xyz/nimisewi.c/home")@@ -24,34 +24,70 @@ include(CheckIncludeFile)
include(CheckSymbolExists) include(CheckCSourceCompiles) +set(WARNING_STATIC_BUILD "static build won't work here") + # check libraries cmake_host_system_information(RESULT OS_NAME QUERY OS_NAME) message(VERBOSE "OS_NAME is ${OS_NAME}") if(OS_NAME MATCHES "Linux") check_include_file("bsd/string.h" HAVE_BSD_STRING_H) - if(HAVE_BSD_STRING_H) + check_include_file("bsd/stdlib.h" HAVE_BSD_STDLIB_H) + if(HAVE_BSD_STRING_H AND HAVE_BSD_STDLIB_H) set(CMAKE_REQUIRED_LIBRARIES "bsd") + check_symbol_exists(strlcat "bsd/string.h" HAVE_STRLCAT) if (HAVE_STRLCAT) list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STRING_H HAVE_STRLCAT) endif() + + check_symbol_exists(arc4random_uniform "bsd/stdlib.h" + HAVE_ARC4RANDOM_UNIFORM) + if (HAVE_ARC4RANDOM_UNIFORM) + list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STDLIB_H HAVE_ARC4RANDOM_UNIFORM) + endif() + + # check static libraries set(CMAKE_REQUIRED_LINK_OPTIONS "-static") check_c_source_compiles( - "#include<bsd/string.h>\nint main(void){return 0;}" HAVE_LIBBSD_STATIC) - if(NOT HAVE_LIBBSD_STATIC) - message(WARNING "static build won't work here") + "#include<bsd/string.h>\nint main(void){return 0;}" + HAVE_LIBBSD_STATIC) + # libpthread and libmd are needed when linking statically on linux. + # these test aren't really checking particular functions, but + # they are here to make sure that program could be linked statically + unset(CMAKE_REQUIRED_LIBRARIES) + set(CMAKE_REQUIRED_LIBRARIES "pthread") + check_c_source_compiles( + "#include<pthread.h>\nint main(void){return 0;}" + HAVE_LIBPTHREAD_STATIC) + + unset(CMAKE_REQUIRED_LIBRARIES) + set(CMAKE_REQUIRED_LIBRARIES "md") + check_c_source_compiles( + "#include<sha2.h>\nint main(void){return 0;}" + HAVE_LIBMD_STATIC) + + if(NOT (HAVE_LIBBSD_STATIC + AND HAVE_LIBPTHREAD_STATIC + AND HAVE_LIBMD_STATIC)) + message(WARNING ${WARNING_STATIC_BUILD}) endif() - list(APPEND EXTRA_LIBS bsd) + + list(APPEND EXTRA_LIBS bsd pthread md) unset(CMAKE_REQUIRED_LIBRARIES) unset(CMAKE_REQUIRED_LINK_OPTIONS) endif() endif() + if(OS_NAME MATCHES "(.*BSD)|(DragonFly)") check_symbol_exists(strlcat "string.h" HAVE_STRLCAT) if(HAVE_STRLCAT) list(APPEND EXTRA_DEFINITIONS HAVE_STRLCAT) endif() + check_symbol_exists(arc4random_uniform "stdlib.h" HAVE_ARC4RANDOM_UNIFORM) + if(HAVE_ARC4RANDOM_UNIFORM) + list(APPEND EXTRA_DEFINITIONS HAVE_ARC4RANDOM_UNIFORM) + endif() check_symbol_exists(pledge "unistd.h" HAVE_PLEDGE) if(HAVE_PLEDGE) list(APPEND EXTRA_DEFINITIONS HAVE_PLEDGE)@@ -63,7 +99,7 @@ check_c_source_compiles(
"#include<stdio.h>\nint main(void){return 0;}" HAVE_LIBC_STATIC ) if(NOT HAVE_LIBC_STATIC) - message(WARNING "static build won't work here") + message(WARNING ${WARNING_STATIC_BUILD}) endif() target_link_libraries(nimisewi PUBLIC ${EXTRA_LIBS})@@ -71,7 +107,7 @@ target_compile_definitions(nimisewi PRIVATE ${EXTRA_DEFINITIONS})
set(NIMISEWI_CGI_STATIC_BUILD FALSE) if(HAVE_LIBC_STATIC) - if(HAVE_BSD_STRING_H) + if(HAVE_BSD_STRING_H AND HAVE_BSD_STDLIB_H) if(HAVE_LIBBSD_STATIC) set(NIMISEWI_CGI_STATIC_BUILD TRUE) endif()@@ -88,9 +124,11 @@ add_executable(nimisewi.cgi cgi.c nimisewi.c
${PROJECT_BINARY_DIR}/nimitoki.c) option(CGI_INSTALL_DIR "specify installation directory of cgi script") if(CGI_INSTALL_DIR) - set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR ${CGI_INSTALL_DIR}) + set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR + ${CGI_INSTALL_DIR}) else() - set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR "var/www/htdocs/cgi-bin") + set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR + "var/www/htdocs/cgi-bin") endif() target_include_directories(nimisewi.cgi PUBLIC "${PROJECT_BINARY_DIR}") target_compile_definitions(nimisewi.cgi PRIVATE ${EXTRA_DEFINITIONS})@@ -106,9 +144,11 @@ add_executable(nimisewi_gemini.cgi cgi_gemini.c nimisewi.c
${PROJECT_BINARY_DIR}/nimitoki.c) option(GEMINI_CGI_INSTALL_DIR "specify installation directory of cgi script") if(GEMINI_CGI_INSTALL_DIR) - set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR ${GEMINI_CGI_INSTALL_DIR}) + set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR + ${GEMINI_CGI_INSTALL_DIR}) else() - set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR "var/gemini/cgi-bin") + set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR + "var/gemini/cgi-bin") endif() target_include_directories(nimisewi_gemini.cgi PUBLIC "${PROJECT_BINARY_DIR}") target_compile_definitions(nimisewi_gemini.cgi PRIVATE ${EXTRA_DEFINITIONS})@@ -136,13 +176,16 @@ set(CPACK_PROJECT_VERSION_MAJOR ${nimisewi_VERSION_MAJOR})
set(CPACK_PROJECT_VERSION_MINOR ${nimisewi_VERSION_MINOR}) set(CPACK_PROJECT_VERSION_PATCH ${nimisewi_VERSION_PATCH}) set(CPACK_PACKAGE_FILE_NAME - ${CMAKE_PROJECT_NAME}-${nimisewi_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) + ${CMAKE_PROJECT_NAME}-${nimisewi_VERSION} + -${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) set(CPACK_GENERATOR "TGZ" "ZIP") set(CPACK_SOURCE_GENERATOR "TGZ" "ZIP") set(CPACK_SOURCE_IGNORE_FILES \.fslckout \.fossil-settings build/ + utils/ + download.md ) set(CPACK_STRIP_FILES TRUE) include(CPack)
M
nimisewi.c
→
nimisewi.c
@@ -29,17 +29,22 @@
#include <config.h> #include <err.h> #include <stdio.h> -#include <stdlib.h> #include <unistd.h> +#include <stdint.h> +#include <sys/types.h> +#include <sys/time.h> -#ifdef HAVE_BSD_STRING_H -#include <bsd/string.h> +#ifdef HAVE_BSD_STDLIB_H + #include <bsd/stdlib.h> #else -#include <string.h> + #include <stdlib.h> #endif -#include <sys/types.h> -#include <sys/time.h> +#ifdef HAVE_BSD_STRING_H + #include <bsd/string.h> +#else + #include <string.h> +#endif #include "nimisewi.h" #include "nimitoki.h" /* nimi_toki, suli_pi_nimi_toki */@@ -53,6 +58,27 @@ int *nanpa_sewi_nimi; /* random indices of words */
size_t suli_pi_nimi_sewi; /* length of generated phrase */ }; +static uint32_t +nsrand(uint32_t limit) +{ +#ifdef HAVE_ARC4RANDOM_UNIFORM + return arc4random_uniform(limit); +#else + return rand() % limit; +#endif +} + +static size_t +catstr(char *dst, const char *src, size_t size) +{ +#ifdef HAVE_STRLCAT + return strlcat(dst, src, size); +#else + strncat(dst, src, size); + return strlen(dst); +#endif +} + static void open_e_nanpa_sewi(void) {@@ -109,7 +135,7 @@ *
* - word1 word2 word3 * - word1 pi word2 word3 */ - nn->pi_li_lon = rand() % 2; + nn->pi_li_lon = nsrand(2); } else if (nn->nanpa_nimi > 2) { nn->pi_li_lon = 1; }@@ -142,7 +168,7 @@ nn->nanpa_pi = -1;
nn->nanpa_sewi_nimi = NULL; nn->suli_pi_nimi_sewi = 0; - nn->nanpa_nimi = (rand() % 6); + nn->nanpa_nimi = (nsrand(6)); /* to use with arbitrary wordlist, remove following function call */ nanpa_nimi_pana_e_pi(nn);@@ -153,7 +179,7 @@ free(nn);
return NULL; } for (i = 0; i <= nn->nanpa_nimi; i++) { - nn->nanpa_sewi_nimi[i] = rand() % suli_pi_nimi_toki; + nn->nanpa_sewi_nimi[i] = nsrand(suli_pi_nimi_toki); } if (nn->pi_li_lon) { nn->nanpa_sewi_nimi[nn->nanpa_pi] = -1;@@ -183,7 +209,9 @@ int i;
char *nimi_pana; struct nanpa_nimi *nn; +#ifndef HAVE_ARC4RANDOM_UNIFORM open_e_nanpa_sewi(); +#endif nn = pana_e_nanpa_nimi();@@ -194,25 +222,14 @@ return NULL;
} for (i = 0; i < nn->nanpa_nimi; i++) { -#ifdef HAVE_STRLCAT - strlcat(nimi_pana, + catstr(nimi_pana, pana_e_nimi(nn->nanpa_sewi_nimi[i]), nn->suli_pi_nimi_sewi); - strlcat(nimi_pana, " ", nn->suli_pi_nimi_sewi); -#else - strcat(nimi_pana, - pana_e_nimi(nn->nanpa_sewi_nimi[i])); - strcat(nimi_pana, " "); -#endif + catstr(nimi_pana, " ", nn->suli_pi_nimi_sewi); } -#ifdef HAVE_STRLCAT - strlcat(nimi_pana, + catstr(nimi_pana, pana_e_nimi(nn->nanpa_sewi_nimi[i]), nn->suli_pi_nimi_sewi); -#else - strcat(nimi_pana, - pana_e_nimi(nn->nanpa_sewi_nimi[i])); -#endif weka_e_nanpa_nimi(nn);