fstat() is used to determine the filesize before read() and
it requires a filesystem. That it means it can not be used
on character nodes. This makes it impossible to obtains the
kernel from a char node like mtd or more likely ubi.
We can't use this in every case because files in /proc don't
support lseek(). This is required by the powerpc part to read
some device-tree entries.

Signed-off-by: Sebastian Andrzej Siewior <[EMAIL PROTECTED]>
---
 kexec/kexec.c |   23 +++++++++++++++++++++--
 1 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/kexec/kexec.c b/kexec/kexec.c
index 0616091..6f1cb76 100644
--- a/kexec/kexec.c
+++ b/kexec/kexec.c
@@ -467,7 +467,7 @@ char *slurp_file(const char *filename, off_t *r_size)
 {
        int fd;
        char *buf;
-       off_t size, progress;
+       off_t size, progress, err;
        ssize_t result;
        struct stat stats;
        
@@ -486,7 +486,26 @@ char *slurp_file(const char *filename, off_t *r_size)
                die("Cannot stat: %s: %s\n",
                        filename, strerror(errno));
        }
-       size = stats.st_size;
+       /*
+        * Seek in case the kernel is a character node like /dev/ubi0_0.
+        * This does not work on regular files which live in /proc and
+        * we need this for some /proc/device-tree entries
+        */
+       if (S_ISCHR(stats.st_mode)) {
+
+               size = lseek(fd, 0, SEEK_END);
+               if (size < 0)
+                       die("Can not seek file %s: %s\n", filename,
+                                       strerror(errno));
+
+               err = lseek(fd, 0, SEEK_SET);
+               if (err < 0)
+                       die("Can not seek to the begin of file %s: %s\n",
+                                       filename, strerror(errno));
+       } else {
+               size = stats.st_size;
+       }
+
        *r_size = size;
        buf = xmalloc(size);
        progress = 0;
-- 
1.5.6.5


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to