home *** CD-ROM | disk | FTP | other *** search
- /*
- * linux/zBoot/xtract.c
- *
- * Copyright (C) 1993 Hannu Savolainen
- *
- * Extracts the system image and writes it to the stdout.
- * based on tools/build.c by Linus Torvalds
- */
-
- #include <stdio.h> /* fprintf */
- #include <string.h>
- #include <stdlib.h> /* contains exit */
- #include <sys/types.h> /* unistd.h needs this */
- #include <sys/stat.h>
- #include <sys/sysmacros.h>
- #include <unistd.h> /* contains read/write */
- #include <fcntl.h>
- #include <a.out.h>
- #include <linux/config.h>
-
- #define GCC_HEADER 1024
-
- #define STRINGIFY(x) #x
-
- void die(char * str)
- {
- fprintf(stderr,"%s\n",str);
- exit(1);
- }
-
- void usage(void)
- {
- die("Usage: xtract system [ | gzip | piggyback > piggy.s]");
- }
-
- int main(int argc, char ** argv)
- {
- int i,c,id, sz;
- char buf[1024];
- char major_root, minor_root;
- struct stat sb;
-
- struct exec *ex = (struct exec *)buf;
-
- if (argc != 2)
- usage();
-
- if ((id=open(argv[1],O_RDONLY,0))<0)
- die("Unable to open 'system'");
- if (read(id,buf,GCC_HEADER) != GCC_HEADER)
- die("Unable to read header of 'system'");
- if (N_MAGIC(*ex) != ZMAGIC)
- die("Non-GCC header of 'system'");
-
- sz = N_SYMOFF(*ex) - GCC_HEADER + 4; /* +4 to get the same result than tools/build */
-
- fprintf(stderr, "System size is %d\n", sz);
-
- while (sz)
- {
- int l, n;
-
- l = sz;
- if (l > sizeof(buf)) l = sizeof(buf);
-
- if ((n=read(id, buf, l)) !=l)
- {
- if (n == -1)
- perror(argv[1]);
- else
- fprintf(stderr, "Unexpected EOF\n");
-
- die("Can't read system");
- }
-
- write(1, buf, l);
- sz -= l;
- }
-
- close(id);
- return(0);
- }
-