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
|
```c
|
||||||
/**
|
/**
|
||||||
* @struct inode
|
* @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 {
|
typedef struct inode {
|
||||||
unsigned short perms; // rwxrwxrwx
|
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
|
* @brief Un bloc possède un tableau de données brut concernant des inodes
|
||||||
*/
|
*/
|
||||||
typedef struct bloc {
|
typedef struct bloc {
|
||||||
char datas[MAX_BYTES_PER_BLOC]; // 1024 octets
|
char datas[MAX_BYTES_PER_BLOC];
|
||||||
} 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
|
* @brief Un disque est un liste d'inodes qui pointent sur des blocs de donnée
|
||||||
*/
|
*/
|
||||||
typedef struct disk {
|
typedef struct disk {
|
||||||
inode inodes[MAX_INODE]; // 10 inodes max
|
char owned_blocs[MAX_BLOCS]; // 1 si possédé par un inode, 0 si libre
|
||||||
bloc blocs[MAX_BLOCS]; // 30 blocs max
|
inode inodes[MAX_INODE];
|
||||||
|
bloc blocs[MAX_BLOCS];
|
||||||
} disk;
|
} disk;
|
||||||
|
|
||||||
// pour 10 inode qui a 30 blocs de chacun 1024 octets, on a 30720 octets, soit
|
// 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
|
## V. Liste des fonctions principales
|
||||||
|
|
||||||
### Primitives Système
|
### 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.
|
- **`int myread(int inode, char *buffer, int nombre)`** : Lit n octets depuis l'inode.
|
||||||
|
|
||||||
### Commandes Shell
|
### Commandes Shell
|
||||||
|
|||||||
Binary file not shown.
@ -3,7 +3,7 @@
|
|||||||
#define MAX_BLOCS 30
|
#define MAX_BLOCS 30
|
||||||
#define MAX_BYTES_PER_BLOC 1024
|
#define MAX_BYTES_PER_BLOC 1024
|
||||||
#define MAX_INODE 10
|
#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_NULL 0
|
||||||
#define TYPE_FILE 1
|
#define TYPE_FILE 1
|
||||||
|
|||||||
64
src/disk.c
64
src/disk.c
@ -3,6 +3,7 @@
|
|||||||
#include "struct.h"
|
#include "struct.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
int init_inode_in_disk(disk *d, int inode_index, int filetype,
|
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;
|
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;
|
int inode_index = 0;
|
||||||
while (inode_index < MAX_INODE &&
|
while (inode_index < MAX_INODE &&
|
||||||
disk->inodes[inode_index].filetype != TYPE_NULL) {
|
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) {
|
if (inode_index >= MAX_INODE) {
|
||||||
dprintf(STDERR_FILENO, "No free inodes\n");
|
dprintf(STDERR_FILENO, "No free inodes\n");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int new_bloc_idx = find_free_bloc(disk);
|
int new_bloc_idx = find_free_bloc(disk);
|
||||||
if (new_bloc_idx == -1) {
|
if (new_bloc_idx == -1) {
|
||||||
dprintf(STDERR_FILENO, "Disk Full\n");
|
dprintf(STDERR_FILENO, "Disk Full\n");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int p_bloc_idx = parent->blocs[0];
|
int p_bloc_idx = parent->blocs[0];
|
||||||
@ -72,7 +73,7 @@ void create_file(disk *disk, inode *parent, char *filename) {
|
|||||||
|
|
||||||
if (offset == -1) {
|
if (offset == -1) {
|
||||||
dprintf(STDERR_FILENO, "Parent directory full\n");
|
dprintf(STDERR_FILENO, "Parent directory full\n");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(&disk->blocs[p_bloc_idx].datas[offset], filename, MAX_INODE_NAME);
|
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));
|
sizeof(int));
|
||||||
|
|
||||||
init_inode_in_disk(disk, inode_index, TYPE_FILE, 0b111111111, new_bloc_idx);
|
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) {
|
if (strlen(name) > MAX_INODE_NAME) {
|
||||||
dprintf(STDERR_FILENO, "A inode name must be < %d\n", MAX_INODE_NAME);
|
dprintf(STDERR_FILENO, "A inode name must be < %d\n", MAX_INODE_NAME);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
if (parent->filetype != TYPE_DIRECTORY) {
|
if (parent->filetype != TYPE_DIRECTORY) {
|
||||||
dprintf(STDERR_FILENO, "A parent's inode must be a directory!\n");
|
dprintf(STDERR_FILENO, "A parent's inode must be a directory!\n");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (inode_type) {
|
switch (inode_type) {
|
||||||
case TYPE_DIRECTORY:
|
case TYPE_DIRECTORY:
|
||||||
create_directory(disk, parent, name);
|
return create_directory(disk, parent, name);
|
||||||
break;
|
break;
|
||||||
case TYPE_FILE:
|
case TYPE_FILE:
|
||||||
create_file(disk, parent, name);
|
return create_file(disk, parent, name);
|
||||||
case TYPE_BINARY:
|
case TYPE_BINARY:
|
||||||
// TODO plus tard
|
// TODO plus tard
|
||||||
break;
|
break;
|
||||||
@ -107,19 +109,49 @@ void create_inode(disk *disk, inode *parent, char inode_type, char *name) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_in_file(disk *d, int file, char* data/*, char mode*/) {
|
void write_in_file(disk *d, int file_index, char *data /*, char mode*/) {
|
||||||
if (file != TYPE_FILE) {
|
inode file = d->inodes[file_index];
|
||||||
|
if (file.filetype != TYPE_FILE) {
|
||||||
dprintf(STDERR_FILENO, "Can only write in files\n");
|
dprintf(STDERR_FILENO, "Can only write in files\n");
|
||||||
return;
|
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) {
|
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.inodes[0].blocs[0] = 0; // utilise le bloc 0
|
||||||
d.owned_blocs[0] = 1; // le bloc 1 est maintenant occupé
|
d.owned_blocs[0] = 1; // le bloc 1 est maintenant occupé
|
||||||
|
|
||||||
|
init_env_var_file(&d);
|
||||||
|
|
||||||
int n = fwrite(&d, sizeof(disk), 1, fptr);
|
int n = fwrite(&d, sizeof(disk), 1, fptr);
|
||||||
if (n == 1) {
|
if (n == 1) {
|
||||||
dprintf(STDOUT_FILENO, "Disk of size %.2fKb created successfully.\n",
|
dprintf(STDOUT_FILENO, "Disk of size %.2fKb created successfully.\n",
|
||||||
(float)(MAX_BYTES_PER_BLOC * MAX_BLOCS) / 1000);
|
(float)(MAX_BYTES_PER_BLOC * MAX_BLOCS) / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
init_env_var_file(&d);
|
|
||||||
|
|
||||||
fclose(fptr);
|
fclose(fptr);
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,4 +7,5 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
disk create_disk();
|
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();
|
// shell_loop();
|
||||||
|
|
||||||
disk drive;
|
disk drive;
|
||||||
if (access("disk", F_OK) == 0)
|
if (access("disk", F_OK) == 0) {
|
||||||
drive = open_disk("disk");
|
drive = open_disk("disk");
|
||||||
else
|
do_ls(&drive, 0);
|
||||||
|
} else
|
||||||
drive = create_disk();
|
drive = create_disk();
|
||||||
|
|
||||||
(void)drive;
|
(void)drive;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user