2 * SPDX-License-Identifier: BSD-3-Clause
4 * Copyright (c) 1991, 1993, 1994
5 * The Regents of the University of California. All rights reserved.
7 * This code is derived from software contributed to Berkeley by
8 * Keith Muller of the University of California, San Diego and Lance
9 * Visser of Convex Computer Corporation.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * @(#)misc.c 8.3 (Berkeley) 4/2/94
36 * $FreeBSD: head/bin/dd/misc.c 338646 2018-09-13 14:54:46Z kevans $
39 #include <sys/types.h>
56 struct timespec end
, ts_res
;
59 if (clock_gettime(CLOCK_MONOTONIC
, &end
))
60 err(1, "clock_gettime");
61 if (clock_getres(CLOCK_MONOTONIC
, &ts_res
))
62 err(1, "clock_getres");
63 secs
= (end
.tv_sec
- st
.start
.tv_sec
) +
64 (end
.tv_nsec
- st
.start
.tv_nsec
) * 1e-9;
65 res
= ts_res
.tv_sec
+ ts_res
.tv_nsec
* 1e-9;
77 if (ddflags
& C_NOINFO
)
80 if (ddflags
& C_PROGRESS
)
81 fprintf(stderr
, "\n");
83 secs
= secs_elapsed();
85 fprintf(stderr
, "%ju+%ju records in\n%ju+%ju records out\n",
86 st
.in_full
, st
.in_part
, st
.out_full
, st
.out_part
);
88 fprintf(stderr
, "%ju odd length swab %s\n",
89 st
.swab
, (st
.swab
== 1) ? "block" : "blocks");
92 fprintf(stderr
, "%ju truncated %s\n",
93 st
.trunc
, (st
.trunc
== 1) ? "block" : "blocks");
95 if (!(ddflags
& C_NOXFER
)) {
97 "%ju bytes transferred in %.6f secs (%.0f bytes/sec)\n",
98 st
.bytes
, secs
, st
.bytes
/ secs
);
107 char si
[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
108 char iec
[4 + 1 + 3 + 1]; /* 123 <space> <suffix> NUL */
109 char persec
[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
113 secs
= secs_elapsed();
114 humanize_number(si
, sizeof(si
), (int64_t)st
.bytes
, "B", HN_AUTOSCALE
,
115 HN_DECIMAL
| HN_DIVISOR_1000
);
116 humanize_number(iec
, sizeof(iec
), (int64_t)st
.bytes
, "B", HN_AUTOSCALE
,
117 HN_DECIMAL
| HN_IEC_PREFIXES
);
118 humanize_number(persec
, sizeof(persec
), (int64_t)(st
.bytes
/ secs
), "B",
119 HN_AUTOSCALE
, HN_DECIMAL
| HN_DIVISOR_1000
);
120 asprintf(&buf
, " %'ju bytes (%s, %s) transferred %.3fs, %s/s",
121 (uintmax_t)st
.bytes
, si
, iec
, secs
, persec
);
122 outlen
= fprintf(stderr
, "%-*s\r", outlen
, buf
) - 1;
129 siginfo_handler(int signo __unused
)
135 sigalarm_handler(int signo __unused
)
144 _exit(sig
== 0 ? 0 : 1);