You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

273 lines
8.9 KiB

  1. #ifndef LSFS_H
  2. #define LSFS_H
  3. #include "../main.h"
  4. typedef struct lsfs_file lsfs_file;
  5. typedef struct Directory_Table Directory_Table;
  6. typedef struct Table_Entry Table_Entry;
  7. int lsfs_disk_getattr(find_file, path, fsci);
  8. int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry);
  9. Directory_Table* lsfs_find_directory(path, drop_filename, fsci);
  10. typedef enum Table_Entry_Kind
  11. {
  12. /* These are specific values since, is has to corrospond to the implementation in assembly*/
  13. ENTRY_EMPTY = 0,
  14. ENTRY_FILE = 1,
  15. ENTRY_DIRECTORY = 2,
  16. } Table_Entry_Kind;
  17. struct Table_Entry
  18. {
  19. char filename[256];
  20. unsigned long file_id[2];
  21. unsigned long file_size[2];
  22. void* ext_file_data_low;
  23. void* ext_file_data_high;
  24. long number_sector_s; /* <- Just try to remove the last undercore and compile . */
  25. short entry_kind;
  26. short extra_control_bits1;
  27. short extra_control_bits2;
  28. short extra_control_bits3;
  29. long table_entry_sector_index[2];
  30. long data_pointer[NUM_DATA_POINTERS * 2]; /* if it is a directory, the first pointer will be to the next table. */
  31. };
  32. struct lsfs_file {
  33. unsigned long file_id[2];
  34. long table_entry_pointer[2];
  35. Table_Entry_Kind entry_kind;
  36. char* filename;
  37. long owner_id;
  38. unsigned long size[2];
  39. long creation_date[2];
  40. long access_time[2];
  41. long modification_time[2];
  42. long number_sector;
  43. long table_entry_sector_index[2];
  44. long data_pointer[NUM_DATA_POINTERS * 2];
  45. };
  46. struct Directory_Table
  47. {
  48. Table_Entry entries[DEFAULT_TABLE_SIZE];
  49. };
  50. /*typedef struct File_System_Control_Information
  51. {
  52. char filesystem_information[256];
  53. long master_table_index[2];
  54. long this_partition_offset_on_disk[2];
  55. long next_free_sector[2];
  56. long next_uniqe_id[2]; /* both files and directories gets this.
  57. long next_sector_reuse_pointer[2];
  58. long last_sector_index_on_partition[2];
  59. long maximum_sectors_on_disk[2];
  60. long sector_size_on_disk[2];
  61. long not_used[48];
  62. } FSCI;
  63. */
  64. int lsfs_disk_getattr(find_file, path, fsci)
  65. lsfs_file* find_file;
  66. char *path;
  67. FSCI *fsci;
  68. {
  69. int i;
  70. String_Array *split_path = string_split_c(path, '/', false);
  71. Length_String *filename = split_path->strings[split_path->length-1];
  72. /* Start from the master table*/
  73. Directory_Table *dir_table = lsfs_find_directory(path, true, fsci);
  74. for (i = 0; i < DEFAULT_TABLE_SIZE; i++)
  75. {
  76. int j;
  77. /*
  78. print(dir_table->entries[i].filename);
  79. print(filename->chars);
  80. print_newline();
  81. print_newline();
  82. print("Size of table_entry: ");
  83. dump_ax(sizeof(Table_Entry));
  84. print_newline();
  85. print_newline();
  86. */
  87. if(strcmp( filename->chars, dir_table->entries[i].filename ) == 0) {
  88. find_file->file_id[0] = dir_table->entries[i].file_id[0];
  89. find_file->entry_kind = dir_table->entries[i].entry_kind;
  90. find_file->table_entry_pointer[0] = i;
  91. find_file->filename = dir_table->entries[i].filename;
  92. find_file->table_entry_sector_index[0] = dir_table->entries[i].table_entry_sector_index;
  93. find_file->owner_id = 1;
  94. find_file->size[0] = dir_table->entries[i].file_size[0]; /* dir_table->entries[i].data_pointer[0]; ;*/
  95. find_file->creation_date[0] = 0;
  96. find_file->access_time[0] = 0;
  97. find_file->modification_time[0] = 0;
  98. /* memcpy(find_file->data_pointer, dir_table->entries[i].data_pointer, NUM_DATA_POINTERS * 8); */
  99. for (j = 0; j < NUM_DATA_POINTERS; j = j + 2)
  100. {
  101. find_file->data_pointer[j] = dir_table->entries[i].data_pointer[j];
  102. }
  103. find_file->number_sector = 1; /* TODO: should be loaded from disk.*/
  104. return 1;
  105. }
  106. }
  107. return 0;
  108. }
  109. Directory_Table* lsfs_find_directory(path, drop_filename, fsci)
  110. char *path;
  111. short drop_filename;
  112. FSCI *fsci;
  113. {
  114. int number_of_traversal;
  115. int i, j;
  116. String_Array *split_path;
  117. Directory_Table *dir_table = calloc(1, sizeof(Directory_Table));
  118. /* printf("Table index: %lu \n",fsci->master_table_index ); */
  119. disk_service_read_data_from_disk(fsci->master_table_index[0], (long) DEFAULT_TABLE_SIZE, dir_table, 0x7e0);
  120. split_path = string_split_c(path, '/', false);
  121. number_of_traversal = split_path->length;
  122. if (drop_filename)
  123. {
  124. number_of_traversal -= 1;
  125. }
  126. /* Start from the master table */
  127. for (i = 0; i < number_of_traversal; ++i)
  128. {
  129. for (j = 0; j < DEFAULT_TABLE_SIZE; ++j)
  130. {
  131. /*
  132. print_newline();
  133. print("New: ");
  134. print(dir_table->entries[j].filename);
  135. print("vs ");
  136. print(split_path->strings[i]->chars);
  137. print_newline();
  138. */
  139. if (strcmp(dir_table->entries[j].filename, split_path->strings[i]->chars) == 0)
  140. {
  141. long index_sector = dir_table->entries[j].data_pointer[0];
  142. /* printf("Table index: %lu \n",index_sector ); */
  143. /* print(dir_table->entries[j].filename); */
  144. disk_service_read_data_from_disk(index_sector, (long) DEFAULT_TABLE_SIZE, dir_table, 0x7e0);
  145. break;
  146. }
  147. }
  148. }
  149. return dir_table;
  150. }
  151. int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry, data_segment)
  152. lsfs_file *file;
  153. unsigned int buffer_size;
  154. char *data;
  155. long offset_to_next_entry;
  156. unsigned int data_segment;
  157. {
  158. unsigned int integer_file_size = file->size[0];
  159. unsigned int integer_offset = offset_to_next_entry;
  160. unsigned int integer_datapointer = 0;
  161. unsigned int data_length = integer_file_size - integer_offset;
  162. unsigned int amount_read = 0;
  163. unsigned int amount_to_read = 0;
  164. unsigned int remaining_offset = offset_to_next_entry;
  165. void *next_data;
  166. /* printf("READ: buffer_size: %d\n", buffer_size); */
  167. /* printf("READ: Data length: %d\n", data_length); */
  168. /* printf("READ: Offset length: %d\n", offset_to_next_entry); */
  169. int data_pointer_index = 0; /* start at first data pointer. */
  170. if (data_length > buffer_size)
  171. {
  172. data_length = buffer_size;
  173. }
  174. while(data_length > 0) /* We have more to write */
  175. {
  176. /* printf("READ: Remaing Data length: %d\n", data_length); */
  177. if (remaining_offset == 0)
  178. {
  179. char *tmp_buffer = calloc(DEFAULT_DATA_POINTER_SIZE, SECTOR_SIZE);
  180. /* assert(tmp_buffer); */
  181. if (data_length < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE))
  182. {
  183. amount_to_read = data_length;
  184. }
  185. else
  186. {
  187. amount_to_read = (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE);
  188. }
  189. /* disk_service_read_data_from_disk(lsfs_sector_offset index, uint32_t number_sector, void* data_buffer) */
  190. integer_datapointer = file->data_pointer[data_pointer_index];
  191. if (integer_datapointer == 0)
  192. {
  193. break;
  194. }
  195. next_data = data + amount_read;
  196. disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], (long) DEFAULT_DATA_POINTER_SIZE, next_data, data_segment);
  197. /* memcpy((data + amount_read), data_segment, tmp_buffer, 0x7e0, amount_to_read); */
  198. data_length -= amount_to_read;
  199. amount_read += amount_to_read;
  200. data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/
  201. /* free(tmp_buffer); */
  202. }
  203. else if (remaining_offset < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE))
  204. {
  205. char *tmp_buffer = calloc(1, (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE));
  206. /* assert(tmp_buffer); */
  207. if (data_length < ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset) )
  208. {
  209. amount_to_read = data_length;
  210. }
  211. else
  212. {
  213. amount_to_read = ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset);
  214. }
  215. disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], (long) DEFAULT_DATA_POINTER_SIZE, tmp_buffer, 0x7e0);
  216. memcpy(data, data_segment, (tmp_buffer + remaining_offset), 0x7e0, amount_to_read);
  217. data_length -= amount_to_read;
  218. amount_read += amount_to_read;
  219. remaining_offset -= amount_to_read;
  220. data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/
  221. /* free(tmp_buffer); */
  222. }
  223. else
  224. {
  225. /* We have to skip a whole data pointer: */
  226. remaining_offset -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE);
  227. data_pointer_index = data_pointer_index + 2;
  228. }
  229. }
  230. /*
  231. time_t current_time;
  232. time ( &current_time );
  233. file->access_time = current_time;
  234. */
  235. return amount_read;
  236. }
  237. #endif