ls fonctionnel 🥳
This commit is contained in:
parent
99ece320d3
commit
b18a6aef72
@ -84,7 +84,8 @@ Le SGF utilise des structures à taille fixe pour simuler la partition .
|
||||
```c
|
||||
/**
|
||||
* @struct inode
|
||||
* @brief Un inode est un fichier, il possède des permissions, un type (répertoire par exemple) et pointe sur des blocs de données
|
||||
* @brief Un inode est un fichier, il possède des permissions, un type
|
||||
* (répertoire par exemple) et pointe sur des blocs de données
|
||||
*/
|
||||
typedef struct inode {
|
||||
unsigned short perms; // rwxrwxrwx
|
||||
@ -97,7 +98,7 @@ typedef struct inode {
|
||||
* @brief Un bloc possède un tableau de données brut concernant des inodes
|
||||
*/
|
||||
typedef struct bloc {
|
||||
char datas[MAX_BYTES_PER_BLOC]; // 1024 octets
|
||||
char datas[MAX_BYTES_PER_BLOC];
|
||||
} bloc;
|
||||
|
||||
/**
|
||||
@ -105,8 +106,9 @@ typedef struct bloc {
|
||||
* @brief Un disque est un liste d'inodes qui pointent sur des blocs de donnée
|
||||
*/
|
||||
typedef struct disk {
|
||||
inode inodes[MAX_INODE]; // 10 inodes max
|
||||
bloc blocs[MAX_BLOCS]; // 30 blocs max
|
||||
char owned_blocs[MAX_BLOCS]; // 1 si possédé par un inode, 0 si libre
|
||||
inode inodes[MAX_INODE];
|
||||
bloc blocs[MAX_BLOCS];
|
||||
} disk;
|
||||
|
||||
// pour 10 inode qui a 30 blocs de chacun 1024 octets, on a 30720 octets, soit
|
||||
@ -118,7 +120,7 @@ typedef struct disk {
|
||||
## V. Liste des fonctions principales
|
||||
|
||||
### Primitives Système
|
||||
- **`int mycreat(char *nom, int mode)`** : Crée un fichier et retourne son inode.
|
||||
- **`int create_inode(disk *disk, inode *parent, char inode_type, char *name)`** : Crée un fichier et retourne son inode.
|
||||
- **`int myread(int inode, char *buffer, int nombre)`** : Lit n octets depuis l'inode.
|
||||
|
||||
### Commandes Shell
|
||||
|
||||
Binary file not shown.
@ -3,7 +3,7 @@
|
||||
#define MAX_BLOCS 30
|
||||
#define MAX_BYTES_PER_BLOC 1024
|
||||
#define MAX_INODE 10
|
||||
#define MAX_INODE_NAME 30 // 29 caractères + '\0' + numero de l'inode ref
|
||||
#define MAX_INODE_NAME 28 // 27 caractères + '\0' + numero de l'inode ref
|
||||
|
||||
#define TYPE_NULL 0
|
||||
#define TYPE_FILE 1
|
||||
|
||||
64
src/disk.c
64
src/disk.c
@ -3,6 +3,7 @@
|
||||
#include "struct.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int init_inode_in_disk(disk *d, int inode_index, int filetype,
|
||||
@ -47,9 +48,9 @@ int find_offset_in_parent_bloc(bloc *parent_bloc) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
void create_directory(disk *disk, inode *parent, char *dirname) {}
|
||||
int create_directory(disk *disk, inode *parent, char *dirname) {}
|
||||
|
||||
void create_file(disk *disk, inode *parent, char *filename) {
|
||||
int create_file(disk *disk, inode *parent, char *filename) {
|
||||
int inode_index = 0;
|
||||
while (inode_index < MAX_INODE &&
|
||||
disk->inodes[inode_index].filetype != TYPE_NULL) {
|
||||
@ -58,13 +59,13 @@ void create_file(disk *disk, inode *parent, char *filename) {
|
||||
|
||||
if (inode_index >= MAX_INODE) {
|
||||
dprintf(STDERR_FILENO, "No free inodes\n");
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int new_bloc_idx = find_free_bloc(disk);
|
||||
if (new_bloc_idx == -1) {
|
||||
dprintf(STDERR_FILENO, "Disk Full\n");
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int p_bloc_idx = parent->blocs[0];
|
||||
@ -72,7 +73,7 @@ void create_file(disk *disk, inode *parent, char *filename) {
|
||||
|
||||
if (offset == -1) {
|
||||
dprintf(STDERR_FILENO, "Parent directory full\n");
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
strncpy(&disk->blocs[p_bloc_idx].datas[offset], filename, MAX_INODE_NAME);
|
||||
@ -80,24 +81,25 @@ void create_file(disk *disk, inode *parent, char *filename) {
|
||||
sizeof(int));
|
||||
|
||||
init_inode_in_disk(disk, inode_index, TYPE_FILE, 0b111111111, new_bloc_idx);
|
||||
return inode_index;
|
||||
}
|
||||
|
||||
void create_inode(disk *disk, inode *parent, char inode_type, char *name) {
|
||||
int create_inode(disk *disk, inode *parent, char inode_type, char *name) {
|
||||
if (strlen(name) > MAX_INODE_NAME) {
|
||||
dprintf(STDERR_FILENO, "A inode name must be < %d\n", MAX_INODE_NAME);
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
if (parent->filetype != TYPE_DIRECTORY) {
|
||||
dprintf(STDERR_FILENO, "A parent's inode must be a directory!\n");
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (inode_type) {
|
||||
case TYPE_DIRECTORY:
|
||||
create_directory(disk, parent, name);
|
||||
return create_directory(disk, parent, name);
|
||||
break;
|
||||
case TYPE_FILE:
|
||||
create_file(disk, parent, name);
|
||||
return create_file(disk, parent, name);
|
||||
case TYPE_BINARY:
|
||||
// TODO plus tard
|
||||
break;
|
||||
@ -107,19 +109,49 @@ void create_inode(disk *disk, inode *parent, char inode_type, char *name) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void write_in_file(disk *d, int file, char* data/*, char mode*/) {
|
||||
if (file != TYPE_FILE) {
|
||||
void write_in_file(disk *d, int file_index, char *data /*, char mode*/) {
|
||||
inode file = d->inodes[file_index];
|
||||
if (file.filetype != TYPE_FILE) {
|
||||
dprintf(STDERR_FILENO, "Can only write in files\n");
|
||||
return;
|
||||
}
|
||||
|
||||
sizeof(data);
|
||||
// mode 'w' (on écrase tout ^^)
|
||||
// les blocs sont possédés par un seul inode donc c'est ok de tout écraser
|
||||
// TODO: regarder si l'inode est sur plusieurs blocs et écraser tous les blocs
|
||||
// possédé
|
||||
|
||||
int bloc_index_to_overwrite = file.blocs[0];
|
||||
if (bloc_index_to_overwrite == -1) {
|
||||
dprintf(STDERR_FILENO, "This inode does not have any bloc\n");
|
||||
return;
|
||||
}
|
||||
|
||||
strncpy(&d->blocs[bloc_index_to_overwrite].datas[0], data, strlen(data));
|
||||
}
|
||||
|
||||
void do_ls(disk *d, int dir_index) {
|
||||
inode dir = d->inodes[dir_index];
|
||||
if (dir.filetype != TYPE_DIRECTORY) {
|
||||
dprintf(STDERR_FILENO, "ls: Can only list in directories\n");
|
||||
return;
|
||||
}
|
||||
|
||||
int bloc = dir.blocs[0];
|
||||
|
||||
for (int i = 0; i < MAX_BYTES_PER_BLOC; i += MAX_INODE_NAME + sizeof(int)) {
|
||||
if (d->blocs[bloc].datas[i] != '\0') {
|
||||
printf("%s\n", &d->blocs[bloc].datas[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void init_env_var_file(disk *d) {
|
||||
create_inode(d, &d->inodes[0], TYPE_FILE, "env");
|
||||
int inode_idx = create_inode(d, &d->inodes[0], TYPE_FILE, "env");
|
||||
write_in_file(d, inode_idx, "PWD=/\nUSER=user");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -151,14 +183,14 @@ disk create_disk() {
|
||||
d.inodes[0].blocs[0] = 0; // utilise le bloc 0
|
||||
d.owned_blocs[0] = 1; // le bloc 1 est maintenant occupé
|
||||
|
||||
init_env_var_file(&d);
|
||||
|
||||
int n = fwrite(&d, sizeof(disk), 1, fptr);
|
||||
if (n == 1) {
|
||||
dprintf(STDOUT_FILENO, "Disk of size %.2fKb created successfully.\n",
|
||||
(float)(MAX_BYTES_PER_BLOC * MAX_BLOCS) / 1000);
|
||||
}
|
||||
|
||||
init_env_var_file(&d);
|
||||
|
||||
fclose(fptr);
|
||||
return d;
|
||||
}
|
||||
|
||||
@ -7,4 +7,5 @@
|
||||
#include <string.h>
|
||||
|
||||
disk create_disk();
|
||||
disk open_disk(char* filename);
|
||||
disk open_disk(char* filename);
|
||||
void do_ls(disk *d, int dir_index);
|
||||
@ -12,9 +12,10 @@ int main(int argc, char *argv[], char *envp[]) {
|
||||
// shell_loop();
|
||||
|
||||
disk drive;
|
||||
if (access("disk", F_OK) == 0)
|
||||
if (access("disk", F_OK) == 0) {
|
||||
drive = open_disk("disk");
|
||||
else
|
||||
do_ls(&drive, 0);
|
||||
} else
|
||||
drive = create_disk();
|
||||
|
||||
(void)drive;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user