This program is a complement to mkbootimg.  It prints header
information and extracts kernel, ramdisk and 2nd boot images.
---
 android/image-utils/mkbootimg/Makefile.am |    5 +-
 android/image-utils/mkbootimg/unbootimg.c |  196 +++++++++++++++++++++++++++++
 2 files changed, 200 insertions(+), 1 deletions(-)
 create mode 100644 android/image-utils/mkbootimg/unbootimg.c

diff --git a/android/image-utils/mkbootimg/Makefile.am 
b/android/image-utils/mkbootimg/Makefile.am
index 04be12e..f6bc152 100644
--- a/android/image-utils/mkbootimg/Makefile.am
+++ b/android/image-utils/mkbootimg/Makefile.am
@@ -8,7 +8,7 @@ AM_CPPFLAGS = \
 -I$(top_builddir)/include \
 -I$(top_builddir)/mkbootimg
 
-bin_PROGRAMS = mkbootimg
+bin_PROGRAMS = mkbootimg unbootimg
 
 include_HEADERS = bootimg.h
 
@@ -18,3 +18,6 @@ mkbootimg.c
 mkbootimg_LDADD = $(top_builddir)/libmincrypt/libmincrypt.la
 mkbootimg_LDFLAGS =
 
+unbootimg_SOURCES = \
+unbootimg.c 
+
diff --git a/android/image-utils/mkbootimg/unbootimg.c 
b/android/image-utils/mkbootimg/unbootimg.c
new file mode 100644
index 0000000..bcfc2fd
--- /dev/null
+++ b/android/image-utils/mkbootimg/unbootimg.c
@@ -0,0 +1,196 @@
+/* tools/mkbootimg/mkbootimg.c
+**
+** Copyright 2007, The Android Open Source Project
+** Copyright 2011, Robert Ham <[email protected]>
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+**
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include "bootimg.h"
+
+static void *load_file(const char *fn, unsigned *_sz)
+{
+    char *data;
+    int sz;
+    int fd;
+
+    data = 0;
+    fd = open(fn, O_RDONLY);
+    if(fd < 0) return 0;
+
+    sz = lseek(fd, 0, SEEK_END);
+    if(sz < 0) goto oops;
+
+    if(lseek(fd, 0, SEEK_SET) != 0) goto oops;
+
+    data = (char*) malloc(sz);
+    if(data == 0) goto oops;
+
+    if(read(fd, data, sz) != sz) goto oops;
+    close(fd);
+
+    if(_sz) *_sz = sz;
+    return data;
+
+oops:
+    close(fd);
+    if(data != 0) free(data);
+    return 0;
+}
+
+static int write_file(const char *fn, void *data, unsigned sz)
+{
+    int fd, ret = 0;
+
+    fd = open(fn, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+    if(fd < 0) {
+        fprintf(stderr, "error: could not open file `%s' for writing: %s\n", 
fn, strerror(errno));
+       return -1;
+    }
+
+    if(write(fd, data, sz) != sz) {
+        fprintf(stderr, "error: could not write to file `%s': %s\n", fn, 
strerror(errno));
+       unlink(fn);
+       ret = -1;
+    }
+    
+    close(fd);
+    return ret;
+}
+
+static int write_image(const char *img, char **page_ptr, const char *fn, 
unsigned sz, unsigned page_size)
+{
+    if (fn) {
+        if(sz == 0)
+           fprintf(stderr,"warning: no %s in boot image\n", img);
+       else
+           if (write_file(fn, (*page_ptr), sz)) return -1;
+    }
+
+    *page_ptr += ((sz + page_size - 1) / page_size) * page_size;
+    
+    return 0;
+}
+
+int usage(void)
+{
+    fprintf(stderr,"usage: unbootimg\n"
+            "       [ --kernel <filename> ]\n"
+            "       [ --ramdisk <filename> ]\n"
+            "       [ --second <2ndbootloader-filename> ]\n"
+            "       -i|--input <filename>\n"
+            );
+    return 1;
+}
+
+
+int main(int argc, char **argv)
+{
+    boot_img_hdr hdr;
+
+    char *kernel_fn = 0;
+    void *kernel_data = 0;
+    char *ramdisk_fn = 0;
+    void *ramdisk_data = 0;
+    char *second_fn = 0;
+    void *second_data = 0;
+    char *cmdline = 0;
+    char *bootimg = 0;
+    char *board = 0;
+    int fd;
+    char *data;
+    unsigned sz;
+    char *page_ptr;
+    unsigned i;
+
+    argc--;
+    argv++;
+
+    while(argc > 0){
+        char *arg = argv[0];
+        char *val = argv[1];
+        if(argc < 2) {
+            return usage();
+        }
+        argc -= 2;
+        argv += 2;
+        if(!strcmp(arg, "--input") || !strcmp(arg, "-i")) {
+            bootimg = val;
+        } else if(!strcmp(arg, "--kernel")) {
+            kernel_fn = val;
+        } else if(!strcmp(arg, "--ramdisk")) {
+            ramdisk_fn = val;
+        } else if(!strcmp(arg, "--second")) {
+            second_fn = val;
+        } else {
+            return usage();
+        }
+    }
+
+    if(bootimg == 0) {
+        fprintf(stderr,"error: no input filename specified\n");
+        return usage();
+    }
+
+
+    data = load_file(bootimg, &sz);
+    if (!data) {
+        fprintf(stderr,"error loading boot image: $s\n", strerror(errno));
+       return 1;
+    }
+    
+    if (memcmp(data, BOOT_MAGIC, BOOT_MAGIC_SIZE) != 0) {
+        fprintf(stderr,"error: supplied file is not an Android boot image\n");
+        return 1;
+    }
+
+    memcpy(&hdr, data, sizeof(hdr));
+    
+    printf("image size:         %u\n"
+          "kernel size:        %u\n"
+          "kernel load addr:   0x%x\n"
+          "ramdisk size:       %u\n"
+          "ramdisk load addr:  0x%x\n"
+          "2nd boot size:      %u\n"
+          "2nd boot load addr: 0x%x\n"
+          "kernel tags addr:   0x%x\n"
+          "page size:          %u\n"
+          "board:              `%s'\n"
+          "cmdline:            `%s'\n"
+          "id:                 ",
+          sz,
+          hdr.kernel_size, hdr.kernel_addr,
+          hdr.ramdisk_size, hdr.ramdisk_addr,
+          hdr.second_size, hdr.second_addr,
+          hdr.tags_addr, hdr.page_size, hdr.name, hdr.cmdline);
+    for (i = 0; i < 8; ++i) printf("%x", hdr.id[i]);
+    printf("\n");
+
+    page_ptr = data + hdr.page_size;
+    
+    if (write_image("kernel",   &page_ptr, kernel_fn,  hdr.kernel_size,  
hdr.page_size)) return 1;
+    if (write_image("ramdisk",  &page_ptr, ramdisk_fn, hdr.ramdisk_size, 
hdr.page_size)) return 1;
+    if (write_image("2nd boot", &page_ptr, second_fn,  hdr.second_size,  
hdr.page_size)) return 1;
+    
+    free(data);
+    return 0;
+}
-- 
1.7.2.5


_______________________________________________
Smartphones-userland mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/smartphones-userland

Reply via email to