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
This commit is contained in:
Gabor Juhos 2011-09-21 11:47:35 +00:00
parent 51a4dc1bb2
commit ffb56132e4

View File

@ -9,6 +9,7 @@
* *
*/ */
#include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
@ -124,6 +125,34 @@ static int maccalc_do_mac2bin(int argc, const char *argv[])
return 0; 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[]) static int maccalc_do_bin2mac(int argc, const char *argv[])
{ {
unsigned char mac[MAC_ADDRESS_LEN]; unsigned char mac[MAC_ADDRESS_LEN];
@ -134,7 +163,7 @@ static int maccalc_do_bin2mac(int argc, const char *argv[])
return ERR_INVALID; return ERR_INVALID;
} }
c = read(STDIN_FILENO, mac, sizeof(mac)); c = read_safe(STDIN_FILENO, mac, sizeof(mac));
if (c != sizeof(mac)) { if (c != sizeof(mac)) {
fprintf(stderr, "failed to read from stdin\n"); fprintf(stderr, "failed to read from stdin\n");
return ERR_IO; return ERR_IO;