Auf einigen Linux-Computern ifconfig
werden die Hexadezimalzahlen der MAC-Adresse („HWaddr“) in Großbuchstaben angezeigt. Auf anderen Linux-Computern werden die [af]-Ziffern in Kleinbuchstaben angezeigt.
Warum dieser Unterschied? Gibt es zwei konkurrierende Versionen des Programms? Gibt es irgendwo eine Möglichkeit, das zu steuern?
Antwort1
Hierfür gibt es mehrere mögliche Gründe.
Verschiedene Schnittstellentypen
Eine Möglichkeit: ifconfig
Delegieren Sie das Drucken der Hardwareadresse an die Schnittstellenimplementierung. Das tatsächliche Drucken wird von einer Funktion in der interface
Struktur für die jeweilige Schnittstelle ausgeführt net-tools-1.60
(vonHier), aufgerufen von lib/interface.c
, Zeile 678:
printf(_("HWaddr %s "), hw->print(ptr->hwaddr));
Eine Liste der unterstützten Schnittstellentypen finden Sie im Quellcode für nettools-1.60
in : Es gibt separate Implementierungen für Ethernet, Glasfaser, Token Ring usw.lib/hw.c
Nun zur eigentlichen Druckfunktion: Beispiel: 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);
}
Die verschiedenen Arten von Netzwerkschnittstellen können so implementiert werden, dass sie die gleiche Art von Informationen unterschiedlich anzeigen, indem x
in der Formatierungszeichenfolge stattdessen ein kleines s verwendet wird (dh %02x
anstelle von %02X
). Beispielsweise verwendet die IrDA-Schnittstelle kleine Hexadezimalziffern ( 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);
}
Patches fürifconfig
Eine weitere Möglichkeit und wahrscheinlich auch der Grund hier: Distributionen ändern oft die Softwarepakete. Der obige Codeausschnitt stammt aus dem Original net-tools-1.60
, schauen wir uns Debians bzw. dessen Patch an net-tools-1.60-23.diff
(vonHier):
+--- 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)
+ );
Debian hat den Quellcode ifconfig
für seine Distribution gepatcht, was möglicherweise auch von Ubuntu übernommen wird (Wikipedia: "Ubuntu-Pakete basieren auf Paketen aus dem instabilen Zweig von Debian").