Ce n'est pas vendredi, mais aujourd'hui je suis un Saint, donc a priori, je suis au dessus de tout soupçon de trollage. OpenBSD est un système contestable à beaucoup de points de vue (admirez l'euphémisme), mais il y a des choses insupportables. C'est par exemple le cas du hostname.*. Ce fichier dont l'extension est le nom d'une interface réseau (nom qui change en fonction du driver employé : "contestable", disais-je), renferme les informations nécessaires à la bonne configuration de ladite interface : IP fixe ou dhcp, alias divers, activation (mais manifestement, pas de désactivation), et d'autres choses dont je n'ai pas la moindre idée de ce à quoi ça sert ("rtsol" ; les bridges quant à eux sont configurés par des fichiers spécifiques, comme l'indique un echo au cas où le mot clef serait rencontré). Prenons un exemple, avec une IP fixe :

$cat /etc/hostname.xl0
inet 192.168.20.201 255.255.255.0 192.168.20.255 description "Reseau Labo"
inet alias 192.168.20.202
inet alias 192.168.20.203
inet alias 192.168.20.204
inet alias 192.168.20.205

Comme on peut le voir, il n'y a qu'une seule ligne d'IP fixe, logique, en tête, suivie de plusieurs IP d'alias, toujours logique. On remarque que l'on commence par le mot clef "inet", à distinguer de "up", ou "dhcp" : jusqu'ici, tout va bien. Là où ça va mal, c'est le second token : soit une adresse IP, soit le mot clé "alias", qui sera alors suivi... d'une adresse IP. Ca ne sent pas bon. Déjà, on peut se dire qu'il y a plutôt intérêt à ce que l'adresse reste toujours indéfiniment sous forme de chiffres, car le jour où l'on veut puiser la correspondance lettrée dans /etc/hosts, et qu'un malin crée une machine "alias", ça risque de mal se passer.

Mais dans l'absolu, nous avons déjà un problème de parsing : "alias" or not "alias", that is the question. Et les gens de BSD ne se tracassent pas beaucoup, ils commencent leur parsing dans le script d'activation des interfaces /etc/netstart par un magnifique :

read af name mask bcaddr ext1 ext2

Ce qui, on l'admettra, est un peu bourrin. Car rien ne dit que le premier argument sera une adresse d'interface (AF), le second un nom (name), le troisième un masque (mask), etc. Résultat des courses, quelques lignes plus tard...

read dt dtaddr
if [ "$name"  = "alias" ]; then
   # perform a 'shift' of sorts
alias=$name
name=$mask
mask=$bcaddr
bcaddr=$ext1
ext1=$ext2
ext2=
else
alias=
fi
cmd="ifconfig $if $af $alias $name"

Oui, ça fait mal aux yeux...