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

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

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

为什么会有差异?这个程序有两个相互竞争的版本吗?有没有选项可以控制它?

答案1

可能的原因有多种。

 不同的接口类型

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

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

请参阅源代码以nettools-1.60获取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 不稳定分支的软件包“)。

相关内容