netabootwrap.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include <sys/types.h>
  2. #include <asm/console.h>
  3. #include "system.h"
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <string.h>
  7. #include <sys/stat.h>
  8. #include <unistd.h>
  9. #include "netwrap.h"
  10. #include "bootloader.h"
  11. char *tfn="netboot.img", *kfn="vmlinux.gz", *ifn=NULL, *barg=NULL;
  12. char *progname;
  13. void print_usage(void )
  14. {
  15. printf("Following shows options and default values or example value\n");
  16. printf("%s -t netboot.img -k vmlinux.gz -i initrd.gz -a \"root=/dev/hda1 single\"\n", progname);
  17. exit(1);
  18. }
  19. void open_file(char *fn, int *fd, int *sz)
  20. {
  21. struct stat buf;
  22. *fd = open(fn, O_RDONLY);
  23. if (fd < 0) {
  24. fprintf(stderr, "%s: Cannot open %s\n", progname, fn);
  25. print_usage();
  26. exit(1);
  27. }
  28. fstat(*fd, &buf);
  29. if (buf.st_size <= 10*1024) {
  30. fprintf(stderr, "%s:Is this a right file %s, size = %d\n", progname, fn, (int)buf.st_size);
  31. print_usage();
  32. exit(1);
  33. }
  34. *sz = buf.st_size;
  35. }
  36. void append_file(int tfd, int sfd)
  37. {
  38. char buf[4096];
  39. int red;
  40. while ((red=read(sfd, buf, 4096)))
  41. write(tfd, buf, red);
  42. }
  43. int main(int argc, char **argv)
  44. {
  45. int tfd=0, kfd=0, ifd=0, ksz=0, isz=0;
  46. struct header hdr;
  47. char *stmp;
  48. progname=argv[0];
  49. /*
  50. * Read switches.
  51. */
  52. for (argc--, argv++; argc > 0; argc--, argv++) {
  53. if (argv[0][0] != '-')
  54. break;
  55. switch (argv[0][1]) {
  56. case 't': /* override target file name */
  57. if (argv[0][2]) {
  58. stmp = &(argv[0][2]);
  59. } else {
  60. argc--;
  61. argv++;
  62. stmp = argv[0];
  63. }
  64. if (!stmp) {
  65. fprintf(stderr,
  66. "%s: missing file name for target\n",progname);
  67. break;
  68. }
  69. tfn = stmp;
  70. break;
  71. case 'k': /* override kernel name */
  72. if (argv[0][2]) {
  73. stmp = &(argv[0][2]);
  74. } else {
  75. argc--;
  76. argv++;
  77. stmp = argv[0];
  78. }
  79. if (!stmp) {
  80. fprintf(stderr,
  81. "%s: missing file name for kernel\n",progname);
  82. break;
  83. }
  84. kfn = stmp;
  85. break;
  86. case 'i': /* override file name for initrd */
  87. if (argv[0][2]) {
  88. stmp = &(argv[0][2]);
  89. } else {
  90. argc--;
  91. argv++;
  92. stmp = argv[0];
  93. }
  94. if (!stmp) {
  95. fprintf(stderr,
  96. "%s: missing file name for initial RAM-disk\n",progname);
  97. break;
  98. }
  99. ifn = stmp;
  100. break;
  101. case 'a': /* add kernel parameters */
  102. if (argv[0][2]) {
  103. stmp = &(argv[0][2]);
  104. } else {
  105. argc--;
  106. argv++;
  107. stmp = argv[0];
  108. }
  109. if (!stmp) {
  110. fprintf(stderr,
  111. "%s: No kernel parameters specified\n",progname);
  112. break;
  113. }
  114. barg = stmp;
  115. break;
  116. default:
  117. fprintf(stderr, "%s: unknown switch: -%c\n",
  118. progname, argv[0][1]);
  119. print_usage();
  120. break;
  121. } /* switch */
  122. } /* for args */
  123. open_file(kfn, &kfd, &ksz);
  124. if (ifn)
  125. open_file(ifn, &ifd, &isz);
  126. printf("Target file name is %s\n", tfn);
  127. unlink(tfn);
  128. tfd = open(tfn, O_RDWR|O_CREAT, 0644);
  129. write(tfd, bootloader, sizeof(bootloader));
  130. hdr.header_size = sizeof(int)*3;
  131. hdr.kern_size = ksz;
  132. hdr.ird_size = isz;
  133. if (barg) printf("With kernel arguments : %s \n", barg);
  134. else printf("Without kernel argument\n");
  135. if (barg) {
  136. if (strlen(barg) >= 200) {
  137. printf("Kernel argument-list is too long\n");
  138. exit(1);
  139. }
  140. strncpy(hdr.boot_arg, barg, strlen(barg)+1);
  141. hdr.header_size += strlen(barg)+1;
  142. }
  143. lseek(tfd, align_512(sizeof(bootloader)), SEEK_SET);
  144. write(tfd, &hdr, hdr.header_size);
  145. printf("Binding kernel %s\n", kfn);
  146. lseek(tfd, align_512((unsigned long)lseek(tfd, 0, SEEK_CUR)), SEEK_SET);
  147. append_file(tfd, kfd);
  148. if (ifn) {
  149. printf("Binding initrd %s\n", ifn);
  150. lseek(tfd, align_512((unsigned long)lseek(tfd, 0, SEEK_CUR)), SEEK_SET);
  151. append_file(tfd, ifd);
  152. }
  153. close(tfd);
  154. printf("Done.\n");
  155. return 0;
  156. }