diff options
author | Roberto Esteves <contact@robertoesteves.dev> | 2025-07-28 09:05:23 -0300 |
---|---|---|
committer | Roberto Esteves <contact@robertoesteves.dev> | 2025-07-28 09:05:23 -0300 |
commit | 72163dc50dde4e07d9d4a17e872a302190fab0bc (patch) | |
tree | 9e550af0a411fdfe2badac6b7c7edbb7a767d9f1 /uicc/reader.c |
Diffstat (limited to 'uicc/reader.c')
-rw-r--r-- | uicc/reader.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/uicc/reader.c b/uicc/reader.c new file mode 100644 index 0000000..ea21b82 --- /dev/null +++ b/uicc/reader.c @@ -0,0 +1,37 @@ +#include <ui_utils.h> + +typedef struct { + int fd; + uint64_t buffer_size; + char *buffer; +} Reader; + +Reader *reader_open(Arena *arena, const char *path, uint64_t buffer_size) { + Reader *reader = {0}; + int fd; + + assert_failure(fd = open(path, O_RDONLY, O_NOFOLLOW), -1); + + reader = arena_type(arena, Reader); + reader->fd = fd; + reader->buffer_size = buffer_size; + reader->buffer = arena_array(arena, char, reader->buffer_size); + + return reader; +} + +void reader_advance(Reader *self, uint32_t *start, uint32_t *end) { + if (*end > self->buffer_size) { + if (*start == 0) { + /* TODO(roberto): maybe reallocate the buffer instead of crashing */ + crash_error("ERROR: token is too long\n"); + } + + assert_errno(lseek(self->fd, *start * -1, SEEK_CUR)); + assert_errno(read(self->fd, self->buffer, self->buffer_size)); + *end -= *start; + *start = 0; + } +} + +void reader_close(Reader *self) { close(self->fd); } |