feat(ltm): add file data support
All checks were successful
ci/woodpecker/push/build Pipeline was successful

This commit is contained in:
Jef Roosens 2023-12-16 22:15:21 +01:00
parent c7a1fec6c2
commit 53c2313953
Signed by: Jef Roosens
GPG key ID: B75D4F293C7052DB
7 changed files with 86 additions and 4 deletions

View file

@ -1,4 +1,5 @@
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include "ltm/common.h"
@ -41,9 +42,13 @@ void ltm_instance_free(ltm_instance *instance) {
case ltm_instance_block_type_buf_owned:
free(block->data.ptr);
break;
case ltm_instance_block_type_file_owned:
fclose(block->data.ptr);
break;
case ltm_instance_block_type_nested:
ltm_instance_free(block->data.ptr);
break;
case ltm_instance_block_type_file:
case ltm_instance_block_type_buf:;
}
@ -204,6 +209,8 @@ size_t ltm_instance_size(const ltm_instance *instance) {
switch (block->type) {
case ltm_instance_block_type_buf:
case ltm_instance_block_type_buf_owned:
case ltm_instance_block_type_file:
case ltm_instance_block_type_file_owned:
total += block->data.len;
break;
case ltm_instance_block_type_nested:
@ -219,6 +226,8 @@ size_t ltm_instance_size(const ltm_instance *instance) {
ltm_err ltm_instance_write(size_t *written, char *buf, size_t len,
ltm_instance *instance) {
*written = 0;
while ((*written < len) && (instance->blocks.current != NULL)) {
ltm_instance_block *current = instance->blocks.current;
@ -227,7 +236,8 @@ ltm_err ltm_instance_write(size_t *written, char *buf, size_t len,
case ltm_instance_block_type_buf_owned: {
size_t cap =
LTM_MIN(current->data.len - instance->written, len - *written);
memcpy(&buf[*written], current->data.ptr, cap);
memcpy(&buf[*written], &((char *)current->data.ptr)[instance->written],
cap);
*written += cap;
instance->written += cap;
@ -236,6 +246,24 @@ ltm_err ltm_instance_write(size_t *written, char *buf, size_t len,
instance->written = 0;
}
} break;
case ltm_instance_block_type_file:
case ltm_instance_block_type_file_owned: {
size_t cap =
LTM_MIN(current->data.len - instance->written, len - *written);
size_t read = fread(&buf[*written], 1, cap, current->data.ptr);
if ((read == 0) && (ferror(current->data.ptr) != 0)) {
return ltm_err_failed_io;
}
*written += read;
instance->written += read;
if (instance->written == current->data.len) {
instance->blocks.current = current->next;
instance->written = 0;
}
} break;
case ltm_instance_block_type_nested: {
size_t nested_written = 0;
ltm_err res = ltm_instance_write(&nested_written, &buf[*written],