ls fonctionnel 🥳

This commit is contained in:
Guamss 2026-04-21 11:24:49 +02:00
parent 99ece320d3
commit b18a6aef72
6 changed files with 61 additions and 25 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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);

View File

@ -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;