# include # include # include # include # include # include # include # include # include struct fpv { uint32_t len; uint8_t type; uint32_t ms; uint8_t pad[8]; } __attribute__((packed)); size_t out(int fd, uint8_t *data, size_t len) { int res = 0; while (len > 0) { size_t n; if ((n = write(fd, data, len)) > 0) { len -= n; data += n; res += n; } else { if (errno != EAGAIN) { printf("write: %s\n", strerror(errno)); } else { continue; } break; } } return res; } size_t in(int fd, uint8_t *data, size_t len) { int res = 0; while (len > 0) { size_t n = read(fd, data, len); if (n > 0) { len -= n; data += n; res += n; } else { if (n < 0) { if (errno != EAGAIN) { printf("read: %s\n", strerror(errno)); } else { continue; } } break; } } return res; } int main(int argc, char *argv[]) { struct fpv fpv; static uint8_t data[8 * 1024 * 1024]; int i; for (i = 1; i < argc; i++) { int fd = open(argv[i], O_RDONLY); if (fd >= 0) { while (1) { if (in(fd, (uint8_t*)&fpv, sizeof(fpv)) > 0) { if (in(fd, data, fpv.len) > 0) { switch (fpv.type) { case 0: out(fileno(stdout), data, fpv.len); break; default: continue; } } else { break; } } else { break; } } close(fd); } } return 0; }