Projet de Systèmes (Licence 3, 2005-2006)

Ark-anoïd

Attention: le texte du sujet est susceptible d'être modifié, corrigé ou mis à jour de temps en temps mais le sujet en lui-même est stable.

Sujet

Il s'agit de réaliser un système d'archivage, c'est-à-dire un ensemble de commandes permettant d'ajouter supprimer ou extraire des fichiers d'un système de fichiers hôte dans un système de fichiers destination (lequel est une structure surimposée à un fichier du système de fichier hôte).

On trouvera dans la suite les constantes, types et structures de données imposées permettant d'implanter ce système d'archivage.

Les commandes

Les commandes à réaliser sont au minimum:

ark fichier_archive référence [...]
qui permet d'ajouter au fichier d'archive de nom spécifié le fichier (ou les fichiers) de référence indiquée. Si l'une des références désigne un répertoire l'archivage concernera l'ensemble des fichiers accessibles à partir de ce répertoire (sans considérer . et ..).
unark fichier_archive [référence ...]
qui permet de copier les fichiers, de références données, contenus dans l'archive (ou toutes les références si aucune n'est spécifiée) sur le système de fichier hôte.
arkls fichier_archive [référence ...]
qui permet d'obtenir à l'affichage les valeurs des attributs associés aux références données.
arkrm fichier_archive référence [...]
qui permet de supprimer de l'archive les références données.

La structure «logique»

La figure suivante illustre les différents mécanismes de chaînage mis en oeuvre dans la représentation de la structure. Cette figure devait être suffisamment «parlante» (on notera que toutes les flèches ne sont pas présentes afin de ne pas trop alourdir le schéma, en particulier les flèches «retour»):

Les constantes/types et structures C

#include 
#include 
#include 

#define MAGIC_NUMBER 0x41524b31

#define FREE      0
#define REGULAR   1
#define DIRECTORY 2

#define ARK_RUSR  1
#define ARK_WUSR  2
#define ARK_XUSR  4
#define ARK_ROTH  8
#define ARK_WOTH 16
#define ARK_XOTH 32

typedef unsigned int arktype_t;
typedef unsigned char arkref_t[128];
typedef unsigned int arkmode_t;

struct att {
  arkmode_t mode;   // droits d'accès "ARK" du fichier
  uid_t     uid;    // identité du propriétaire
  time_t    mtime;  // date de dernière modification
  off_t     length; // longueur (en octets) du fichier
};
typedef struct att arkatt_t;

// On notera que dans le cas d'un répertoire la longueur (un des attributs)
// est nulle et aucune donnée ne sera placée à la suite.
// Dans le cas d'un fichier la longueur correspond exactement à la longueur
// de la suite d'octets constituant le fichier et que cette suite sera placée
// immédiatement derrière cette structure.
// Dans le cas d'un espace libre, la longueur est celle de l'emplacement comme
// pour un fichier et aucune des autres données n'est pertinente.
// (sauf les chaînages).
struct head {
  arktype_t type;       // FREE, REGULAR ou DIRECTORY
  arkref_t  name;       // La référence complète
  off_t     next;       // "pointeur" sur l'entrée suivante (0 => fin)
  off_t     previous;   // "pointeur" sur l'entrée précédente (0 => début)
  arkatt_t  attributes; // attributs du fichier
};
typedef struct head head_t;

struct arkhead {
  unsigned int magic_number; // "man magic" ou "man file" pour en savoir plus
  off_t        first_entry;  // "pointeur" sur la première entrée
  off_t        first_free;   // "pointeur" sur le premier "trou"
};
typedef struct arkhead arkhead_t;

Consignes

Le projet est à réaliser par groupe de trois personnes au plus (non négociable).

Les soutenances auront lieu les Jeudi 12 et Vendredi 13 Janvier 2006. Inscrivez-vous auprès du secrétariat. Les rapports et code sources imprimés seront à fournir au moment de la soutenance.

Le conseil d'UFR a voté la proposition consistant à faire valoir que compte-tenu de la nature pragmatique de cet enseignement le projet de Systèmes est obligatoire et que par conséquent aucune dispense n'est accordée. Une absence est donc équivalente à la note de 0.