Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
1,289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. inode *minixfs_create_inode_for_path(file_system *fs, const char *path) {
  2. // Land ahoy!
  3. inode* new_inode = get_inode(fs, path);
  4. inode_number inode_num = first_unused_inode(fs);
  5. char* f = NULL;
  6. inode* parent = parent_directory(fs, path, (const char**)&f);
  7. int block_size = sizeof(data_block);
  8. size_t inode_file_len = FILE_NAME_LENGTH + INODE_SIZE;
  9. size_t inode_block_const = 16 * KILOBYTE;
  10. char block[inode_file_len];
  11.  
  12. if (new_inode || inode_num == -1 || !valid_filename(f) || (parent->mode & 0700) != 0700) {
  13. return NULL;
  14. }
  15.  
  16. minixfs_dirent dirent;
  17. dirent.name = f;
  18. dirent.inode_num = inode_num;
  19. make_string_from_dirent(block, dirent);
  20.  
  21. if (parent->size + inode_file_len <= NUM_DIRECT_BLOCKS * inode_block_const + NUM_INDIRECT_BLOCKS * inode_block_const) {
  22.  
  23. if (parent->indirect == -1) {
  24. data_block_number unused_block = first_unused_data(fs);
  25.  
  26. if (unused_block == -1) {
  27. return NULL;
  28. }
  29.  
  30. set_data_used(fs, unused_block, 1);
  31. parent->indirect = unused_block;
  32. data_block_number* unused_block_ptr = (data_block_number*) (fs->data_root + unused_block);
  33. data_block_number tmp_unused_block = first_unused_data(fs);
  34.  
  35. if (tmp_unused_block == -1) {
  36. return NULL;
  37. }
  38.  
  39. set_data_used(fs, tmp_unused_block, 1);
  40. unused_block_ptr[0] = tmp_unused_block;
  41. char* tmp_unused_block_ptr = (char*) (fs->data_root + tmp_unused_block);
  42. memcpy(tmp_unused_block_ptr, block, inode_file_len);
  43. }
  44. else {
  45. data_block_number* unused_block_ptr = (data_block_number*) (fs->data_root + parent->indirect);
  46. if (parent->size % block_size) {
  47. char* tmp_unused_block_ptr = (char*) (fs->data_root + unused_block_ptr[parent->size / block_size - NUM_DIRECT_BLOCKS]);
  48. memcpy(tmp_unused_block_ptr, block, inode_file_len);
  49. }
  50. else {
  51. data_block_number tmp_unused_block = first_unused_data(fs);
  52. if (tmp_unused_block == -1) {
  53. return NULL;
  54. }
  55.  
  56. set_data_used(fs, tmp_unused_block, 1);
  57. unused_block_ptr[parent->size / block_size - NUM_DIRECT_BLOCKS] = tmp_unused_block;
  58. char* tmp_unused_block_ptr = (char*) (fs->data_root + tmp_unused_block);
  59. memcpy(tmp_unused_block_ptr, block, inode_file_len);
  60. }
  61. }
  62. parent->size += inode_file_len;
  63.  
  64. }
  65. else if (parent->size + inode_file_len <= NUM_DIRECT_BLOCKS * inode_block_const) {
  66. char* ptr = (char*) (fs->data_root + parent->direct[parent->size / block_size]);
  67. if (parent->size % block_size == 0) {
  68. data_block_number unused_block = first_unused_data(fs);
  69. if (unused_block == -1) {
  70. return NULL;
  71. }
  72.  
  73. parent->direct[parent->size / block_size] = unused_block;
  74. set_data_used(fs, unused_block, 1);
  75. ptr = (char*) (fs->data_root + unused_block);
  76. memcpy(ptr, block, inode_file_len);
  77. }
  78. else {
  79. memcpy(ptr + (parent->size % block_size), block, inode_file_len);
  80. }
  81. parent->size += inode_file_len;
  82. }
  83. else {
  84. return NULL;
  85. }
  86. inode* final_inode = fs->inode_root + inode_num;
  87. init_inode(parent, final_inode);
  88. return final_inode;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement