在某些 Linux 计算机上,ifconfig以大写形式显示 MAC 地址 ("HWaddr") 十六进制数字。在其他 Linux 计算机上,[af] 数字是小写的。
为什么会有差异?该程序是否有两个相互竞争的版本?有什么地方可以控制它吗?
有几个可能的原因。
一种可能性: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 不稳定分支的软件包”)。
| 归档时间: |
|
| 查看次数: |
5977 次 |
| 最近记录: |