source: mainline/uspace/app/testread/testread.c@ b5746a2

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since b5746a2 was 1d6dd2a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 8 years ago

Remove unnecessary includes from <stdio.h>.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Copyright (c) 2011 Martin Sucha
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup test
30 * @{
31 */
32
33/**
34 * @file testread.c
35 * This program checks if the file contains a pattern of increasing
36 * 64 bit unsigned integers (that may overflow at some point)
37 * stored in little endian byte order.
38 * This is to verify that the filesystem reads
39 * the files correctly.
40 * If the file does not contain specified pattern, it stops
41 * at the point where the file does not match and prints
42 * the byte offset at which the error occured.
43 * While checking the file, the program displays how many megabytes
44 * it has already read, how long it took to read the last megabyte
45 * and current and average read speed.
46 *
47 */
48
49#include <stdio.h>
50#include <stdlib.h>
51#include <stddef.h>
52#include <stdint.h>
53#include <mem.h>
54#include <loc.h>
55#include <byteorder.h>
56#include <inttypes.h>
57#include <errno.h>
58#include <time.h>
59#include <offset.h>
60#include <str.h>
61
62#define NAME "testread"
63#define BUFELEMS 1024
64#define MBYTE (1024*1024)
65
66static void syntax_print(void);
67
68int main(int argc, char **argv)
69{
70
71 FILE *file;
72 char *file_name;
73 uint64_t *buf;
74 uint64_t expected;
75 aoff64_t offset;
76 aoff64_t next_mark;
77 aoff64_t last_mark;
78 unsigned int i;
79 bool check_enabled = true;
80 bool progress = true;
81
82 if (argc < 2) {
83 printf(NAME ": Error, argument missing.\n");
84 syntax_print();
85 return 1;
86 }
87
88 /* Skip program name */
89 --argc; ++argv;
90
91 if (argc > 0 && str_cmp(*argv, "--no-check") == 0) {
92 check_enabled = false;
93 --argc; ++argv;
94 }
95
96 if (argc > 0 && str_cmp(*argv, "--no-progress") == 0) {
97 progress = false;
98 --argc; ++argv;
99 }
100
101 if (argc != 1) {
102 printf(NAME ": Error, unexpected argument.\n");
103 syntax_print();
104 return 1;
105 }
106
107 file_name = *argv;
108
109 buf = calloc(BUFELEMS, sizeof(uint64_t));
110 if (buf == NULL) {
111 printf("Failed allocating buffer\n");
112 return 1;
113 }
114
115 file = fopen(file_name, "r");
116 if (file == NULL) {
117 printf("Failed opening file\n");
118 return 1;
119 }
120
121 expected = 0;
122 offset = 0;
123 next_mark = 0;
124 last_mark = 0;
125 struct timeval prev_time;
126 struct timeval start_time;
127 gettimeofday(&start_time, NULL);
128 prev_time = start_time;
129
130 while (!feof(file)) {
131 size_t elems = fread(buf, sizeof(uint64_t), BUFELEMS, file);
132 if (ferror(file)) {
133 printf("Failed reading file\n");
134 fclose(file);
135 free(buf);
136 return 1;
137 }
138
139 for (i = 0; i < elems; i++) {
140 if (check_enabled && uint64_t_le2host(buf[i]) != expected) {
141 printf("Unexpected value at offset %" PRIuOFF64 "\n", offset);
142 fclose(file);
143 free(buf);
144 return 2;
145 }
146 expected++;
147 offset += sizeof(uint64_t);
148 }
149
150 if (progress && offset >= next_mark) {
151 struct timeval cur_time;
152 gettimeofday(&cur_time, NULL);
153
154 uint32_t last_run = cur_time.tv_sec - prev_time.tv_sec;
155 uint32_t total_time = cur_time.tv_sec - start_time.tv_sec;
156 if (last_run > 0 && total_time > 0) {
157 printf("%" PRIuOFF64 "M - time: %u s, "
158 "cur: %"PRIuOFF64 " B/s, avg: %" PRIuOFF64 " B/s\n",
159 offset / MBYTE, last_run,
160 (offset-last_mark)/last_run,
161 offset/total_time);
162 prev_time = cur_time;
163 last_mark = offset;
164 }
165 next_mark += MBYTE;
166 }
167 }
168
169 struct timeval final_time;
170 gettimeofday(&final_time, NULL);
171
172 uint32_t total_run_time = final_time.tv_sec - start_time.tv_sec;
173 if (total_run_time > 0) {
174 printf("total bytes: %" PRIuOFF64
175 ", total time: %u s, avg speed: %" PRIuOFF64 " B/s\n",
176 offset,
177 total_run_time,
178 offset/total_run_time);
179 }
180
181 fclose(file);
182 free(buf);
183
184 return 0;
185}
186
187
188static void syntax_print(void)
189{
190 printf("syntax: testread <filename>\n");
191}
192
193/**
194 * @}
195 */
Note: See TracBrowser for help on using the repository browser.