summaryrefslogtreecommitdiff
path: root/uicc/reader.c
blob: ea21b82851a6883bd44d12bf158e8cd140fbc2fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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); }