From 35d3842cc4b930c5102eed2921e0189b7f4fd069 Mon Sep 17 00:00:00 2001 From: Robert Yang Date: Wed, 31 Dec 2014 16:43:37 +0800 Subject: [PATCH 4/9] linux/syslinux: add ext_file_read() and ext_file_write() Will use them to read and write on the extX device. Upstream-Status: Submitted Signed-off-by: Robert Yang Tested-by: Du Dolpher --- linux/syslinux.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/linux/syslinux.c b/linux/syslinux.c index 45f080d..247c86a 100755 --- a/linux/syslinux.c +++ b/linux/syslinux.c @@ -349,6 +349,68 @@ fail: } +/* Read from an ext2_file */ +static int ext_file_read(ext2_file_t e2_file, void *buf, size_t count, + off_t offset, const char *msg) +{ + int retval; + char *ptr = (char *) buf; + unsigned int got = 0; + size_t done = 0; + + /* Always lseek since e2_file is uncontrolled by this func */ + if (ext2fs_file_lseek(e2_file, offset, EXT2_SEEK_SET, NULL)) { + fprintf(stderr, "%s: ext2fs_file_lseek() failed.\n", + program); + return -1; + } + + while (1) { + retval = ext2fs_file_read(e2_file, ptr, count, &got); + if (retval) { + fprintf(stderr, "%s: error while reading %s\n", + program, msg); + return -1; + } + count -= got; + ptr += got; + done += got; + if (got == 0 || count == 0) + break; + } + + return done; +} + +/* Write to an ext2_file */ +static int ext_file_write(ext2_file_t e2_file, const void *buf, size_t count, + off_t offset) +{ + const char *ptr = (const char *) buf; + unsigned int written = 0; + size_t done = 0; + + /* Always lseek since e2_file is uncontrolled by this func */ + if (ext2fs_file_lseek(e2_file, offset, EXT2_SEEK_SET, NULL)) { + fprintf(stderr, "%s: ext2fs_file_lseek() failed.\n", + program); + return -1; + } + + while (count > 0) { + if (ext2fs_file_write(e2_file, ptr, count, &written)) { + fprintf(stderr, "%s: failed to write syslinux adv.\n", + program); + return -1; + } + count -= written; + ptr += written; + done += written; + } + + return done; +} + /* * Install the boot block on the specified device. * Must be run AFTER file installed. -- 1.9.1