summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorpi <pi@FreeBSD.org>2014-10-27 17:39:37 +0000
committerpi <pi@FreeBSD.org>2014-10-27 17:39:37 +0000
commit4280e8bc36a0ce1e00c5bf1662664cfa0213dba2 (patch)
treee7c1dfa585789cd102f898da1c3e8a03c2aab264 /bin
parentb27ddf1ff3b61ee99e933d7e2b15b23754120fb9 (diff)
downloadFreeBSD-src-4280e8bc36a0ce1e00c5bf1662664cfa0213dba2.zip
FreeBSD-src-4280e8bc36a0ce1e00c5bf1662664cfa0213dba2.tar.gz
bin/dd: revert 273734, as it fails on 32bit platforms
Revert: insufficient testing on 32bit platforms PR: 191263
Diffstat (limited to 'bin')
-rw-r--r--bin/dd/args.c63
-rw-r--r--bin/dd/conv.c6
-rw-r--r--bin/dd/dd.c8
-rw-r--r--bin/dd/dd.h21
-rw-r--r--bin/dd/position.c2
5 files changed, 54 insertions, 46 deletions
diff --git a/bin/dd/args.c b/bin/dd/args.c
index fec0c46..2f197f8 100644
--- a/bin/dd/args.c
+++ b/bin/dd/args.c
@@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
-#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <inttypes.h>
@@ -172,7 +171,8 @@ jcl(char **argv)
*/
if (in.offset > OFF_MAX / (ssize_t)in.dbsz ||
out.offset > OFF_MAX / (ssize_t)out.dbsz)
- errx(1, "seek offsets cannot be larger than %jd", OFF_MAX);
+ errx(1, "seek offsets cannot be larger than %jd",
+ (intmax_t)OFF_MAX);
}
static int
@@ -186,30 +186,37 @@ c_arg(const void *a, const void *b)
static void
f_bs(char *arg)
{
+ uintmax_t res;
- in.dbsz = out.dbsz = get_num(arg);
- if (out.dbsz < 1 || out.dbsz > SSIZE_MAX)
- errx(1, "bs must be between 1 and %jd", SSIZE_MAX);
+ res = get_num(arg);
+ if (res < 1 || res > SSIZE_MAX)
+ errx(1, "bs must be between 1 and %jd", (intmax_t)SSIZE_MAX);
+ in.dbsz = out.dbsz = (size_t)res;
}
static void
f_cbs(char *arg)
{
+ uintmax_t res;
- cbsz = get_num(arg);
- if (cbsz < 1 || cbsz > SSIZE_MAX)
- errx(1, "cbs must be between 1 and %jd", SSIZE_MAX);
+ res = get_num(arg);
+ if (res < 1 || res > SSIZE_MAX)
+ errx(1, "cbs must be between 1 and %jd", (intmax_t)SSIZE_MAX);
+ cbsz = (size_t)res;
}
static void
f_count(char *arg)
{
+ intmax_t res;
- cpy_cnt = get_num(arg);
- if (cpy_cnt == SIZE_MAX)
- errc(1, ERANGE, "%s", oper);
- if (cpy_cnt == 0)
- cpy_cnt = -1;
+ res = (intmax_t)get_num(arg);
+ if (res < 0)
+ errx(1, "count cannot be negative");
+ if (res == 0)
+ cpy_cnt = (uintmax_t)-1;
+ else
+ cpy_cnt = (uintmax_t)res;
}
static void
@@ -218,7 +225,7 @@ f_files(char *arg)
files_cnt = get_num(arg);
if (files_cnt < 1)
- errx(1, "files must be between 1 and %ju", SIZE_MAX);
+ errx(1, "files must be between 1 and %jd", (uintmax_t)-1);
}
static void
@@ -234,11 +241,14 @@ f_fillchar(char *arg)
static void
f_ibs(char *arg)
{
+ uintmax_t res;
if (!(ddflags & C_BS)) {
- in.dbsz = get_num(arg);
- if (in.dbsz < 1 || in.dbsz > SSIZE_MAX)
- errx(1, "ibs must be between 1 and %ju", SSIZE_MAX);
+ res = get_num(arg);
+ if (res < 1 || res > SSIZE_MAX)
+ errx(1, "ibs must be between 1 and %jd",
+ (intmax_t)SSIZE_MAX);
+ in.dbsz = (size_t)res;
}
}
@@ -252,11 +262,14 @@ f_if(char *arg)
static void
f_obs(char *arg)
{
+ uintmax_t res;
if (!(ddflags & C_BS)) {
- out.dbsz = get_num(arg);
- if (out.dbsz < 1 || out.dbsz > SSIZE_MAX)
- errx(1, "obs must be between 1 and %jd", SSIZE_MAX);
+ res = get_num(arg);
+ if (res < 1 || res > SSIZE_MAX)
+ errx(1, "obs must be between 1 and %jd",
+ (intmax_t)SSIZE_MAX);
+ out.dbsz = (size_t)res;
}
}
@@ -365,17 +378,11 @@ get_num(const char *val)
uintmax_t num, mult, prevnum;
char *expr;
- while (isspace(val[0]))
- val++;
-
- if (val[0] == '-')
- errx(1, "%s: cannot be negative", oper);
-
errno = 0;
- num = strtoull(val, &expr, 0);
+ num = strtouq(val, &expr, 0);
if (errno != 0) /* Overflow or underflow. */
err(1, "%s", oper);
-
+
if (expr == val) /* No valid digits. */
errx(1, "%s: illegal numeric value", oper);
diff --git a/bin/dd/conv.c b/bin/dd/conv.c
index 6b1822b..2ffba1e 100644
--- a/bin/dd/conv.c
+++ b/bin/dd/conv.c
@@ -133,7 +133,7 @@ block(void)
*/
ch = 0;
for (inp = in.dbp - in.dbcnt, outp = out.dbp; in.dbcnt;) {
- maxlen = MIN(cbsz, (size_t)in.dbcnt);
+ maxlen = MIN(cbsz, in.dbcnt);
if ((t = ctab) != NULL)
for (cnt = 0; cnt < maxlen && (ch = *inp++) != '\n';
++cnt)
@@ -146,7 +146,7 @@ block(void)
* Check for short record without a newline. Reassemble the
* input block.
*/
- if (ch != '\n' && (size_t)in.dbcnt < cbsz) {
+ if (ch != '\n' && in.dbcnt < cbsz) {
(void)memmove(in.db, in.dbp - in.dbcnt, in.dbcnt);
break;
}
@@ -228,7 +228,7 @@ unblock(void)
* translation has to already be done or we might not recognize the
* spaces.
*/
- for (inp = in.db; (size_t)in.dbcnt >= cbsz; inp += cbsz, in.dbcnt -= cbsz) {
+ for (inp = in.db; in.dbcnt >= cbsz; inp += cbsz, in.dbcnt -= cbsz) {
for (t = inp + cbsz - 1; t >= inp && *t == ' '; --t)
;
if (t >= inp) {
diff --git a/bin/dd/dd.c b/bin/dd/dd.c
index c81aaa2..8ae11a7 100644
--- a/bin/dd/dd.c
+++ b/bin/dd/dd.c
@@ -168,10 +168,10 @@ setup(void)
* record oriented I/O, only need a single buffer.
*/
if (!(ddflags & (C_BLOCK | C_UNBLOCK))) {
- if ((in.db = malloc((size_t)out.dbsz + in.dbsz - 1)) == NULL)
+ if ((in.db = malloc(out.dbsz + in.dbsz - 1)) == NULL)
err(1, "input buffer");
out.db = in.db;
- } else if ((in.db = malloc(MAX((size_t)in.dbsz, cbsz) + cbsz)) == NULL ||
+ } else if ((in.db = malloc(MAX(in.dbsz, cbsz) + cbsz)) == NULL ||
(out.db = malloc(out.dbsz + cbsz)) == NULL)
err(1, "output buffer");
@@ -343,7 +343,7 @@ dd_in(void)
++st.in_full;
/* Handle full input blocks. */
- } else if ((size_t)n == (size_t)in.dbsz) {
+ } else if ((size_t)n == in.dbsz) {
in.dbcnt += in.dbrcnt = n;
++st.in_full;
@@ -493,7 +493,7 @@ dd_out(int force)
outp += nw;
st.bytes += nw;
- if ((size_t)nw == n && n == (size_t)out.dbsz)
+ if ((size_t)nw == n && n == out.dbsz)
++st.out_full;
else
++st.out_part;
diff --git a/bin/dd/dd.h b/bin/dd/dd.h
index 42892ad..a8b45e5 100644
--- a/bin/dd/dd.h
+++ b/bin/dd/dd.h
@@ -38,9 +38,10 @@
typedef struct {
u_char *db; /* buffer address */
u_char *dbp; /* current buffer I/O address */
- ssize_t dbcnt; /* current buffer byte count */
- ssize_t dbrcnt; /* last read byte count */
- ssize_t dbsz; /* block size */
+ /* XXX ssize_t? */
+ size_t dbcnt; /* current buffer byte count */
+ size_t dbrcnt; /* last read byte count */
+ size_t dbsz; /* block size */
#define ISCHR 0x01 /* character device (warn on short) */
#define ISPIPE 0x02 /* pipe-like (see position.c) */
@@ -56,13 +57,13 @@ typedef struct {
} IO;
typedef struct {
- size_t in_full; /* # of full input blocks */
- size_t in_part; /* # of partial input blocks */
- size_t out_full; /* # of full output blocks */
- size_t out_part; /* # of partial output blocks */
- size_t trunc; /* # of truncated records */
- size_t swab; /* # of odd-length swab blocks */
- size_t bytes; /* # of bytes written */
+ uintmax_t in_full; /* # of full input blocks */
+ uintmax_t in_part; /* # of partial input blocks */
+ uintmax_t out_full; /* # of full output blocks */
+ uintmax_t out_part; /* # of partial output blocks */
+ uintmax_t trunc; /* # of truncated records */
+ uintmax_t swab; /* # of odd-length swab blocks */
+ uintmax_t bytes; /* # of bytes written */
struct timespec start; /* start time of dd */
} STAT;
diff --git a/bin/dd/position.c b/bin/dd/position.c
index 4264355..57bfde5 100644
--- a/bin/dd/position.c
+++ b/bin/dd/position.c
@@ -178,7 +178,7 @@ pos_out(void)
n = write(out.fd, out.db, out.dbsz);
if (n == -1)
err(1, "%s", out.name);
- if (n != out.dbsz)
+ if ((size_t)n != out.dbsz)
errx(1, "%s: write failure", out.name);
}
break;
OpenPOWER on IntegriCloud