|
@@ -9,6 +9,7 @@
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
+#include <errno.h>
|
|
|
#include <stdlib.h>
|
|
|
#include <stdio.h>
|
|
|
#include <stdint.h>
|
|
@@ -124,6 +125,34 @@ static int maccalc_do_mac2bin(int argc, const char *argv[])
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static ssize_t read_safe(int fd, void *buf, size_t count)
|
|
|
+{
|
|
|
+ ssize_t total = 0;
|
|
|
+ ssize_t r;
|
|
|
+
|
|
|
+ while(count > 0) {
|
|
|
+ r = read(fd, buf, count);
|
|
|
+ if (r == 0)
|
|
|
+ /* EOF */
|
|
|
+ break;
|
|
|
+ if (r < 0) {
|
|
|
+ if (errno == EINTR)
|
|
|
+ /* interrupted by a signal, restart */
|
|
|
+ continue;
|
|
|
+ /* error */
|
|
|
+ total = -1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* ok */
|
|
|
+ total += r;
|
|
|
+ count -= r;
|
|
|
+ buf += r;
|
|
|
+ }
|
|
|
+
|
|
|
+ return total;
|
|
|
+}
|
|
|
+
|
|
|
static int maccalc_do_bin2mac(int argc, const char *argv[])
|
|
|
{
|
|
|
unsigned char mac[MAC_ADDRESS_LEN];
|
|
@@ -134,7 +163,7 @@ static int maccalc_do_bin2mac(int argc, const char *argv[])
|
|
|
return ERR_INVALID;
|
|
|
}
|
|
|
|
|
|
- c = read(STDIN_FILENO, mac, sizeof(mac));
|
|
|
+ c = read_safe(STDIN_FILENO, mac, sizeof(mac));
|
|
|
if (c != sizeof(mac)) {
|
|
|
fprintf(stderr, "failed to read from stdin\n");
|
|
|
return ERR_IO;
|