OVH Cloud OVH Cloud

Invariabilite de certains programmes

2 réponses
Avatar
Vincent Bernat
Coucou !

J'ai programmé une petite application reposant sur un programme comme
ifconfig. Je pensais naïvement que la sortie d'un tel utilitaire était
fixée depuis longtemps. Je me suis cependant rendu compte que (au
moins sous Linux), il y avait des subtilités selon la locale : addr
devient adr, link devient lien.

Actuellement, quelle serait la politique la plus consensuelle ?
- considérer que ce comportement de ifconfig est un bug ?
- considérer qu'il faut tout lancer en LC_ALL=C et que l'on aura
alors un comportement déterministe ?
- considérer que pour une application, il faut reposer sur une appli
plus solide et donc refaire une partie du boulot de ifconfig ?

Je pencherais pour la première solution, avec la seconde solution
comme fallback. Maintenant, il faut bien avouer qu'aujourd'hui, on
tente plutôt d'avoir des libs que des sorties standardisées (ex:
subversion contre CVS).
--
I AM NOT A 32 YEAR OLD WOMAN
I AM NOT A 32 YEAR OLD WOMAN
I AM NOT A 32 YEAR OLD WOMAN
-+- Bart Simpson on chalkboard in episode 7F08

2 réponses

Avatar
Nicolas George
Vincent Bernat wrote in message :
Actuellement, quelle serait la politique la plus consensuelle ?
- considérer que ce comportement de ifconfig est un bug ?


Non, c'est tout à fait normal, c'est la traduction du logiciel. Après, on
aime ou on n'aime pas.

- considérer qu'il faut tout lancer en LC_ALL=C et que l'on aura
alors un comportement déterministe ?


Ça me semble le plus raisonnable. Mais même comme ça, ça risque de ne pas
fonctionner très bien partout : il n'y a pas qu'un ifconfig dans la nature.

- considérer que pour une application, il faut reposer sur une appli
plus solide et donc refaire une partie du boulot de ifconfig ?


Ça dépend énormément de l'audience de l'application. Difficile d'en dire
plus.

Avatar
Bob qui Trolle
Vincent Bernat wrote:
Coucou !

J'ai programmé une petite application reposant sur un programme comme
ifconfig. Je pensais naïvement que la sortie d'un tel utilitaire était
fixée depuis longtemps. Je me suis cependant rendu compte que (au
moins sous Linux), il y avait des subtilités selon la locale : addr
devient adr, link devient lien.


static struct ifreq ifr;
static char *myip;
static char *ifname = "eth0";
// Renseigner la structure
strcpy(ifr.ifr_name, ifname);
ifr.ifr_addr.sa_family = AF_INET;
// ioctl : le couteau suisse qui coupe partout
if (ioctl(sock, SIOCGIFADDR, &ifr) < 0) {
printf("ioctl arrorn");
}
else {
myip = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
}

fonctionnera peut-être sous linux.

Sinon, regarder du côté des ioctl dans le code d'ifconfig. ou dans le
catalogue de définitions et les commentaires de sockios.h des includes
du noyau pour tous les SIOC (Get|Set) IF BlahBlah qu'on peut passer en
ioctl.