Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

112 Zeilen
3.6 KiB

  1. #include "lsfs.h"
  2. #include "../main.h"
  3. struct lsfs_file {
  4. long file_id[2];
  5. long table_entry_pointer[2];
  6. Table_Entry_Kind entry_kind;
  7. char* filename;
  8. long owner_id;
  9. long size[2];
  10. long creation_date[2];
  11. long access_time[2];
  12. long modification_time[2];
  13. long number_sector;
  14. long table_entry_sector_index[2];
  15. long data_pointer[NUM_DATA_POINTERS * 2];
  16. };
  17. int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry)
  18. lsfs_file *file;
  19. int buffer_size;
  20. char *data;
  21. long offset_to_next_entry;
  22. {
  23. int integer_file_size = file->size;
  24. int integer_offset = offset_to_next_entry;
  25. int integer_datapointer = 0;
  26. int data_length = integer_file_size - integer_offset;
  27. int amount_read = 0;
  28. int amount_to_read = 0;
  29. int remaining_offset = offset_to_next_entry;
  30. /* printf("READ: buffer_size: %d\n", buffer_size); */
  31. /* printf("READ: Data length: %d\n", data_length); */
  32. /* printf("READ: Offset length: %d\n", offset_to_next_entry); */
  33. int data_pointer_index = 0; /* start at first data pointer. */
  34. if (data_length > buffer_size)
  35. {
  36. data_length = buffer_size;
  37. }
  38. while(data_length > 0) /* We have more to write */
  39. {
  40. /* printf("READ: Remaing Data length: %d\n", data_length); */
  41. if (remaining_offset == 0)
  42. {
  43. char *tmp_buffer = calloc(DEFAULT_DATA_POINTER_SIZE, SECTOR_SIZE);
  44. /* assert(tmp_buffer); */
  45. if (data_length < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE))
  46. {
  47. amount_to_read = data_length;
  48. }
  49. else
  50. {
  51. amount_to_read = (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE);
  52. }
  53. /* disk_service_read_data_from_disk(lsfs_sector_offset index, uint32_t number_sector, void* data_buffer) */
  54. integer_datapointer = file->data_pointer[data_pointer_index];
  55. if (integer_datapointer == 0)
  56. {
  57. break;
  58. }
  59. disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer);
  60. memcpy((data + amount_read), tmp_buffer, amount_to_read);
  61. data_length -= amount_to_read;
  62. amount_read += amount_to_read;
  63. data_pointer_index++;
  64. /* free(tmp_buffer); */
  65. }
  66. else if (remaining_offset < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE))
  67. {
  68. char *tmp_buffer = calloc(1, (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE));
  69. /* assert(tmp_buffer); */
  70. if (data_length < ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset) )
  71. {
  72. amount_to_read = data_length;
  73. }
  74. else
  75. {
  76. amount_to_read = ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset);
  77. }
  78. disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer);
  79. memcpy(data, (tmp_buffer + remaining_offset), amount_to_read);
  80. data_length -= amount_to_read;
  81. amount_read += amount_to_read;
  82. remaining_offset -= amount_to_read;
  83. data_pointer_index++;
  84. /* free(tmp_buffer); */
  85. }
  86. else
  87. {
  88. /* We have to skip a whole data pointer: */
  89. remaining_offset -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE);
  90. data_pointer_index++;
  91. }
  92. }
  93. /*
  94. time_t current_time;
  95. time ( &current_time );
  96. file->access_time = current_time;
  97. */
  98. return amount_read;
  99. }