Est-ce volontaire ou non ?

En ce moment, je travaille sur le portage de l'environnement de bureau Pantheon [1] pour FreeBSD. C'est long, fastidieux, car il faut sans cesse lire le code (voir plusieurs fois) pour vérifier qu'il n'y a pas de « linuxisme », et trouver des parades pour les résoudre (si il y en a).

Récemment je suis tombé sur une portion de code, qui m'a laissé perplexe. Pour simplifier, elle consiste à calculer la taille du disque dur [2].

En isolant cette partie (Cf. annexe, fichier hdd.vala), je fus surpris du résultat (au départ j'ai cru, que sous Linux le résultat serait différent, mais en fait non).

Pour l'éxecuter

valac --pkg=glib-2.0 --pkg=gio-2.0 hdd.vala

./hdd
33.2 GB

Le résultat sera sans doute différent chez vous, en fait, le calcul se fait uniquement pour la racine (/). Il crée un File object juste pour /, grâce à la méthode GLib.File.new_for_path.

Mais dans mon cas, mon disque dur est partitionné, je dois pouvoir retrouver la (quasi) totalité du disque, en faisant la somme de toutes mes partitions.

Mais comment fait-on ?

Ce bout de code s'inspire en fait, de ce que fait GNOME (via le paquet gnome-control-center). En parcourant le fichier panels/info/cc-info-panel.c, on constate, que c'est la fonction g_unix_mount_points_get qui est utilisée [3].

Avec le langage Vala, il faut utiliser la classe UnixMountEntry, et faire une boucle sur l'ensemble des points de montage.

Dans mon exemple (Cf. annexe), je stocke la taille de chacune des partitions dans une liste, et ensuite je fais la somme de toutes les tailles.

valac --pkg=glib-2.0 --pkg=gio-2.0 --pkg=gio-unix-2.0 hdd-02.vala


./hdd-02
266.5 GB

C'est déjà plus cohérent.

Il ne reste plus qu'à envoyer un patch aux développeurs.

Notes

[1] Issue du projet elementary OS.

[2] À partir de la ligne 234 du fichier src/Plug.vala (Switchboard-about-plug).

[3] Elle lit le fichier /etc/fstab ou /etc/mtab.