ifconfig - 谁决定 MAC 地址应该是小写的?

OJW*_*OJW 4 ifconfig

在某些 Linux 计算机上,ifconfig以大写形式显示 MAC 地址 ("HWaddr") 十六进制数字。在其他 Linux 计算机上,[af] 数字是小写的。

为什么会有差异?该程序是否有两个相互竞争的版本?有什么地方可以控制它吗?

Dan*_*eck 5

有几个可能的原因。

 不同的接口类型

一种可能性:ifconfig将硬件地址的打印委托给接口实现。实际打印由interface结构中的函数执行,用于net-tools-1.60(来自此处)中的特定接口,由lib/interface.c,第 678 行调用:

printf(_("HWaddr %s  "), hw->print(ptr->hwaddr));
Run Code Online (Sandbox Code Playgroud)

有关支持的接口类型列表,请参阅nettools-1.60in的源代码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);
}
Run Code Online (Sandbox Code Playgroud)

通过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);
}
Run Code Online (Sandbox Code Playgroud)

补丁到 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)
+   );
Run Code Online (Sandbox Code Playgroud)

因此 Debianifconfig为他们的发行版修补了源代码,这也可能被 Ubuntu 获取(维基百科:“ Ubuntu 软件包基于来自 Debian 不稳定分支的软件包”)。