summaryrefslogtreecommitdiff
path: root/uicc/reader.c
diff options
context:
space:
mode:
authorRoberto Esteves <contact@robertoesteves.dev>2025-07-28 09:05:23 -0300
committerRoberto Esteves <contact@robertoesteves.dev>2025-07-28 09:05:23 -0300
commit72163dc50dde4e07d9d4a17e872a302190fab0bc (patch)
tree9e550af0a411fdfe2badac6b7c7edbb7a767d9f1 /uicc/reader.c
init commitHEADmaster
Diffstat (limited to 'uicc/reader.c')
-rw-r--r--uicc/reader.c37
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); }