Rewrote dd.
diff --git a/utility.c b/utility.c
index 794a928..34341c8 100644
--- a/utility.c
+++ b/utility.c
@@ -562,10 +562,9 @@
return total;
}
-#endif /* BB_TAR || BB_CP_MV || BB_AR */
+#endif
-
-#if defined BB_TAR || defined BB_TAIL || defined BB_AR || defined BB_SH || defined BB_CP_MV || defined BB_DD
+#if defined BB_AR || defined BB_CP_MV || defined BB_SH || defined BB_TAR
/*
* Read all of the supplied buffer from a file.
* This does multiple reads as necessary.
@@ -1215,58 +1214,6 @@
}
#endif /* BB_DF || BB_MTAB */
-
-
-#if defined BB_DD || defined BB_TAIL
-/*
- * Read a number with a possible multiplier.
- * Returns -1 if the number format is illegal.
- */
-extern long atoi_w_units(const char *cp)
-{
- long value;
-
- if (!is_decimal(*cp))
- return -1;
-
- value = 0;
-
- while (is_decimal(*cp))
- value = value * 10 + *cp++ - '0';
-
- switch (*cp++) {
- case 'M':
- case 'm': /* `tail' uses it traditionally */
- value *= 1048576;
- break;
-
- case 'k':
- value *= 1024;
- break;
-
- case 'b':
- value *= 512;
- break;
-
- case 'w':
- value *= 2;
- break;
-
- case '\0':
- return value;
-
- default:
- return -1;
- }
-
- if (*cp)
- return -1;
-
- return value;
-}
-#endif /* BB_DD || BB_TAIL */
-
-
#if defined BB_INIT || defined BB_SYSLOGD
/* try to open up the specified device */
extern int device_open(char *device, int mode)
@@ -1313,11 +1260,11 @@
/* open device */
fd = open(device, O_RDONLY);
if (fd < 0)
- perror_msg_and_die( "open failed for `%s'", device);
+ perror_msg_and_die("open failed for `%s'", device);
/* Find out how many processes there are */
if (ioctl (fd, DEVPS_GET_NUM_PIDS, &num_pids)<0)
- perror_msg_and_die( "\nDEVPS_GET_PID_LIST");
+ perror_msg_and_die("\nDEVPS_GET_PID_LIST");
/* Allocate some memory -- grab a few extras just in case
* some new processes start up while we wait. The kernel will
@@ -1328,7 +1275,7 @@
/* Now grab the pid list */
if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0)
- perror_msg_and_die( "\nDEVPS_GET_PID_LIST");
+ perror_msg_and_die("\nDEVPS_GET_PID_LIST");
/* Now search for a match */
for (i=1, j=0; i<pid_array[0] ; i++) {
@@ -1337,7 +1284,7 @@
info.pid = pid_array[i];
if (ioctl (fd, DEVPS_GET_PID_INFO, &info)<0)
- perror_msg_and_die( "\nDEVPS_GET_PID_INFO");
+ perror_msg_and_die("\nDEVPS_GET_PID_INFO");
/* Make sure we only match on the process name */
p=info.command_line+1;
@@ -1361,7 +1308,7 @@
/* close device */
if (close (fd) != 0)
- perror_msg_and_die( "close failed for `%s'", device);
+ perror_msg_and_die("close failed for `%s'", device);
return pidList;
}
@@ -1387,7 +1334,7 @@
dir = opendir("/proc");
if (!dir)
- perror_msg_and_die( "Cannot open /proc");
+ perror_msg_and_die("Cannot open /proc");
while ((next = readdir(dir)) != NULL) {
FILE *status;
@@ -1791,7 +1738,34 @@
return strcmp(applet1->name, applet2->name);
}
-#if defined BB_NC
+#if defined BB_DD || defined BB_TAIL
+unsigned long parse_number(const char *numstr, struct suffix_mult *suffixes)
+{
+ struct suffix_mult *sm;
+ unsigned long int ret;
+ int len;
+ char *end;
+
+ ret = strtoul(numstr, &end, 10);
+ if (numstr == end)
+ error_msg_and_die("invalid number `%s'\n", numstr);
+ while (end[0] != '\0') {
+ for (sm = suffixes; sm->suffix != NULL; sm++) {
+ len = strlen(sm->suffix);
+ if (strncmp(sm->suffix, end, len) == 0) {
+ ret *= sm->mult;
+ end += len;
+ break;
+ }
+ }
+ if (sm->suffix == NULL)
+ error_msg_and_die("invalid number `%s'\n", numstr);
+ }
+ return ret;
+}
+#endif
+
+#if defined BB_DD || defined BB_NC
ssize_t safe_read(int fd, void *buf, size_t count)
{
ssize_t n;