From 157105952b5ee0912274df0d0340a1e4754ae042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Guldberg?= Date: Sun, 9 Jun 2019 14:44:18 +0000 Subject: [PATCH] Folder strucres works, write works, truncate works --- SingOS.img | Bin 1070080 -> 0 bytes a.out | Bin 35216 -> 23216 bytes lsfs_disk_controller.h | 146 ++++++++++++++++++++++++----------------- lsfs_fuse | Bin 39880 -> 40048 bytes lsfs_fuse.c | 26 ++++---- lsfs_fuse.o | Bin 39040 -> 38888 bytes 6 files changed, 102 insertions(+), 70 deletions(-) delete mode 100644 SingOS.img diff --git a/SingOS.img b/SingOS.img deleted file mode 100644 index ff92620ded807f704fbfb95a3101ca41968e0a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070080 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≶kD|R#OCXl(s~a4=PlN?I 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 DnzE>F diff --git a/lsfs_disk_controller.h b/lsfs_disk_controller.h index 06f35e1..d5b844c 100644 --- a/lsfs_disk_controller.h +++ b/lsfs_disk_controller.h @@ -38,22 +38,24 @@ int lsfs_disk_delete_file(lsfs_file_id file_id); int get_free_sectors_table(); int get_free_sectors(int num_sectors_needed, lsfs_sector_offset* output_array); int lsfs_disk_read_data_from_file(lsfs_file* file, int buffer_size, void* buffer_for_data); -int lsfs_disk_write_data_to_file(lsfs_file* file, int data_length, char *data); +int lsfs_disk_write_data_to_file(lsfs_file* file, int data_length, char *data, size_t offset_to_next_entry); int lsfs_disk_rename_file(lsfs_file* file, const char* new_filename); int lsfs_disk_load_disk(); int write_data_to_disk(lsfs_sector_offset at_sector, uint32_t file_block_size, void* data_to_write); int read_data_from_disk(lsfs_sector_offset index, uint32_t file_block_size, void* data_buffer); -int write_data_to_disk_off(lsfs_sector_offset index, void* data_to_write, int offset); +int write_data_to_disk_off(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write, int offset); int save_modified_file_information(lsfs_file* file); #define SPACE_MBR_RECORD 2048 // Sectors #define SPACE_VBR_RECORD 2048 // Sectors #define SIZE_FSCI_RECORD 1 // Sectors +#define DEFAULT_ENTRY_SIZE 1 // Sectors #define SECTOR_SIZE 512 // BYTES #define NUMBER_OF_MBR_PARTITIONS 4 #define DEFAULT_FILE_SIZE 4 // This is in sectors +#define DEFAULT_DATA_POINTER_SIZE 4 // This is in sectors #define DEFAULT_TABLE_SIZE 10 -#define NUM_DATA_POINTERS 28 +#define NUM_DATA_POINTERS 27 typedef enum Table_Entry_Kind { @@ -92,8 +94,9 @@ typedef struct struct_table_entry uint8_t extra_control_bits1; uint8_t extra_control_bits2; uint8_t extra_control_bits3; + lsfs_sector_offset table_entry_sector_index; lsfs_sector_offset data_pointer[NUM_DATA_POINTERS]; // if it is a directory, the first pointer will be to the next table. -} __attribute__((packed)) table_entry; +} __attribute__((packed)) Table_Entry; typedef struct Directory_Table { @@ -166,7 +169,8 @@ typedef struct lsfs_file { uint64_t access_time; uint64_t modification_time; uint32_t file_block_size; - lsfs_sector_offset *data; + lsfs_sector_offset table_entry_sector_index; + lsfs_sector_offset data_pointer[NUM_DATA_POINTERS]; } lsfs_file; @@ -188,15 +192,18 @@ Directory_Table* lsfs_find_directory(const char *path, bool drop_filename) { for (int j = 0; j < DEFAULT_TABLE_SIZE; ++j) { - printf("find dir: %s == %s\n", dir_table->entries[j].filename, split_path.strings[i].chars); if (strcmp(dir_table->entries[j].filename, split_path.strings[i].chars) == 0) { - printf("Latterlig data pointer: %d\n", dir_table->entries[j].data_pointer[0]); int index_sector = dir_table->entries[j].data_pointer[0]; if (i == 0) { // Alocate space, we refuse this further on - dir_table = malloc(sizeof(Directory_Table)); + dir_table = calloc(1, sizeof(Directory_Table)); + } + else + { + free(dir_table); + dir_table = calloc(1, sizeof(Directory_Table)); } read_data_from_disk(index_sector, DEFAULT_TABLE_SIZE, dir_table); break; @@ -223,12 +230,13 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char* path) { find_file->entry_kind = dir_table->entries[i].entry_kind; find_file->table_entry_pointer = i; find_file->filename = dir_table->entries[i].filename; + find_file->table_entry_sector_index = dir_table->entries[i].table_entry_sector_index; find_file->owner_id = getuid(); find_file->size = dir_table->entries[i].file_size; // dir_table->entries[i].data_pointer[0]; //; find_file->creation_date = (uint64_t) current_time; find_file->access_time = (uint64_t) current_time; find_file->modification_time = (uint64_t) current_time; - find_file->data = dir_table->entries[i].data_pointer; + memcpy(find_file->data_pointer, dir_table->entries[i].data_pointer, DEFAULT_DATA_POINTER_SIZE * 8); find_file->file_block_size = 1; // TODO: should be loaded from disk. return 1; } @@ -244,10 +252,10 @@ int lsfs_disk_read_data_from_file(lsfs_file *file, int buffer_size, void* buffer int return_val = 0; for (int i = 0; i < NUM_DATA_POINTERS; ++i) { - if(file->data[i] == 0) { + if(file->data_pointer[i] == 0) { break; } - return_val += read_data_from_disk(file->data[i], file->file_block_size, buffer_for_data + (SECTOR_SIZE * i)); + return_val += read_data_from_disk(file->data_pointer[i], file->file_block_size, buffer_for_data + (SECTOR_SIZE * i)); } //time_t current_time; @@ -265,50 +273,70 @@ static inline time_t lsfs_disk_update_timestamps(lsfs_file *file) { #define lsfs_num_sectors_for_size(x) (((x)+SECTOR_SIZE-1)&~(SECTOR_SIZE-1)) -int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data) { - int written; +int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data, size_t offset_to_next_entry) { + int new_filesize = data_length + offset_to_next_entry; int amount_written = data_length; + //printf("Data length: %d\n", data_length); + //printf("Offset length: %d\n", offset_to_next_entry); - lsfs_sector_offset current_sector = file->size / SECTOR_SIZE; - unsigned int offset_in_sector = file->size % SECTOR_SIZE; - char *tmp_buffer = calloc(file->file_block_size, SECTOR_SIZE); - assert(tmp_buffer); - - read_data_from_disk(file->data[current_sector], file->file_block_size, tmp_buffer); + int data_pointer_index = 0; // start at first data pointer. + while(data_length > 0) // We have more to write + { + if (file->data_pointer[data_pointer_index] == 0) + { + // we have to assign a free sector + get_free_sectors(1, (lsfs_sector_offset*) file->data_pointer[data_pointer_index]); + } - memcpy(tmp_buffer + offset_in_sector, data, SECTOR_SIZE-offset_in_sector); - data_length -= SECTOR_SIZE-offset_in_sector; + if (offset_to_next_entry == 0) + { + char *tmp_buffer = calloc(DEFAULT_DATA_POINTER_SIZE, SECTOR_SIZE); + assert(tmp_buffer); - if (data_length < 0) { - data_length = 0; - } + memcpy(tmp_buffer, data, data_length); + data_length -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); - for (;;) { - assert(current_sector <= NUM_DATA_POINTERS); - written = written + write_data_to_disk(p_control.master_table.entries[file->file_id].data_pointer[current_sector], 4, tmp_buffer); - if (data_length <= 0) break; - data += SECTOR_SIZE; - if (data_length >= SECTOR_SIZE) { - memcpy(tmp_buffer, data, SECTOR_SIZE); - data_length -= SECTOR_SIZE; + write_data_to_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer); + data_pointer_index++; + free(tmp_buffer); } - else { - memset(tmp_buffer, 0, SECTOR_SIZE); + else if (offset_to_next_entry <= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) + { + char *tmp_buffer = calloc(1, ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - offset_to_next_entry)); + assert(tmp_buffer); + memcpy(tmp_buffer, data, data_length); - data_length = 0; + data_length -= ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - offset_to_next_entry); + + + write_data_to_disk_off(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer, offset_to_next_entry); + data_pointer_index++; + free(tmp_buffer); + } + else + { + // We have to skip a whole data pointer: + offset_to_next_entry -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); + data_pointer_index++; } - } - amount_written -= data_length; + } - free(tmp_buffer); + time_t current_time; + time ( ¤t_time ); //lsfs_disk_update_timestamps(&mif_record); - file->size += amount_written; // update file size + file->size = new_filesize; // update file size + + file->access_time = current_time; + file->modification_time = current_time; + save_modified_file_information(file); //write_data_to_disk(file->file_id, 4, &p_control.master_table[file->file_id]); + + // Should return the total new file size return amount_written; } @@ -337,7 +365,7 @@ int lsfs_disk_rename_file(lsfs_file* file, const char* new_filename) { save_modified_file_information(file); - return 1; + return 0; } int lsfs_disk_delete_file(lsfs_file_id file_id) { @@ -489,11 +517,12 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) { // First check if file exist: - lsfs_file *file; + lsfs_file *file = calloc(1, sizeof(lsfs_file)); if (lsfs_disk_getattr(file, path)) { return -EINVAL; } + free(file); // Start from the master table int free_index = -1; // -1 is no index found. @@ -504,7 +533,7 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) lsfs_string_array split_path = lsfs_string_split_c(path, '/', false); lsfs_string filename = split_path.strings[split_path.length-1]; - printf("spilt length: %d\n", split_path.length); + //printf("spilt length: %d\n", split_path.length); for (int i = 0; i < split_path.length -1; ++i) { @@ -513,14 +542,14 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) if (strcmp(dir_table->entries[j].filename, split_path.strings[i].chars) == 0) { // We have found the next directory to traverse. - printf("Get next dir at sector: "); + //printf("Get next dir at sector: "); table_disk_position = dir_table->entries[j].data_pointer[0]; if (i == 0) { // Alocate space, we refuse this further on dir_table = malloc(sizeof(Directory_Table)); } - printf("%d\n", table_disk_position); + //printf("%d\n", table_disk_position); read_data_from_disk(table_disk_position, DEFAULT_TABLE_SIZE, dir_table); break; } @@ -544,13 +573,6 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) } } - - - - - - - if (free_index == -1) { // The table is full, and we cannot create an entry @@ -563,6 +585,7 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) sprintf(dir_table->entries[free_index].filename, "%s", filename.chars); dir_table->entries[free_index].entry_kind = entry_kind; + dir_table->entries[free_index].table_entry_sector_index = table_disk_position; if (entry_kind == ENTRY_DIRECTORY) { dir_table->entries[free_index].data_pointer[0] = get_free_sectors_table(); @@ -589,7 +612,7 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) time_t current_time; time ( ¤t_time ); */ - printf("File is written to sector: %d\n", table_disk_position); + //printf("File is written to sector: %d\n", table_disk_position); write_data_to_disk(table_disk_position, 1, &dir_table->entries[free_index]); return 0; } @@ -597,12 +620,17 @@ int lsfs_disk_create_entry(const char* path, Table_Entry_Kind entry_kind) int save_modified_file_information(lsfs_file* file) { // Write the file struct into the table_entry, such that we can save the data correct. - p_control.master_table.entries[file->table_entry_pointer].file_id = file->file_id; - memcpy(p_control.master_table.entries[file->table_entry_pointer].filename, file->filename, 256); - p_control.master_table.entries[file->table_entry_pointer].file_size = file->size; // p_control.master_table.entries[i].data_pointer[0]; //; + Table_Entry *entry = calloc(1, sizeof(Table_Entry)); + read_data_from_disk(file->table_entry_sector_index, DEFAULT_ENTRY_SIZE, entry); + + + //entry.file_id = file->file_id; + memcpy(entry->filename, file->filename, 256); + printf("Filse size: %d\n", file->size); + entry->file_size = file->size; // p_control.master_table.entries[i].data_pointer[0]; //; //p_control.master_table.entries[i].data_pointer = find_file->data; - write_data_to_disk(file->table_entry_pointer, file->file_block_size, &p_control.master_table.entries[file->table_entry_pointer]); + write_data_to_disk(file->table_entry_sector_index, DEFAULT_ENTRY_SIZE, entry); return 0; } @@ -613,9 +641,9 @@ int write_data_to_disk(lsfs_sector_offset index, uint32_t file_block_size, void* return written; } -int write_data_to_disk_off(lsfs_sector_offset index, void* data_to_write, int offset) { - fseek ( disk, (index * SECTOR_SIZE) + offset, SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int written = fwrite(data_to_write, 1, (4 * SECTOR_SIZE), disk); +int write_data_to_disk_off(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write, int offset) { + fseek ( disk, ((index * SECTOR_SIZE) + offset), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. + int written = fwrite(data_to_write, 1, ((file_block_size * SECTOR_SIZE) - offset), disk); return written; } diff --git a/lsfs_fuse b/lsfs_fuse index 683a28fb0fe068c04c3c0190f513a140f7ac09c5..e6a53dd18001e6d39c478d08ff2eb512c9ac7ff8 100755 GIT binary patch delta 13595 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

H@z2kW^>yL9rC96` z|6r-b4oUfpjVw-+CV$3e7u%(!pRx7DY2tV6iQ;rA`viNZ*k1D^V%-O^7e+*x)=Q%z zLk)Rigi#S}K+Of-h}b6}#+TP)q`>+{tpARjG-5fpE_rF0^Y6iW^+`6qpFM2_Qa1W3 zF(pAUevs|_n%&dSF1`9Sdm6)7KYItm?SA%cKf8E=MfP_{51wNA{q0i7X*RyUeT0n6 zl_7IMwT97#fLVU%$;aLCv8&8_IB1pvzJ2Ve{*JT@pjv(vReg}k1FG@o*|+`eVhf8L z;1C;G9zNHzarmrf3kEo(S?Ae31MJ?Ns2b$>vMth>pp-0B$G@;X5qKc{ zcHo7UDT{1`7y1}@Wu;+J^ekqCBQ@}S++G9+4{ztEt#w4X6?XNhtwf$iqj77`g(vG7O}-Vw@Jv zwvV)WmjD$a84GaD4+$|=;YtO%dLWHw5Xz9u#3~|}QzAz8LLKp97(ctd(8 zEacMUg@B9?!H|%=+=zLrjn8M1qis%Z z&>6xXpn0ia>`lsEPvu14!fM$Pw}KSx0bWir|ApqG;htb(cBBWLMO*rA=UT+=0;;|Cd~!dq8v?xenANb-lVEZChS%_ z;H(-RK}3T33OrOJ;%fjXl(8GhOGTasTa-z7F_0COr+iLaUWV9(6@-ojm!N(}Kpztq zt{R~!tUq5dg)M<;VS}S7tRbSq9QGVKYS?fcwwuFVgo3b9I-Ft-ON9Yp*XXd#9JY|? z$LVmgIqVsdR}sCCncZe@C`=EV9KHqCIt67KhRxymN-OlM7hzF&VI;rjsaru8-Y@b~ z7@?@I(8{oA3DhQaCB%gfkD@4A)Dkd;mqt<;ZR!w&JbXmt`v9EkS-2iPN+oA|sgDtv z8=_%amijx}>&_Ja%|39~4!;i4B6da)S(Fu25s$=Bilgp=u87B@4g(c+1JOLK(b$OQ z8BU|rhqI+)GR3>tjxkC7eg{#MQ%jb5CyB^5mve(%h*wl^4p`JC1S=|s15Wj2c6v-w z_PfNHZ@v-41JyTBBTSxN|fdl9Y0M z#;gUW@%PqU*ZeM-+^AfOXo^rWAweyTWc$kdL_G-ArWnP9C^^+>?0k7@q;*}Dh zO4Z3Q+LXWnkNOi(rbJF$p>8HWEXs7?D%GdhwPQ0!ZiP0JO*sM7GW8U+nCwazw60dO zkU5i6=?!3`O0{B2RoXzdS*;^&X&iV!eUm*uHq*P0#AGUMSZPz=C7mvAK!Qn!g9dsR~L}#eDw%c&Z(Qor~>61 z0GG`FAw7kPst9p-{cHXLm0~JVvS`DI=8bIrwVB?F5F6Vos*>_J66CRcwDcc<(AWXm zynyCI_*{uWSsaZkQho$Z-2(k_eT`$mEU5p1hjIN?lBB535F0mu112>d#>5TefJLRf z95;vqPIbyOm>V~kLs{w{Ff48e2MX2AFg9)|2L`HM_!~Ej1EuO(l2FP4kNQ3Ah#SFy z3iWm9jvL8=N_9J%KQ1ZxC>i46CN5TYkjyd;)T#T~&T&au60MJqt_SB@RU$PL6f1@X zwUpFc7u_4cMzx)t7?(7w7|zGtlvE1TPW3(lZZ?|%>`}Lo8PnD25c8~hfz-?h`yK+? zR4*y0;yOFj=@f|?Wej*;7mV?cU^XT#L=+RZQS@@6V(QuS@kL@0+dSUt7>iB>_W^# z)R$nFsD|@Iq47yWq1s5iVwhnM$r(a*B1V`j5TUU~a#lg5TecV#OA88Y`Z5A9?~Oz* zMjOt7)p#B*NhW81a+>CXS*kT%PjXg+RhnaYHwH+-_#KF)nDpsHM{_}vZZuKLRNtbN z%J>~bXEqVjl=zKwT@}sm!wYF@JhfERZz!ro@=l9?3X~?%EF-kiP4VloXc5hSCy_VD z(~B0HXpV(*(sT}`h-PXP(hLsSMe|^SsyO5j%?}b(ZCL?@PSH%inn*R4R%pl)1>+n@ zlVY=Dsb;G%7ZN1za??<+c@NfuM{cib`HX312(a=ghN@P z`ESULRL7x0_yeU*Z$(;bx;HwIl7@uu zNRe7g-ZUmqoG+>^UXr*jp&LuTX!%*6Kpy-8)kL^~6H1c#EM?Ni*Fq&TBM&xlC`vLP zp|vIsB}nF9$*dMD1>G*0Zz9jPSfg>5yC|6xX^nB{D_Jo9BLwv)C0cjF%D8_ZVuhmg zh-oa6r}D~qG?rJ68bd-J<5^WyUK+a+h{~i@+u!(JuxPG59!0J>)sM;i-BILBmddT) z!+}CIjUxO62L^i8;~nEVlK2f=uNbXsG{8e=$xE7?Y*Ht)>@*m*}#4bJPqh{raD z3d>>T8_H0sW0f*UG)bdPHiTBqAd)drv_k|nnX2uYC|VHJ1}a|IH*(1L$li2-r+lKT^r2LcyC7kO$1e6btt ziS}3oh3T~b)+!i(qP)&brp^;Vjfu*ibErZDg_o+F!-<+iDs2w`C`3>-Q6+NNL9&q@ zM*wj%n=sMh-3W^epVF6iVRJ4%@XXc*LEOF+w2tN2=!Q?Di9%|b@A#U7$&@6irAn|5 z!^H407ZCUgl^GOphy-+D_ZU95<#CR=j@9tO@NxD*N=}P+mSZGRX85?@lN_!ToMi;R z&jso~%+qy%KjQXKOf`Y;+jW7dv*&?+$a7S3WKaw8W$5Jmfp23CLH>J#{GHq&uhim6 zt*M_4jx0K1q?S?#Z6!lz@%J#u(9-60d=ANm&QjVrhL&f&Twmt`(r0MdPV1jF0>ek--yB-rnPR6`p#C-5b4T+o~^yg_@~^Z-?I`E7$Ve=2PINKd=z z3lK^zb5SPL8*(ig#q-4+t=X-1}#X;p#`Z@^O5Dyi7&NOI7A8(E0w%d zUM(KYM>d{!hn7-q0=r9dvCV5+jjA_nOCY(hAw4dKD-xz^gOG*V=mkl@amPboGpxziOs;S=Qef8%r#u8rTr*KO(J_^5TC*l# zqZao@J?`@b`$;OJDO~+eS(@IF!3fRO)eBz3lt73aA5l!E^kFzldc^H71>_qlQUV#MTLk(7-8oI%4JL0Oul7A;?0fz$=c+>$e8h z4gCW9RR5e~A;1Rc< z4N6GVqcm5m+C=vjeQ#%sr(VBF;x;_wB0fQwsSS{DU7{dlZl&~Xl5(k$N-dR{{EXWq z4W(mJYMGch0A-2w8?>F^ac$*?^4(Ifax&5pSgBD{;?$M!*Jn^9Zhs@Fq){rkN=c(s z5>Rr2>}-^7)RkmXt^m&?*RlOvkJB-^Uf1bunJ;8KM`o?kl)jv)xpdjHY)iniRZ`AX zN>@oku2Q;6x<23;SF-vF$I2*-^EDk-UB_d3{NdRGQt}O1HeV{x>ax=H8^MdDSX$Kj z51mdK#S~?{S0abr)2o2LsN^wfOoAk8`yk1piZ`@8;LYSWnGmUjt}=#}d%Z5MOOd>K z(Ry4hB-Nx@Oug0h7M;p567M|Ji(S`}Ik6JIrJz^4j+2sjDbXH@5rO5`@dPR6OQLJ3 z%371Ih4N)>5UOBV_B`B8q$o1o(6ZN??rqkIw(CUMw+NC=;th=&z96Iz@1-pTcBE?| zCA2Ug?bgI*H~`>j3O2H8ye!N-L1Ei1+AFa{CI5d04i{)}MdrG24wut? z0iD#vZ~sq=;lzv}d2=eja0dX@u(^mU5L}Ovtan6y)ztD%Ult-tfF??QrHB;_b1={F zQZVk-OsukN0^ZODc-{q)Of#8quV|&9<5 z5Gz#nycAYH07R6EE-QPzuiyjpq)X=NgR#JkygA|4e@W zULt1El?fqq4JMcB#4x&`k^335=;Ak16Y{oA<9;$IY z5Ry`c+Y_RF4buA4D z5xwm1T3Iz4@Kazxpo-(;kHeKZ?U ze~wOaV&5=&`(tQ%-pkFBp4Ts&m6{JP=sr~0uA>mYqzBQH{uf=zrZJk)x%7k#5|3^tHN1k zTh8n?DN=qY8&;Dno@7&MY@y~*cgLgldoH7PL=Vyz*3w{r&zN}&*mdp7BZF; zoJhlF*-V3!6U$EDQs7ipT?{JEMjO~ zsB%)u=Uh~C7nWmPGV6(~1dE6Y1&^<_DsUbZ|X_j*Rol+xnl zLFIDkP&vO+j;WKQ{IXmp$4-^;%Kv|)B4fO4Rz9XY#2iz`>hZrl7=Q8#@lPkq%jFyz zyhC}E#GzUwhssfggteq2w+M0BEStv5F>~b%B-7R+k05?S{p>*06@zKEY?>zzeN@h^ zljD@XQU>LxWk;M=@tGcdw#^Ocu7S`3?K4ad(S+&bp#FB1itE*yBE9|W+ z>Yf)_zopKIg|&Cgm_2WPE&Xi?o47PHd}4LY{Ms4rg>|>z*?Q;Fd&J0sxr-Lm7Ti8} z(X86#c`R>LN~>|%XOg9k)728)j3u=*>lW#1T2C&|7F%;y{3x>WRquq<)h<}fGQCq- zqxTd17GAx22K_L8aCLrC;QxMLy9OVFfU8fdy5?(1jAZ8<68i*>ZJc@hp(8*PqJ_Yf zk-o~&Qwh8zMB*zR8{9ZXY8=ScHZGNR6|r9$^HUd7N5X>+&L28AVnG~yiNVU&xr%ze zFQD5QQT6=F*GtE@vq#n?N*i+6{&i!-mzlW!8u4vbhR+eKWql%f`Q-XB;@#~0`Wb5Q zWdNJ9p+M}zd>cxVdfp0O!wE+Eo@FOCB&PNJvirHddig+R){U8B6&tZ}h8nzbu_rc` zsKIYp?EJ<>qQI(s1#0kZ0ejF_B2H$%%iTzUP64SABy0~9ewgEH6?fQoL@pikMU ahXzQd)hun>aH;feR)Ln2Gl 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 Ps1~waUmL+&pK|^$OLN=G diff --git a/lsfs_fuse.c b/lsfs_fuse.c index 952cec0..c87672d 100644 --- a/lsfs_fuse.c +++ b/lsfs_fuse.c @@ -39,7 +39,7 @@ static struct fuse_operations lsfs_oper = { .read = lsfs_read, .release = lsfs_release, .write = lsfs_write, - .rename = NULL, + .rename = lsfs_rename, .utime = lsfs_utime_STUB, }; @@ -80,13 +80,16 @@ int lsfs_truncate(const char *path, off_t offset) { int lsfs_rename(const char *path, const char *to) { (void)path; (void)to; - return 0; + lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); + + lsfs_disk_getattr(found_file, path); + return lsfs_disk_rename_file(found_file, to); } int lsfs_getattr( const char *path, struct stat *stbuf ) { int res = 0; lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); - printf("getattr: (path=%s)\n", path); + //printf("getattr: (path=%s)\n", path); memset(stbuf, 0, sizeof(struct stat)); if( strcmp( path, "/" ) == 0 ) { @@ -124,26 +127,27 @@ int lsfs_getattr( const char *path, struct stat *stbuf ) { } int lsfs_write(const char *path, const char *content, size_t content_length, off_t offset_to_next_entry, struct fuse_file_info *file_info) { - (void) offset_to_next_entry; + //(void) offset_to_next_entry; //(void) file_info; int res; + //printf("WRITE: offset id: %d\n", offset_to_next_entry); // printf("read: (path=%s)\n", path); - time_t current_time; - time ( ¤t_time ); + //time_t current_time; + //time ( ¤t_time ); - res = lsfs_disk_write_data_to_file(((lsfs_file*) file_info->fh), content_length, (void*) content); + res = lsfs_disk_write_data_to_file(((lsfs_file*) file_info->fh), content_length, (void*) content, offset_to_next_entry); - ((lsfs_file*) file_info->fh)->size += res; - ((lsfs_file*) file_info->fh)->access_time = current_time; - ((lsfs_file*) file_info->fh)->modification_time = current_time; + //((lsfs_file*) file_info->fh)->size += res; + //((lsfs_file*) file_info->fh)->access_time = current_time; + //((lsfs_file*) file_info->fh)->modification_time = current_time; return res; } int lsfs_readdir( const char *path, void *buf, fuse_fill_dir_t filler, off_t offset_to_next_entry, struct fuse_file_info *fi ) { //(void) offset; (void) fi; - printf("readdir: (path=%s)\n", path); + //printf("readdir: (path=%s)\n", path); filler(buf, ".", NULL, 0); filler(buf, "..", NULL, 0); diff --git a/lsfs_fuse.o b/lsfs_fuse.o index b774a3f0cc75ca27bbff951b79fbe760d118c15c..66369a8e6ff571141d4e8dfc1f66eb2fd512e06b 100644 GIT binary patch literal 38888 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 z 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 literal 39040 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