3

На некоторых компьютерах Linux ifconfig отображает шестнадцатеричные цифры MAC-адреса ("HWaddr") в верхнем регистре. На других компьютерах Linux цифры [af] строчные.

Почему разница? Существуют ли две конкурирующие версии программы? Есть ли вариант где-нибудь это контролировать?

1 ответ1

5

Есть несколько возможных причин.

 Различные типы интерфейса

Одна возможность: ifconfig делегирует печать аппаратного адреса реализации интерфейса. Фактическая печать выполняется функцией в структуре interface для определенного интерфейса в net-tools-1.60 (отсюда), вызываемой lib/interface.c , строка 678:

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

Посмотрите исходный код для nettools-1.60 в lib/hw.c для списка поддерживаемых типов интерфейса: Есть отдельные реализации для Ethernet, Fibre, Token Ring и т.д.

Теперь к фактической функции печати: Пример: 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 »).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .