From: Bastian Dehn Date: Fri, 14 Feb 2025 08:01:27 +0000 (+0100) Subject: change client with write callback X-Git-Tag: v1.0.35^2~1^2~7 X-Git-Url: https://gitweb.hhaalo.de/?a=commitdiff_plain;h=a1ea138c0d0f375294875d93c69dec358dc764a6;p=sane-kds-s2000w-net.git change client with write callback --- diff --git a/src/kds_s2000w_client.c b/src/kds_s2000w_client.c index 7fd64ad..3ff17a5 100644 --- a/src/kds_s2000w_client.c +++ b/src/kds_s2000w_client.c @@ -26,6 +26,26 @@ CURL* curl = NULL; program_config* config = NULL; char* errbuf = NULL; +size_t _kds_s2000w_client_write_callback(char* ptr, size_t size, size_t nmemb, void* data) +{ + response* resp = (response*) data; + + resp->data = realloc(resp->data, resp->size + size * nmemb + 1); + char* respdata = (char*) resp->data; + memcpy(&respdata[resp->size], ptr, size * nmemb); + resp->size += size * nmemb; + + return size * nmemb; +} + +void _kds_s2000w_client_add_null_terminate_to_response(response* resp) +{ + resp->size++; + resp->data = realloc(resp->data, resp->size); + char* responsedata = (char*) resp->data; + responsedata[resp->size - 1] = '\0'; +} + void _kds_s2000w_client_print_error_status(CURL* curl) { struct curl_header* header = NULL; @@ -52,16 +72,6 @@ void _kds_s2000w_client_print_error_result(CURLcode result) kds_s2000w_debug_printf(ERROR, curl_easy_strerror(result)); } -void _kds_s2000w_client_stream_to_response(char* mem, response* resp, size_t* size) -{ - kds_s2000w_debug_printf(ALL, "kds_s2000w_client_stream_to_response"); - - size_t incl_null_term = *size + 1; - resp->data = malloc(sizeof(char) * incl_null_term); - resp->size = incl_null_term; - memcpy(resp->data, mem, incl_null_term); -} - void _kds_s2000w_client_set_ssl_verification_off(CURL* curl) { if (config->ssl_verify) @@ -148,11 +158,6 @@ uint8_t kds_s2000w_client_open_session(response* resp) headers = curl_slist_append(headers, ACCEPT_JSON_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - char* body = malloc(sizeof(char) * MAX_STR_BUFFER_LENGTH); memset(body, 0, MAX_STR_BUFFER_LENGTH); sprintf(body, "{\"OCPUserName\": \"%s\"}", config->username); @@ -161,16 +166,15 @@ uint8_t kds_s2000w_client_open_session(response* resp) _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; curl_slist_free_all(headers); @@ -179,12 +183,6 @@ uint8_t kds_s2000w_client_open_session(response* resp) body = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; return result; } @@ -247,37 +245,25 @@ uint8_t kds_s2000w_client_get_capabilities(response* resp) headers = curl_slist_append(headers, ACCEPT_JSON_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; curl_slist_free_all(headers); headers = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; return result; } @@ -307,37 +293,25 @@ uint8_t kds_s2000w_client_status_session(int64_t sessionid, response* resp) headers = curl_slist_append(headers, ACCEPT_JSON_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; curl_slist_free_all(headers); headers = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; free(header_str); header_str = NULL; @@ -366,38 +340,26 @@ uint8_t kds_s2000w_client_start_scan(int64_t sessionid, response* resp) headers = curl_slist_append(headers, ACCEPT_JSON_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0L); _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; curl_slist_free_all(headers); headers = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; free(header_str); header_str = NULL; @@ -426,38 +388,26 @@ uint8_t kds_s2000w_client_stop_scan(int64_t sessionid, response* resp) headers = curl_slist_append(headers, ACCEPT_JSON_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0L); _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; curl_slist_free_all(headers); headers = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; free(header_str); header_str = NULL; @@ -489,37 +439,25 @@ uint8_t kds_s2000w_client_get_image(int64_t sessionid, uint8_t img_number, respo headers = curl_slist_append(headers, ACCEPT_IMAGE_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; curl_slist_free_all(headers); headers = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; free(url_path); url_path = NULL; free(header_str); @@ -553,25 +491,19 @@ uint8_t kds_s2000w_client_delete_image(int64_t sessionid, uint8_t img_number, re headers = curl_slist_append(headers, ACCEPT_JSON_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; free(url_path); @@ -580,12 +512,6 @@ uint8_t kds_s2000w_client_delete_image(int64_t sessionid, uint8_t img_number, re headers = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; free(header_str); header_str = NULL; @@ -614,37 +540,25 @@ uint8_t kds_s2000w_client_get_option(int64_t sessionid, response* resp) headers = curl_slist_append(headers, ACCEPT_JSON_HEADER); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - char** mem = malloc(sizeof(char*)); - size_t* sizeloc = malloc(sizeof(size_t)); - FILE* stream = open_memstream(mem, sizeloc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stream); - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); _kds_s2000w_client_set_ssl_verification_off(curl); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _kds_s2000w_client_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); CURLcode result = curl_easy_perform(curl); + _kds_s2000w_client_add_null_terminate_to_response(resp); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp->code); _kds_s2000w_client_print_error_status(curl); _kds_s2000w_client_print_error_result(result); - fclose(stream); - stream = NULL; - _kds_s2000w_client_stream_to_response(*mem, resp, sizeloc); - curl_url_cleanup(url_handler); url_handler = NULL; curl_slist_free_all(headers); headers = NULL; curl_free(url); url = NULL; - free(*mem); - *mem = NULL; - free(mem); - mem = NULL; - free(sizeloc); - sizeloc = NULL; free(header_str); header_str = NULL;