123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #include <sys/types.h>
- #include <asm/console.h>
- #include "system.h"
- #include <stdio.h>
- #include <fcntl.h>
- #include <string.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include "netwrap.h"
- #include "bootloader.h"
- char *tfn="netboot.img", *kfn="vmlinux.gz", *ifn=NULL, *barg=NULL;
- char *progname;
- void print_usage(void )
- {
- printf("Following shows options and default values or example value\n");
- printf("%s -t netboot.img -k vmlinux.gz -i initrd.gz -a \"root=/dev/hda1 single\"\n", progname);
- exit(1);
- }
- void open_file(char *fn, int *fd, int *sz)
- {
- struct stat buf;
- *fd = open(fn, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "%s: Cannot open %s\n", progname, fn);
- print_usage();
- exit(1);
- }
- fstat(*fd, &buf);
- if (buf.st_size <= 10*1024) {
- fprintf(stderr, "%s:Is this a right file %s, size = %d\n", progname, fn, (int)buf.st_size);
- print_usage();
- exit(1);
- }
- *sz = buf.st_size;
- }
- void append_file(int tfd, int sfd)
- {
- char buf[4096];
- int red;
- while ((red=read(sfd, buf, 4096)))
- write(tfd, buf, red);
- }
- int main(int argc, char **argv)
- {
- int tfd=0, kfd=0, ifd=0, ksz=0, isz=0;
- struct header hdr;
- char *stmp;
- progname=argv[0];
- /*
- * Read switches.
- */
- for (argc--, argv++; argc > 0; argc--, argv++) {
- if (argv[0][0] != '-')
- break;
- switch (argv[0][1]) {
- case 't': /* override target file name */
- if (argv[0][2]) {
- stmp = &(argv[0][2]);
- } else {
- argc--;
- argv++;
- stmp = argv[0];
- }
- if (!stmp) {
- fprintf(stderr,
- "%s: missing file name for target\n",progname);
- break;
- }
- tfn = stmp;
- break;
- case 'k': /* override kernel name */
- if (argv[0][2]) {
- stmp = &(argv[0][2]);
- } else {
- argc--;
- argv++;
- stmp = argv[0];
- }
- if (!stmp) {
- fprintf(stderr,
- "%s: missing file name for kernel\n",progname);
- break;
- }
- kfn = stmp;
- break;
- case 'i': /* override file name for initrd */
- if (argv[0][2]) {
- stmp = &(argv[0][2]);
- } else {
- argc--;
- argv++;
- stmp = argv[0];
- }
- if (!stmp) {
- fprintf(stderr,
- "%s: missing file name for initial RAM-disk\n",progname);
- break;
- }
- ifn = stmp;
- break;
- case 'a': /* add kernel parameters */
- if (argv[0][2]) {
- stmp = &(argv[0][2]);
- } else {
- argc--;
- argv++;
- stmp = argv[0];
- }
- if (!stmp) {
- fprintf(stderr,
- "%s: No kernel parameters specified\n",progname);
- break;
- }
- barg = stmp;
- break;
- default:
- fprintf(stderr, "%s: unknown switch: -%c\n",
- progname, argv[0][1]);
- print_usage();
- break;
- } /* switch */
- } /* for args */
- open_file(kfn, &kfd, &ksz);
- if (ifn)
- open_file(ifn, &ifd, &isz);
- printf("Target file name is %s\n", tfn);
- unlink(tfn);
- tfd = open(tfn, O_RDWR|O_CREAT, 0644);
- write(tfd, bootloader, sizeof(bootloader));
- hdr.header_size = sizeof(int)*3;
- hdr.kern_size = ksz;
- hdr.ird_size = isz;
- if (barg) printf("With kernel arguments : %s \n", barg);
- else printf("Without kernel argument\n");
- if (barg) {
- if (strlen(barg) >= 200) {
- printf("Kernel argument-list is too long\n");
- exit(1);
- }
- strncpy(hdr.boot_arg, barg, strlen(barg)+1);
- hdr.header_size += strlen(barg)+1;
- }
- lseek(tfd, align_512(sizeof(bootloader)), SEEK_SET);
- write(tfd, &hdr, hdr.header_size);
- printf("Binding kernel %s\n", kfn);
- lseek(tfd, align_512((unsigned long)lseek(tfd, 0, SEEK_CUR)), SEEK_SET);
- append_file(tfd, kfd);
- if (ifn) {
- printf("Binding initrd %s\n", ifn);
- lseek(tfd, align_512((unsigned long)lseek(tfd, 0, SEEK_CUR)), SEEK_SET);
- append_file(tfd, ifd);
- }
- close(tfd);
- printf("Done.\n");
- return 0;
- }
|