Skip to content
This repository has been archived by the owner on Jan 22, 2021. It is now read-only.

Latest commit

 

History

History
210 lines (163 loc) · 9.38 KB

funktionen.md

File metadata and controls

210 lines (163 loc) · 9.38 KB

Funktionen

Beim Initialisieren des Blockdevices werden zuerst S-Block, D-Map, FAT und die Namen aus dem Rootverzeichnis ausgelesen und somit im Arbeitspeicher abgelegt. S-Block, D-Map und das FAT werden immer beim Aufruf der Funktion fuseRelease auf das Blockdevice zurück geschrieben mit den aktualisierten Daten. Das Root-Verzeichnis wird immer direkt auf dem Blockdevice aktualsiert, sobald an diesem eine Änderung vorgenommen wird. Durch die unten aufgeführten Hilfsfunktionen konnten wir unseren Code mehrfach verwenden.

Fusefunktionen

Methode Zweck
fuseInit() initialisiert das Blockdevice und öffnet die Containerdatei
fuseRelease() schließt eine zuvor geöffnete Datei
fuseReaddir() gibt Informationen über den Verzeichnisinhalt zurück
fuseGetattr() liefert Informationen über eine Datei zurück
fuseOpen() öffnet eine Datei um sie zu lesen
fuseRead() liest von einer Datei
fuseMknod() erzeugt eine neue Datei
fuseWrite() schreibt in eine Datei
fuseUnlink() löscht eine Datei

Hilfsfunktionen:

int getFilePosition(const char *path);

Parameter

  • const char *path: Pfad der Datei, von welcher die Position angefragt wird.

Durch diese Funktion kann die Position der angefragten Datei im Root-Verzeichnis lokalisiert werden. Dies wird dadurch erreicht, dass alle Einträge des Root-Verzeichnisses an der Position des Datei Namens vergliechen wird, mit dem angefragten Pfad/Datei.

int readBlock(u_int32_t blockNo,char *buf, size_t size, off_t offset);

Parameter

  • u_int32_t blockNo: Nummer des angeforderten Blocks.
  • char *buf: Char Array, in welches der angeforderte Block geschrieben wird.
  • size_t size: Die Menge an Bytes, die aus dem Block gelesen werden sollen.
  • off_t offset: Der Offset, ab dem die Daten ausgelesen werden sollen im angeforderten Block.

Diese Funktion liest den angeforderten Block aus dem Blockdevice aus und speichert diesen in dem übergebenen char Array ab.

void transferBytes(char firstBuf, size_t size, off_t firstOff, char secondBuf, off_t secondOff);

Parameter

  • char *firstBuf: Char Array, welches in einen zweites Array übertragen werden soll.
  • size_t size: Die Größe des firstBuf.
  • off_t firstOff: Der Offset, ab wo die Daten übernommen werden sollen.
  • char* secondBuf: Das zweite char Array, in welches das erste char Array übertragen wird.
  • off_t secondOff: Der Offset, ab wo die neuen Daten geschrieben werden sollen im zweiten Array.

Schreibt den erstem Buffer (firstBuf) in den zweiten Buffer (secondBuf). Es besteht jeweils die Möglichkeit ein Offset anzugeben.

int getFileSize(int position);

Parameter

  • int position: Position im Root-Verzeichnis

Liest aus dem Root-Block die Größe der angefragten Datei aus.

bool isFileExisting(const char *path);

Parameter

  • const char *path: Pfad einer Datei

Überprüft, Ob eine Datei beireits existiert. Dies wird durch Aufrufen der getFilePosition() Funktion erreicht, da diese, wenn sie eine Datei nicht findet -1 zurück gibt.

const char* remDirPath(const char *path);

Parameter

  • const char *path: Pfad einer Datei

Entfernt den Dateipfad vom Dateinamen.

bool isFilenameCorrect(const char* path);

Parameter

  • const char* path: Pfad einer Datei

Überprüft, ob der Dateiname korrekt ist.

bool isDirPathCorrect(const char *path);

Parameter

  • const char *path: Pfad einer Datei

Überprüft ob der übergebene Dateipfad korrekt ist.

bool isDirPath(const char* path);

Parameter

  • const char *path: Pfad einer Datei

Überprüft ob der Pfad ein korrekter Verzeichnispfad ist und keine Datei.

int charToInt(char* chars, int numberOfChars);

Parameter

  • char* chars: Char Array, in welchem eine Zahl codiert ist.
  • int numberOfChars: Größe des char Arrays.

Konvertiert eine in ein Char abgespeicherte Zahl zurück in einen Integer.

void intToChar(int number, char* buffer, int numberOfChars);

Parameter

  • int number: Die Zahl die konvertiert werden soll
  • char* buffer: Ein char Array, in welches die konvertierte Zahl gespeichert werden soll.
  • int numberOfChars: Anzahl der chars bzw. die Größe in Byte, des char Buffers.

Konvertiert einen Integer in einen Char. Die Zahl wird dabei in das Dualsystem konvertiert.

void readDMap();

Liest die DMap aus dem Blockdevice aus.

void writeDMap();

Schreibt die im Speicher(Memory) liegende DMap auf das Blockdevice.

void setDataBlocksUnused(u_int32_t position);

Parameter

  • u_int32_t position: Start Block einer Datei.

Die Blöcke einer Dateien werden in der DMap und im FAT freigegeben.

void searchfreeBlocks(size_t size, u_int32_t* blockAdressBuffer);

Parameter

  • size_t size: Menge der Byte die angefordert werden.
  • u_int32_t blockAdressBuffer: Array in welches die Nummern der freien Blöcken gespeichert werden.

Sucht nach freien Blöcken und gibt die Nummern dieser zurück.

int readSectionByList(int filePosition, u_int32_t* list, char* buf, size_t size, off_t offset);

Parameter

  • int filePosition: Position des Root-Blocks einer Datei im Root-Verzeichnis.
  • u_int32_t* list: Liste der angefragten Blöcken
  • char* buf: char Array, in welches die ausgelesen Daten gespeichert werden
  • size_t size: Anzahl der Bytes die in das char Array geschrieben werden sollen.
  • off_t offset: Position ab der von dem Blockdevice gelesen werden soll.

Liest die Blöcke, die in der übergebenen Liste angegeben sind aus dem Blockdevice aus. Dabei wird davor überprüft, ob einer dieser Blöcke schon gecacht wurde. Ausserdem wird am Ende des Lesevorgangs der zuletzt ausgelesene Block gecached.

int readSection(u_int32_t startblock, char* buffer, size_t size, off_t offset);

Parameter

  • u_int32_t startblock: Erster Block der gelesen werden soll.
  • char* buffer: char Array, in welches die ausgelesen Daten gespeichert werden.
  • size_t size: Anzahl der Bytes die in das char Array geschrieben werden sollen.
  • off_t offset: Position ab der von dem Blockdevice gelesen werden soll.

Berechnet sich die zu lesende Blöcke aus und fordert diese über die Funktion readSectionByList an.

void writeSection(u_int32_t startblock,const char* buffer, size_t size, off_t offset);

Parameter

  • u_int32_t startblock: Erster Block der geschrieben werden soll.
  • char* buffer: char Array, welches auf das Blockdevice geschrieben werden soll.
  • size_t size: Anzahl der Bytes die aus dem char Array auf das Blockdevice geschrieben werden sollen.
  • off_t offset: Ab dieser Position werden die Daten geschrieben auf dem Blockdevice.

Die Funktion berechnet, wie viele Blöcke geschrieben werden müssen und übergibt diese an writeSectionByList.

void writeSectionByList(u_int32_t* list, const char* buf, size_t size, off_t offset);

Parameter

  • u_int32_t* list: Blöcke, die beschrieben werden sollen.
  • char* buffer: char Array, welches auf das Blockdevice geschrieben werden soll.
  • size_t size: Anzahl der Bytes die aus dem char Array auf das Blockdevice geschrieben werden sollen.
  • off_t offset: Ab dieser Position werden die Daten geschrieben auf dem Blockdevice.

Schreibt den übergebenen Buffer auf das Blockdevice.

void writeFAT();

Schreibt das FAT aus dem Speicher(Memory) auf das Blockdevice.

void readFAT();

Liest das FAT aus dem Blockdevice aus.

int writeSBLOCK();

Schreibt den S-Block auf das Blockdevice.

int readSBlock();

Liest den S-Block aus dem Blockdevice aus.

void readRoot();

Liest die Filenamen aus dem Root-Verzeichnis, das auf dem Blockdevice liegt aus.

int sizeToBlocks(size_t size);

Parameter

  • size_t size: Größe in Bytes.

Berechnet die benötigte Anzahl an Böcken, um die übergebene Größe an Daten zu speichern.

u_int32_t getFirstPointer(int filePosition);

Parameter

  • int filePosition: Position des Root-Blocks im Root-Verzeichnis.

Liest den Startblock des Files aus dem Root-Block aus.

void clearCharArray(char* buffer, size_t size);

Parameter

  • char* buffer: Char Array Pointer.
  • size_t size: Größe des char Arrays.

Befüllt den übergebenen Buffer mit '\0'.

u_int32_t createFATEntrie(u_int32_t startposition, size_t oldFileSize, size_t newFileSize);

Parameter

  • u_int32_t startposition: Nummer des Startblocks.
  • size_t oldFileSize: Alte Größe der Datei in Bytes.
  • size_t newFileSize: Neue Größe der Datei in Bytes.

Erzeugt ein FAT Eintrag.

void getFATList(u_int32_t* list, u_int32_t startposition, int numberOfBlocks, int startnumber);

Parameter

  • u_int32_t* list: unisgned int32 Array, in welches die Nummbern der Blöcke geschrieben werden.
  • u_int32_t startposition: Nummer des Start-Blocks.
  • int numberOfBlocks: Anzhal der Blöcke. Bei -1 werden alle Blöcke, der Datei ausgelesen.
  • int startnumber: Offset = Anfang der Datenblöcke.

Schreibt die Nummern der Blöcke, in denen die Datei gespeichert ist in das u_int32 Array.

int writeRoot(u_int32_t position, char* buf);

Paramter

  • u_int32_t position: Position des Root-Blocks.
  • char* buf: Buffer in welchem der aktualisierte Root-Block steht.

Schreibt in den Root-Block.

int createNewFile(const char *path, mode_t mode);

Parameter

  • const char *path: Pfad der Datei, die angelegt wird.
  • mode_t mode: Berechtigungen der Datei.

Legt eine neue Datei an und erstellt den Root-Block für diese Datei.