t/fio-verify-state: pretty up output a bit
[fio.git] / t / verify-state.c
CommitLineData
98996ef9
JA
1/*
2 * Dump the contents of a verify state file in plain text
3 */
4#include <sys/types.h>
5#include <sys/stat.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <unistd.h>
9#include <errno.h>
10#include <fcntl.h>
11#include <string.h>
12#include "../log.h"
13#include "../os/os.h"
14#include "../verify-state.h"
15#include "../crc/crc32c.h"
16#include "debug.h"
17
18static void show_s(struct thread_io_list *s, unsigned int no_s)
19{
20 int i;
21
ac141834
JA
22 printf("Thread:\t\t%u\n", no_s);
23 printf("Name:\t\t%s\n", s->name);
24 printf("Completions:\t%llu\n", (unsigned long long) s->no_comps);
25 printf("Depth:\t\t%llu\n", (unsigned long long) s->depth);
26 printf("Number IOs:\t%llu\n", (unsigned long long) s->numberio);
27 printf("Index:\t\t%llu\n", (unsigned long long) s->index);
98996ef9
JA
28
29 printf("Completions:\n");
94a6e1bb
JA
30 for (i = 0; i < s->no_comps; i++) {
31 printf("\t(file=%2llu) %llu\n",
32 (unsigned long long) s->comps[i].fileno,
33 (unsigned long long) s->comps[i].offset);
34 }
35}
36
37static void show(struct thread_io_list *s, size_t size)
38{
39 int no_s;
40
41 no_s = 0;
42 do {
43 int i;
44
45 s->no_comps = le64_to_cpu(s->no_comps);
46 s->depth = le32_to_cpu(s->depth);
47 s->nofiles = le32_to_cpu(s->nofiles);
48 s->numberio = le64_to_cpu(s->numberio);
49 s->index = le64_to_cpu(s->index);
50
51 for (i = 0; i < s->no_comps; i++) {
52 s->comps[i].fileno = le64_to_cpu(s->comps[i].fileno);
53 s->comps[i].offset = le64_to_cpu(s->comps[i].offset);
54 }
55
56 show_s(s, no_s);
57 no_s++;
58 size -= __thread_io_list_sz(s->depth, s->nofiles);
59 s = (void *) s + __thread_io_list_sz(s->depth, s->nofiles);
60 } while (size != 0);
98996ef9
JA
61}
62
63static void show_verify_state(void *buf, size_t size)
64{
65 struct verify_state_hdr *hdr = buf;
66 struct thread_io_list *s;
67 uint32_t crc;
98996ef9
JA
68
69 hdr->version = le64_to_cpu(hdr->version);
70 hdr->size = le64_to_cpu(hdr->size);
71 hdr->crc = le64_to_cpu(hdr->crc);
72
ac141834
JA
73 printf("Version:\t0x%x\n", (unsigned int) hdr->version);
74 printf("Size:\t\t%u\n", (unsigned int) hdr->size);
75 printf("CRC:\t\t0x%x\n", (unsigned int) hdr->crc);
98996ef9
JA
76
77 size -= sizeof(*hdr);
78 if (hdr->size != size) {
79 log_err("Size mismatch\n");
80 return;
81 }
82
83 s = buf + sizeof(*hdr);
84 crc = fio_crc32c((unsigned char *) s, hdr->size);
85 if (crc != hdr->crc) {
86 log_err("crc mismatch %x != %x\n", crc, (unsigned int) hdr->crc);
87 return;
88 }
89
94a6e1bb
JA
90 if (hdr->version == 0x03)
91 show(s, size);
92 else
93 log_err("Unsupported version %d\n", (int) hdr->version);
98996ef9
JA
94}
95
96int main(int argc, char *argv[])
97{
98 struct stat sb;
99 void *buf;
100 int ret, fd;
101
102 debug_init();
103
104 if (argc < 2) {
105 log_err("Usage: %s <state file>\n", argv[0]);
106 return 1;
107 }
108
109 fd = open(argv[1], O_RDONLY);
110 if (fd < 0) {
111 log_err("open %s: %s\n", argv[1], strerror(errno));
112 return 1;
113 }
114
115 if (fstat(fd, &sb) < 0) {
116 log_err("stat: %s\n", strerror(errno));
117 close(fd);
118 return 1;
119 }
120
121 buf = malloc(sb.st_size);
122 ret = read(fd, buf, sb.st_size);
123 if (ret < 0) {
124 log_err("read: %s\n", strerror(errno));
125 close(fd);
126 return 1;
127 } else if (ret != sb.st_size) {
128 log_err("Short read\n");
129 close(fd);
130 return 1;
131 }
132
133 close(fd);
134 show_verify_state(buf, sb.st_size);
135
136 free(buf);
137 return 0;
138}