From b0870f3ab4d4ecd4625eca1a20d7b8d9ac1aacc7 Mon Sep 17 00:00:00 2001 From: Matthew Larson Date: Thu, 2 May 2024 15:21:23 -0500 Subject: [PATCH] Implement RV_strtok_r --- config/cmake/ConfigureChecks.cmake | 5 ++++- config/cmake/rv_cmake_config.h.in | 6 +++++- src/rest_vol.c | 33 +++++++++++++++++++++++++----- src/rest_vol.h | 4 ++++ 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake index 442f3e8f..39a2c1e6 100644 --- a/config/cmake/ConfigureChecks.cmake +++ b/config/cmake/ConfigureChecks.cmake @@ -29,6 +29,9 @@ SET (H5_DEFAULT_VOL H5VL_NATIVE) # Find the library containing clock_gettime() CHECK_FUNCTION_EXISTS (clock_gettime CLOCK_GETTIME_IN_LIBC) +CHECK_FUNCTION_EXISTS (gettimeofday RV_HAVE_GETTIMEOFDAY) +CHECK_FUNCTION_EXISTS(strtok_r RV_HAVE_STRTOK_R) +CHECK_FUNCTION_EXISTS(strtok_s RV_HAVE_STRTOK_s) CHECK_LIBRARY_EXISTS (rt clock_gettime "" CLOCK_GETTIME_IN_LIBRT) CHECK_LIBRARY_EXISTS (posix4 clock_gettime "" CLOCK_GETTIME_IN_LIBPOSIX4) if (CLOCK_GETTIME_IN_LIBC) @@ -41,7 +44,7 @@ elseif (CLOCK_GETTIME_IN_LIBPOSIX4) list (APPEND LINK_LIBS posix4) endif () -CHECK_FUNCTION_EXISTS (gettimeofday RV_HAVE_GETTIMEOFDAY) + # ----------------------------------------------------------------------- # wrapper script variables # diff --git a/config/cmake/rv_cmake_config.h.in b/config/cmake/rv_cmake_config.h.in index 2694b37d..a616b1ca 100644 --- a/config/cmake/rv_cmake_config.h.in +++ b/config/cmake/rv_cmake_config.h.in @@ -24,7 +24,11 @@ /* Define to 1 if you have the `gettimeofday' function. */ #cmakedefine RV_HAVE_GETTIMEOFDAY @RV_HAVE_GETTIMEOFDAY@ -#cmakedefine RV_TEST_VAR @RV_TEST_VAR@ +/* Define to 1 if you have the `strtok_r` function */ +#cmakedefine RV_HAVE_STRTOK_R @RV_HAVE_STRTOK_R@ + +/* Define to 1 if you have the `strtok_s` function */ +#cmakedefine RV_HAVE_STRTOK_S @RV_HAVE_STRTOK_S@ /* Define if Darwin or Mac OS X */ #cmakedefine RV_HAVE_DARWIN @RV_HAVE_DARWIN@ diff --git a/src/rest_vol.c b/src/rest_vol.c index bf2d0a23..2b6f84c0 100644 --- a/src/rest_vol.c +++ b/src/rest_vol.c @@ -3458,8 +3458,9 @@ RV_parse_server_version(char *HTTP_response, const void *callback_data_in, void herr_t ret_value = SUCCEED; server_api_version *server_version = (server_api_version *)callback_data_out; - char *version_response = NULL; - char *version_field = NULL; + char *version_response = NULL; + char *version_field = NULL; + char *saveptr; int numeric_version_field = 0; #ifdef RV_CONNECTOR_DEBUG @@ -3486,7 +3487,7 @@ RV_parse_server_version(char *HTTP_response, const void *callback_data_in, void FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server version was NULL"); /* Parse server version into struct */ - if (NULL == (version_field = strtok(version_response, "."))) + if (NULL == (version_field = RV_strtok_r(version_response, ".", &saveptr))) FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server major version field was NULL"); if ((numeric_version_field = (int)strtol(version_field, NULL, 10)) < 0) @@ -3494,7 +3495,7 @@ RV_parse_server_version(char *HTTP_response, const void *callback_data_in, void server_version->major = (size_t)numeric_version_field; - if (NULL == (version_field = strtok(NULL, "."))) + if (NULL == (version_field = RV_strtok_r(NULL, ".", &saveptr))) FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server minor version field was NULL"); if ((numeric_version_field = (int)strtol(version_field, NULL, 10)) < 0) @@ -3502,7 +3503,7 @@ RV_parse_server_version(char *HTTP_response, const void *callback_data_in, void server_version->minor = (size_t)numeric_version_field; - if (NULL == (version_field = strtok(NULL, "."))) + if (NULL == (version_field = RV_strtok_r(NULL, ".", &saveptr))) FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server patch version field was NULL"); if ((numeric_version_field = (int)strtol(version_field, NULL, 10)) < 0) @@ -4481,3 +4482,25 @@ RV_now_usec(void) done: return (ret_value); } + +/*------------------------------------------------------------------------- + * Function: RV_strtok_r + * + * Purpose: Helper function to use strtok_r or strtok_r depending on current platform + * + * Return: See strtok_r documentation + * + * Programmer: Matthew Larson + * May, 2024 + */ +char * +RV_strtok_r(char *str, const char *delim, char **saveptr) +{ +#ifdef RV_HAVE_STRTOK_R + return strtok_r(str, delim, saveptr); +#elif RV_HAVE_STRTOK_S + return strtok_s(str, delim, saveptr); +#else + return NULL; +#endif +} \ No newline at end of file diff --git a/src/rest_vol.h b/src/rest_vol.h index 38244df3..a12153b3 100644 --- a/src/rest_vol.h +++ b/src/rest_vol.h @@ -817,9 +817,13 @@ herr_t RV_get_cmpd_subset_type(hid_t src_type_id, hid_t dst_type_id, RV_subset_t /* Helper to get information about members in dst that are included in src compound */ herr_t RV_get_cmpd_subset_nmembers(hid_t src_type_id, hid_t dst_type_id, size_t *num_cmpd_members); + /* Return the current time as microseconds after the UNIX epoch. */ uint64_t RV_now_usec(void); +/* System-indepedent wrapper for strtok_r/strtok_s */ +char *RV_strtok_r(char *str, const char *delim, char **saveptr); + #define SERVER_VERSION_MATCHES_OR_EXCEEDS(version, major_needed, minor_needed, patch_needed) \ (version.major > major_needed) || (version.major == major_needed && version.minor > minor_needed) || \ (version.major == major_needed && version.minor == minor_needed && version.patch >= patch_needed)