ifconfig - MAC 주소가 소문자여야 한다고 누가 결정했나요?

ifconfig - MAC 주소가 소문자여야 한다고 누가 결정했나요?

일부 Linux 컴퓨터에서는 ifconfigMAC 주소("HWaddr") 16진수를 대문자로 표시합니다. 다른 Linux 컴퓨터에서는 [af] 숫자가 소문자입니다.

왜 차이점이 있나요? 프로그램에 두 가지 경쟁 버전이 있습니까? 그것을 제어할 수 있는 옵션이 있습니까?

답변1

몇 가지 가능한 이유가 있습니다.

 다양한 인터페이스 유형

한 가지 가능성은 ifconfig하드웨어 주소 인쇄를 인터페이스 구현에 위임하는 것입니다. 실제 인쇄는 (from) interface의 특정 인터페이스에 대한 구조체 의 함수에 의해 수행됩니다.net-tools-1.60여기), lib/interface.c678행에 의해 호출됨:

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

지원되는 인터페이스 유형 목록은 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);
}

x형식 지정 문자열에 소문자 s를 대신(예: %02x대신 ) 사용하면 동일한 종류의 정보를 다르게 표시하도록 다양한 종류의 네트워크 인터페이스를 구현할 수 있습니다 %02X. 예를 들어 IrDA 인터페이스는 소문자 16진수( 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. 데비안의 패치를 살펴보겠습니다 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)
+   );

그래서 데비안은 배포를 위해 소스 코드를 패치했는데 ifconfig, 이는 우분투에서도 채택될 수 있습니다(위키피디아: "Ubuntu 패키지는 Debian의 불안정한 브랜치 패키지를 기반으로 합니다.").

관련 정보