En algunas computadoras Linux, ifconfig
muestra los dígitos hexadecimales de la dirección MAC ("HWaddr") en mayúsculas. En otras computadoras con Linux, los dígitos [af] están en minúsculas.
¿Por qué la diferencia? ¿Hay dos versiones competitivas del programa? ¿Existe alguna opción en algún lugar para controlarlo?
Respuesta1
Hay varias razones posibles.
Diferentes tipos de interfaz
Una posibilidad: ifconfig
delega la impresión de la dirección de hardware a la implementación de la interfaz. La impresión real se realiza mediante una función en la interface
estructura para la interfaz específica en net-tools-1.60
(desdeaquí), llamado por lib/interface.c
, línea 678:
printf(_("HWaddr %s "), hw->print(ptr->hwaddr));
Consulte el código fuente para nettools-1.60
obtener lib/hw.c
una lista de los tipos de interfaz admitidos: Hay implementaciones independientes para Ethernet, fibra, Token Ring, etc.
Ahora a la función de impresión real: Ejemplo lib/ether.c
::
/* Display an Ethernet address in readable format. */
static char *pr_ether(unsigned char *ptr)
{
static char buff[64];
snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
(ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
(ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
);
return (buff);
}
Los diferentes tipos de interfaces de red se pueden implementar para mostrar el mismo tipo de información de manera diferente usando letras minúsculas x
en la cadena de formato (es decir, %02x
en lugar de %02X
). Por ejemplo, la interfaz IrDA utiliza dígitos hexadecimales en minúscula ( lib/irda.c
):
/*
* Function irda_print (ptr)
*
* Print hardware address of interface
*
*/
static char *irda_print(unsigned char *ptr)
{
static char buff[8];
sprintf(&buff[strlen(buff)], "%02x:%02x:%02x:%02x", ptr[3], ptr[2],
ptr[1], ptr[0]);
return (buff);
}
Parches paraifconfig
Otra posibilidad, y probablemente la razón aquí: las distribuciones a menudo cambian los paquetes de software. El fragmento de código anterior es del original net-tools-1.60
, veamos el parche de Debian, o mejor dicho, su net-tools-1.60-23.diff
(deaquí):
+--- net-tools.orig/lib/ether.c
++++ net-tools/lib/ether.c
[...]
+@@ -39,7 +39,7 @@ static char *pr_ether(unsigned char *ptr
+ {
+ static char buff[64];
+
+- snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
++ snprintf(buff, sizeof(buff), "%02x:%02x:%02x:%02x:%02x:%02x",
+ (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
+ (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
+ );
Entonces Debian parchó el código fuente ifconfig
para su distribución, que también podría ser adoptado por Ubuntu (Wikipedia: "Los paquetes de Ubuntu se basan en paquetes de la rama inestable de Debian").