Date: Tue, 12 Sep 95 22:56:37 +0200 From: "Pascal Pederiva (Digital UNIX Support Switzerland)" <pascal@zuo.dec.com> To: hackers@freebsd.org Cc: pascal@zuo.dec.com Subject: Enhancement to dd (conv=sparse) Message-ID: <9509122056.AA28693@tempx.zuo.dec.com.zuo.dec.com>
next in thread | raw e-mail | index | archive | help
Hello
here are the diffs of /usr/src/bin/dd ( 2.1.0-950726-SNAP ) to
add an option to dd, which creates sparse files.
It is just a half-hour midnight hack, so I am sure it needs
some cleanup, but it work and I thought it might be interesting
for others, too.
Best regards,
Pascal Pederiva
-------------------------------------------------------------------------------
+---------------------------+tm Pascal Pederiva
| | | | | | | | Digital UNIX Software Support
| d | i | g | i | t | a | l | DEC Digital Equipment Corporation
| | | | | | | | Hofwisenstrasse 50
+---------------------------+ CH-8153 Ruemlang (Switzerland)
email: pascal@zuo.dec.com phone: +41-1-801-2111 fax: +41-1-801-2172
*** /usr/src/bin/dd/args.c Sat Sep 24 04:54:42 1994
--- args.c Sun Sep 10 23:43:48 1995
***************
*** 281,286 ****
--- 281,287 ----
{ "oldascii", C_ASCII, C_EBCDIC, e2a_32V },
{ "oldebcdic", C_EBCDIC, C_ASCII, a2e_32V },
{ "oldibm", C_EBCDIC, C_ASCII, a2ibm_32V },
+ { "sparse", C_SPARSE, 0, NULL },
{ "osync", C_OSYNC, C_BS, NULL },
{ "swab", C_SWAB, 0, NULL },
{ "sync", C_SYNC, 0, NULL },
*** /usr/src/bin/dd/dd.c Wed Jan 18 00:04:29 1995
--- dd.c Mon Sep 11 00:55:34 1995
***************
*** 74,79 ****
--- 74,80 ----
STAT st; /* statistics */
void (*cfunc) __P((void)); /* conversion function */
u_long cpy_cnt; /* # of blocks to copy */
+ u_long pending=0; /* pending seek if sparse */
u_int ddflags; /* conversion options */
u_int cbsz; /* conversion block size */
u_int files_cnt = 1; /* # of files to copy */
***************
*** 341,347 ****
memset(out.dbp, 0, out.dbsz - out.dbcnt);
out.dbcnt = out.dbsz;
}
! if (out.dbcnt)
dd_out(1);
}
--- 342,348 ----
memset(out.dbp, 0, out.dbsz - out.dbcnt);
out.dbcnt = out.dbsz;
}
! if (out.dbcnt||pending)
dd_out(1);
}
***************
*** 350,356 ****
int force;
{
static int warned;
! int cnt, n, nw;
u_char *outp;
/*
--- 351,357 ----
int force;
{
static int warned;
! int cnt, n, nw,i,sparse;
u_char *outp;
/*
***************
*** 369,378 ****
* One special case is if we're forced to do the write -- in that case
* we play games with the buffer size, and it's usually a partial write.
*/
outp = out.db;
for (n = force ? out.dbcnt : out.dbsz;; n = out.dbsz) {
! for (cnt = n;; cnt -= nw) {
! nw = write(out.fd, outp, cnt);
if (nw <= 0) {
if (nw == 0)
errx(1, "%s: end of device", out.name);
--- 370,416 ----
* One special case is if we're forced to do the write -- in that case
* we play games with the buffer size, and it's usually a partial write.
*/
+
outp = out.db;
for (n = force ? out.dbcnt : out.dbsz;; n = out.dbsz) {
! for (cnt = n;; cnt -= nw) {
! sparse=0;
! if (ddflags & C_SPARSE)
! {
! sparse = 1; /* Is buffer sparse ? */
! for (i=0; i < cnt; i++)
! if (outp[i] != 0) {
! sparse = 0;
! break;
! }
! }
! if(sparse && !force)
! {
! pending+=cnt;
! nw=cnt;
! }else
! {
! if(pending)
! {
! if(force)pending--;
! if (lseek (out.fd, pending, SEEK_CUR) == -1) {
! perror("dd seek error");
! exit(2);
! }
! if(force)write(out.fd, outp, 1);
! pending=0;
! }
! if(cnt)
! {
! nw = write(out.fd, outp, cnt);
! }else
! {
! return;
! }
! }
!
!
!
if (nw <= 0) {
if (nw == 0)
errx(1, "%s: end of device", out.name);
*** /usr/src/bin/dd/dd.h Sun Sep 10 23:07:14 1995
--- dd.h Sun Sep 10 23:10:06 1995
***************
*** 95,97 ****
--- 95,98 ----
#define C_UCASE 0x40000
#define C_UNBLOCK 0x80000
#define C_OSYNC 0x100000
+ #define C_SPARSE 0x200000
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9509122056.AA28693>
