Shammer's Philosophy

My private adversaria

NIC の MAC address を取得するも失敗

TCPUDP の Socket は一通り書いてみたので、今度は RawSocket に挑戦したい。
TCPUDP では、L2 や L3 のヘッダはおろか、TCP のヘッダも完全にお任せ。意識するのは Payload のみでよかった。だが、RawSocket ではそうも行かない。手始めに指定した NIC(interface) の MAC address を取得してみようと思う。

#include <arpa/inet.h>
#include <errno.h>
#include <linux/if_ether.h>
#include <net/if.h> // ifr
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h> // ioctl
#include <sys/types.h>
#include <sys/socket.h>

int main(int argc, char **args){
    int fd, status;
    struct ifreq ifr;
    fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if( fd < 0 ){
	perror("socket() failed.\n");
	exit(EXIT_FAILURE);
    }

    // Access to NIC and get information
    memset(&ifr, 0, sizeof(ifr));
    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", args[1]);
    status = ioctl(fd, SIOCGIFHWADDR, &ifr);
    if( status < 0 ){
	perror("ioctl() failed to get source MAC address.\n");
	exit(EXIT_FAILURE);
    }
    close(fd);
    printf("%s\n", ifr.ifr_hwaddr.sa_data);
    
    return 0;
}

これでうまくいくかと思いきや、文字化け。何が悪いのだろうか・・・