]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
change client with write callback
authorBastian Dehn <hhaalo@arcor.de>
Fri, 14 Feb 2025 08:01:27 +0000 (09:01 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Fri, 14 Feb 2025 08:01:27 +0000 (09:01 +0100)
src/kds_s2000w_client.c

index 7fd64addbccd427ae419b29e7ebeb34db22e62b5..3ff17a59bb72161b4c9b1ebbb648a71a71ed8170 100644 (file)
@@ -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;