⬢ DragonFlyBSD Kernel Audit
DF-5171 / odcat.c
← back to finding ↓ download raw
/* 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);
}