summaryrefslogtreecommitdiffstats
path: root/bin/dd
diff options
context:
space:
mode:
authorgreen <green@FreeBSD.org>1999-09-16 19:50:59 +0000
committergreen <green@FreeBSD.org>1999-09-16 19:50:59 +0000
commita12ece1af8e8a375973b5cd4ea60516c4e61a819 (patch)
treecf94071b11c33e7d8ffb6c9317614d708c5d586f /bin/dd
parentf051cabc3624134f50f0a18014e1430c314c8bde (diff)
downloadFreeBSD-src-a12ece1af8e8a375973b5cd4ea60516c4e61a819.zip
FreeBSD-src-a12ece1af8e8a375973b5cd4ea60516c4e61a819.tar.gz
Make count=0 set cpy_cnt to -1, which is slight overloading, but makes
what I was trying to do work much better (ie at all. I could have sworn it was working...) Fix a SEEK_SET to be SEEK_CUR, and make Bruce's lseek() test work correctly.
Diffstat (limited to 'bin/dd')
-rw-r--r--bin/dd/args.c2
-rw-r--r--bin/dd/dd.c19
-rw-r--r--bin/dd/position.c2
3 files changed, 18 insertions, 5 deletions
diff --git a/bin/dd/args.c b/bin/dd/args.c
index 7348503..c3c6d04 100644
--- a/bin/dd/args.c
+++ b/bin/dd/args.c
@@ -209,6 +209,8 @@ f_count(arg)
cpy_cnt = get_num(arg);
if (cpy_cnt < 0)
errx(1, "count cannot be negative");
+ if (cpy_cnt == 0)
+ cpy_cnt = -1;
}
static void
diff --git a/bin/dd/dd.c b/bin/dd/dd.c
index da70ca7..49fd7be 100644
--- a/bin/dd/dd.c
+++ b/bin/dd/dd.c
@@ -225,10 +225,13 @@ getfdtype(io)
if (S_ISCHR(sb.st_mode) && (type & D_TAPE) == 0)
io->flags |= ISCHR;
}
- } else if (lseek(io->fd, (off_t)0, SEEK_CUR) == 0)
- io->flags |= ISSEEK;
- else if (errno == ESPIPE)
+ return;
+ }
+ errno = 0;
+ if (lseek(io->fd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE)
io->flags |= ISPIPE;
+ else
+ io->flags |= ISSEEK;
}
static void
@@ -237,8 +240,16 @@ dd_in()
ssize_t n;
for (;;) {
- if (cpy_cnt && (st.in_full + st.in_part) >= cpy_cnt)
+ switch (cpy_cnt) {
+ case -1: /* count=0 was specified */
return;
+ case 0:
+ break;
+ default:
+ if (st.in_full + st.in_part >= cpy_cnt)
+ return;
+ break;
+ }
/*
* Zero the buffer first if sync; if doing block operations,
diff --git a/bin/dd/position.c b/bin/dd/position.c
index e6774a5..9d3d0d8 100644
--- a/bin/dd/position.c
+++ b/bin/dd/position.c
@@ -132,7 +132,7 @@ pos_out()
*/
if (!(out.flags & ISTAPE)) {
errno = 0;
- if (lseek(out.fd, out.offset * out.dbsz, SEEK_SET) == -1 &&
+ if (lseek(out.fd, out.offset * out.dbsz, SEEK_CUR) == -1 &&
errno != 0)
err(1, "%s", out.name);
return;
OpenPOWER on IntegriCloud