/* Programma:     sock_ioctl
*  Autore:        FF
*  Data:          10/02/2006
*  Descr.:        Esempio in cui si visualizzano le interfacce di rete
*                 della macchina con relativi indirizzi IP, MAC, NETMASK
*                 e BROADCAST usando la funzione ioctl()
*/
#include "utilsock.h"
/* utilsock.h contiene tutte le inclusioni delle altre librerie necessarie
*  e le funzioni di lettura e scrittura dal socket
*/
#include <sys/ioctl.h>
#include <net/if.h>
#define MAX        256

int main(int argc, char *argv[])
{
    int sd;                           // socket
    char buf[1024];                   // buffer dei dati
    struct ifreq *ifr = NULL;
    struct ifconf ifc;
    unsigned char *indmac;    
    int i;
    // socket
    if ((sd = socket(PF_INET,SOCK_STREAM,0))<0) {
        perror("Errore nella socket");
        exit(-1);
    }
    // Recupero delle informazioni delle interfacce
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = buf;
    if (ioctl(sd, SIOCGIFCONF, &ifc)< 0) {
        perror("Errore nella ioctl SIOCGIFCONF");
        exit(-1);
    }
    ifr=ifc.ifc_req;
    for (i=0; i< ifc.ifc_len / sizeof(struct ifreq); i++, ifr++) 
    {
        printf("Interfaccia: %s\n", ifr->ifr_ifrn.ifrn_name);
        // IP  
        if (ioctl(sd, SIOCGIFADDR, ifr)< 0) {
            perror("Errore nella ioctl SIOCGIFADDR");
            exit(-1);
        }
        printf("IP: %s\n",inet_ntoa
                (((struct sockaddr_in *)&(ifr->ifr_addr))->sin_addr));
        // MAC
        if (ioctl(sd, SIOCGIFHWADDR, ifr)< 0) {
            perror("Errore nella ioctl SIOCGIFHWADDR");
            exit(-1);
        }
        indmac=ifr->ifr_hwaddr.sa_data; 
        // usato sa_data che è un campo della struttuta sockaddr generica                                    
        printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
                indmac[0],indmac[1],indmac[2],indmac[3],indmac[4],indmac[5]);    
        // Netmask
        if (ioctl(sd, SIOCGIFNETMASK, ifr)< 0) {
            perror("Errore nella ioctl SIOCGIFNETMASK");
            exit(-1);
        }
        printf("Netmask: %s\n",inet_ntoa
                (((struct sockaddr_in *)&(ifr->ifr_netmask))->sin_addr));
        // Broadcast 
        if (ioctl(sd, SIOCGIFBRDADDR, ifr)< 0) {
            perror("Errore nella ioctl SIOCGIFBRDADDR");
            exit(-1);
        }
        printf("Broadcast: %s\n\n",inet_ntoa
                (((struct sockaddr_in *)&(ifr->ifr_broadaddr))->sin_addr));
    }    
    close(sd);
    exit(0);       
}

