linux-old/zBoot/xtract.c
<<
>>
Prefs
   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
  25void die(char * str)
  26{
  27        fprintf(stderr,"%s\n",str);
  28        exit(1);
  29}
  30
  31void usage(void)
  32{
  33        die("Usage: xtract system [ | gzip | piggyback > piggy.s]");
  34}
  35
  36int main(int argc, char ** argv)
  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}
  83
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.