# Aller plus loin avec GRUB/Des commandes de l'exemple

* Utilisation basique
* Clavier QWERTY des États-Unis
* Des commandes derrière les menus
* Dynamique des commandes
* Des commandes de l'exemple
* Des variables d'environnement
* Des systèmes de fichiers
* Utilisation basique
* Clavier QWERTY des États-Unis
* Des commandes derrière les menus
* Dynamique des commandes
* Des commandes de l'exemple
* Des variables d'environnement
* Des systèmes de fichiers
[ Modifier le sommaire ]
Nous nous proposons ici de comprendre plus en détail les commandes de l'exemple, maintenant que les notions de modules et de commandes ont été expliquées au chapitre précédent.
Autrement dit, nous nous intéressons plus spécifiquement aux commandes de l'exemple.

## Commande load_video

La commande load_video ne semble être ni une commande, ni un module ordinaire. Cet appel semble donc mystérieux pour le moment.

## Commande insmod

La commande insmod est fournie par le fichier kern/corecmd.c. Sa documentation anglaise indique un paramètre: MODULE et une description "Insert a module.". Elle est implémentée dans une fonction grub_core_cmd_insmod. Cette fonction renvoie une erreur si aucun argument n'est donné. Si le premier caractère du premier argument est un /, un ( ou un +, le chargement s'effectue à partir d'un fichier. Sinon, il s'agit d'un chargement du module.

## Commande set

La commande set est fournie par le fichier kern/corecmd.c. Sa documentation anglaise indique un paramètre: [ENVVAR=VALUE] et une description "Set an environment variable.". Elle est implémentée dans une fonction grub_core_cmd_set.
Suivant le cas:
* En l'absence d'argument, cette fonction peut afficher la liste des variable d'environnement sous la forme nom=valeur et renvoie la valeur 0.
* En présence d'argument, si l'argument ne contient pas le caractère "=", cette fonction renvoie une erreur.
* En présence d'argument, si l'argument contient le caractère "=", la variable d'environnement présente avant le caractère "=" est positionnée à la valeur présente après le caractère "=", par la fonction grub_env_set.

## Commande search

Le manuel de documentaiton en langue anglaise démystifie la commande: La commande search sert à chercher un périphérique (device en anglais). L'option set permet de positionner une variable d'environnement avec le device trouvé. L'option -n évite les cherches sur disquettes. L'option --efidisk-only quand elle est disponible limite la recherche aux disques EFI.
Les options --hint permette d'orienter ou privilégier certains disques pour la recherche. Le fait de terminer une option hint avec une virgule permet de rechercher toutes les partitions du disque.
La commande search est fournie par le fichier commands/search_wrap.c. Cette commande a les particularités suivantes: GRUB_COMMAND_FLAG_EXTRACTOR | GRUB_COMMAND_ACCEPT_DASH. Sa documentation embarquée en anglaise indique le paramétrage: [-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] ...] NAME Sa documentation embarquée en anglaise la décrit ainsiSearch devices by file, filesystem label or filesystem UUID. If --set is specified, the first device found is set to a variable. If no variable name is specified, `root' is used. .
Elle est implémentée dans une fonction grub_cmd_search dont les 110 lignes suggèrent une relative complexité.
Cette fonction récupère une liste de hints. Cette fonction renvoie une erreur en cas d'échec d'allocation mémoire pour les hints.
* Si un argument hors hint est donné, cet argument est utilisé comme id. Si le "set" est paramétré cette variable est utilisée, sinon root est utilisé.
* Si aucun argument hors hint n'est donné, et si le "set" est positionné avec un argument, L4arguement est utilisé comme id, root est utilisé comme variable.
* Dans les les cas contraire, une erreur est retournée: one argument expected.
Ensuite 2 cas de figure se présentent:
* Soit une recherche est spécifiée et effectuée
* Soit une erreur est retournée: unspecified search type.
La recherche est considérée comme spécifiée si une option label, FS_UUID ou file est spécifiée. Dans ce cas, la recherche s'effectue sans disquette, avec l'id et la variable et les hints.
Le même algorithme de recherche est utilisé dans les trois cas; il s'agit de la fonction try de 69 lignes qui peut être appelée avec ou sans autoload.
Pour simplifier, cette fonction utilise notamment chacun des hints pour y rechercher le fichier, le FS_UUID ou le label, soit directement dans le device, soit dans le cas d'un disque sur ses partitions.
Finalement, la valeur retourne le code d'erreur.

## Commande echo

La commande echo est fournie par le fichier commands/echo.c. Cette commande a les caractéristiques GRUB_COMMAND_ACCEPT_DASH | GRUB_COMMAND_OPTIONS_AT_START . Sa documentation anglaise indique un paramètre: [-e|-n] STRING et une description Display a line of text.. La documentation de l'option -n indique Do not output the trailing newline.. La documentation de l'option -e indique Enable interpretation of backslash escapes.
Elle est implémentée dans une fonction grub__cmd_echo.
Cette fonction renvoie une erreur en cas d'échec de l'allocation mémoire.
Elle traite chaque caractère de chaque argument.
Si l'option -e est utilisée, les backslash sont pris en compte pour \\0, \, \a, \c, \f, \n, \r, \t, et \v. L'ensemble des caractères sont affichés sur la sortie, à l'exception de \c qui supprime le retour à la ligne final. Un espace est inséré entre chaque argument.
La fonction retourne 0 en cas de succès.

## Commande linux

La commande linux est fournie par le fichier lib/syslinux_parse.c. Elle est implémentée dans une fonction cmd_linux. Cette fonction renvoie une erreur:
* en l'absence d'entrée
* en cas d'erreur d'allocation pour duplication de la ligne
Elle duplique la ligne pour indiquer le fichier du kernel Linux. Dans ce cas, elle renvoie l'absence d'erreur.

## Commande initrd

La commande initrd est fournie par le fichier lib/syslinux_parse.c. Elle est implémentée dans une fonction cmd_initrd.
Cette fonction renvoie une erreur:
* en l'absence d'entrée
* en cas d'erreur d'allocation mémoire
Elle sépare la ligne suivant les caractères virgule qu'elle contient. Une liste chaînée est constituée avec le premier fichier et le dernier. Dans ce cas, elle renvoie l'absence d'erreur.