DF-5171 / odcat.c
/* odcat - read a file with O_DIRECT (bypass guest buffer cache) and print * printable runs (>=4 chars). Used to read /marker out of root.img after a * vkernel run wrote it via its own O_DIRECT I/O. */ #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { static char buf[1 << 20]; char run[256]; int fd, n, i, rl = 0; if (argc < 2) return (1); fd = open(argv[1], O_RDONLY | O_DIRECT); if (fd < 0) { perror("open"); return (1); } while ((n = read(fd, buf, sizeof(buf))) > 0) { for (i = 0; i < n; i++) { if (buf[i] >= 32 && buf[i] < 127) { if (rl < (int)sizeof(run) - 1) run[rl++] = buf[i]; } else { if (rl >= 4) printf("%.*s\n", rl, run); rl = 0; } } } if (rl >= 4) printf("%.*s\n", rl, run); return (0); } |