ifconfig - 誰決定 MAC 位址應該小寫?

ifconfig - 誰決定 MAC 位址應該小寫?

在某些 Linux 電腦上,ifconfig以大寫顯示 MAC 位址(「HWaddr」)十六進位數字。在其他 Linux 電腦上,[af] 數字是小寫的。

為什麼有差別?該程式是否有兩個相互競爭的版本?有沒有什麼地方可以控制它?

答案1

有幾個可能的原因。

 不同的介面類型

一種可能性:ifconfig將硬體位址的列印委託給介面實作。實際的列印是由interface結構中的函數執行的net-tools-1.60(來自這裡),由 調用lib/interface.c,第 678 行:

printf(_("HWaddr %s  "), hw->print(ptr->hwaddr));

nettools-1.60有關支援的介面類型列表,請參閱in 的原始碼lib/hw.c:乙太網路、光纖、令牌環等都有單獨的實作。

現在到實際的列印功能: 範例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);
}

x透過在格式化字串中使用小寫 s(即%02x代替) ,可以實現不同類型的網路介面以不同方式顯示相同類型的信息%02X。例如,IrDA 介面使用小寫十六進位數字 ( 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);
}

補丁到ifconfig

另一種可能性,也可能是這裡的原因:發行版經常更改軟體包。上面的程式碼片段來自原始的net-tools-1.60,讓我們看看 Debian 的,或者更確切地說,它的補丁net-tools-1.60-23.diff(來自這裡):

+--- 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 為其發行版修補了原始碼ifconfig,Ubuntu 也可能會採用該原始碼(維基百科:「Ubuntu 軟體包基於 Debian不穩定分支的軟體包”)。

相關內容