#include <stdio.h>
#include <string.h>
#include "finstext2.h"
-#include "ext2.h" // #defines ext2_data
+#include "ext2.h" // #defines ext2_data
#include <linux/hdreg.h>
#include <linux/ext3_fs.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
-#define MAJOR_VERSION 1
-#define MINOR_VERSION 0
+#define MAJOR_VERSION 1
+#define MINOR_VERSION 0
-PEXT2_BOOTCODE Ext2BootCode = (PEXT2_BOOTCODE)ext2_data;
-struct ext3_super_block Ext2SuperBlock;
-struct hd_geometry Ext2DriveGeometry;
-unsigned char Ext2ExistingBootCode[1024];
+PEXT2_BOOTCODE Ext2BootCode = (PEXT2_BOOTCODE)ext2_data;
+struct ext3_super_block Ext2SuperBlock;
+struct hd_geometry Ext2DriveGeometry;
+unsigned char Ext2ExistingBootCode[1024];
-char BlockDevice[260];
-int BlockDeviceSpecified = 0;
-int BlockDeviceFileDescriptor;
+char BlockDevice[260];
+int BlockDeviceSpecified = 0;
+int BlockDeviceFileDescriptor;
int main(int argc, char *argv[])
{
- int Index;
- char ch;
-
- // Verify that we got enough command line parameters
- if (argc < 2)
- {
- printf("finstext2 block_device [-v]\n\n");
- printf("block_device Specifies the ext2/3 volume to install to (i.e. /dev/hda1)\n");
- printf("-v Displays the version\n\n");
- }
-
- // Parse the command line parameters
- for (Index=1; Index<argc; Index++)
- {
- if (strcmp(argv[Index], "-v") == 0)
- {
- printf("FreeLoader Ext2/3 Installer v%d.%d\n", MAJOR_VERSION, MINOR_VERSION);
- }
- else
- {
- strcpy(BlockDevice, argv[Index]);
- BlockDeviceSpecified = 1;
- }
- }
-
- if (BlockDeviceSpecified)
- {
- BlockDeviceFileDescriptor = open(BlockDevice, O_RDWR|O_SYNC);
-
- if (BlockDeviceFileDescriptor == -1)
- {
- printf("Couldn't open block device %s\n", BlockDevice);
- return 1;
- }
-
- if (read(BlockDeviceFileDescriptor, Ext2ExistingBootCode, (size_t)1024) != (ssize_t)1024)
- {
- close(BlockDeviceFileDescriptor);
- printf("Couldn't read existing boot code from %s\n", BlockDevice);
- return 1;
- }
-
- for (Index=0; Index<1024; Index++)
- {
- if (Ext2ExistingBootCode[Index] != 0x00)
- {
- printf("This EXT2/3 volume has existing boot code.\n");
- printf("Do you want to overwrite it? [y/n] ");
- scanf("%c", &ch);
-
- if (ch == 'n' || ch == 'N')
- {
- close(BlockDeviceFileDescriptor);
- printf("Cancelled.\n");
- return 0;
- }
-
- break;
- }
- }
-
- if (read(BlockDeviceFileDescriptor, &Ext2SuperBlock, (size_t)1024) != (ssize_t)1024)
- {
- close(BlockDeviceFileDescriptor);
- printf("Couldn't read super block from %s\n", BlockDevice);
- return 1;
- }
-
- if (Ext2SuperBlock.s_magic != EXT3_SUPER_MAGIC)
- {
- close(BlockDeviceFileDescriptor);
- printf("Block device %s is not a EXT2/3 volume or has an invalid super block.\n", BlockDevice);
- return 1;
- }
-
- if (ioctl(BlockDeviceFileDescriptor, HDIO_GETGEO, &Ext2DriveGeometry) != 0)
- {
- close(BlockDeviceFileDescriptor);
- printf("Couldn't get drive geometry from block device %s\n", BlockDevice);
- return 1;
- }
-
- printf("Heads: %d\n", Ext2DriveGeometry.heads);
- printf("Sectors: %d\n", Ext2DriveGeometry.sectors);
- printf("Cylinders: %d\n", Ext2DriveGeometry.cylinders);
- printf("Start: %d\n", Ext2DriveGeometry.start);
-
- Ext2BootCode->BootDrive = 0xff;
- Ext2BootCode->BootPartition = 0x00;
- //Ext2BootCode->SectorsPerTrack = Ext2DriveGeometry.sectors;
- //Ext2BootCode->NumberOfHeads = Ext2DriveGeometry.heads;
- Ext2BootCode->Ext2VolumeStartSector = Ext2DriveGeometry.start;
- Ext2BootCode->Ext2BlockSizeInBytes = 1024 << Ext2SuperBlock.s_log_block_size;
- Ext2BootCode->Ext2BlockSize = Ext2BootCode->Ext2BlockSizeInBytes / 512;
- Ext2BootCode->Ext2PointersPerBlock = Ext2BootCode->Ext2BlockSizeInBytes / 4;
- Ext2BootCode->Ext2GroupDescPerBlock = Ext2BootCode->Ext2BlockSizeInBytes / 32;
- Ext2BootCode->Ext2FirstDataBlock = Ext2SuperBlock.s_first_data_block;
- Ext2BootCode->Ext2InodesPerGroup = Ext2SuperBlock.s_inodes_per_group;
- Ext2BootCode->Ext2InodesPerBlock = Ext2BootCode->Ext2BlockSizeInBytes / 128;
-
- if (lseek(BlockDeviceFileDescriptor, (off_t)0, SEEK_SET) == (off_t)-1)
- {
- close(BlockDeviceFileDescriptor);
- printf("Couldn't write boot code on %s\n", BlockDevice);
- return 1;
- }
-
- if (write(BlockDeviceFileDescriptor, Ext2BootCode, (size_t)1024) != (ssize_t)1024)
- {
- close(BlockDeviceFileDescriptor);
- printf("Couldn't write boot code on %s\n", BlockDevice);
- return 1;
- }
-
- close(BlockDeviceFileDescriptor);
-
- printf("Boot code written successfully!\n");
- }
-
- return 0;
+ int Index;
+ char ch;
+
+ // Verify that we got enough command line parameters
+ if (argc < 2)
+ {
+ printf("finstext2 block_device [-v]\n\n");
+ printf("block_device Specifies the ext2/3 volume to install to (i.e. /dev/hda1)\n");
+ printf("-v Displays the version\n\n");
+ }
+
+ // Parse the command line parameters
+ for (Index=1; Index<argc; Index++)
+ {
+ if (strcmp(argv[Index], "-v") == 0)
+ {
+ printf("FreeLoader Ext2/3 Installer v%d.%d\n", MAJOR_VERSION, MINOR_VERSION);
+ }
+ else
+ {
+ strcpy(BlockDevice, argv[Index]);
+ BlockDeviceSpecified = 1;
+ }
+ }
+
+ if (BlockDeviceSpecified)
+ {
+ BlockDeviceFileDescriptor = open(BlockDevice, O_RDWR|O_SYNC);
+
+ if (BlockDeviceFileDescriptor == -1)
+ {
+ printf("Couldn't open block device %s\n", BlockDevice);
+ return 1;
+ }
+
+ if (read(BlockDeviceFileDescriptor, Ext2ExistingBootCode, (size_t)1024) != (ssize_t)1024)
+ {
+ close(BlockDeviceFileDescriptor);
+ printf("Couldn't read existing boot code from %s\n", BlockDevice);
+ return 1;
+ }
+
+ for (Index=0; Index<1024; Index++)
+ {
+ if (Ext2ExistingBootCode[Index] != 0x00)
+ {
+ printf("This EXT2/3 volume has existing boot code.\n");
+ printf("Do you want to overwrite it? [y/n] ");
+ scanf("%c", &ch);
+
+ if (ch == 'n' || ch == 'N')
+ {
+ close(BlockDeviceFileDescriptor);
+ printf("Cancelled.\n");
+ return 0;
+ }
+
+ break;
+ }
+ }
+
+ if (read(BlockDeviceFileDescriptor, &Ext2SuperBlock, (size_t)1024) != (ssize_t)1024)
+ {
+ close(BlockDeviceFileDescriptor);
+ printf("Couldn't read super block from %s\n", BlockDevice);
+ return 1;
+ }
+
+ if (Ext2SuperBlock.s_magic != EXT3_SUPER_MAGIC)
+ {
+ close(BlockDeviceFileDescriptor);
+ printf("Block device %s is not a EXT2/3 volume or has an invalid super block.\n", BlockDevice);
+ return 1;
+ }
+
+ if (ioctl(BlockDeviceFileDescriptor, HDIO_GETGEO, &Ext2DriveGeometry) != 0)
+ {
+ close(BlockDeviceFileDescriptor);
+ printf("Couldn't get drive geometry from block device %s\n", BlockDevice);
+ return 1;
+ }
+
+ printf("Heads: %d\n", Ext2DriveGeometry.heads);
+ printf("Sectors: %d\n", Ext2DriveGeometry.sectors);
+ printf("Cylinders: %d\n", Ext2DriveGeometry.cylinders);
+ printf("Start: %d\n", Ext2DriveGeometry.start);
+
+ Ext2BootCode->BootDrive = 0xff;
+ Ext2BootCode->BootPartition = 0x00;
+ //Ext2BootCode->SectorsPerTrack = Ext2DriveGeometry.sectors;
+ //Ext2BootCode->NumberOfHeads = Ext2DriveGeometry.heads;
+ Ext2BootCode->Ext2VolumeStartSector = Ext2DriveGeometry.start;
+ Ext2BootCode->Ext2BlockSizeInBytes = 1024 << Ext2SuperBlock.s_log_block_size;
+ Ext2BootCode->Ext2BlockSize = Ext2BootCode->Ext2BlockSizeInBytes / 512;
+ Ext2BootCode->Ext2PointersPerBlock = Ext2BootCode->Ext2BlockSizeInBytes / 4;
+ Ext2BootCode->Ext2GroupDescPerBlock = Ext2BootCode->Ext2BlockSizeInBytes / 32;
+ Ext2BootCode->Ext2FirstDataBlock = Ext2SuperBlock.s_first_data_block;
+ Ext2BootCode->Ext2InodesPerGroup = Ext2SuperBlock.s_inodes_per_group;
+ Ext2BootCode->Ext2InodesPerBlock = Ext2BootCode->Ext2BlockSizeInBytes / 128;
+
+ if (lseek(BlockDeviceFileDescriptor, (off_t)0, SEEK_SET) == (off_t)-1)
+ {
+ close(BlockDeviceFileDescriptor);
+ printf("Couldn't write boot code on %s\n", BlockDevice);
+ return 1;
+ }
+
+ if (write(BlockDeviceFileDescriptor, Ext2BootCode, (size_t)1024) != (ssize_t)1024)
+ {
+ close(BlockDeviceFileDescriptor);
+ printf("Couldn't write boot code on %s\n", BlockDevice);
+ return 1;
+ }
+
+ close(BlockDeviceFileDescriptor);
+
+ printf("Boot code written successfully!\n");
+ }
+
+ return 0;
}
\ No newline at end of file