diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2011-09-21 11:47:35 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2011-09-21 11:47:35 +0000 |
commit | ffb56132e43e067b1fe0c3ea848f689f5b57fc75 (patch) | |
tree | e74320d04aee24f530853512a6c281c8d36451f9 /package/maccalc/src | |
parent | 51a4dc1bb2382ce9b8534411a1573d8573ed3075 (diff) | |
download | master-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/src')
-rw-r--r-- | package/maccalc/src/main.c | 31 |
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; |