From 227f64c7de572bf937b151f16cdf7032578d696c Mon Sep 17 00:00:00 2001
From: Bah Thierno-Souleymane <thiernosouleymane.bah.etu@univ-lille.fr>
Date: Sat, 20 Mar 2021 03:57:54 +0100
Subject: [PATCH] feat(mkvol programm upgrade, restrictions on sectors and
cylinders added)
---
tpfs/mkvol.c | 55 ++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 45 insertions(+), 10 deletions(-)
diff --git a/tpfs/mkvol.c b/tpfs/mkvol.c
index ad8831b..f8eec43 100644
--- a/tpfs/mkvol.c
+++ b/tpfs/mkvol.c
@@ -3,14 +3,55 @@
#include "hardware.h"
#include "vol.h"
+#include "drive.h"
-void create_vol(unsigned int nb_blocs, unsigned int cylinder, unsigned int sector, vol_t *volume)
+void create_vol(unsigned int nb_blocs, unsigned int cylinder, unsigned int sector)
{
- if (cylinder + sector == 0)
+ int i, abs_nbloc, remaining_blocs;
+ vol_t *volume;
+
+ if (mbr.nb_vols == VOLS_MAX)
+ {
+ fprintf(stderr, "Le nombre de volumes maximal est atteint \n");
+ return;
+ }
+
+ if (cylinder + sector == 0 ||
+ cylinder >= HDA_MAXCYLINDER ||
+ sector >= HDA_MAXSECTOR)
{
- printf("Impossible d'ecrire à cet endroit\n");
+ fprintf(stderr, "Impossible d'ecrire à cet endroit \n");
return;
}
+
+ abs_nbloc = cylinder * HDA_MAXSECTOR + sector;
+ remaining_blocs = HDA_MAXSECTOR * HDA_MAXCYLINDER - abs_nbloc;
+
+ if (abs_nbloc > remaining_blocs)
+ nb_blocs = remaining_blocs;
+
+ for (i = 0; i < mbr.nb_vols; i++)
+ {
+ vol_t vol = mbr.vols[i];
+ int vol_abs_nbloc = vol.cylinder * HDA_MAXSECTOR + vol.sector;
+ /*
+ * Les deux commencent sur le même bloc
+ * Les deux se terminent sur le même bloc
+ * Si le debut de l'un se trouve entre le debut et la fin de l'autre
+ */
+ printf("%d %d %d %d\n", abs_nbloc, abs_nbloc + nb_blocs, vol_abs_nbloc, vol_abs_nbloc + vol.nb_blocs);
+ if (abs_nbloc == vol_abs_nbloc ||
+ (abs_nbloc + nb_blocs) == (vol_abs_nbloc + vol.nb_blocs) ||
+ ((abs_nbloc < vol_abs_nbloc) && (vol_abs_nbloc < abs_nbloc + nb_blocs)) ||
+ ((vol_abs_nbloc < abs_nbloc) && (abs_nbloc < vol_abs_nbloc + vol.nb_blocs)))
+ {
+
+ fprintf(stderr, "Le volume %d occupe déjà cet emplacement \n", i);
+ return;
+ }
+ }
+
+ volume = mbr.vols + (mbr.nb_vols++);
volume->nb_blocs = nb_blocs;
volume->cylinder = cylinder;
volume->sector = sector;
@@ -47,14 +88,8 @@ int main(int argc, char const *argv[])
exit(EXIT_FAILURE);
}
- if (mbr.nb_vols == VOLS_MAX)
- {
- fprintf(stderr, "Le nombre de volumes maximal est atteint \n");
- exit(EXIT_FAILURE);
- }
-
load_mbr();
- create_vol(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), mbr.vols + (mbr.nb_vols++));
+ create_vol(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
save_mbr();
/* and exit! */
--
GitLab