feat(ltm): add file data support
All checks were successful
ci/woodpecker/push/build Pipeline was successful
All checks were successful
ci/woodpecker/push/build Pipeline was successful
This commit is contained in:
parent
c7a1fec6c2
commit
53c2313953
7 changed files with 86 additions and 4 deletions
|
|
@ -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],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue