From b041dc3392e6326e8afc166b08b9e484338983b6 Mon Sep 17 00:00:00 2001 From: liuxianliang Date: Wed, 27 Jul 2022 13:39:38 +0800 Subject: [PATCH] use rt_xxx whose RT-Thread threadsafe api to instead of strandard libc api. --- inc/webclient.h | 39 ++++++++++++++++++++++++++++++++++----- src/webclient.c | 30 +++++++++++++++--------------- src/webclient_file.c | 16 ++++++++-------- 3 files changed, 57 insertions(+), 28 deletions(-) diff --git a/inc/webclient.h b/inc/webclient.h index cb66412..ae6f103 100644 --- a/inc/webclient.h +++ b/inc/webclient.h @@ -29,23 +29,52 @@ extern "C" { #endif #ifndef web_malloc -#define web_malloc rt_malloc +#define web_malloc rt_malloc #endif #ifndef web_calloc -#define web_calloc rt_calloc +#define web_calloc rt_calloc #endif #ifndef web_realloc -#define web_realloc rt_realloc +#define web_realloc rt_realloc #endif #ifndef web_free -#define web_free rt_free +#define web_free rt_free +#endif + +/** + * The gcc libc api is not threadsafe, + * especially the float type operation. + * So, use rt_xxx whose RT-Thread threadsafe api to instead of strandard libc api. + */ +#ifndef web_memset +#define web_memset rt_memset +#endif + +#ifndef web_memcpy +#define web_memcpy rt_memcpy +#endif + +#ifndef web_memcmp +#define web_memcmp rt_memcmp +#endif + +#ifndef web_snprintf +#define web_snprintf rt_snprintf +#endif + +#ifndef web_vsnprintf +#define web_vsnprintf rt_vsnprintf #endif #ifndef web_strdup -#define web_strdup rt_strdup +#define web_strdup rt_strdup +#endif + +#ifndef web_strndup +#define web_strndup rt_strndup #endif #define WEBCLIENT_SW_VERSION "2.3.0" diff --git a/src/webclient.c b/src/webclient.c index 4933da9..167c0e4 100644 --- a/src/webclient.c +++ b/src/webclient.c @@ -298,7 +298,7 @@ static int webclient_resolve_address(struct webclient_session *session, struct a struct addrinfo hint; int ret; - memset(&hint, 0, sizeof(hint)); + web_memset(&hint, 0, sizeof(hint)); ret = getaddrinfo(session->host, port_str, &hint, res); if (ret != 0) { @@ -533,7 +533,7 @@ int webclient_header_fields_add(struct webclient_session *session, const char *f RT_ASSERT(session->header->buffer); va_start(args, fmt); - length = vsnprintf(session->header->buffer + session->header->length, + length = web_vsnprintf(session->header->buffer + session->header->length, session->header->size - session->header->length, fmt, args); va_end(args); if (length < 0) @@ -655,7 +655,7 @@ static int webclient_send_header(struct webclient_session *session, int method) if (method != WEBCLIENT_USER_METHOD) { /* check and add fields header data */ - if (memcmp(header, "HTTP/1.", strlen("HTTP/1."))) + if (web_memcmp(header, "HTTP/1.", strlen("HTTP/1."))) { char *header_buffer = RT_NULL; int length = 0; @@ -670,13 +670,13 @@ static int webclient_send_header(struct webclient_session *session, int method) /* splice http request header data */ if (method == WEBCLIENT_GET) - length = snprintf(session->header->buffer, session->header->size, "GET %s HTTP/1.1\r\n%s", + length = web_snprintf(session->header->buffer, session->header->size, "GET %s HTTP/1.1\r\n%s", session->req_url ? session->req_url : "/", header_buffer); else if (method == WEBCLIENT_POST) - length = snprintf(session->header->buffer, session->header->size, "POST %s HTTP/1.1\r\n%s", + length = web_snprintf(session->header->buffer, session->header->size, "POST %s HTTP/1.1\r\n%s", session->req_url ? session->req_url : "/", header_buffer); else if (method == WEBCLIENT_HEAD) - length = snprintf(session->header->buffer, session->header->size, "HEAD %s HTTP/1.1\r\n%s", + length = web_snprintf(session->header->buffer, session->header->size, "HEAD %s HTTP/1.1\r\n%s", session->req_url ? session->req_url : "/", header_buffer); session->header->length = length; @@ -702,7 +702,7 @@ static int webclient_send_header(struct webclient_session *session, int method) } /* header data end */ - snprintf(session->header->buffer + session->header->length, session->header->size - session->header->length, "\r\n"); + web_snprintf(session->header->buffer + session->header->length, session->header->size - session->header->length, "\r\n"); session->header->length += 2; /* check header size */ @@ -765,7 +765,7 @@ int webclient_handle_response(struct webclient_session *session) RT_ASSERT(session); /* clean header buffer and size */ - memset(session->header->buffer, 0x00, session->header->size); + web_memset(session->header->buffer, 0x00, session->header->size); session->header->length = 0; LOG_D("response header:"); @@ -966,7 +966,7 @@ int webclient_get(struct webclient_session *session, const char *URI) webclient_clean(session); /* clean webclient session header */ session->header->length = 0; - memset(session->header->buffer, 0, session->header->size); + web_memset(session->header->buffer, 0, session->header->size); rc = webclient_get(session, new_url); @@ -1020,7 +1020,7 @@ int webclient_shard_head_function(struct webclient_session *session, const char } /* clean header buffer and size */ - memset(session->header->buffer, 0x00, session->header->size); + web_memset(session->header->buffer, 0x00, session->header->size); session->header->length = 0; rc = webclient_send_header(session, WEBCLIENT_HEAD); @@ -1071,7 +1071,7 @@ int webclient_shard_position_function(struct webclient_session *session, const c total_len = start + length; /* clean header buffer and size */ - memset(session->header->buffer, 0x00, session->header->size); + web_memset(session->header->buffer, 0x00, session->header->size); session->header->length = 0; for(start_position = end_position; total_len != end_position + 1;) @@ -1120,7 +1120,7 @@ int webclient_shard_position_function(struct webclient_session *session, const c webclient_clean(session); /* clean webclient session header */ session->header->length = 0; - memset(session->header->buffer, 0, session->header->size); + web_memset(session->header->buffer, 0, session->header->size); rc = webclient_shard_position_function(session, new_url, start, length, mem_size); @@ -1173,7 +1173,7 @@ int webclient_shard_position_function(struct webclient_session *session, const c } /* clean header buffer and size */ - memset(session->header->buffer, 0x00, session->header->size); + web_memset(session->header->buffer, 0x00, session->header->size); session->header->length = 0; } @@ -1269,7 +1269,7 @@ static int webclient_next_chunk(struct webclient_session *session) RT_ASSERT(session); - memset(line, 0x00, sizeof(line)); + web_memset(line, 0x00, sizeof(line)); length = webclient_read_line(session, line, sizeof(line)); if (length > 0) { @@ -1712,7 +1712,7 @@ int webclient_request_header_add(char **request_header, const char *fmt, ...) va_start(args, fmt); header_length = strlen(header); - length = vsnprintf(header + header_length, WEBCLIENT_HEADER_BUFSZ - header_length, fmt, args); + length = web_vsnprintf(header + header_length, WEBCLIENT_HEADER_BUFSZ - header_length, fmt, args); if (length < 0) { LOG_E("add request header data failed, return length(%d) error.", length); diff --git a/src/webclient_file.c b/src/webclient_file.c index 2bce5ca..2ad98f1 100644 --- a/src/webclient_file.c +++ b/src/webclient_file.c @@ -191,17 +191,17 @@ int webclient_post_file(const char* URI, const char* filename, header_ptr = header; /* build boundary */ - snprintf(boundary, sizeof(boundary), "----------------------------%012d", rt_tick_get()); + web_snprintf(boundary, sizeof(boundary), "----------------------------%012d", rt_tick_get()); /* build encapsulated mime_multipart information*/ buffer_ptr = buffer; /* first boundary */ - buffer_ptr += snprintf((char*) buffer_ptr, + buffer_ptr += web_snprintf((char*) buffer_ptr, WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer), "--%s\r\n", boundary); - buffer_ptr += snprintf((char*) buffer_ptr, + buffer_ptr += web_snprintf((char*) buffer_ptr, WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer), "Content-Disposition: form-data; %s\r\n", form_data); - buffer_ptr += snprintf((char*) buffer_ptr, + buffer_ptr += web_snprintf((char*) buffer_ptr, WEBCLIENT_RESPONSE_BUFSZ - (buffer_ptr - buffer), "Content-Type: application/octet-stream\r\n\r\n"); /* calculate content-length */ @@ -209,10 +209,10 @@ int webclient_post_file(const char* URI, const char* filename, length += strlen(boundary) + 8; /* add the last boundary */ /* build header for upload */ - header_ptr += snprintf(header_ptr, + header_ptr += web_snprintf(header_ptr, WEBCLIENT_HEADER_BUFSZ - (header_ptr - header), "Content-Length: %d\r\n", length); - header_ptr += snprintf(header_ptr, + header_ptr += web_snprintf(header_ptr, WEBCLIENT_HEADER_BUFSZ - (header_ptr - header), "Content-Type: multipart/form-data; boundary=%s\r\n", boundary); @@ -248,7 +248,7 @@ int webclient_post_file(const char* URI, const char* filename, } /* send last boundary */ - snprintf((char*) buffer, WEBCLIENT_RESPONSE_BUFSZ, "\r\n--%s--\r\n", boundary); + web_snprintf((char*) buffer, WEBCLIENT_RESPONSE_BUFSZ, "\r\n--%s--\r\n", boundary); webclient_write(session, buffer, strlen(boundary) + 8); extern int webclient_handle_response(struct webclient_session *session); @@ -263,7 +263,7 @@ int webclient_post_file(const char* URI, const char* filename, { int bytes_read = 0; - memset(buffer, 0x00, WEBCLIENT_RESPONSE_BUFSZ); + web_memset(buffer, 0x00, WEBCLIENT_RESPONSE_BUFSZ); do { bytes_read = webclient_read(session, buffer,