From owner-svn-src-all@FreeBSD.ORG Thu Apr 17 00:34:51 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id A0F472BC; Thu, 17 Apr 2014 00:34:51 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 806231A98; Thu, 17 Apr 2014 00:34:51 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s3H0YpqN026352; Thu, 17 Apr 2014 00:34:51 GMT (envelope-from delphij@svn.freebsd.org) Received: (from delphij@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s3H0YnoW026331; Thu, 17 Apr 2014 00:34:49 GMT (envelope-from delphij@svn.freebsd.org) Message-Id: <201404170034.s3H0YnoW026331@svn.freebsd.org> From: Xin LI Date: Thu, 17 Apr 2014 00:34:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r264579 - stable/9/bin/dd X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Apr 2014 00:34:51 -0000 Author: delphij Date: Thu Apr 17 00:34:49 2014 New Revision: 264579 URL: http://svnweb.freebsd.org/changeset/base/264579 Log: MFC all recent changes on -HEAD to dd(1). Modified: stable/9/bin/dd/args.c stable/9/bin/dd/conv_tab.c stable/9/bin/dd/dd.1 stable/9/bin/dd/dd.c stable/9/bin/dd/dd.h stable/9/bin/dd/extern.h stable/9/bin/dd/misc.c stable/9/bin/dd/position.c Directory Properties: stable/9/bin/dd/ (props changed) Modified: stable/9/bin/dd/args.c ============================================================================== --- stable/9/bin/dd/args.c Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/args.c Thu Apr 17 00:34:49 2014 (r264579) @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -65,6 +66,7 @@ static void f_obs(char *); static void f_of(char *); static void f_seek(char *); static void f_skip(char *); +static void f_status(char *); static uintmax_t get_num(const char *); static off_t get_off_t(const char *); @@ -87,6 +89,7 @@ static const struct arg { { "oseek", f_seek, C_SEEK, C_SEEK }, { "seek", f_seek, C_SEEK, C_SEEK }, { "skip", f_skip, C_SKIP, C_SKIP }, + { "status", f_status, C_STATUS,C_STATUS }, }; static char *oper; @@ -291,6 +294,18 @@ f_skip(char *arg) in.offset = get_off_t(arg); } +static void +f_status(char *arg) +{ + + if (strcmp(arg, "none") == 0) + ddflags |= C_NOINFO; + else if (strcmp(arg, "noxfer") == 0) + ddflags |= C_NOXFER; + else + errx(1, "unknown status %s", arg); +} + static const struct conv { const char *name; u_int set, noset; Modified: stable/9/bin/dd/conv_tab.c ============================================================================== --- stable/9/bin/dd/conv_tab.c Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/conv_tab.c Thu Apr 17 00:34:49 2014 (r264579) @@ -41,6 +41,12 @@ __FBSDID("$FreeBSD$"); #include +#include +#include + +#include "dd.h" +#include "extern.h" + /* * There are currently six tables: * Modified: stable/9/bin/dd/dd.1 ============================================================================== --- stable/9/bin/dd/dd.1 Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/dd.1 Thu Apr 17 00:34:49 2014 (r264579) @@ -32,7 +32,7 @@ .\" @(#)dd.1 8.2 (Berkeley) 1/13/94 .\" $FreeBSD$ .\" -.Dd January 23, 2009 +.Dd April 2, 2014 .Dt DD 1 .Os .Sh NAME @@ -156,6 +156,17 @@ Otherwise, input data is read and discar For pipes, the correct number of bytes is read. For all other devices, the correct number of blocks is read without distinguishing between a partial or complete block being read. +.It Cm status Ns = Ns Ar value +Where +.Cm value +is one of the symbols from the following list. +.Bl -tag -width ".Cm noxfer" +.It Cm noxfer +Do not print the transfer statistics as the last line of status output. +.It Cm none +Do not print the status output. +Error messages are shown; informational messages are not. +.El .It Cm conv Ns = Ns Ar value Ns Op , Ns Ar value ... Where .Cm value @@ -378,12 +389,12 @@ will exit. .Sh EXAMPLES Check that a disk drive contains no bad blocks: .Pp -.Dl "dd if=/dev/ad0 of=/dev/null bs=1m" +.Dl "dd if=/dev/ada0 of=/dev/null bs=1m" .Pp Do a refresh of a disk drive, in order to prevent presently recoverable read errors from progressing into unrecoverable read errors: .Pp -.Dl "dd if=/dev/ad0 of=/dev/ad0 bs=1m" +.Dl "dd if=/dev/ada0 of=/dev/ada0 bs=1m" .Pp Remove parity bit from a file: .Pp @@ -410,7 +421,9 @@ utility is expected to be a superset of standard. The .Cm files -operand and the +and +.Cm status +operands and the .Cm ascii , .Cm ebcdic , .Cm ibm , Modified: stable/9/bin/dd/dd.c ============================================================================== --- stable/9/bin/dd/dd.c Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/dd.c Thu Apr 17 00:34:49 2014 (r264579) @@ -81,6 +81,7 @@ size_t cbsz; /* conversion block size uintmax_t files_cnt = 1; /* # of files to copy */ const u_char *ctab; /* conversion table */ char fill_char; /* Character to fill with if defined */ +volatile sig_atomic_t need_summary; int main(int argc __unused, char *argv[]) @@ -89,7 +90,7 @@ main(int argc __unused, char *argv[]) jcl(argv); setup(); - (void)signal(SIGINFO, summaryx); + (void)signal(SIGINFO, siginfo_handler); (void)signal(SIGINT, terminate); atexit(summary); @@ -98,6 +99,13 @@ main(int argc __unused, char *argv[]) dd_in(); dd_close(); + /* + * Some devices such as cfi(4) may perform significant amounts + * of work when a write descriptor is closed. Close the out + * descriptor explicitly so that the summary handler (called + * from an atexit() hook) includes this work. + */ + close(out.fd); exit(0); } @@ -232,8 +240,8 @@ setup(void) ctab = casetab; } - (void)gettimeofday(&tv, (struct timezone *)NULL); - st.start = tv.tv_sec + tv.tv_usec * 1e-6; + (void)gettimeofday(&tv, NULL); + st.start = tv.tv_sec + tv.tv_usec * 1e-6; } static void @@ -368,6 +376,9 @@ dd_in(void) in.dbp += in.dbrcnt; (*cfunc)(); + if (need_summary) { + summary(); + } } } Modified: stable/9/bin/dd/dd.h ============================================================================== --- stable/9/bin/dd/dd.h Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/dd.h Thu Apr 17 00:34:49 2014 (r264579) @@ -68,32 +68,35 @@ typedef struct { } STAT; /* Flags (in ddflags). */ -#define C_ASCII 0x00001 -#define C_BLOCK 0x00002 -#define C_BS 0x00004 -#define C_CBS 0x00008 -#define C_COUNT 0x00010 -#define C_EBCDIC 0x00020 -#define C_FILES 0x00040 -#define C_IBS 0x00080 -#define C_IF 0x00100 -#define C_LCASE 0x00200 -#define C_NOERROR 0x00400 -#define C_NOTRUNC 0x00800 -#define C_OBS 0x01000 -#define C_OF 0x02000 -#define C_OSYNC 0x04000 -#define C_PAREVEN 0x08000 -#define C_PARNONE 0x100000 -#define C_PARODD 0x200000 -#define C_PARSET 0x400000 -#define C_SEEK 0x800000 -#define C_SKIP 0x1000000 -#define C_SPARSE 0x2000000 -#define C_SWAB 0x4000000 -#define C_SYNC 0x8000000 -#define C_UCASE 0x10000000 -#define C_UNBLOCK 0x20000000 -#define C_FILL 0x40000000 +#define C_ASCII 0x00000001 +#define C_BLOCK 0x00000002 +#define C_BS 0x00000004 +#define C_CBS 0x00000008 +#define C_COUNT 0x00000010 +#define C_EBCDIC 0x00000020 +#define C_FILES 0x00000040 +#define C_IBS 0x00000080 +#define C_IF 0x00000100 +#define C_LCASE 0x00000200 +#define C_NOERROR 0x00000400 +#define C_NOTRUNC 0x00000800 +#define C_OBS 0x00001000 +#define C_OF 0x00002000 +#define C_OSYNC 0x00004000 +#define C_PAREVEN 0x00008000 +#define C_PARNONE 0x00010000 +#define C_PARODD 0x00020000 +#define C_PARSET 0x00040000 +#define C_SEEK 0x00080000 +#define C_SKIP 0x00100000 +#define C_SPARSE 0x00200000 +#define C_SWAB 0x00400000 +#define C_SYNC 0x00800000 +#define C_UCASE 0x01000000 +#define C_UNBLOCK 0x02000000 +#define C_FILL 0x04000000 +#define C_STATUS 0x08000000 +#define C_NOXFER 0x10000000 +#define C_NOINFO 0x20000000 #define C_PARITY (C_PAREVEN | C_PARODD | C_PARNONE | C_PARSET) Modified: stable/9/bin/dd/extern.h ============================================================================== --- stable/9/bin/dd/extern.h Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/extern.h Thu Apr 17 00:34:49 2014 (r264579) @@ -43,7 +43,7 @@ void jcl(char **); void pos_in(void); void pos_out(void); void summary(void); -void summaryx(int); +void siginfo_handler(int); void terminate(int); void unblock(void); void unblock_close(void); @@ -61,3 +61,4 @@ extern const u_char e2a_32V[], e2a_POSIX extern const u_char a2ibm_32V[], a2ibm_POSIX[]; extern u_char casetab[]; extern char fill_char; +extern volatile sig_atomic_t need_summary; Modified: stable/9/bin/dd/misc.c ============================================================================== --- stable/9/bin/dd/misc.c Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/misc.c Thu Apr 17 00:34:49 2014 (r264579) @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -57,41 +58,37 @@ summary(void) { struct timeval tv; double secs; - char buf[100]; - (void)gettimeofday(&tv, (struct timezone *)NULL); + if (ddflags & C_NOINFO) + return; + + (void)gettimeofday(&tv, NULL); secs = tv.tv_sec + tv.tv_usec * 1e-6 - st.start; if (secs < 1e-6) secs = 1e-6; - /* Use snprintf(3) so that we don't reenter stdio(3). */ - (void)snprintf(buf, sizeof(buf), + (void)fprintf(stderr, "%ju+%ju records in\n%ju+%ju records out\n", st.in_full, st.in_part, st.out_full, st.out_part); - (void)write(STDERR_FILENO, buf, strlen(buf)); - if (st.swab) { - (void)snprintf(buf, sizeof(buf), "%ju odd length swab %s\n", + if (st.swab) + (void)fprintf(stderr, "%ju odd length swab %s\n", st.swab, (st.swab == 1) ? "block" : "blocks"); - (void)write(STDERR_FILENO, buf, strlen(buf)); - } - if (st.trunc) { - (void)snprintf(buf, sizeof(buf), "%ju truncated %s\n", + if (st.trunc) + (void)fprintf(stderr, "%ju truncated %s\n", st.trunc, (st.trunc == 1) ? "block" : "blocks"); - (void)write(STDERR_FILENO, buf, strlen(buf)); + if (!(ddflags & C_NOXFER)) { + (void)fprintf(stderr, + "%ju bytes transferred in %.6f secs (%.0f bytes/sec)\n", + st.bytes, secs, st.bytes / secs); } - (void)snprintf(buf, sizeof(buf), - "%ju bytes transferred in %.6f secs (%.0f bytes/sec)\n", - st.bytes, secs, st.bytes / secs); - (void)write(STDERR_FILENO, buf, strlen(buf)); + need_summary = 0; } /* ARGSUSED */ void -summaryx(int notused __unused) +siginfo_handler(int signo __unused) { - int save_errno = errno; - summary(); - errno = save_errno; + need_summary = 1; } /* ARGSUSED */ Modified: stable/9/bin/dd/position.c ============================================================================== --- stable/9/bin/dd/position.c Thu Apr 17 00:31:54 2014 (r264578) +++ stable/9/bin/dd/position.c Thu Apr 17 00:34:49 2014 (r264579) @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include "dd.h" @@ -91,6 +92,8 @@ pos_in(void) } } else --cnt; + if (need_summary) + summary(); continue; }