From owner-freebsd-hackers@FreeBSD.ORG Sat Jun 26 12:52:06 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 31E7316A4CE; Sat, 26 Jun 2004 12:52:06 +0000 (GMT) Received: from itchy.rabson.org (mailgate.nlsystems.com [80.177.232.242]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8201C43D39; Sat, 26 Jun 2004 12:52:05 +0000 (GMT) (envelope-from dfr@nlsystems.com) Received: from ns0.nlsystems.com (ns0.nlsystems.com [80.177.232.243]) by itchy.rabson.org (8.12.11/8.12.11) with ESMTP id i5QCpM1h067412; Sat, 26 Jun 2004 13:51:22 +0100 (BST) (envelope-from dfr@nlsystems.com) From: Doug Rabson To: freebsd-hackers@freebsd.org Date: Sat, 26 Jun 2004 13:51:16 +0100 User-Agent: KMail/1.6.1 References: <40DCC57F.5090209@fer.hr> <20040626104947.T93253@woozle.rinet.ru> <40DD3EC1.9000106@fer.hr> In-Reply-To: <40DD3EC1.9000106@fer.hr> MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200406261351.16778.dfr@nlsystems.com> X-Spam-Status: No, hits=0.0 required=5.0 tests=none autolearn=no version=2.63 X-Spam-Checker-Version: SpamAssassin 2.63 (2004-01-11) on itchy.rabson.org X-Virus-Scanned: clamd / ClamAV version 0.71, clamav-milter version 0.71 X-Virus-Status: Clean cc: hackers@freebsd.org cc: Dmitry Morozovsky cc: Ivan Voras Subject: Re: Getting MAC address? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 Jun 2004 12:52:06 -0000 On Saturday 26 June 2004 10:15, Ivan Voras wrote: > Dmitry Morozovsky wrote: > > On Sat, 26 Jun 2004, Ivan Voras wrote: > > > > IV> How to get the MAC address for an (ethernet) interface? The > > linux code IV> does this: > > IV> retval = ioctl(thisint->sockInt, SIOCGIFHWADDR, &ifr); > > IV> > > IV> After some searching, I found SIOCSIFLLADDR ioctl, but it > > appears there IV> isn't a "GET" counterpart. > > IV> > > IV> (I've got interface name & index available...) > > > > Take a look at ifconfig(8) source. > > > > getifaddrs(3), case when sa_family == AF_LINK > > I was looking at it and came across getifaddrs(). This function does > not depend on a open socket (yes, mine is AF_LINK, sockaddr_dl), and > apparently returns a list of all interfaces. Is there really no other > way than to traverse this list? Its really not that hard: static void getNodeID(uint8_t node[6]) { struct ifaddrs *ifap; if (getifaddrs(&ifap) == 0) { struct ifaddrs *p; for (p = ifap; p; p = p->ifa_next) { if (p->ifa_addr->sa_family == AF_LINK) { struct sockaddr_dl* sdp = (struct sockaddr_dl*) p->ifa_addr; memcpy(node, sdp->sdl_data + sdp->sdl_nlen, 6); freeifaddrs(ifap); return; } } freeifaddrs(ifap); } }