2012-05-15 34 views
7

Questa potrebbe essere una domanda stupida e mi scuso se è già stato risolto qui, ma ho cercato un po 'senza molta fortuna. Sto cercando di ottenere l'indirizzo hardware della mia interfaccia in C e sto usando OS X (x86-64). So come ottenerlo con ifconfig, ma voglio che il mio programma lo ottenga automaticamente per qualsiasi computer, beh, almeno per i computer OS X. Ho trovato un altro thread che ha pubblicato questo link che praticamente fa quello che voglio (con alcune modifiche), ma non posso fare il collegamento delle funzioni iokit in ld (il mio compilatore è gcc). Ho provato ad aggiungere le flag -lIOKit e -framework IOKit alla riga di comando gcc, ma ottengo ancora gli stessi errori di collegamento. Ecco un collegamento al mio codice: header e source.Indirizzo MAC dall'interfaccia su OS X (C)

+0

ho sempre pensato che Pavlov aveva un cane ... no? –

+1

Sì, il mio nome è solo un gioco di parole. –

risposta

6

This little program funzionerà senza modifiche su OSX.

Codice: (crediti a Alecs re da lista FreeBSD)

#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <sys/sysctl.h> 
#include <net/if.h> 
#include <net/if_dl.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int   mib[6], len; 
    char   *buf; 
    unsigned char  *ptr; 
    struct if_msghdr *ifm; 
    struct sockaddr_dl *sdl; 

    if (argc != 2) { 
     fprintf(stderr, "Usage: getmac <interface>\n"); 
     return 1; 
    } 

    mib[0] = CTL_NET; 
    mib[1] = AF_ROUTE; 
    mib[2] = 0; 
    mib[3] = AF_LINK; 
    mib[4] = NET_RT_IFLIST; 
    if ((mib[5] = if_nametoindex(argv[1])) == 0) { 
     perror("if_nametoindex error"); 
     exit(2); 
    } 

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { 
     perror("sysctl 1 error"); 
     exit(3); 
    } 

    if ((buf = malloc(len)) == NULL) { 
     perror("malloc error"); 
     exit(4); 
    } 

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { 
     perror("sysctl 2 error"); 
     exit(5); 
    } 

    ifm = (struct if_msghdr *)buf; 
    sdl = (struct sockaddr_dl *)(ifm + 1); 
    ptr = (unsigned char *)LLADDR(sdl); 
    printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *ptr, *(ptr+1), *(ptr+2), 
      *(ptr+3), *(ptr+4), *(ptr+5)); 

    return 0; 
} 

Si dovrebbe, tuttavia, cambiare int len;-size_t len;

+0

Grazie, è esattamente quello che volevo. –