root/zBoot/xtract.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. die
  2. usage
  3. main

   1 /*
   2  *  linux/zBoot/xtract.c
   3  *
   4  *  Copyright (C) 1993  Hannu Savolainen
   5  *
   6  *      Extracts the system image and writes it to the stdout.
   7  *      based on tools/build.c by Linus Torvalds
   8  */
   9 
  10 #include <stdio.h>      /* fprintf */
  11 #include <string.h>
  12 #include <stdlib.h>     /* contains exit */
  13 #include <sys/types.h>  /* unistd.h needs this */
  14 #include <sys/stat.h>
  15 #include <sys/sysmacros.h>
  16 #include <unistd.h>     /* contains read/write */
  17 #include <fcntl.h>
  18 #include <a.out.h>
  19 #include <linux/config.h>
  20 
  21 #define GCC_HEADER 1024
  22 
  23 #define STRINGIFY(x) #x
  24 
  25 void die(char * str)
     /* [<][>][^][v][top][bottom][index][help] */
  26 {
  27         fprintf(stderr,"%s\n",str);
  28         exit(1);
  29 }
  30 
  31 void usage(void)
     /* [<][>][^][v][top][bottom][index][help] */
  32 {
  33         die("Usage: xtract system [ | gzip | piggyback > piggy.s]");
  34 }
  35 
  36 int main(int argc, char ** argv)
     /* [<][>][^][v][top][bottom][index][help] */
  37 {
  38         int i,c,id, sz;
  39         char buf[1024];
  40         char major_root, minor_root;
  41         struct stat sb;
  42 
  43         struct exec *ex = (struct exec *)buf;
  44 
  45         if (argc  != 2)
  46                 usage();
  47         
  48         if ((id=open(argv[1],O_RDONLY,0))<0)
  49                 die("Unable to open 'system'");
  50         if (read(id,buf,GCC_HEADER) != GCC_HEADER)
  51                 die("Unable to read header of 'system'");
  52         if (N_MAGIC(*ex) != ZMAGIC)
  53                 die("Non-GCC header of 'system'");
  54 
  55         sz = N_SYMOFF(*ex) - GCC_HEADER + 4;    /* +4 to get the same result than tools/build */
  56 
  57         fprintf(stderr, "System size is %d\n", sz);
  58 
  59         while (sz)
  60         {
  61                 int l, n;
  62 
  63                 l = sz;
  64                 if (l > sizeof(buf)) l = sizeof(buf);
  65 
  66                 if ((n=read(id, buf, l)) !=l)
  67                 {
  68                         if (n == -1) 
  69                            perror(argv[1]);
  70                         else
  71                            fprintf(stderr, "Unexpected EOF\n");
  72 
  73                         die("Can't read system");
  74                 }
  75 
  76                 write(1, buf, l);
  77                 sz -= l;
  78         }
  79 
  80         close(id);
  81         return(0);
  82 }

/* [<][>][^][v][top][bottom][index][help] */