my_gethwaddr.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* get hardware address for an interface */
  14. /* if there are many available, any non-zero one can be used */
  15. #include "mysys_priv.h"
  16. #include <m_string.h>
  17. #ifndef MAIN
  18. static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
  19. {
  20.   uint i, res=1;
  21.   for (i=0; i < len; i++)
  22.     if ((*to++= *from++))
  23.       res=0;
  24.   return res;
  25. }
  26. #ifdef __FreeBSD__
  27. #include <net/ethernet.h>
  28. #include <sys/sysctl.h>
  29. #include <net/route.h>
  30. #include <net/if.h>
  31. #include <net/if_dl.h>
  32. my_bool my_gethwaddr(uchar *to)
  33. {
  34.   size_t len;
  35.   uchar  *buf, *next, *end, *addr;
  36.   struct if_msghdr *ifm;
  37.   struct sockaddr_dl *sdl;
  38.   int i, res=1, mib[6]={CTL_NET, AF_ROUTE, 0, AF_LINK, NET_RT_IFLIST, 0};
  39.   if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1)
  40.     goto err;
  41.   if (!(buf = alloca(len)))
  42.     goto err;
  43.   if (sysctl(mib, 6, buf, &len, NULL, 0) < 0)
  44.     goto err;
  45.   end = buf + len;
  46.   for (next = buf ; res && next < end ; next += ifm->ifm_msglen)
  47.   {
  48.     ifm = (struct if_msghdr *)next;
  49.     if (ifm->ifm_type == RTM_IFINFO)
  50.     {
  51.       sdl = (struct sockaddr_dl *)(ifm + 1);
  52.       addr=LLADDR(sdl);
  53.       res=memcpy_and_test(to, addr, ETHER_ADDR_LEN);
  54.     }
  55.   }
  56. err:
  57.   return res;
  58. }
  59. #elif __linux__
  60. #include <net/if.h>
  61. #include <sys/ioctl.h>
  62. #include <net/ethernet.h>
  63. my_bool my_gethwaddr(uchar *to)
  64. {
  65.   int fd, res=1;
  66.   struct ifreq ifr;
  67.   fd = socket(AF_INET, SOCK_DGRAM, 0);
  68.   if (fd < 0)
  69.     goto err;
  70.   bzero(&ifr, sizeof(ifr));
  71.   strnmov(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name) - 1);
  72.   do {
  73.     if (ioctl(fd, SIOCGIFHWADDR, &ifr) >= 0)
  74.       res=memcpy_and_test(to, (uchar *)&ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
  75.   } while (res && (errno == 0 || errno == ENODEV) && ifr.ifr_name[3]++ < '6');
  76.   close(fd);
  77. err:
  78.   return res;
  79. }
  80. #else
  81. /* just fail */
  82. my_bool my_gethwaddr(uchar *to __attribute__((unused)))
  83. {
  84.   return 1;
  85. }
  86. #endif
  87. #else /* MAIN */
  88. int main(int argc __attribute__((unused)),char **argv)
  89. {
  90.   uchar mac[6];
  91.   uint i;
  92.   MY_INIT(argv[0]);
  93.   if (my_gethwaddr(mac))
  94.   {
  95.     printf("my_gethwaddr failed with errno %dn", errno);
  96.     exit(1);
  97.   }
  98.   for (i=0; i < sizeof(mac); i++)
  99.   {
  100.     if (i) printf(":");
  101.     printf("%02x", mac[i]);
  102.   }
  103.   printf("n");
  104.   return 0;
  105. }
  106. #endif