All pastes #731256 Raw Edit

Stuff

public text v1 · immutable
·published 2007-10-09 22:09 UTC
rendered paste body
// Include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <net/if.h>
#include <sys/ioctl.h>
#include <errno.h>

void usage() {
        fprintf(stderr, "Usage: hwchanger iface mac\n");
        exit(EXIT_FAILURE);
}

// Affiche l'adresse d'une interface
void get_hwaddr(char *ifname, struct ifreq *ifr)
{
        int sock;
        unsigned char mac[6];

        memset(ifr,0,sizeof(struct ifreq));

        strcpy(ifr->ifr_name, ifname);

        if (!(sock = socket(AF_INET, SOCK_DGRAM, 0)))
                exit(EXIT_FAILURE);

        if (ioctl(sock, SIOCGIFHWADDR, ifr) < 0) {
                fprintf(stderr, "get_hwaddr ioctl échoue : %s\n", strerror(errno));
                exit(EXIT_FAILURE);
        }

        close(sock);

        memcpy(mac, ifr->ifr_hwaddr.sa_data, 6);

        printf("Interface : %s\n", ifname);
        printf("Adresse MAC : %02X:%02X:%02X:%02X:%02X:%02X\n",
                mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}

// Modifie l'adresse de l'interface
void set_hwaddr(char *ifname, char *hwaddr, struct ifreq *ifr)
{
        int sock;
        char mac[6];
        int t;

        strcpy(ifr->ifr_name, ifname);

        // Récupère la mac address
        if (sscanf (hwaddr, "%2x:%2x:%2x:%2x:%2x:%2x",
                &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) < 6)
        {
                usage();
                exit(1);
        }

        // Copie l'adresse dans la structure
        for (t=0; t<6; t++)
                ifr->ifr_hwaddr.sa_data[t] = mac[t];

        if (!(sock = socket(AF_INET, SOCK_DGRAM, 0)))
                exit(EXIT_FAILURE);

        if (ioctl(sock, SIOCSIFHWADDR, ifr) < 0) {
                fprintf(stderr, "ioctl échoue : %s\n", strerror(errno));
                exit(EXIT_FAILURE);
        }

        close (sock);
}

int main (int argc, char *argv[])
{
        struct ifreq ifr;
        char *interface = argv[1];
        char *mac_addr = argv[2];

        if (argc != 3)
                usage();

        // Affiche l'adresse de l'interface
        get_hwaddr(interface, &ifr);

        // Modifie l'adresse de l'interface
        set_hwaddr(interface, mac_addr, &ifr);
        printf("Adresse MAC modifiée.\nNouvelle adresse MAC...\n");

        // Affiche la nouvelle adresse de l'interface
        get_hwaddr(interface, &ifr);

        return EXIT_SUCCESS;
}