summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/tools.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c
index cd1b40fe8..767c8c830 100644
--- a/mdk-stage1/tools.c
+++ b/mdk-stage1/tools.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <unistd.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -31,6 +32,7 @@
#include <sys/types.h>
#include <bzlib.h>
#include <sys/mount.h>
+#include <sys/poll.h>
#include "stage1.h"
#include "log.h"
#include "mount.h"
@@ -249,8 +251,19 @@ enum return_type load_ramdisk_fd(int ramdisk_fd, int size)
int bytes_read = 0;
int actually;
int seems_ok = 0;
+ struct pollfd polls;
+
+ /* first of all, we wait for data to be available on fd; because
+ when it's a socket, data can be unavailable at the beginning */
+ polls.fd = ramdisk_fd;
+ polls.events = POLLIN;
+ if (poll(&polls, 1, 10000) != 1) {
+ log_message("poll'ing ramdisk fd: timeout or error");
+ return RETURN_ERROR;
+ }
st2 = BZ2_bzdopen(ramdisk_fd, "r");
+ BZ2_bzerror(st2, &z_errnum);
if (!st2) {
log_message("Opening compressed ramdisk: %s", BZ2_bzerror(st2, &z_errnum));