Advertisement
madegoff

sysprog2ha_writef

Jul 10th, 2023 (edited)
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.93 KB | None | 0 0
  1. #include "../lib/operations.h"
  2. #include <stddef.h>
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. int get_index_parent_from_path(file_system *fs, char *path){
  9.  
  10.     printf("ANFANG GET INDEX PARENT\n");
  11.     printf("PATH = %s", path);
  12.  
  13.     int index_current = fs->root_node; //fangen beim wurzel an
  14.     printf("INDEX CURRENT = %d\n", index_current);
  15.     char* path_temp = strdup(path);
  16.  
  17.     char* token = NULL;
  18.     char* last_token = (char *)strrchr(path_temp, '/')+1;
  19.     token = strtok(path_temp, "/");
  20.     if(last_token == token) return 0;
  21.  
  22.     //bei pfad /root/home/folder/...
  23.  
  24.     while (token!=last_token){ //durchlaufen path
  25.  
  26.         printf("TOCKEN = %s\n", token);
  27.  
  28.         int flag = 0; //zeigt, ob wir das kind von current_node gefunden haben
  29.  
  30.         for (int i=0; i<DIRECT_BLOCKS_COUNT; i++){
  31.  
  32.             printf("i = %d\n", i);
  33.  
  34.             int block_num = fs->inodes[index_current].direct_blocks[i]; //schauen in direct_blocks von root
  35.  
  36.             printf("BLOCK_NUM = %d\n", block_num);
  37.                 printf("index_current = %d\n", index_current);
  38.  
  39.             if (block_num != -1){ //if block exist
  40.                 if(fs->inodes[block_num].n_type == directory){ //schauen nur auf verzeichnisse
  41.  
  42.                     if (strcmp(fs->inodes[block_num].name, token) == 0){ // wenn inodes name = home
  43.  
  44.                         printf("CHILD GEFUNDEN\n");
  45.                         index_current = block_num;
  46.                         flag = 1;
  47.                         token = strtok(NULL, "/");
  48.                         break; //for schleife beenden
  49.                     }
  50.                 }
  51.             }
  52.             else if(i>=DIRECT_BLOCKS_COUNT-1) flag = 0;
  53.         }
  54.         printf("WEITER GEHTS\n");
  55.  
  56.         if(flag != 1){ //es wurde in current directory kein kind gefunden
  57.             index_current = -1;
  58.             break; // etwas schief, raus aus while schleife
  59.         }
  60.     }
  61.     printf("index_current = %d\n", index_current);
  62.     free(path_temp);
  63.     return index_current;
  64. }
  65.  
  66. int set_kid(file_system* fs, int index_parent, int index_kind){
  67.  
  68.     //size of array direct_blocks
  69.         for (int j = 0; j<DIRECT_BLOCKS_COUNT; j++){
  70.                 if (fs->inodes[index_parent].direct_blocks[j] == -1){ //no block
  71.                         fs->inodes[index_parent].direct_blocks[j] = index_kind;
  72.                         printf("......\n");
  73.                         return 0;
  74.                 }
  75.             }
  76.         return -1;
  77. }
  78.  
  79. int find_free_datablock(file_system *fs){
  80.  
  81.     int block_num = -1;
  82.     //data blocks in free list durchgehen
  83.     for (int i = 0; i<fs->s_block->num_blocks; i++){
  84.  
  85.         if (fs->free_list[i] == 1){ //block free
  86.             block_num = i;
  87.             break; //free block mit geringstem index gefunden
  88.         }
  89.     }
  90.  
  91.     return block_num;
  92.  
  93. }
  94.  
  95. char write_in_datablock(file_system *fs, int block_num, char* text, int flag){ //flag zeigt, ob der block schon etwas enthaelt
  96.  
  97.     int size_text = strlen(text);
  98.     int max_size_array = fs->s_block->free_blocks*BLOCK_SIZE; // anzahl freie bloecke * size eines blocks
  99.  
  100.     //fuer den nicht leeren block relevent, sonst null
  101.     int size_first_block = fs->data_blocks[block_num].size;
  102.  
  103.     //wenn size_text > max_size_array return NULL
  104.     if(size_text+size_first_block > max_size_array) return NULL;
  105.  
  106.  
  107.     int a = size_text/max_size_array; //wie viele male passt text in block = vie viele bloecke man verwenden soll
  108.     int b = size_text%max_size_array; //wie viele tokens werden in den letzten passenden block geschrieben
  109.  
  110.     if(!flag){ //block leer
  111.  
  112.         if(a < 1){ // text passt weniger als einmal in den block
  113.  
  114.             memcpy(fs->data_blocks[block_num].block, text, size_text); //text in data kopieren
  115.             fs->data_blocks[block_num].size = size_text;
  116.             fs->free_list[block_num] = 0; //block is jz besetzt
  117.         }
  118.         else if (a == 1 && b == 0){ //text passt genau ein mal
  119.  
  120.             memcpy(fs->data_blocks[block_num].block, text, size_text); //text in data kopieren
  121.             fs->data_blocks[block_num].size = BLOCK_SIZE; //maximaler size fuer den block gesetzt
  122.             fs->free_list[block_num] = 0; //block is jz besetzt
  123.         }
  124.         else{ //text muss in mehreren bloeken geschrieben werden
  125.  
  126.             char* text_temp[size_text]; // array
  127.  
  128.             strncpy(text_temp, text, size_text);
  129.  
  130.             char* part_text;
  131.             int current_block_num;
  132.  
  133.             for (int i=0; i<a; i++){
  134.  
  135.                 if(i!=0){ //befinden uns nicht im ersten block
  136.                     current_block_num = find_free_datablock(fs);
  137.                     if (current_block_num == -1) return NULL;
  138.                 }
  139.                 else current_block_num = block_num;
  140.  
  141.                 if(i==a){ //befinden uns im letzten zu schreibenden block
  142.                     strncpy(part_text, text_temp[size_text-b],b);
  143.                 } else strncpy(part_text, text_temp[i*BLOCK_SIZE], BLOCK_SIZE); // kopieren den naechsten teil des textes in part text
  144.  
  145.                 memcpy(fs->data_blocks[current_block_num].block, part_text, size_text); //text in data kopieren
  146.                 fs->data_blocks[current_block_num].size = BLOCK_SIZE; //maximaler size fuer den block gesetzt
  147.                 fs->free_list[current_block_num] = 0; //block is jz besetzt
  148.  
  149.                 free(part_text);
  150.             }
  151.  
  152.         }
  153.  
  154.     }
  155.     //else{ //block nicht leer
  156.  
  157.     //}
  158. }
  159.  
  160. int fs_mkdir(file_system *fs, char *path)
  161. {
  162.     if (fs == NULL || path == NULL) return -1;
  163.  
  164.     if (path[0] != '/') return -1; //wenn path kein absoluter pfad ist
  165.  
  166.     int index_parent = get_index_parent_from_path(fs,path);
  167.     if (index_parent == -1) return -1; //kein parent gefunden
  168.  
  169.     int index = find_free_inode(fs);
  170.  
  171.     if(index==-1) return -1; //es gibt keinen freien inode
  172.  
  173.     if(set_kid(fs, index_parent, index)) return -1;
  174.     fs->inodes[index].n_type = directory; //type = directory
  175.     fs->inodes[index].size = 0;
  176.     strncpy(fs->inodes[index].name, strrchr(path, '/')+1, NAME_MAX_LENGTH);
  177.  
  178.     //printf("root index = %d\n", fs->root_node);
  179.     //printf("index parent = %d\n", fs->root_node);
  180.  
  181.     fs->inodes[index].parent = index_parent;
  182.  
  183.     return 0; //wenn diese stelle erreicht alles gut
  184. }
  185.  
  186. int
  187. fs_mkfile(file_system *fs, char *path_and_name)
  188. {
  189.     if (fs == NULL || path_and_name == NULL){
  190.         return -1;
  191.     }
  192.  
  193.     if (path_and_name[0] != '/') return -1; //wenn path kein absoluter pfad ist
  194.  
  195.     int index_parent = get_index_parent_from_path(fs,path_and_name);
  196.     if (index_parent == -1) return -1; //kein parent gefunden
  197.  
  198.     int index = find_free_inode(fs);
  199.  
  200.     if(index==-1) return -1; //es gibt keinen freien inode
  201.  
  202.     if(set_kid(fs, index_parent, index)) return -1;
  203.     fs->inodes[index].n_type = reg_file; //type = directory
  204.     fs->inodes[index].size = 0;
  205.     strncpy(fs->inodes[index].name, strrchr(path_and_name, '/')+1, NAME_MAX_LENGTH);
  206.  
  207.     //printf("root index = %d\n", fs->root_node);
  208.     //printf("index parent = %d\n", fs->root_node);
  209.  
  210.     fs->inodes[index].parent = index_parent;
  211.  
  212.     return 0; //wenn diese stelle erreicht alles gut
  213. }
  214.  
  215. char *
  216. fs_list(file_system *fs, char *path)
  217. {
  218.     if(fs == NULL || path == NULL) return NULL;
  219.  
  220.     int index_current = fs->root_node; //fangen beim wurzel an
  221.     printf("INDEX CURRENT = %d\n", index_current);
  222.     char* path_temp = strdup(path);
  223.     char* token = strtok(path_temp, "/");
  224.  
  225.     //bei pfad /root/home/folder/...
  226.  
  227.     while (token!=NULL){ //durchlaufen path
  228.  
  229.         printf("TOCKEN = %s\n", token);
  230.  
  231.         int flag = 0; //zeigt, ob wir das kind von current_node gefunden haben
  232.  
  233.         for (int i=0; i<DIRECT_BLOCKS_COUNT; i++){
  234.  
  235.             printf("i = %d\n", i);
  236.  
  237.             int block_num = fs->inodes[index_current].direct_blocks[i]; //schauen in direct_blocks von root
  238.  
  239.             printf("BLOCK_NUM = %d\n", block_num);
  240.                 printf("index_current = %d\n", index_current);
  241.  
  242.             if (block_num != -1){ //if block exist
  243.                 if(fs->inodes[block_num].n_type == directory){ //schauen nur auf verzeichnisse
  244.  
  245.                     if (strcmp(fs->inodes[block_num].name, token) == 0){ // wenn inodes name = home
  246.  
  247.                         printf("CHILD GEFUNDEN\n");
  248.                         index_current = block_num;
  249.                         flag = 1;
  250.                         token = strtok(NULL, "/");
  251.                         break; //for schleife beenden
  252.                     }
  253.                 }
  254.             }
  255.             else if(i>=DIRECT_BLOCKS_COUNT-1) flag = 0;
  256.         }
  257.         printf("WEITER GEHTS\n");
  258.  
  259.         if(flag != 1){ //es wurde in current directory kein kind gefunden
  260.             index_current = -1;
  261.  
  262.             return NULL; // etwas schief, raus aus while schleife
  263.         }
  264.     }
  265.     char* str = (char*)calloc(1,sizeof(char));
  266.     for (int j = 0; j<fs->s_block->num_blocks; j++){
  267.  
  268.         if(fs->inodes[j].parent == index_current){
  269.             if(fs->inodes[j].n_type == directory){
  270.                 str = (char*)realloc(str,5+strlen(str)+strnlen(fs->inodes[j].name, NAME_MAX_LENGTH));
  271.                 strcat(str, "DIR ");
  272.                 strcat(str, fs->inodes[j].name);
  273.                 strcat(str, "\n");
  274.             }
  275.             else if(fs->inodes[j].n_type == reg_file){
  276.                 str = (char*)realloc(str,5+strlen(str)+strnlen(fs->inodes[j].name, NAME_MAX_LENGTH));
  277.                 strcat(str, "FIL ");
  278.                 strcat(str, fs->inodes[j].name);
  279.                 strcat(str, "\n");
  280.             }
  281.         }
  282.     }
  283.     return str;
  284. }
  285.  
  286. int
  287. fs_writef(file_system *fs, char *filename, char *text)
  288. {
  289.     if(fs == NULL || filename == NULL) return -1;
  290.  
  291.     char* filename_temp = strdup(filename);
  292.     char* file_name = (char *)strrchr(filename_temp, '/')+1;
  293.  
  294.     int index_child;
  295.     int index_parent = get_index_parent_from_path(fs, filename);
  296.     if (index_parent == -1) return -1; //kein parent gefunden
  297.  
  298.     char* parent_name = fs->inodes[index_parent].name;
  299.     int exist = 0; //zeigt, ob die datei existiert
  300.  
  301.     for (int i = 0; i < DIRECT_BLOCKS_COUNT; i++){
  302.  
  303.         int current_block_index = fs->inodes[index_parent].direct_blocks[i];
  304.         if (current_block_index !=1){ //es gibt einen block, schauen rein
  305.             if(strcmp(fs->inodes[current_block_index].name, file_name)){ //datei existiert
  306.                 index_child = current_block_index;
  307.                 exist = 1;
  308.             }
  309.         }
  310.     }
  311.  
  312.     if(exist){ //datei existiert, kann leer oder nicht leer sein
  313.  
  314.         int flag = 0; //zeigt, ob in datei schon etwas liegt
  315.         int block_num; //nummer blocks in den geschrieben wird
  316.  
  317.         for (int j = 0; j < DIRECT_BLOCKS_COUNT; j++){
  318.  
  319.             if (fs->inodes[index_child].direct_blocks[j] != -1){ //es gibt einen block schon - datei nicht leer
  320.  
  321.                 flag = 1;
  322.                 block_num = fs->inodes[index_child].direct_blocks[j];
  323.                 if(write_in_datablock(fs, block_num, text,flag) == NULL) return -1; //schreiben in/ab diesen datablock je nachdem ob size uebershritten. falls NULL returned - fehler, return -1
  324.             }
  325.         }
  326.  
  327.         if (!flag){
  328.  
  329.             block_num = find_free_datablock(fs); //finden den kleinstmöglichen block
  330.             if (block_num == -1) return -1; //wenn freier block nicht gefunden
  331.             if(write_in_datablock(fs, block_num, text,flag) == NULL) return -1; //schreiben in/ab diesen datablock je nachdem ob size uebershritten. falls NULL returned - fehler, return -1
  332.         }
  333.     }
  334.     else{ //wenn es keine datei gibt
  335.         return -1; //die datei muss bereits existieren
  336.     }
  337.  
  338. }
  339.  
  340. uint8_t *
  341. fs_readf(file_system *fs, char *filename, int *file_size)
  342. {
  343.     return NULL;
  344. }
  345.  
  346.  
  347. int
  348. fs_rm(file_system *fs, char *path)
  349. {
  350.     return -1;
  351. }
  352.  
  353. int
  354. fs_import(file_system *fs, char *int_path, char *ext_path)
  355. {
  356.     return -1;
  357. }
  358.  
  359. int
  360. fs_export(file_system *fs, char *int_path, char *ext_path)
  361. {
  362.     return -1;
  363. }
  364.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement