Table of Contents

Devoir 1 - Rustybox

Informations générales

Date limite: 29 Mars, 23:59
Points: 1 point de la note finale
Lien: Devoir 1
Télécharger en retard: 1 points / jour (maximum 4 jours)

Connaissances évaluées

Règles

  1. Le devoir doit contenir un fichier nommé Readme.md avec des explications concernant la manière choisie pour résoudre le devoir (-0.1p)
  2. Le devoir doit être implémenté en Rust et seulement en utilisant des fonctions de la bibliothèque standard Rust. Toute autre implémentation conduira à l'annulation du devoir.(0 points)

Exception: Vous pouvez utiliser la bibliotheque chrono pour l'affichage de date et heure.

Copiage

Le devoir est individuel. Toute tentative de copier entraînera 0p pour les devoirs. On utilisera un système automatisé pour détecter le copiage. Si on a des doutes, on va vous adresser des questions supplémentaires concernant le devoir.

Questions

Si vous avez des questions concernant le devoir, posez-les en publiant un issue sur le github https://github.com/UPB-FILS-SdE2/questions avec le format [busybox] <le titre de votre question> . Vous aurez besoin d'un compte github pour publier des questions.

NE PUBLIEZ PAS DE CODE SOURCE. Cela est considéré comme copiage et vous aller recevoir 0p pour le devoir.

Si vous voulez recevoir un e-mail lorsque des problèmes sont signalés ou lorsqu'il y a de nouveaux messages, accédez au site github repository et cliquez sur Watch.

Rustybox

Le but de ce devoir est d’implémenter un utilitaire capable d'exécuter des commandes de type Linux bash.

Pour résoudre le devoir, vous allez réaliser un program en Rust qui reçoit comme arguments la commande qu'on désire d'exécuter, suivie par ses paramètres. Le program exécutera la commande et après il finira son exécution.

Exemple:

./rustybox cp file folder

 Vous pouvez trouver les tests au chemin /home/codespace/devoir-1-tests dans votre GitHub Codespace.

Commandes acceptées

En ce qui suit, on va définir les commandes supportées par l'utilitaire, ainsi que le comportement caractéristique et les parametres acceptés. Pour toute autre commande ou pour un format différent, le program va afficher le message Invalid command et il va retourner la valeur -1.

En raison d'incompatibilités entre le système Linux et d'autres systèmes, le code d'erreur renvoyé affiché par le terminal Linux sera égal à 255, pas -1. Si le terminal affiche 255 comme code d'erreur, la solution est correcte.

Cela se produira également avec les codes d'erreur spécifiés ci-dessous, pour chacun d'eux, le terminal affichera un nombre positif.

Si la commande reçue par l'utilitaire a été exécutée sans erreur, le program va retourner la valeur 0. Si non, il va retourner un code d'erreur spécifique, mentionné dans la description de la commande.

Pour vous aider à comprendre le mode fonctionnement de chaque commande, on a attaché la page de mannuel de celle-ci. On de demande pas l'implémentation de tous les parametres précisés dans le manuel, mais seulement de ceux qui seront précisés dans l'énoncé du devoir.

Les parametres qui ont la forme [param] sont optionnels.

Les commandes supportées par l'application mini-busybox sont:

Exemple:

$ ./rustybox pwd
/home/pi/my_directories

Exemple:

$ ./rustybox echo a b c
a b c
$ ./rustybox echo -n a b c
a b c$ 

Exemple:

$ ./rustybox cat file1
Text in file1                       
$ ./rustybox cat file2
Text in file 2
$ ./rustybox cat file1 file2
Text in file1
Text in file 2 

Exemple:

 ./rustybox mkdir my_drectory
 ./rustybox mkdir my_drectory1 my_drectory2 my_drectory3

Exemple:

./rustybox mv my_file my_directory
./rustybox mv my_directory1 my_drectory2 

Exemple:

./rustybox ln my_file my_file_link
./rustybox ln -s my_file my_file_link3

Exemple:

./rustybox rmdir my_empty_directory
./rustybox rmdir my_empty_directory1 my_empty_directory2

Exemple:

./rustybox rm my_file1 my_file2
./rustybox rm -R my_directory
./rustybox rm --dir my_empty_directory

Exemple:

$ ./rustybox ls
  directory1
  Directory2
  File1
  file2
$ ./rustybox ls -a
  .
  ..
  directory1
  Directory2
  File1
  File2
$ ./rustybox ls Directory2
  f1
  f2

Exemple:

./rustybox cp my_file my_directory
./rustybox cp -r my_directory1 my_directory2

Exemple:

./rustybox touch my_file
./rustybox touch -a --no-create my_file

Les permissions peuvent etre spécifiées en 2 modes:

  1. numérique: un numéro formé de 3 chiffres, chacun représentant une valuer sur 3 bits; ex: 650
  2. ajouter/supprimer des permissions spécifiques: pour chacune de ces 3 catégories (user, group, others), on peut ajouter ou supprimer des permissions. Les catégories sont: u - user, g - group, o - others, a - all. Le format générique: u/g/o/a +/- r/w/x

Exemple:

./rustybox chmod 570 file
./rustybox chmod u+x file
./rustybox chmod ug+rx file
./rustybox chmod a-rx file

Pour plus de détails sur le mode de fonctionnement de chaque commande, vous pouvez consulter le manuel spécifique du terminal de Linux: man commande. La commande peut etre exécutée en chaque terminal d'un système Linux ou dans le lien attaché a la commande.

Bonus

Exemple:

$ ./rustybox grep '[0-9]+' File
this line 99
this line is another 7
$ ./rustybox ls -l
drwxr-xr-x alexandru staff 960 Feb 12 22:40 Desktop
-rw-r--r-- alexandru staff 372944 Nov 29  2020 Title Hello Wyliodrin STUDIO.jpg

# file_type (-, l - link, d - directory) properties user group size modified_date name
$ ./rustybox ls -l Desktop
drwxr-xr-x alexandru staff 960 Feb 12 22:40 Desktop