|
|
- #include <sys/stat.h>
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #include <stdlib.h>
- #include "lsfs_disk_controller.h"
-
-
- static int disk_is_loaded = 0;
- static char loaded_disk_name[256];
- static char input_buffer[256];
-
- int dmu_print_file(char *path) {
-
- lsfs_file *file = calloc(1, sizeof(lsfs_file));
- lsfs_disk_getattr(file, path);
-
-
- printf("\n|-----------------Meta Information For File-----------------|\n");
- printf("File ID: %lu\n", file->file_id);
- printf("Filename: %s\n", file->filename);
- printf("File size: %lu\n", file->size);
- printf("Entry kind: %d\n", file->entry_kind);
- printf("Index in directory table: %lu\n", file->table_entry_pointer);
- printf("Sector index on disk: %lu\n", file->table_entry_sector_index);
- printf("\nData pointers:\n");
- for (int i = 0; i < NUM_DATA_POINTERS; ++i)
- {
- printf("%lu\n", file->data_pointer[i]);
- }
- /*
- printf("\n|-------------------------File Data-------------------------|\n");
- char* file_data = calloc(MAX_NUM_ONE_LEVEL_DATA, SECTOR_SIZE);
- int size_of_data = 0;
-
- size_of_data = lsfs_disk_read_data_from_file(fileID, (256*4096), file_data);
-
- if (size_of_data <= 0) {
- printf("|File has no data!\n");
- }
- for (int i = 0; i < MAX_NUM_ONE_LEVEL_DATA; ++i)
- {
- if (size_of_data <= 0) {
- break;
- }
- printf("|%s", file_data);
- size_of_data -= SECTOR_SIZE;
- }
- printf("\n|---------------------End File Data-------------------------|\n");
- */
- return 1;
- }
-
- #if 0
- typedef struct sector_data
- {
- char data[SECTOR_SIZE];
- } sector_data;
-
-
- int dmu_install_SingOS(char* disk_name) {
- disk = fopen ( disk_name , "r+b" );
- p_control.fsci = malloc(sizeof(FSCI));
- p_control.mtt_tags = malloc(sizeof(global_tag) * DEFAULT_MASTER_TAG_TABLE_SIZE);
- lsfs_disk_load_disk(disk, &p_control);
-
- lsfs_tag_id untagged = lsfs_disk_create_tag("@untagged", false);
- lsfs_tag_id sy_files = lsfs_disk_create_tag("@system_files", false);
- lsfs_tag_id SingOS_files = lsfs_disk_create_tag("@SingOS", false);
-
- /* Add files: */
- char* new_file_data_d = calloc(1, 4096);
- char* rtfm_file = "If you don't know the answer\nRead the F manual\n";
- sprintf(new_file_data_d, "%s", rtfm_file);
- char* l_filename = "RTFM.md";
- lsfs_sector_offset* tags = calloc(2, sizeof(lsfs_sector_offset));
- lsfs_tag_id filename_tag = lsfs_disk_create_tag(l_filename, true);
- tags[0] = filename_tag;
- tags[1] = sy_files;
- int rtfm_file_if = lsfs_disk_create_file(l_filename, tags, new_file_data_d );
- lsfs_disk_write_data_to_file(rtfm_file_if, strlen(rtfm_file), new_file_data_d);
-
- char* vip_file = "Very important file\n" ;
- sprintf(new_file_data_d, "%s", vip_file);
- l_filename = "system_control.md";
- filename_tag = lsfs_disk_create_tag(l_filename, true);
- tags[0] = filename_tag;
- tags[1] = sy_files;
- int vip_file_id = lsfs_disk_create_file(l_filename, tags, new_file_data_d );
- lsfs_disk_write_data_to_file(vip_file_id, strlen(vip_file), new_file_data_d);
-
- char* sing_os_file = "SingOS is comming\n\nWe are not ready to expose the binaries nor the source\nBut read more @ guld-berg.dk/singos\nSingOS is real\n\n- groot\n" ;
- sprintf(new_file_data_d, "%s", sing_os_file);
- l_filename = "README.md";
- filename_tag = lsfs_disk_create_tag(l_filename, true);
- tags[0] = filename_tag;
- tags[1] = SingOS_files;
- int sing_id = lsfs_disk_create_file(l_filename, tags, new_file_data_d );
- lsfs_disk_write_data_to_file(sing_id, strlen(sing_os_file), new_file_data_d);
-
-
- free(new_file_data_d);
- free(tags);
-
- fclose (disk);
- }
- #endif
-
- int dmu_create_file_system(char* disk_name) {
- uint64_t filesystem_size_in_MB = 0;
- char hdd_or_partition = 0; // 1: is harddisk, 2: is partition
- char input_size_file_system[64]; // in MB
-
- do {
- printf("Create as 1: harddrive or 2: as a single partition (enter 1 or 2): \n");
- scanf("%c", &hdd_or_partition);
-
- } while ((hdd_or_partition != '1') && (hdd_or_partition != '2'));
-
- printf("Enter size of file system in MB (as an integer number): \n");
- scanf("%s", input_size_file_system);
-
- filesystem_size_in_MB = atoi(input_size_file_system);
-
- printf("Create new disk img\n");
- create_file_system(disk_name, hdd_or_partition, filesystem_size_in_MB);
- printf("Disk is created as: %s\n", disk_name);
-
- fclose (disk);
-
- // TODO: Do you want to install SingOS:
- //dmu_install_SingOS(disk_name);
-
- return 1;
- }
-
- int dmu_load_file_system(char* disk_name)
- {
- lsfs_disk_load_disk(disk_name);
- disk_is_loaded = 1;
- return 1;
- }
-
- int dmu_install_bootloader(char* disk_name)
- {
- lsfs_disk_install_bootloader(disk_name);
- return 1;
- }
-
- int dmu_install_vbr(char* disk_name) {
- lsfs_disk_install_vbr(disk_name);
- return 1;
- }
-
- int dmu_print_mtt(char *path) {
- Directory_Table *directory_table;
- directory_table = lsfs_find_directory(path, false);
-
- printf("\n|------------------------ Directory -------------------------------------|\n");
- printf("\n|--------Filename------------|Not used----------------------|Entry ID----|\n");
-
- for (int i = 0; i < DEFAULT_TABLE_SIZE; ++i) {
- printf("|%-28s|%-30lu|%-12lu| \n", directory_table->entries[i].filename, directory_table->entries[i].file_id, directory_table->entries[i].file_id);
- printf("|----------------------------|------------------------------|------------|\n");
-
- }
- printf("\n\n\n");
- return 1;
- }
-
-
- typedef struct Arguments_Settings
- {
- char* load_diskname;
- char* new_diskname;
- int new_disk_size_mb;
- char* install_vbr_path;
- char* install_bootloader_path;
- char* copy_new_kernel;
-
-
- } Arguments_Settings;
-
- int main (int argc, char *argv[])
- {
-
- if (argc > 1)
- {
- Arguments_Settings* settings = calloc(1, sizeof(Arguments_Settings));
- for (int i = 1; i < argc; i++)
- {
- // Parse parameters for cmd usage
- switch(argv[i][1])
- {
- case 'd':
- {
- // Load disk with specified name
- i++; // Go to next parameter which is the path/filename for the new disk
- if (i > argc)
- {
- // Go to loop condition to exit
- continue;
- }
- settings->load_diskname = argv[i];
-
- } break;
-
- case 'n':
- {
- // Create new disk
- i++; // Go to next parameter which is the path/filename for the new disk
- if (i > argc)
- {
- // Go to loop condition to exit
- continue;
- }
- settings->new_diskname = argv[i];
- printf("Creating new disk: %s \n", settings->new_diskname);
-
- } break;
-
- case 's':
- {
- // Specify size of new disk
- i++; // Go to next parameter which is the disk size
- if (i > argc)
- {
- // Go to loop condition to exit
- continue;
- }
- settings->new_disk_size_mb = atoi(argv[i]);
-
- } break;
-
- case 'v':
- {
- // Update Volume boot record
- i++; // Go to next parameter which is the path for the VBR
- if (i > argc)
- {
- // Go to loop condition to exit
- continue;
- }
- settings->install_vbr_path = argv[i];
-
- } break;
-
- case 'b':
- {
- // Update bootloader
- i++; // Go to next parameter which is the path for the VBR
- if (i > argc)
- {
- // Go to loop condition to exit
- continue;
- }
- settings->install_bootloader_path = argv[i];
- } break;
- }
- }
-
- if (settings->new_diskname != NULL && settings->load_diskname != NULL)
- {
- printf("-d and -n cannot be specified in the same qeury\n");
- return 1;
- }
- // Now execute the commands.
- // First check if we should create a new disk
- if (settings->new_diskname != NULL)
- {
- // TODO(only harddisk is supported yet)
- char hdd_or_partition = '1'; // 1 is harddrive
-
- if (settings->new_disk_size_mb <= 0)
- {
- settings->new_disk_size_mb = 20; // 20MB is default size
- }
-
- create_file_system(settings->new_diskname, hdd_or_partition, settings->new_disk_size_mb);
-
- settings->load_diskname = settings->new_diskname;
- }
-
- // Load the disk to complete the following instructions
- if (settings->load_diskname != NULL)
- {
- dmu_load_file_system(settings->load_diskname);
-
- if (settings->install_bootloader_path != NULL)
- {
- lsfs_disk_install_bootloader(settings->install_bootloader_path);
- }
-
- if (settings->install_vbr_path != NULL)
- {
- lsfs_disk_install_vbr(settings->install_vbr_path);
- }
-
- }
-
- }
- else
- {
- char chose[8];
- while(strcmp(chose, "exit")) {
- if(!disk_is_loaded) {
- printf("Tag File System Utility\nMenu:\nc: Create new lsfs disk\nl: load disk\nEnter:");
- }
- else {
- printf("Tag File System Utility\n"
- "Disk loaded: %s\nMenu:\n"
- "1: Print Directory table\n"
- "2: (Not implemented) \n"
- "3: Print File\n"
- "4: (Not implemented)\n"
- "5: Create New Directory\n"
- "b: install Bootloader\n"
- "v: install VBR\n"
- "exit: exit program\n", loaded_disk_name);
- }
-
- scanf("%s", chose);
-
- if (strcmp(chose, "c") == 0)
- {
- printf("\nCreate disk\nEnter filename:\n");
- scanf("%s", loaded_disk_name);
- dmu_create_file_system(loaded_disk_name);
- }
- else if(strcmp(chose, "l") == 0)
- {
- printf("\nLoad disk\nEnter filename:\n");
- scanf("%s", loaded_disk_name);
- dmu_load_file_system(loaded_disk_name);
- }
- else if(strcmp(chose, "b") == 0) {
- printf("\nInstall Bootloader\nEnter filename:\n");
- scanf("%s", input_buffer);
- dmu_install_bootloader(input_buffer);
- }
- else if(strcmp(chose, "v") == 0) {
- printf("\nInstall VBR\nEnter filename:\n");
- scanf("%s", input_buffer);
- dmu_install_vbr(input_buffer);
- }
- else if(strcmp(chose, "1") == 0) {
- // Print Directory:
- printf("Enter Directory:\n");
- scanf("%s", input_buffer);
- dmu_print_mtt(input_buffer);
- }
- else if(strcmp(chose, "3") == 0) {
- // Print File
- printf("Enter path:\n");
- scanf("%s", input_buffer);
-
- dmu_print_file( input_buffer );
- }
- else if(strcmp(chose, "5") == 0) {
- printf("Enter Directory:\n");
- scanf("%s", input_buffer);
-
- lsfs_disk_create_entry(input_buffer, ENTRY_DIRECTORY );
- //lsfs_disk_write_data_to_file(new_id, strlen(new_file_data_d), new_file_data_d);
-
- }
-
- #if 0
- else if(strcmp(chose, "2") == 0) {
- // Print Master Tag Table
- printf("Enter Tag ID:\n");
- scanf("%s", input_buffer);
-
- dmu_print_tag_table( (lsfs_tag_id) atoi(input_buffer) );
- }
- else if(strcmp(chose, "4") == 0) {
- // Print Master Tag Table
- printf("Enter Tag name:\n");
- scanf("%s", input_buffer);
- lsfs_disk_create_tag(input_buffer, false);
- }
-
-
- printf("Write data:\n");
- char* new_file_data_d = calloc(1, 4096);
- scanf("%s", new_file_data_d);
-
-
- #endif
- }
-
- if(disk_is_loaded)
- {
- fclose (disk);
- }
- }
-
-
- return 0;
- }
|