misc.c revision 30246
1214501Srpaulo/*-
2214501Srpaulo * Copyright (c) 1991, 1993, 1994
3214501Srpaulo *	The Regents of the University of California.  All rights reserved.
4214501Srpaulo *
5252726Srpaulo * This code is derived from software contributed to Berkeley by
6252726Srpaulo * Keith Muller of the University of California, San Diego and Lance
7214501Srpaulo * Visser of Convex Computer Corporation.
8214501Srpaulo *
9214501Srpaulo * Redistribution and use in source and binary forms, with or without
10214501Srpaulo * modification, are permitted provided that the following conditions
11214501Srpaulo * are met:
12214501Srpaulo * 1. Redistributions of source code must retain the above copyright
13214501Srpaulo *    notice, this list of conditions and the following disclaimer.
14252726Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
15214501Srpaulo *    notice, this list of conditions and the following disclaimer in the
16214501Srpaulo *    documentation and/or other materials provided with the distribution.
17214501Srpaulo * 3. All advertising materials mentioning features or use of this software
18214501Srpaulo *    must display the following acknowledgement:
19214501Srpaulo *	This product includes software developed by the University of
20214501Srpaulo *	California, Berkeley and its contributors.
21214501Srpaulo * 4. Neither the name of the University nor the names of its contributors
22214501Srpaulo *    may be used to endorse or promote products derived from this software
23214501Srpaulo *    without specific prior written permission.
24214501Srpaulo *
25252726Srpaulo * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26214501Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27214501Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28214501Srpaulo * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29214501Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30214501Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31214501Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32214501Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33214501Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34214501Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35214501Srpaulo * SUCH DAMAGE.
36214501Srpaulo *
37214501Srpaulo *	$Id: misc.c,v 1.8 1997/10/08 12:59:14 eivind Exp $
38214501Srpaulo */
39214501Srpaulo
40214501Srpaulo#ifndef lint
41214501Srpaulostatic char const sccsid[] = "@(#)misc.c	8.3 (Berkeley) 4/2/94";
42214501Srpaulo#endif /* not lint */
43214501Srpaulo
44214501Srpaulo#include <sys/errno.h>
45214501Srpaulo#include <sys/types.h>
46214501Srpaulo#include <sys/time.h>
47214501Srpaulo
48214501Srpaulo#include <err.h>
49214501Srpaulo#include <stdio.h>
50214501Srpaulo#include <stdlib.h>
51214501Srpaulo#include <string.h>
52214501Srpaulo#include <time.h>
53214501Srpaulo#include <unistd.h>
54214501Srpaulo
55214501Srpaulo#include "dd.h"
56214501Srpaulo#include "extern.h"
57214501Srpaulo
58214501Srpaulovoid
59214501Srpaulosummary()
60214501Srpaulo{
61214501Srpaulo	struct timeval tv;
62214501Srpaulo	double secs;
63214501Srpaulo	char buf[100];
64214501Srpaulo
65214501Srpaulo	(void)gettimeofday(&tv, (struct timezone *)NULL);
66214501Srpaulo	secs = tv.tv_sec + tv.tv_usec * 1e-6 - st.start;
67214501Srpaulo	if (secs < 1e-6)
68214501Srpaulo		secs = 1e-6;
69214501Srpaulo	/* Use snprintf(3) so that we don't reenter stdio(3). */
70214501Srpaulo	(void)snprintf(buf, sizeof(buf),
71214501Srpaulo	    "%u+%u records in\n%u+%u records out\n",
72252726Srpaulo	    st.in_full, st.in_part, st.out_full, st.out_part);
73214501Srpaulo	(void)write(STDERR_FILENO, buf, strlen(buf));
74214501Srpaulo	if (st.swab) {
75214501Srpaulo		(void)snprintf(buf, sizeof(buf), "%u odd length swab %s\n",
76214501Srpaulo		     st.swab, (st.swab == 1) ? "block" : "blocks");
77214501Srpaulo		(void)write(STDERR_FILENO, buf, strlen(buf));
78214501Srpaulo	}
79214501Srpaulo	if (st.trunc) {
80214501Srpaulo		(void)snprintf(buf, sizeof(buf), "%u truncated %s\n",
81214501Srpaulo		     st.trunc, (st.trunc == 1) ? "block" : "blocks");
82214501Srpaulo		(void)write(STDERR_FILENO, buf, strlen(buf));
83214501Srpaulo	}
84214501Srpaulo	(void)snprintf(buf, sizeof(buf),
85214501Srpaulo	    "%u bytes transferred in %.6f secs (%.0f bytes/sec)\n",
86214501Srpaulo	    st.bytes, secs, st.bytes / secs);
87214501Srpaulo	(void)write(STDERR_FILENO, buf, strlen(buf));
88214501Srpaulo}
89214501Srpaulo
90214501Srpaulo/* ARGSUSED */
91214501Srpaulovoid
92214501Srpaulosummaryx(notused)
93	int notused;
94{
95	int save_errno = errno;
96
97	summary();
98	errno = save_errno;
99}
100
101/* ARGSUSED */
102void
103terminate(notused)
104	int notused;
105{
106
107	exit(0);
108}
109