|
@@ -6,6 +6,7 @@
|
|
|
#endif
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
+#include <linux/kernel.h>
|
|
|
|
|
|
/*
|
|
|
* XXX We need to find a better place for these things...
|
|
@@ -151,21 +152,26 @@ unsigned long convert_unit(unsigned long value, char *unit)
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Read exactly 'n' bytes or return an error.
|
|
|
+ */
|
|
|
ssize_t readn(int fd, void *buf, size_t n)
|
|
|
{
|
|
|
void *buf_start = buf;
|
|
|
+ size_t left = n;
|
|
|
|
|
|
- while (n) {
|
|
|
- ssize_t ret = read(fd, buf, n);
|
|
|
+ while (left) {
|
|
|
+ ssize_t ret = read(fd, buf, left);
|
|
|
|
|
|
if (ret <= 0)
|
|
|
return ret;
|
|
|
|
|
|
- n -= ret;
|
|
|
- buf += ret;
|
|
|
+ left -= ret;
|
|
|
+ buf += ret;
|
|
|
}
|
|
|
|
|
|
- return buf - buf_start;
|
|
|
+ BUG_ON((size_t)(buf - buf_start) != n);
|
|
|
+ return n;
|
|
|
}
|
|
|
|
|
|
size_t hex_width(u64 v)
|