From cc12b2e4495b5f1d9d58b06631d4c2d16004ed90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Guldberg?= Date: Sat, 8 Jun 2019 21:02:59 +0200 Subject: [PATCH] Disk Manager Utility is able to create new disk with correct format --- SingOS.img | Bin 0 -> 1054208 bytes a.out | Bin 23128 -> 23128 bytes lsfs_disk_controller.h | 93 +++++++++++++++++++++-------------------- lsfs_fuse | Bin 39696 -> 39776 bytes lsfs_fuse.c | 3 +- lsfs_fuse.o | Bin 37928 -> 38344 bytes 6 files changed, 50 insertions(+), 46 deletions(-) create mode 100644 SingOS.img diff --git a/SingOS.img b/SingOS.img new file mode 100644 index 0000000000000000000000000000000000000000..9566a05ed13d64bf18c8d647aba8a7d87b14f12b GIT binary patch literal 1054208 zcmeIyQA^uU6ae7W%^`hu?|HNj2AR*kiNX*jeIg-Qc%W6p z+=u`H0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1a=GDWLH`8 zc$R)n&rZW~F+8~mO_SyGMJTTFB4n#3hWY5^I+UTF#4t_nR!O`M$uw_%jOUYbG7I(i zA?8IMSLwIW@G?AxqFStPj8&559L@ z+^*zyYvEvPzNgdgdELY`F5{lo|EFaSIu7W{b!^+KR8@w(s`qaf`}`Rnzdrd_?o<1J tc%AOWN_?t%(Z}yLaoBF$@&3+Q$M5bPDisQKkyv@Db87X)s6lFE31Dw19aGohjLoZhuAq0f_w z`S$|0%ZHi@4XqG1tiWBA54rASd$?$Ns2Dv{5QTtZdQ@OSdk8O+OR0{-SSu?9B$h1S(lIu~;umb2oKXaF8zaPMcFspTfb-b?^tj2`@%H&I>uD8-!U46_-opj`W!z%zf848Zq0!( zTE!E1hVGN&(p_go47)`>FM#Gu0$38o^M=N${`<=Hsy2KOTgb0FK*!Uai76m|(~kT}^${#uNgvsg`6f!Sl^D;g z_}`j~ch#CVXuHkG@6!R>Dr4jSm9%Lk<#fen;@fH3mfP=lgkw|4EAD{ouRP&Gr+!Cy z#DaAxV8ooOJh3{@qgOG%_d^sc7n}#O$~moZA|G;QG%bve${&mSAH&)sV3`DKSg?Hc zh-*){e8rVWs$1s412HZ_(SaVNn!$5wy{}ggZloWjG&G~)rr~nq@pN3T{o)s4SQm+PuFE?6TJ>$ zwF~$%-|8xePe+1zbn;J-xb*9nC^pNOFqOtwz0031u&yTSAFe%9`ZjqcuqJCHjO+&c zA$wattEsE1v-H_>@^kFj?&r4|GHcvBcGR_ZZgY23wRgDdcJ1)EJF_yK?k;yvi^tt+ z*|N*x+3L2mw(odub7xCeOPjlAbFZhpqusMB=h-a7I(MJDqk9_)J>8bN_O7-Kbp}wX zyL-AU&fbpJE$*H+1AC&rriSg@!l=W(GVrSXJq~Nsi}E&_s53vcKj||?S%tIe#p{X^ z5A6M$qC5?J4d?-01ik_+85d8Nu|D7!aLG+Y`8RMo(1JtcnOlldF7WS)(hPJ=D9Qlv z55Ob9Fc>y05KnU)=mfG5*3af}V+mob6#KaxC|;IkpcgOJ05Bd0z!Bit83+LHHCE#Jchg&T2CjDUP_md`0@tL6q=;7 zwDsi_BJz?dOAsY;APxe(ABO zu#o*cGF;D+FmwVQbx?M(S(?5}PZXPYBy}PrNpcGLX@#&4Olf=rnM-0WJW6=k2!G)k#SAL1(^H8aSp*YCc^Qo4V<-@E7he&?Kf-nnj>E&378Psc9I~eobWMo`lADebpFG6})BeiUNK4A5yB+Jft*Z$Mv7h2~-3YmW+G- zr00?Lt_OdPDALz8%s4@LaofsUV5 zRSv%U6=1F$ip|PKnR3wIH@a001%%VGhm9XyoBO|2L9GLYt-TJ(HgHj-_eQG#-%^0m zdI1631AV`!Dx3_j>?~ddF=V(n8X{QhS&L|g9BfzkZ{UZLzlBE*2hMBd9BF0}V=bB< zlsr&cn3=JI!lKlR48edRsG;O7LKxClK?p$`5MC0@sIOgl^*olyaaOHYo7oT$qeY}^ z#N?{}B2cg_VhKvLh&MoK83ch|#9t!TKoRLz7a?c^!bMjXkpba8o0d3K**8}nlc@E) z)}YLShlV;GseAJEF8x>E2O?W2c>~?*9L|r>d}p<}$->w^5k@(94!SMQH0pL53wu5N zS~>WIXm7lxG<3o&2iyMF*RZb}HYKHBJbrmAZ|gJ#+whgvUlZdka9|EZV+^zQg06(&6t$6t4CD> zt#vb(Klw4MGanQkS3ZYL6Ni1{Ayazj=FItg3B8%=O03R9V3aBc4O6Kj(`Bwo6q&x% zJK?AJ5xLUEJ}MgV44+4BBj)g5$)1%pvC#)P_`V!AEFsD&w^<<;LkptTQkNKyQ1WFu;I{KAWOWzYULJWhC4%V(Wfj%9 zZTv@C;vQuyyM|JwQ#@Lf8am`P(;O_rzPYd}ssdBkzfEi* z>`R78-*>NePW{_(P>q&7z=FDWKzK}OKGiilb5dB4mwyNoYSgknFp&MQMm1#S=ygAVI97<^VAPpyOW8kyv6*r>SK#eab56_4yN&admWU;%EpAQzyx3_or%t8Q z`J<%8_eQLv_i`$jo=!alnf2>Ws_H0o?aFtmIs|y>l&anVOzl+FTHqw$^T548(cM3Q z9YFd)Rj&Xq0G+rrPyVQ?69oRGsx`m^U8>puoPugM16KlD1>%!;0^5Ns1{d-ojGHqC z?FCK%PQsMe08QNp0NjdGxfxi7%b*n)z@^+N))x^Vma*4?PN4O7=z+Ds8sO4P&;wUt zdR_ru0d@m%(zPFddk-2a%?<7}Yigf=88dvD%>*$_B2j57`@Z3gQ3Nv{xeOTy_ zhMuCX!VLZ_nY@|&6Uy~EcoS869a7y7^q|)+d4HnSUORu8w!_mxpX0fadhk3*NktB6 z@)^o2vP%!2p=m{Seu5SjIb6%|!PldQtkgVcrF2VDT+9nRG2Y11VA_Tr{Y~4UeCjNH z0m%mH!J_0GnTzexvU8MIY)2WD#ST{@u3F<&VPdo}PK0Shr+%k!aV9potGL`?ME4Al zMLF~1Nb!y3jS*K#aV&47Sra{}(Z2|g4g6x5l{Jisyfks8G;DhRUy1a7Zv}F4W?>Ig zseiGwqL`Zfk4h^FsGuy5H_$z09yI8=vb*_Vx=>c0(C5}=MotsUtB`qJxr6f@dQUzk znX+ijkKrb42%tCNi3JXuki505$hC>#EYo3(#G>6vn%Z; s$zY?$tMW{ZIeLah+ErC9EtlwWRbE1LQ=+cwqJ)MqItP1tq`FJ`7nE;~#Q*>R diff --git a/lsfs_disk_controller.h b/lsfs_disk_controller.h index 19edb5b..e98fd36 100644 --- a/lsfs_disk_controller.h +++ b/lsfs_disk_controller.h @@ -46,9 +46,9 @@ int read_data_from_disk(lsfs_sector_offset index, uint32_t file_block_size, void int write_data_to_disk_off(lsfs_sector_offset index, 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 SPACE_MBR_RECORD 2048 // Sectors +#define SPACE_VBR_RECORD 2048 // Sectors +#define SIZE_FSCI_RECORD 1 // Sectors #define SECTOR_SIZE 512 // BYTES #define NUMBER_OF_MBR_PARTITIONS 4 #define DEFAULT_FILE_SIZE 4 // This is in sectors @@ -78,7 +78,7 @@ typedef struct Master_Boot_record { uint8_t offset_on_disk[446]; // The code for the bootloader Partition_Entry partitions[4]; - uint8_t master_tag_records[2]; // Signature + uint16_t mbr_signature; // Signature } __attribute__((packed)) Master_Boot_record; typedef struct struct_table_entry @@ -111,7 +111,7 @@ typedef struct File_System_Control_Information uint64_t next_sector_reuse_pointer; uint64_t last_sector_index_on_partition; uint64_t maximum_sectors_on_disk; - uint64_t sectors_size_on_disk; + uint64_t sector_size_on_disk; uint64_t not_used[24]; } __attribute__((packed)) FSCI; @@ -396,8 +396,7 @@ int create_file_system(char* disk_name, char* hdd_or_partition, uint64_t filesys // to master tag tables // Second and forward is the pointers to the master Tag Tables // we need the first number to allocate memory at one go. - int* zero_buffer; - FSCI fsci; + FSCI *fsci = calloc(1, sizeof(FSCI)); if (hdd_or_partition[0] == '1') { // This is the create hdd case @@ -408,13 +407,15 @@ int create_file_system(char* disk_name, char* hdd_or_partition, uint64_t filesys { // This is just a single partition // And then the file system is the only thing in the system. - fsci.filesystem_information = "LSFS v0.2.0-exp\n(LessSimpelFileSystem)(Generated by the disk_manager_utility.c)\nDeveloped to SingOS\nby Jorn Guldberg\n"; - fsci.this_partition_offset_on_disk = SPACE_VBR_RECORD; - fsci.master_table_index = fsci.this_partition_offset_on_disk + SIZE_FSCI_RECORD; - fsci.next_free_sector = fsci.master_table_index + DEFAULT_TABLE_SIZE; - fsci.next_uniqe_id = 1; - fsci.next_sector_reuse_pointer = 0; - fsci.last_sector_index_on_partition = filesystem_size_in_MB * 2048; // Todo, this is the ssectors pr MB, this should not be hardcoded. + sprintf(fsci->filesystem_information, "LSFS v0.2.0-exp\n(LessSimpelFileSystem)(Generated by the disk_manager_utility.c)\nDeveloped to SingOS\nby Jorn Guldberg\n"); + fsci->this_partition_offset_on_disk = SPACE_VBR_RECORD; + fsci->master_table_index = fsci->this_partition_offset_on_disk + SIZE_FSCI_RECORD; + fsci->next_free_sector = fsci->master_table_index + DEFAULT_TABLE_SIZE; + fsci->next_uniqe_id = 1; + fsci->next_sector_reuse_pointer = 0; + fsci->last_sector_index_on_partition = filesystem_size_in_MB * 2048; // Todo, this is the ssectors pr MB, this should not be hardcoded. + fsci->maximum_sectors_on_disk = 0; //TODO(Jørn) Not in use yet + fsci->sector_size_on_disk = SECTOR_SIZE; } else { @@ -422,28 +423,15 @@ int create_file_system(char* disk_name, char* hdd_or_partition, uint64_t filesys assert(NULL); } - - //fsci.maximum_sectors_on_partition = 1048576; // Max 4GiB - fsci.next_free_sector = 257; - // Create disk on host system: disk = fopen ( disk_name , "wb" ); - // Start writing data to the disk - fseek ( disk , 0, SEEK_SET ); - fwrite(&fsci, 1, sizeof(fsci), disk); - zero_buffer = calloc(1, (4096 - sizeof(fsci))); - fwrite(zero_buffer, 1, (4096 - sizeof(fsci)), disk); - free(zero_buffer); - /* MASTER TAG TABLE */ - - table_entry master_table[DEFAULT_TABLE_SIZE]; - memset(master_table, 0, (DEFAULT_TABLE_SIZE * sizeof(table_entry))); + write_data_to_disk(fsci->this_partition_offset_on_disk, 1, fsci); - fwrite(&master_table, 1, sizeof(master_table), disk); - zero_buffer = calloc(1, 16); - fwrite(zero_buffer, 1, 16, disk); + char* zero_buffer = calloc(1, (DEFAULT_TABLE_SIZE * SECTOR_SIZE)); + write_data_to_disk(fsci->master_table_index, DEFAULT_TABLE_SIZE, zero_buffer); free(zero_buffer); + return 0; } @@ -454,25 +442,40 @@ int lsfs_disk_load_disk() { Master_Boot_record mbr; fseek( disk , 0 * SECTOR_SIZE, SEEK_SET ); fread(&mbr, 1, sizeof(mbr), disk); - - for (int i = 0; i < NUMBER_OF_MBR_PARTITIONS; ++i) + if (mbr.mbr_signature != 0xaa55 ) { - // TODO (Jørn) We maybe wnat to optimize, such that we can detect if we have more than one partition opn the system. - if (mbr.partitions[i].partition_type == 0x18) + // Means that it is a sigle partition we try to mount + fseek(disk, (SPACE_VBR_RECORD * SECTOR_SIZE), SEEK_SET ); + fread(&p_control.fsci, 1, SECTOR_SIZE , disk); + //printf("next free sector: %d\n", p_control.fsci.next_free_sector); + //printf("next free ID: %d\n", p_control.fsci.next_uniqe_id); + + // next we find the Mater Table. + fseek (disk, (p_control.fsci.master_table_index * SECTOR_SIZE), SEEK_SET ); + fread(&p_control.master_table, 1, DEFAULT_TABLE_SIZE * SECTOR_SIZE , disk); + return 1; + } + else + { + for (int i = 0; i < NUMBER_OF_MBR_PARTITIONS; ++i) { - printf("%d\n", mbr.partitions[i].LBA_abs_first_sector); + // TODO (Jørn) We maybe wnat to optimize, such that we can detect if we have more than one partition opn the system. + if (mbr.partitions[i].partition_type == 0x18) + { + printf("%d\n", mbr.partitions[i].LBA_abs_first_sector); - // First we find the File system control information. - fseek ( disk , mbr.partitions[i].LBA_abs_first_sector * SECTOR_SIZE, SEEK_SET ); - fread(&p_control.fsci, 1, SECTOR_SIZE , disk); - //printf("next free sector: %d\n", p_control.fsci.next_free_sector); - //printf("next free ID: %d\n", p_control.fsci.next_uniqe_id); + // First we find the File system control information. + fseek(disk , mbr.partitions[i].LBA_abs_first_sector * SECTOR_SIZE, SEEK_SET ); + fread(&p_control.fsci, 1, SECTOR_SIZE , disk); + //printf("next free sector: %d\n", p_control.fsci.next_free_sector); + //printf("next free ID: %d\n", p_control.fsci.next_uniqe_id); - // next we find the Mater Table. - fseek ( disk , (mbr.partitions[i].LBA_abs_first_sector + 1) * SECTOR_SIZE, SEEK_SET ); - fread(&p_control.master_table, 1, DEFAULT_TABLE_SIZE * SECTOR_SIZE , disk); + // next we find the Mater Table. + fseek (disk, p_control.fsci.master_table_index * SECTOR_SIZE, SEEK_SET ); + fread(&p_control.master_table, 1, DEFAULT_TABLE_SIZE * SECTOR_SIZE , disk); - return 1; + return 1; + } } } return 0; diff --git a/lsfs_fuse b/lsfs_fuse index 9611d5bdf513e03c98911fabf5381b3e4a064e72..3fc2f9b9062c3818910809c3ecca1fc4af3cd9a4 100755 GIT binary patch delta 12048 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 EANZ^wSO5S3 delta 11630 zcmZ8n34B!5xxeR5CUZ|RnapG+naO05nS`ul4@)8tNZ1@%qig|@1cVSQge|B@VbA~? z0zy142vM-DmRbbfiwaUjT(H#osAy{`6%AT60$LD3+{pWX=gu94`_ucK?|l1mmbszp zMRha&%VnF}^FEF_>{H}(*e4QL5wF#Bv{u~2UUf8=>R1GdWc5$3>`TdS#%!y2>w~A> zeR$KV;jy9rd9tdrTRjprb8C*yf2Br;VP(p5`8uxLeC_<%>@a@ayf3WBe%*YWaA@wE z^25~Nb=2cwZ8g`;zujB6QhVLJTP)VxW#8oL)Vr^vZVmgq_qzFAd7THem$mr*DT)%@ z8274|K;`JpwT_3(Y+9$sy-HR8Z53OR_e5VxQj`O6Vyw4P{XAA|@YY1v(@e7X#5j4{7cRBR8N&Ues!IncQ!PmN? zf~-4OXh%`ns*+j`vDdnI>uadzhb3W8!>T`oD5ei%TB@c5#>otBtUQJsb$=+j(!Jh~ zuObKJVeq;X92c&PY&G|y7?d#}t{)|}b;P?+*t=A;WYk%|i!&ngeFbg_&cp+>u-A6Mtmt6GYi;7@knNyI`@jm$huW6DiNWqOqW&&K8DsnP{G!>AkzJU z*q4>+|CltkMmd6QBd!G7sx+w`X$rQ!9^7btNnFgjG5O|#YqNDT76z(1pg^SMq^hIO ziY3|oJ)dG{pd|urvRa>FA%W=~aVXovJ{60z-Qs+9qG#Q8Z0mHkg(5X4jja}ga+a5` zlWU3Gnba-aYW;x9-z94_sp}V0cYZ@QzzOnRaV}@bNP9$fL^s8`vGOpsTRlB*c1!NA z1DoMxWC;@~T`nOn|Tc+~=il=igsHZ;{f67l|+r_@T8SDd*)H^@+pV5ZO zLt;#CPxKMsJ@1O~y%Q_;$RT_ped~dczI~rjnVa1-9kFXV2XC-posC7FFNuA<7si}7 z>-?#oiIV)x&?0nmZA7AoNBWz53BU4e};UKV|bwK#vBy0mFQ}&lP;{B_|t^%L? z*XfEfDY&ta;Dj-Gr-Lo$w7K06c79xtZW8v`MGuwCjT$#;%ouUHqz+Nw5ihO`xF^hO znmc|%u?~vnEto4wiWpZ~Chjf`hIW0_)3X7docp+^ry1~cS5MFLfH9|fdj1aB7w{Xv z-vfHEia!Ia0BrfRr)N6gDZtf${|AqE5Jbuj0Y3M6Pfr)%KonOoDaxII0fOkZD!_e! z^(JiRGttVcF|iYH2Vh@R__6EFa{53mZ*c^UHN(Tb9d!D>vb{uT-VE3QBR;NGf zdnf?B0k8_N4zM2Z9l$k!g9PuB!xo9sK5o@>QjF@8Jv0wV&7y=?+wAMqVR6y*Rtq{@ zp}Wnm@qZEM@)BUs=jikRXdU>!;$!i@eKOen;vaqd>=|*XPcPMfN_hKbu&JW5uV2mj zM9k=$rkXz$tNNy~!{Q0d^*JpL0vRVx0x9}jTm>>-r1tZ(e~HR|epTrfGy0{m`C?^1 zf3*XPl}_S_gQmwAxj+u?MD;eJN>5!w?}*TkfNm2fp}0`|g!fUA+TYI{q7v_^;x@cH z#7ew3i6`)G7q8>Aajtq4){!KZ?|HKYLPCmiyJ?7sQP6G$d~&rkcbPcyAN0fN=Gq z_^3Qhy>L-n1^D)&NUO+TRie7$Msp(yZ|-cz2<<;y9Ip(j`wKcV1|L*KRkbEO)%IlL zerMe0jQbnzYt_Z+#(mAWpBeWtcld_&jW|{1R=4I07Tcfg5;LpaFjOM0R1Z_Tl0~(e z6#O=zC}=S}8ndGXtYh)2uqevZ1Uaj8CF_vhsx|~~6OI8Tibdat);3kpShM^jwhc`Q zEyqlhYB_}?Co0OK#!9von6%LPi^_J_6Srz!h6BfP21cTKCpAe0<|H(gWhiV%6{ZZw zl;tW(v?t5)2vYb^GO=3d@QD)o`0u3RVV!4j3|3;)Bf9WI2r24OuM}v;r6}q#ecn$l zZAsonioT@r<0*2yl*T)}a(o_55w$y2j(3Hm4e$JkPbae^Dpb;A87u~bnt`} z%Vl_H_Bd%}Sk8gT>~(FT@o+?DPI3K)#vfoly43j*jTIP+9_ZLjV->Q|RgSl4{4fHD z9+7Z{#y2AR=x%u4JwF@wVsX|9-B_!u)RjHkL{P7!`%827ni`V#-xFrMOy zSx5?NbUa0I#Wpl5F%x6&fxjNUpJ-Dg5>T|;F}FFkNZW?=^DXc&wj>lsc~tlegdE#1 z?mdh(K9fk5@t1+vc_mcD4z`^E;^BQE8Cw-cdG+y6;Ye(C93?-%cXA-ZI7Oey|3GXb zr0QJ$H0l^TDvnB3!l#2CJI;{}q=L_-`p4GT%Yaq!hslLo6F&nI{oK<;qUp>eljqRd;VHhY1`QMy&dS_?pjiNu*=yBBopb{nzS90Ol<-ZYu1F#kybacDB~o`4zk{^(l}M2P6MozJNu-A3hm&IK&&ju1B_xA9 zgRxAOS+V>G-uMCWmocSkKjIxvx$?pV`wR^1h4hl>>+l3T)J>KTkc{}jfda6pS{dGs z2@thxhZpff;)luUoA8#(=3-zE(5o;++Q@)?9ch!~6_P@8G=e@VvZ|4kq|RBmvt631?GhQc+iH)ekyk(WJ4{d$d`Yd}xfPfSFIzUK_d_ac&EO9u_g zg$RWj!N|>VB8OxU*xdDyf0?^)4e{a#S@vrb1RPiaqmL!oN-wwLnEw$C~EhOX7s6A`>_*fvx8Z~1*zX5Gz_iC%DD;l{V z4Jq0VkQVW|q}!)aXWh-)5SBen`x?kk-~nKffi%>`za@VPW1JA}=JA9SacYzEd=O3>d$C6CamCd_c1kqr2!*+x zqfC?aW=bM8m?|rqlnW;uel`9UOxbqAZbGJwR-Ek&L=wvM^J50A zCY0;rWAGzkpd4$_*fx(lOSO}r^RXZ}`&dRpSm94a!M?LUCsi6B3%$;AiP-roaMW2L z5f3jy;+!`~B*0@4k8^-Ta``jVg##s0!YgoOItNLlf)7DoIV&Yn#n+R9Dv1R7|H2Pv zwM1${{9mx`94fI|J`3SEhbLVIM?K$9LL*&tOf>Q>LpMpJna@Hlougt^ zaNo@jlg!wJxlp>AzfLZUi(dxhKK?pc9j~dFYvDm+yE#6=iufPk4Wwae9NpVC^R?v9 zt?pFtZQ*%HopX9}E|49Zjvwc3(x08YlGM%MRHMCo5BXCULwm`7K7>52m(CsH(WH8o zRs;oaDwY^%a9NTkqXzEz=s#zE$mX~MwN|MmSfhe~mE+;-0eP>W7Bu>P~&=6MP zW(2EFOuPpHU=i*{#nefOt>CmX*K=3~>g2>G&^*j_lvGYhoCVCsT>povtF;nKWv)|% zO_f+0b6p~An#BCfH484Nw|X`~CpIL@LddI*ymOchIU9i}N$OI264n*ZBhoT2jTP5K zWKX@*n*cssHZ5DpPiIL6XwF-Z9YiA`YVYAnCp*ZZN9{EnQJV?vp`}c%(aC$ndHMrZYJaPk*2P&H{r{#UW8vK{gn*yeA2%%ltih$%%@TWtCIc=()W5n zLP-?C_sq437*|U^RdszrwYyK!qE**Gq(N zq=q0brsjV-`3HDjqgZ}Vd~Sa)nDx@w64gYG^tX{$DaX+fq!A za=_xG1bKbL>YGF3)R5c^xG6v<3m)G%ophtISGi+iuLJD3%u~!P8S{x3SV@L<>Ml zaK%dLraqUrTh~a&aSRNl{*Q%Zvl6xLCjpeX(f>;a||@3v_J6lwHVAwJXld31kO+h_a#gF>6$??=CA)b?5>aF+0+(j(*Vht7z; z?ufplX<>co4fDW1aBFn$ut&2{S<@R*f$@2)C8FR?=<+`xZk?1`PRq&kM&A=KY--;h z^3w-+(;HQV0DYU6D=gJ3~G{Me&yPsMs?pBV>Gk8yiu4SSlu-=fjcKN)6B7 zKpNEc8sAjXbihuGYI`HfLK|7yeN=!=(%W5my0$cUKo9Gfi@)*c>D%Pj!>vu9wX8uA zHIrj2-@|e-ZK|T56>57>cYo73a$jw)lD0Rk(7oRu^5vqZO^+p!LKyEgS!|gc2+?Vf zHkuq*B^@ySj=NvC4+nmXIIt=lRnR{TQl?c!x<6I^0*ZOn;A_*kYNC-wze<)@-D~7A zW67MQis@eZ=7IyGeY&34HP)lj?|LQe=~(bj*6W|6J2EYjkXsXtgiJOP;@?K~o?J#h zXpm-I{}lO62koV2y*85dz$e6ABh`EE59|NAzqU#J;^>sr&?xd_m}E4*zS4IfdRWKV zh#$iue$1tnF)Uv%K)Bo^e>R*$h6hP~#y z3%mNW$oPmzKVxYrX%n%Jn2Mx?@gX@QVq|kfqR5cY7h{pJ7?sQ=R86;YG>W4bADe$p z&#{OGcd_nfqwGhMd&E7m%j=aaP8;_)Rr;_jTQ`1t#D{)v{B>eFm1>+?K>HHbe6~EJ z#;Jqom{Z#)W)DG2hQKgE{%mOv=Fks0wMGpWb-t4ISF#q=jl_kGG)9a(9x)PBiwz?! z_9*GKYG#K=%J-!LL08LAF6 zB9TUis<#+{NF&1|MwF}zl!|`3jW05F8?O1Q~U2iIrkCAapsPW18lF!k=NRP zF$dk4v9pJArjTnNGMRK!`}3ik^*FiIlPtW6ROMKS^CKoNG1!56dBd$n!PApFPfS55{9hf93||3kUy}b(T@&O z`;iHu>>O+Wn7M(@UsL;`2|4>nOB;(JepCDL2|4nHy@AEh6&s#R=skjzc-Az-8ZPz)5XivJ-$5<%}FKES$c(u zBkLWx&cylYp3p_oEw8LKESIhrSg1Ll(6YOk#n6R@⁡iHg~m3_b;FR5{Ktm9l*aE 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 HO#i