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
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.
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.
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.
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.