mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-02-17 15:04:42 +02:00
package/maccalc: don't expect to get all data in one read
Signed-off-by: Alexander Gordeev <lasaine@lvk.cs.msu.su> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@28266 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
de7614b2c5
commit
25ead84c94
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user