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;
}