/******************************************************************************/ /* */ /* This program merges an MFS root disk image into a kernel built with */ /* option MD_ROOT_SIZE. It duplicates the functionality of the */ /* program of the same name that used to be part of FreeBSD 4.x. */ /* */ /******************************************************************************/ #include #include #include #include #include #define KERNEL_FNAME argv[1] #define MFSROOT_FNAME argv[2] #define MFSROOTSIGNATURE "MFS Filesystem goes here" int main(int argc, char *argv[]) { FILE *kernel, *mfsroot; int ksize, mfssize; unsigned char *kbuff; size_t len; unsigned char *mfsrootptr; fprintf(stderr, "\nFreeBSD MFS Root Image Merger\n\n"); /* Validate command line arguments */ if (argc != 3) { fprintf(stderr, "Usage: write_mfs_in_kernel \n"); exit(1); } /* Open kernel image file */ kernel = fopen(KERNEL_FNAME, "r+"); if (kernel == NULL) { fprintf(stderr, "ERROR: Cannot open kernel image file %s, %s\n", KERNEL_FNAME, strerror(errno)); exit(1); } /* Figure out kernel image size */ if (fseek(kernel, 0L, SEEK_END)) { fprintf(stderr, "ERROR: fseek() failed, %s\n", strerror(errno)); exit(1); } ksize = ftell(kernel); if (ksize < 0) { fprintf(stderr, "ERROR: ftell() failed, %s\n", strerror(errno)); exit(1); } rewind(kernel); printf("Kernel image size: %d bytes \n", ksize); /* Open MFS root image file */ mfsroot = fopen(MFSROOT_FNAME, "r"); if (mfsroot == NULL) { fprintf(stderr, "ERROR: Cannot open MFS root image file %s, %s\n", MFSROOT_FNAME, strerror(errno)); exit(1); } /* Figure out MFS root image size */ if (fseek(mfsroot, 0L, SEEK_END)) { fprintf(stderr, "ERROR: fseek() failed, %s\n", strerror(errno)); exit(1); } mfssize = ftell(mfsroot); if (mfssize < 0) { fprintf(stderr, "ERROR: ftell() failed, %s\n", strerror(errno)); exit(1); } rewind(mfsroot); printf("MFS root image size: %d bytes\n", mfssize); /* Allocate a big buffer for the kernel image */ kbuff = malloc(ksize); if (kbuff == NULL) { fprintf(stderr, "ERROR: malloc() failed, %s\n", strerror(errno)); exit(1); } /* Read in kernel image */ len = fread(kbuff, 1, ksize, kernel); if (len != ksize) { fprintf(stderr, "ERROR: fread() failed, %s\n", strerror(errno)); exit(1); } mfsrootptr = memmem(kbuff, ksize, MFSROOTSIGNATURE, strlen(MFSROOTSIGNATURE)); if (mfsrootptr == NULL) { fprintf(stderr, "ERROR: MFS root signature not found\n"); exit(1); } len = fread(mfsrootptr, 1, ksize, mfsroot); rewind(kernel); len = fwrite(kbuff, 1, ksize, kernel); if (len != ksize) { fprintf(stderr, "ERROR: fwrite() failed, %s\n", strerror(errno)); exit(1); } exit(0); }