summaryrefslogtreecommitdiffstats
path: root/package/maccalc
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2011-09-21 11:47:35 +0000
committerGabor Juhos <juhosg@openwrt.org>2011-09-21 11:47:35 +0000
commitffb56132e43e067b1fe0c3ea848f689f5b57fc75 (patch)
treee74320d04aee24f530853512a6c281c8d36451f9 /package/maccalc
parent51a4dc1bb2382ce9b8534411a1573d8573ed3075 (diff)
downloadmaster-31e0f0ae-ffb56132e43e067b1fe0c3ea848f689f5b57fc75.tar.gz
master-31e0f0ae-ffb56132e43e067b1fe0c3ea848f689f5b57fc75.tar.bz2
master-31e0f0ae-ffb56132e43e067b1fe0c3ea848f689f5b57fc75.zip
package/maccalc: don't expect to get all data in one read
Signed-off-by: Alexander Gordeev <lasaine@lvk.cs.msu.su> SVN-Revision: 28266
Diffstat (limited to 'package/maccalc')
-rw-r--r--package/maccalc/src/main.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/package/maccalc/src/main.c b/package/maccalc/src/main.c
index e1e12cd96f..dcb5f55c55 100644
--- a/package/maccalc/src/main.c
+++ b/package/maccalc/src/main.c
@@ -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;