Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

401 rinda
13 KiB

pirms 4 gadiem
pirms 4 gadiem
pirms 4 gadiem
pirms 4 gadiem
pirms 3 gadiem
pirms 3 gadiem
pirms 3 gadiem
pirms 3 gadiem
pirms 3 gadiem
  1. #include <sys/stat.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <errno.h>
  6. #include <stdlib.h>
  7. #include "lsfs_disk_controller.h"
  8. static int disk_is_loaded = 0;
  9. static char loaded_disk_name[256];
  10. static char input_buffer[256];
  11. int dmu_print_file(char *path) {
  12. lsfs_file *file = calloc(1, sizeof(lsfs_file));
  13. lsfs_disk_getattr(file, path);
  14. printf("\n|-----------------Meta Information For File-----------------|\n");
  15. printf("File ID: %lu\n", file->file_id);
  16. printf("Filename: %s\n", file->filename);
  17. printf("File size: %lu\n", file->size);
  18. printf("Entry kind: %d\n", file->entry_kind);
  19. printf("Index in directory table: %lu\n", file->table_entry_pointer);
  20. printf("Sector index on disk: %lu\n", file->table_entry_sector_index);
  21. printf("\nData pointers:\n");
  22. for (int i = 0; i < NUM_DATA_POINTERS; ++i)
  23. {
  24. printf("%lu\n", file->data_pointer[i]);
  25. }
  26. /*
  27. printf("\n|-------------------------File Data-------------------------|\n");
  28. char* file_data = calloc(MAX_NUM_ONE_LEVEL_DATA, SECTOR_SIZE);
  29. int size_of_data = 0;
  30. size_of_data = lsfs_disk_read_data_from_file(fileID, (256*4096), file_data);
  31. if (size_of_data <= 0) {
  32. printf("|File has no data!\n");
  33. }
  34. for (int i = 0; i < MAX_NUM_ONE_LEVEL_DATA; ++i)
  35. {
  36. if (size_of_data <= 0) {
  37. break;
  38. }
  39. printf("|%s", file_data);
  40. size_of_data -= SECTOR_SIZE;
  41. }
  42. printf("\n|---------------------End File Data-------------------------|\n");
  43. */
  44. return 1;
  45. }
  46. #if 0
  47. typedef struct sector_data
  48. {
  49. char data[SECTOR_SIZE];
  50. } sector_data;
  51. int dmu_install_SingOS(char* disk_name) {
  52. disk = fopen ( disk_name , "r+b" );
  53. p_control.fsci = malloc(sizeof(FSCI));
  54. p_control.mtt_tags = malloc(sizeof(global_tag) * DEFAULT_MASTER_TAG_TABLE_SIZE);
  55. lsfs_disk_load_disk(disk, &p_control);
  56. lsfs_tag_id untagged = lsfs_disk_create_tag("@untagged", false);
  57. lsfs_tag_id sy_files = lsfs_disk_create_tag("@system_files", false);
  58. lsfs_tag_id SingOS_files = lsfs_disk_create_tag("@SingOS", false);
  59. /* Add files: */
  60. char* new_file_data_d = calloc(1, 4096);
  61. char* rtfm_file = "If you don't know the answer\nRead the F manual\n";
  62. sprintf(new_file_data_d, "%s", rtfm_file);
  63. char* l_filename = "RTFM.md";
  64. lsfs_sector_offset* tags = calloc(2, sizeof(lsfs_sector_offset));
  65. lsfs_tag_id filename_tag = lsfs_disk_create_tag(l_filename, true);
  66. tags[0] = filename_tag;
  67. tags[1] = sy_files;
  68. int rtfm_file_if = lsfs_disk_create_file(l_filename, tags, new_file_data_d );
  69. lsfs_disk_write_data_to_file(rtfm_file_if, strlen(rtfm_file), new_file_data_d);
  70. char* vip_file = "Very important file\n" ;
  71. sprintf(new_file_data_d, "%s", vip_file);
  72. l_filename = "system_control.md";
  73. filename_tag = lsfs_disk_create_tag(l_filename, true);
  74. tags[0] = filename_tag;
  75. tags[1] = sy_files;
  76. int vip_file_id = lsfs_disk_create_file(l_filename, tags, new_file_data_d );
  77. lsfs_disk_write_data_to_file(vip_file_id, strlen(vip_file), new_file_data_d);
  78. 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" ;
  79. sprintf(new_file_data_d, "%s", sing_os_file);
  80. l_filename = "README.md";
  81. filename_tag = lsfs_disk_create_tag(l_filename, true);
  82. tags[0] = filename_tag;
  83. tags[1] = SingOS_files;
  84. int sing_id = lsfs_disk_create_file(l_filename, tags, new_file_data_d );
  85. lsfs_disk_write_data_to_file(sing_id, strlen(sing_os_file), new_file_data_d);
  86. free(new_file_data_d);
  87. free(tags);
  88. fclose (disk);
  89. }
  90. #endif
  91. int dmu_create_file_system(char* disk_name) {
  92. uint64_t filesystem_size_in_MB = 0;
  93. char hdd_or_partition = 0; // 1: is harddisk, 2: is partition
  94. char input_size_file_system[64]; // in MB
  95. do {
  96. printf("Create as 1: harddrive or 2: as a single partition (enter 1 or 2): \n");
  97. scanf("%c", &hdd_or_partition);
  98. } while ((hdd_or_partition != '1') && (hdd_or_partition != '2'));
  99. printf("Enter size of file system in MB (as an integer number): \n");
  100. scanf("%s", input_size_file_system);
  101. filesystem_size_in_MB = atoi(input_size_file_system);
  102. printf("Create new disk img\n");
  103. create_file_system(disk_name, hdd_or_partition, filesystem_size_in_MB);
  104. printf("Disk is created as: %s\n", disk_name);
  105. fclose (disk);
  106. // TODO: Do you want to install SingOS:
  107. //dmu_install_SingOS(disk_name);
  108. return 1;
  109. }
  110. int dmu_load_file_system(char* disk_name)
  111. {
  112. lsfs_disk_load_disk(disk_name);
  113. disk_is_loaded = 1;
  114. return 1;
  115. }
  116. int dmu_install_bootloader(char* disk_name)
  117. {
  118. lsfs_disk_install_bootloader(disk_name);
  119. return 1;
  120. }
  121. int dmu_install_vbr(char* disk_name) {
  122. lsfs_disk_install_vbr(disk_name);
  123. return 1;
  124. }
  125. int dmu_print_mtt(char *path) {
  126. Directory_Table *directory_table;
  127. directory_table = lsfs_find_directory(path, false);
  128. printf("\n|------------------------ Directory -------------------------------------|\n");
  129. printf("\n|--------Filename------------|Not used----------------------|Entry ID----|\n");
  130. for (int i = 0; i < DEFAULT_TABLE_SIZE; ++i) {
  131. printf("|%-28s|%-30lu|%-12lu| \n", directory_table->entries[i].filename, directory_table->entries[i].file_id, directory_table->entries[i].file_id);
  132. printf("|----------------------------|------------------------------|------------|\n");
  133. }
  134. printf("\n\n\n");
  135. return 1;
  136. }
  137. typedef struct Arguments_Settings
  138. {
  139. char* load_diskname;
  140. char* new_diskname;
  141. int new_disk_size_mb;
  142. char* install_vbr_path;
  143. char* install_bootloader_path;
  144. char* copy_new_kernel;
  145. } Arguments_Settings;
  146. int main (int argc, char *argv[])
  147. {
  148. if (argc > 1)
  149. {
  150. Arguments_Settings* settings = calloc(1, sizeof(Arguments_Settings));
  151. for (int i = 1; i < argc; i++)
  152. {
  153. // Parse parameters for cmd usage
  154. switch(argv[i][1])
  155. {
  156. case 'd':
  157. {
  158. // Load disk with specified name
  159. i++; // Go to next parameter which is the path/filename for the new disk
  160. if (i > argc)
  161. {
  162. // Go to loop condition to exit
  163. continue;
  164. }
  165. settings->load_diskname = argv[i];
  166. } break;
  167. case 'n':
  168. {
  169. // Create new disk
  170. i++; // Go to next parameter which is the path/filename for the new disk
  171. if (i > argc)
  172. {
  173. // Go to loop condition to exit
  174. continue;
  175. }
  176. settings->new_diskname = argv[i];
  177. printf("Creating new disk: %s \n", settings->new_diskname);
  178. } break;
  179. case 's':
  180. {
  181. // Specify size of new disk
  182. i++; // Go to next parameter which is the disk size
  183. if (i > argc)
  184. {
  185. // Go to loop condition to exit
  186. continue;
  187. }
  188. settings->new_disk_size_mb = atoi(argv[i]);
  189. } break;
  190. case 'v':
  191. {
  192. // Update Volume boot record
  193. i++; // Go to next parameter which is the path for the VBR
  194. if (i > argc)
  195. {
  196. // Go to loop condition to exit
  197. continue;
  198. }
  199. settings->install_vbr_path = argv[i];
  200. } break;
  201. case 'b':
  202. {
  203. // Update bootloader
  204. i++; // Go to next parameter which is the path for the VBR
  205. if (i > argc)
  206. {
  207. // Go to loop condition to exit
  208. continue;
  209. }
  210. settings->install_bootloader_path = argv[i];
  211. } break;
  212. }
  213. }
  214. if (settings->new_diskname != NULL && settings->load_diskname != NULL)
  215. {
  216. printf("-d and -n cannot be specified in the same qeury\n");
  217. return 1;
  218. }
  219. // Now execute the commands.
  220. // First check if we should create a new disk
  221. if (settings->new_diskname != NULL)
  222. {
  223. // TODO(only harddisk is supported yet)
  224. char hdd_or_partition = '1'; // 1 is harddrive
  225. if (settings->new_disk_size_mb <= 0)
  226. {
  227. settings->new_disk_size_mb = 20; // 20MB is default size
  228. }
  229. create_file_system(settings->new_diskname, hdd_or_partition, settings->new_disk_size_mb);
  230. settings->load_diskname = settings->new_diskname;
  231. }
  232. // Load the disk to complete the following instructions
  233. if (settings->load_diskname != NULL)
  234. {
  235. dmu_load_file_system(settings->load_diskname);
  236. if (settings->install_bootloader_path != NULL)
  237. {
  238. lsfs_disk_install_bootloader(settings->install_bootloader_path);
  239. }
  240. if (settings->install_vbr_path != NULL)
  241. {
  242. lsfs_disk_install_vbr(settings->install_vbr_path);
  243. }
  244. }
  245. }
  246. else
  247. {
  248. char chose[8];
  249. while(strcmp(chose, "exit")) {
  250. if(!disk_is_loaded) {
  251. printf("Tag File System Utility\nMenu:\nc: Create new lsfs disk\nl: load disk\nEnter:");
  252. }
  253. else {
  254. printf("Tag File System Utility\n"
  255. "Disk loaded: %s\nMenu:\n"
  256. "1: Print Directory table\n"
  257. "2: (Not implemented) \n"
  258. "3: Print File\n"
  259. "4: (Not implemented)\n"
  260. "5: Create New Directory\n"
  261. "b: install Bootloader\n"
  262. "v: install VBR\n"
  263. "exit: exit program\n", loaded_disk_name);
  264. }
  265. scanf("%s", chose);
  266. if (strcmp(chose, "c") == 0)
  267. {
  268. printf("\nCreate disk\nEnter filename:\n");
  269. scanf("%s", loaded_disk_name);
  270. dmu_create_file_system(loaded_disk_name);
  271. }
  272. else if(strcmp(chose, "l") == 0)
  273. {
  274. printf("\nLoad disk\nEnter filename:\n");
  275. scanf("%s", loaded_disk_name);
  276. dmu_load_file_system(loaded_disk_name);
  277. }
  278. else if(strcmp(chose, "b") == 0) {
  279. printf("\nInstall Bootloader\nEnter filename:\n");
  280. scanf("%s", input_buffer);
  281. dmu_install_bootloader(input_buffer);
  282. }
  283. else if(strcmp(chose, "v") == 0) {
  284. printf("\nInstall VBR\nEnter filename:\n");
  285. scanf("%s", input_buffer);
  286. dmu_install_vbr(input_buffer);
  287. }
  288. else if(strcmp(chose, "1") == 0) {
  289. // Print Directory:
  290. printf("Enter Directory:\n");
  291. scanf("%s", input_buffer);
  292. dmu_print_mtt(input_buffer);
  293. }
  294. else if(strcmp(chose, "3") == 0) {
  295. // Print File
  296. printf("Enter path:\n");
  297. scanf("%s", input_buffer);
  298. dmu_print_file( input_buffer );
  299. }
  300. else if(strcmp(chose, "5") == 0) {
  301. printf("Enter Directory:\n");
  302. scanf("%s", input_buffer);
  303. lsfs_disk_create_entry(input_buffer, ENTRY_DIRECTORY );
  304. //lsfs_disk_write_data_to_file(new_id, strlen(new_file_data_d), new_file_data_d);
  305. }
  306. #if 0
  307. else if(strcmp(chose, "2") == 0) {
  308. // Print Master Tag Table
  309. printf("Enter Tag ID:\n");
  310. scanf("%s", input_buffer);
  311. dmu_print_tag_table( (lsfs_tag_id) atoi(input_buffer) );
  312. }
  313. else if(strcmp(chose, "4") == 0) {
  314. // Print Master Tag Table
  315. printf("Enter Tag name:\n");
  316. scanf("%s", input_buffer);
  317. lsfs_disk_create_tag(input_buffer, false);
  318. }
  319. printf("Write data:\n");
  320. char* new_file_data_d = calloc(1, 4096);
  321. scanf("%s", new_file_data_d);
  322. #endif
  323. }
  324. if(disk_is_loaded)
  325. {
  326. fclose (disk);
  327. }
  328. }
  329. return 0;
  330. }