Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 03 Oct 2014 08:22:52 -0400
From:      "John Ten" <ritanopi@eclipso.ch>
To:        <freebsd-ports-bugs@freebsd.org>
Cc:        clutton@zoho.com
Subject:   ports/187363: [new port][net/macchanger] GNU macchanger port for the FreeBSD system
Message-ID:  <201932d5b6ec7b5fa73f925b85fcef6b@mail.eclipso.de>

next in thread | raw e-mail | index | archive | help
   Sorry, I don't know how to reply to a thread so I guess this will do.

   Anyway, this port lacks the "-p" option, basically getting the original
   NIC MAC address. It seems it's a bit harder on BSD, since there's no
   ethtool, still

   ethtool -P doesn't work on my system, it shows me the cloned mac, not
   the original one. Anyway on BSD this can be achieved by doing two
   things:

   1. using sysctl.XX.Y.nvm=1  (on newer bsd) or sysctl.XX.Y.debug=1 on
   older ones (thanks Jeremy Chadwick) to do an EEPROM dump, where XXX is
   interface name (e.g. em), and Y is the number(e.g. 0)

   2. inspecting the output of dmesg, /var/log/messages specifically the
   first line, that is the original/permanent MAC of the NIC (tested also
   on VirtualBox)

   I am sure there is a better way to find this out, but syslog source
   needs to be inspected and such and it's gonna take some time, just
   wanted to point the author in the right direction.

   Regards
>Number:         187363
>Category:       ports
>Synopsis:       [new port][net/macchanger] GNU macchanger port for the FreeBSD
system
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Mar 08 08:30:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     clutton
>Release:
>Organization:
>Environment:
>Description:
GNU macchanger is a good tool because of it's mac's addresses database.

The pool request [1]https://github.com/alobbs/macchanger/pull/9

I hope patches will be accepted in new versions, for now I'd like to start by pr
oviding a working version.

One feature was commented, because I don't know how to implement it now...
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#       macchanger
#       macchanger/pkg-plist
#       macchanger/files
#       macchanger/files/patch-src_netinfo.h
#       macchanger/files/patch-src_netinfo.c
#       macchanger/files/patch-src_main.c
#       macchanger/Makefile
#       macchanger/distinfo
#       macchanger/pkg-descr
#
echo c - macchanger
mkdir -p macchanger > /dev/null 2>&1
echo x - macchanger/pkg-plist
sed 's/^X//' >macchanger/pkg-plist << 'd03b69c5dadd960b1ea1d2397b6ac821'
Xbin/macchanger
Xman/man1/macchanger.1.gz
X%%DATADIR%%/OUI.list
X%%DATADIR%%/wireless.list
[2]X at dirrmtry %%DATADIR%%
d03b69c5dadd960b1ea1d2397b6ac821
echo c - macchanger/files
mkdir -p macchanger/files > /dev/null 2>&1
echo x - macchanger/files/patch-src_netinfo.h
sed 's/^X//' >macchanger/files/patch-src_netinfo.h << 'cb21b643c2b0f08fdb9e24dc4
956a846'
X--- src/netinfo.h      2013-03-17 00:54:41.000000000 +0200
X+++ src/netinfo.h      2014-03-08 07:14:58.334245891 +0200
X@@ -30,6 +30,17 @@
X #include <net/if.h>
X #include "mac.h"
X
X+#ifdef __linux__
X+#define sockaddr_dl    sockaddr_ll
X+#define sdl_family     sll_family
X+#define AF_LINK        AF_PACKET
X+#define LLADDR(s)      s->sll_addr;
X+#endif
X+
X+#ifdef __FreeBSD__
X+#define SIOCSIFHWADDR SIOCSIFLLADDR
X+#endif
X+
X typedef struct {
X          int sock;
X          struct ifreq dev;
cb21b643c2b0f08fdb9e24dc4956a846
echo x - macchanger/files/patch-src_netinfo.c
sed 's/^X//' >macchanger/files/patch-src_netinfo.c << '6698a3f09c341f61778b29439
b1b7d42'
X--- src/netinfo.c      2013-03-17 00:56:37.000000000 +0200
X+++ src/netinfo.c      2014-03-08 07:03:30.388297174 +0200
X@@ -29,8 +29,17 @@
X #include <unistd.h>
X #include <sys/ioctl.h>
X
X-#include <linux/ethtool.h>
X-#include <linux/sockios.h>
X+#if defined(__linux__)
X+# include <linux/ethtool.h>
X+# include <linux/sockios.h>
X+#elif defined(__FreeBSD__)
X+# include <net/if.h>
X+# include <net/if_dl.h>
X+# include <net/if_var.h>
X+# include <net/if_types.h>
X+# include <net/ethernet.h>
X+# include <ifaddrs.h>
X+#endif
X
X #include "netinfo.h"
X
X@@ -47,8 +56,9 @@
X               return NULL;
X       }
X
X-      strcpy (new->dev.ifr_name, device);
X-      if (ioctl(new->sock, SIOCGIFHWADDR, &new->dev) < 0) {
X+      strncpy (new->dev.ifr_name, device, sizeof(new->dev.ifr_name));
X+      new->dev.ifr_name[sizeof(new->dev.ifr_name)-1] = '\0';
X+      if (if_nametoindex(device) == 0) {
X               perror ("[ERROR] Set device name");
X               free(new);
X               return NULL;
X@@ -65,31 +75,56 @@
X       free(net);
X }
X
X-
X mac_t *
X mc_net_info_get_mac (const net_info_t *net)
X {
X-      int    i;
X-      mac_t *new = (mac_t *) malloc (sizeof(mac_t));
X+      int i;
X+      mac_t *mac = (mac_t *) malloc (sizeof(mac_t));
X+      u_char *lladr;
X
X-      for (i=0; i<6; i++) {
X-              new->byte[i] = net->dev.ifr_hwaddr.sa_data[i] & 0xFF;
X-      }
X+      struct ifaddrs *ifap, *ifa;
X+      struct sockaddr_dl *sdl;
X
X-      return new;
X-}
X+      if (getifaddrs(&ifap) == 0) {
X+              for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
X+
X+                      sdl = (struct sockaddr_dl *) ifa->ifa_addr;
X
X+                      if (strcmp(ifa->ifa_name, net->dev.ifr_name) != 0)
X+                              continue;
X+
X+                      if (!sdl && sdl->sdl_family != AF_LINK)
X+                              continue;
X+
X+                      lladr = (u_char *) LLADDR(sdl);
X+                      for (i=0; i<6; i++)
X+                              mac->byte[i] = lladr[i] & 0xFF;
X+                      break;
X+              }
X+              freeifaddrs(ifap);
X+      } else
X+              perror("getifaddrs");
X+
X+      return mac;
X+}
X
X int
X mc_net_info_set_mac (net_info_t *net, const mac_t *mac)
X {
X       int i;
X+#if defined(__FreeBSD__)
X+      net->dev.ifr_addr.sa_family = AF_LINK;
X+      net->dev.ifr_addr.sa_len    = ETHER_ADDR_LEN;
X+#endif
X
X-      for (i=0; i<6; i++) {
X+      for (i=0; i<6; i++)
X+#if   defined(__linux__)
X               net->dev.ifr_hwaddr.sa_data[i] = mac->byte[i];
X-      }
X+#elif defined(__FreeBSD__)
X+              net->dev.ifr_addr.sa_data[i] = mac->byte[i];
X+#endif
X
X-      if (ioctl(net->sock, SIOCSIFHWADDR, &net->dev) < 0) {
X+      if (ioctl(net->sock, SIOCSIFHWADDR, &net->dev) == -1) {
X               perror ("[ERROR] Could not change MAC: interface up or insuffici
ent permissions");
X               return -1;
X       }
X@@ -97,6 +132,7 @@
X       return 0;
X }
X
X+#if defined(__linux__)
X mac_t *
X mc_net_info_get_permanent_mac (const net_info_t *net)
X {
X@@ -125,3 +161,4 @@
X       free(epa);
X       return newmac;
X }
X+#endif
6698a3f09c341f61778b29439b1b7d42
echo x - macchanger/files/patch-src_main.c
sed 's/^X//' >macchanger/files/patch-src_main.c << '3805d61673e2a7a097c57875d5c3
8ba9'
X--- src/main.c 2013-03-17 00:57:41.000000000 +0200
X+++ src/main.c 2014-03-08 06:42:36.021380219 +0200
X@@ -40,9 +40,6 @@
X #include "maclist.h"
X #include "netinfo.h"
X
X-#define EXIT_OK    0
X-#define EXIT_ERROR 1
X-
X static void
X print_help (void)
X {
X@@ -51,10 +48,12 @@
X               "  -h,  --help                   Print this help\n"
X               "  -V,  --version                Print version and exit\n"
X               "  -s,  --show                   Print the MAC address and exit\
n"
X-              "  -e,  --endding                Don't change the vendor bytes\n
"
X+              "  -e,  --ending                 Don't change the vendor bytes\n
"
X               "  -a,  --another                Set random vendor MAC of the sa
me kind\n"
X               "  -A                            Set random vendor MAC of any ki
nd\n"
X+#ifdef __linux__
X               "  -p,  --permanent              Reset to original, permanent ha
rdware MAC\n"
X+#endif
X               "  -r,  --random                 Set fully random MAC\n"
X               "  -l,  --list[=keyword]         Print known vendors\n"
X               "  -b,  --bia                    Pretend to be a burned-in-addre
ss\n"
X@@ -94,8 +93,9 @@
X       struct timeval tv;
X       unsigned int   seed;
X
X-      if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 ||
X-          (fd = open("/dev/random", O_RDONLY)) >= 0)
X+      if ((fd = open("/dev/hwrng", O_RDONLY)) >= 0 ||
X+          (fd = open("/dev/random", O_RDONLY)) >= 0 ||
X+          (fd = open("/dev/urandom", O_RDONLY)) >= 0)
X       {
X               read (fd, &seed, sizeof(seed));
X               close (fd);
X@@ -112,10 +112,12 @@
X main (int argc, char *argv[])
X {
X       char random       = 0;
X-      char endding      = 0;
X+      char ending       = 0;
X       char another_any  = 0;
X       char another_same = 0;
X+#ifdef __linux__
X       char permanent    = 0;
X+#endif
X       char print_list   = 0;
X       char show         = 0;
X       char set_bia      = 0;
X@@ -127,9 +129,12 @@
X               {"help",        no_argument,       NULL, 'h'},
X               {"version",     no_argument,       NULL, 'V'},
X               {"random",      no_argument,       NULL, 'r'},
X-              {"endding",     no_argument,       NULL, 'e'},
X+              {"ending",      no_argument,       NULL, 'e'},
X+              {"endding",     no_argument,       NULL, 'e'}, /* kept for backw
ards compatibility */
X               {"another",     no_argument,       NULL, 'a'},
X+#ifdef __linux__
X               {"permanent",   no_argument,       NULL, 'p'},
X+#endif
X               {"show",        no_argument,       NULL, 's'},
X               {"another_any", no_argument,       NULL, 'A'},
X               {"bia",         no_argument,       NULL, 'b'},
X@@ -140,7 +145,9 @@
X
X       net_info_t *net;
X       mac_t      *mac;
X+#ifdef __linux__
X       mac_t      *mac_permanent;
X+#endif
X       mac_t      *mac_faked;
X       char       *device_name;
X       int         val;
X@@ -156,7 +163,7 @@
X                               "This is free software; see the source for copyi
ng conditions.  There is NO\n"
X                               "warranty; not even for MERCHANTABILITY or FITNE
SS FOR A PARTICULAR PURPOSE.\n",
X                               VERSION);
X-                      exit (EXIT_OK);
X+                      exit (EXIT_SUCCESS);
X                       break;
X               case 'l':
X                       print_list = 1;
X@@ -166,7 +173,7 @@
X                       random = 1;
X                       break;
X               case 'e':
X-                      endding = 1;
X+                      ending = 1;
X                       break;
X               case 'b':
X                       set_bia = 1;
X@@ -180,9 +187,11 @@
X               case 'A':
X                       another_any = 1;
X                       break;
X+#ifdef __linux__
X               case 'p':
X                       permanent = 1;
X                       break;
X+#endif
X               case 'm':
X                       set_mac = optarg;
X                       break;
X@@ -190,67 +199,78 @@
X               case '?':
X               default:
X                       print_help();
X-                      exit (EXIT_OK);
X+                      exit (EXIT_SUCCESS);
X                       break;
X               }
X       }
X
X       /* Read the MAC lists */
X       if (mc_maclist_init() < 0) {
X-              exit (EXIT_ERROR);
X+              exit (EXIT_FAILURE);
X       }
X
X       /* Print list? */
X       if (print_list) {
X               mc_maclist_print(search_word);
X-              exit (EXIT_OK);
X+              exit (EXIT_SUCCESS);
X       }
X
X       /* Get device name argument */
X       if (optind >= argc) {
X               print_usage();
X-              exit (EXIT_OK);
X+              exit (EXIT_SUCCESS);
X       }
X       device_name = argv[optind];
X
X       /* Seed a random number generator */
X       random_seed();
X
X-        /* Read the MAC */
X+      /* Read the MAC */
X       if ((net = mc_net_info_new(device_name)) == NULL) {
X-              exit (EXIT_ERROR);
X+              exit (EXIT_FAILURE);
X       }
X       mac = mc_net_info_get_mac(net);
X+#ifdef __linux__
X       mac_permanent = mc_net_info_get_permanent_mac(net);
X+#endif
X+
X+      /* --bia can only be used with --random */
X+      if (set_bia  &&  !random) {
X+              fprintf (stderr, "[WARNING] Ignoring --bia option that can only
be used with --random\n");
X+      }
X
X       /* Print the current MAC info */
X       print_mac ("Current MAC:   ", mac);
X+#ifdef __linux__
X       print_mac ("Permanent MAC: ", mac_permanent);
X+#endif
X
X       /* Change the MAC */
X       mac_faked = mc_mac_dup (mac);
X
X       if (show) {
X-              exit (EXIT_OK);
X+              exit (EXIT_SUCCESS);
X       } else if (set_mac) {
X               if (mc_mac_read_string (mac_faked, set_mac) < 0) {
X-                      exit (EXIT_ERROR);
X+                      exit (EXIT_FAILURE);
X               }
X       } else if (random) {
X               mc_mac_random (mac_faked, 6, set_bia);
X-      } else if (endding) {
X-              mc_mac_random (mac_faked, 3, set_bia);
X+      } else if (ending) {
X+              mc_mac_random (mac_faked, 3, 1);
X       } else if (another_same) {
X               val = mc_maclist_is_wireless (mac);
X               mc_maclist_set_random_vendor (mac_faked, val);
X-              mc_mac_random (mac_faked, 3, set_bia);
X+              mc_mac_random (mac_faked, 3, 1);
X       } else if (another_any) {
X               mc_maclist_set_random_vendor(mac_faked, mac_is_anykind);
X-              mc_mac_random (mac_faked, 3, set_bia);
X+              mc_mac_random (mac_faked, 3, 1);
X+#ifdef __linux__
X       } else if (permanent) {
X               mac_faked = mc_mac_dup (mac_permanent);
X+#endif
X       } else {
X-              mc_mac_next (mac_faked);
X+              exit (EXIT_SUCCESS); /* default to show */
X       }
X
X       /* Set the new MAC */
X@@ -272,9 +292,11 @@
X       /* Memory free */
X       mc_mac_free (mac);
X       mc_mac_free (mac_faked);
X+#ifdef __linux__
X       mc_mac_free (mac_permanent);
X+#endif
X       mc_net_info_free (net);
X       mc_maclist_free();
X
X-      return (ret == 0) ? EXIT_OK : EXIT_ERROR;
X+      return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
X }
3805d61673e2a7a097c57875d5c38ba9
echo x - macchanger/Makefile
sed 's/^X//' >macchanger/Makefile << '3a74b2cc6a0f2b8b8b8e28da5443e260'
X# $FreeBSD$
X
XPORTNAME=      macchanger
XPORTVERSION=   1.6.0
XCATEGORIES=    net
XMASTER_SITES=  GNU
X
XMAINTAINER=    [3]clutton at zoho.com
XCOMMENT=       GNU MAC Changer
X
XLICENSE=       GPLv3
X
XGNU_CONFIGURE= yes
X
XINFO=          macchanger
X
X.include <bsd.port.mk>
3a74b2cc6a0f2b8b8b8e28da5443e260
echo x - macchanger/distinfo
sed 's/^X//' >macchanger/distinfo << '614a08e9cf0867f64ce5227faaa18894'
XSHA256 (macchanger-1.6.0.tar.gz) = 31534f138f1d21fa247be74ba6bef3fbfa47bbcd5033
e99bd10c432fe58e51f7
XSIZE (macchanger-1.6.0.tar.gz) = 352061
614a08e9cf0867f64ce5227faaa18894
echo x - macchanger/pkg-descr
sed 's/^X//' >macchanger/pkg-descr << '23d5d0fdb10e0c2778a645d256385f23'
XGNU MAC Changer is an utility that makes the maniputation of MAC addresses of
Xnetwork interfaces easier.
X
XWWW: [4]http://www.gnu.org/software/macchanger
23d5d0fdb10e0c2778a645d256385f23
exit


   ----
   eclipso Freemail - Sicher, kostenlos, schnell!
   [5]https://www.eclipso.ch

References

   1. https://github.com/alobbs/macchanger/pull/9
   2. http://lists.freebsd.org/mailman/listinfo/freebsd-ports-bugs
   3. http://lists.freebsd.org/mailman/listinfo/freebsd-ports-bugs
   4. http://www.gnu.org/software/macchanger
   5. https://www.eclipso.ch/



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201932d5b6ec7b5fa73f925b85fcef6b>