#include #include #include #include #include #include ssize_t hexagram_pcapng_stream_read(fd, handler, error) int fd; hexagram_pcapng_block_handler *handler; int *error; { hexagram_pcapng_block_header header; hexagram_pcapng_block_footer footer; ssize_t total = 0; while (1) { ssize_t readlen; if ((readlen = read(fd, &header, sizeof(header))) < 0) { *error = HEXAGRAM_PCAPNG_ERROR_IO; goto error_io; } else if (readlen == 0) { goto done; } else if (readlen < sizeof(header)) { *error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED; goto error_io; } total += readlen; if (handler(fd, header.type, header.length - sizeof(header) - sizeof(footer)) < 0) { *error = HEXAGRAM_PCAPNG_ERROR_HANDLER; goto error_io; } if ((readlen = read(fd, &footer, sizeof(footer))) < 0) { *error = HEXAGRAM_PCAPNG_ERROR_IO; goto error_io; } else if (readlen == 0) { goto done; } else if (readlen < sizeof(footer)) { *error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED; goto error_io; } if (footer.length != header.length) { *error = HEXAGRAM_PCAPNG_ERROR_FORMAT; goto error_io; } } *error = HEXAGRAM_PCAPNG_ERROR_OK; done: return total; error_io: return -1; }