Guest User

Untitled

a guest
Nov 25th, 2012
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.18 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include <stdlib.h>
  5. #include <sys/stat.h>
  6. #include <endian.h>
  7.  
  8. #include "bootheader.h"
  9.  
  10. #define ERROR(...) do { fprintf(stderr, __VA_ARGS__); return 1; } while(0)
  11. #define CMDLINE_END (0x600)
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15.     char *origin;
  16.     char *bzImage;
  17.     char *ramdisk;
  18.     FILE *forigin;
  19.     FILE *fbzImage;
  20.     FILE *framdisk;
  21.     uint32_t bzImageLen;
  22.     uint32_t ramdiskLen;
  23.     uint32_t missing;
  24.     char buf[BUFSIZ];
  25.     size_t size;
  26.  
  27.     if (argc != 4)
  28.         ERROR("Usage: %s <image to unpack> <bzImage out> <ramdisk out>\n", argv[0]);
  29.  
  30.     origin = argv[1];
  31.     bzImage = argv[2];
  32.     ramdisk = argv[3];
  33.  
  34.     forigin = fopen(origin, "r");
  35.     fbzImage = fopen(bzImage, "w");
  36.     framdisk = fopen(ramdisk, "w");
  37.     if (!forigin || !bzImage || !framdisk)
  38.         ERROR("ERROR: failed to open origin or output images\n");
  39.  
  40.     /* Read bzImage length from the image to unpack */
  41.     if (fseek(forigin, CMDLINE_END, SEEK_SET) == -1)
  42.         ERROR("ERROR: failed to seek on image\n");
  43.  
  44.     if (fread(&bzImageLen, sizeof(uint32_t), 1, forigin) != 1)
  45.         ERROR("ERROR: failed to read bzImage length\n");
  46.     else
  47.         bzImageLen = le32toh(bzImageLen);
  48.  
  49.     /* Read ramdisk length from the image to unpack */
  50.     if (fseek(forigin, (CMDLINE_END+sizeof(uint32_t)), SEEK_SET) == -1)
  51.         ERROR("ERROR: failed to seek on image\n");
  52.  
  53.     if (fread(&ramdiskLen, sizeof(uint32_t), 1, forigin) != 1)
  54.         ERROR("ERROR: failed to read ramdisk length\n");
  55.     else
  56.         ramdiskLen = le32toh(ramdiskLen);
  57.  
  58.     /* Copy bzImage */
  59.     if (fseek(forigin, sizeof(struct bootheader), SEEK_SET) == -1)
  60.         ERROR("ERROR: failed to seek when copying bzImage\n");
  61.  
  62.     missing = bzImageLen;
  63.     while (missing > 0) {
  64.         size = fread(buf, 1, ((missing > BUFSIZ) ? BUFSIZ : missing), forigin);
  65.         if (size != 0) {
  66.             fwrite(buf, 1, size, fbzImage);
  67.             missing -= size;
  68.         }
  69.     }
  70.  
  71.     /* Copy ramdisk */
  72.     if (fseek(forigin, (sizeof(struct bootheader)+bzImageLen), SEEK_SET) == -1)
  73.         ERROR("ERROR: failed to seek when copying ramdisk\n");
  74.  
  75.     missing = ramdiskLen;
  76.     while (missing > 0) {
  77.         size = fread(buf, 1, ((missing > BUFSIZ) ? BUFSIZ : missing), forigin);
  78.         if (size != 0) {
  79.             fwrite(buf, 1, size, framdisk);
  80.             missing -= size;
  81.         }
  82.     }
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment