lladdr.c
e12fe286
 /*
  * Support routine for configuring link layer address 
  */
 
 #include "syshead.h"
 #include "error.h"
 #include "misc.h"
 
 int set_lladdr(const char *ifname, const char *lladdr,
 		const struct env_set *es)
 {
5a2e9a25
   struct argv argv = argv_new ();
14a4962a
   int r;
e12fe286
 
   if (!ifname || !lladdr)
     return -1;
   
 #if defined(TARGET_LINUX)
 #ifdef CONFIG_FEATURE_IPROUTE
5a2e9a25
   argv_printf (&argv,
0aee9ca7
 		    "%s link set addr %s dev %s",
 		    iproute_path, lladdr, ifname);
e12fe286
 #else
5a2e9a25
   argv_printf (&argv,
 		    "%s %s hw ether %s",
 		    IFCONFIG_PATH,
e12fe286
 		    ifname, lladdr);
 #endif
 #elif defined(TARGET_SOLARIS)
5a2e9a25
   argv_printf (&argv,
 		    "%s %s ether %s",
 		    IFCONFIG_PATH,
e12fe286
 		    ifname, lladdr);
 #elif defined(TARGET_OPENBSD)
5a2e9a25
   argv_printf (&argv,
 		    "%s %s lladdr %s",
 		    IFCONFIG_PATH,
e12fe286
 		    ifname, lladdr);
 #elif defined(TARGET_DARWIN)
5a2e9a25
   argv_printf (&argv,
 		    "%s %s lladdr %s",
 		    IFCONFIG_PATH,
e12fe286
 		    ifname, lladdr);
 #elif defined(TARGET_FREEBSD)
5a2e9a25
   argv_printf (&argv,
 		    "%s %s ether %s",
 		    IFCONFIG_PATH,
e12fe286
 		    ifname, lladdr);
 #else
       msg (M_WARN, "Sorry, but I don't know how to configure link layer addresses on this operating system.");
       return -1;
 #endif
 
5a2e9a25
   argv_msg (M_INFO, &argv);
   r = openvpn_execve_check (&argv, es, M_WARN, "ERROR: Unable to set link layer address.");
e12fe286
   if (r)
     msg (M_INFO, "TUN/TAP link layer address set to %s", lladdr);
5a2e9a25
 
   argv_reset (&argv);
e12fe286
   return r;
 }