X-Git-Url: https://git.sesse.net/?p=fjl;a=blobdiff_plain;f=input.c;fp=input.c;h=2d80457a7202f08f9018ce5fe350e308dd84cae8;hp=0000000000000000000000000000000000000000;hb=352c52d38c212a2aa93a9970731c9d7a2f8d4dac;hpb=b8abdf976177386c5fe85712280a669ba80a41d2 diff --git a/input.c b/input.c new file mode 100644 index 0000000..2d80457 --- /dev/null +++ b/input.c @@ -0,0 +1,36 @@ +#include +#include +#include + +#include "input.h" + +void reliable_read(raw_input_func_t* input_func, void* userdata, uint8_t* buf, size_t len) +{ + while (len > 0) { + ssize_t bytes_read = input_func(userdata, buf, len); + assert(bytes_read <= (ssize_t)len); + + // TODO: We need better error handling here. setjmp()/longjmp() + // should hopefully do the trick, but we need to take care for + // suspension. + if (bytes_read == (ssize_t)-1) { + fprintf(stderr, "Input function returned error\n"); + exit(1); + } + if (bytes_read == 0) { + fprintf(stderr, "Premature EOF\n"); + exit(1); + } + + buf += bytes_read; + len -= bytes_read; + } +} + +uint16_t read_length(raw_input_func_t* input_func, void* userdata) +{ + uint8_t buf[2]; + reliable_read(input_func, userdata, buf, 2); + return (buf[0] << 8) | buf[1]; +} +