1*47a64631SHidetoshi Shimokawa /* 2*47a64631SHidetoshi Shimokawa * Copyright 2004 The Aerospace Corporation. All rights reserved. 3*47a64631SHidetoshi Shimokawa * 4*47a64631SHidetoshi Shimokawa * Redistribution and use in source and binary forms, with or without 5*47a64631SHidetoshi Shimokawa * modification, are permitted provided that the following conditions 6*47a64631SHidetoshi Shimokawa * are met: 7*47a64631SHidetoshi Shimokawa * 8*47a64631SHidetoshi Shimokawa * 1. Redistributions of source code must retain the above copyright 9*47a64631SHidetoshi Shimokawa * notice, this list of conditions, and the following disclaimer. 10*47a64631SHidetoshi Shimokawa * 2. Redistributions in binary form must reproduce the above copyright 11*47a64631SHidetoshi Shimokawa * notice, this list of conditions, and the following disclaimer in the 12*47a64631SHidetoshi Shimokawa * documentation and/or other materials provided with the distribution. 13*47a64631SHidetoshi Shimokawa * 3. The name of The Aerospace Corporation may not be used to endorse or 14*47a64631SHidetoshi Shimokawa * promote products derived from this software. 15*47a64631SHidetoshi Shimokawa * 16*47a64631SHidetoshi Shimokawa * THIS SOFTWARE IS PROVIDED BY THE AEROSPACE CORPORATION "AS IS" AND 17*47a64631SHidetoshi Shimokawa * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*47a64631SHidetoshi Shimokawa * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*47a64631SHidetoshi Shimokawa * ARE DISCLAIMED. IN NO EVENT SHALL THE AEROSPACE CORPORATION BE LIABLE 20*47a64631SHidetoshi Shimokawa * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*47a64631SHidetoshi Shimokawa * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*47a64631SHidetoshi Shimokawa * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*47a64631SHidetoshi Shimokawa * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*47a64631SHidetoshi Shimokawa * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*47a64631SHidetoshi Shimokawa * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*47a64631SHidetoshi Shimokawa * SUCH DAMAGE. 27*47a64631SHidetoshi Shimokawa * 28*47a64631SHidetoshi Shimokawa * Copyright (c) 1995 29*47a64631SHidetoshi Shimokawa * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 30*47a64631SHidetoshi Shimokawa * 31*47a64631SHidetoshi Shimokawa * Redistribution and use in source and binary forms, with or without 32*47a64631SHidetoshi Shimokawa * modification, are permitted provided that the following conditions 33*47a64631SHidetoshi Shimokawa * are met: 34*47a64631SHidetoshi Shimokawa * 1. Redistributions of source code must retain the above copyright 35*47a64631SHidetoshi Shimokawa * notice, this list of conditions and the following disclaimer. 36*47a64631SHidetoshi Shimokawa * 2. Redistributions in binary form must reproduce the above copyright 37*47a64631SHidetoshi Shimokawa * notice, this list of conditions and the following disclaimer in the 38*47a64631SHidetoshi Shimokawa * documentation and/or other materials provided with the distribution. 39*47a64631SHidetoshi Shimokawa * 3. All advertising materials mentioning features or use of this software 40*47a64631SHidetoshi Shimokawa * must display the following acknowledgement: 41*47a64631SHidetoshi Shimokawa * This product includes software developed by Bill Paul. 42*47a64631SHidetoshi Shimokawa * 4. Neither the name of the author nor the names of any co-contributors 43*47a64631SHidetoshi Shimokawa * may be used to endorse or promote products derived from this software 44*47a64631SHidetoshi Shimokawa * without specific prior written permission. 45*47a64631SHidetoshi Shimokawa * 46*47a64631SHidetoshi Shimokawa * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 47*47a64631SHidetoshi Shimokawa * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 48*47a64631SHidetoshi Shimokawa * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 49*47a64631SHidetoshi Shimokawa * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 50*47a64631SHidetoshi Shimokawa * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 51*47a64631SHidetoshi Shimokawa * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 52*47a64631SHidetoshi Shimokawa * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 53*47a64631SHidetoshi Shimokawa * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 54*47a64631SHidetoshi Shimokawa * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 55*47a64631SHidetoshi Shimokawa * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 56*47a64631SHidetoshi Shimokawa * SUCH DAMAGE. 57*47a64631SHidetoshi Shimokawa * 58*47a64631SHidetoshi Shimokawa * EUI-64 conversion and lookup routines 59*47a64631SHidetoshi Shimokawa * 60*47a64631SHidetoshi Shimokawa * 61*47a64631SHidetoshi Shimokawa * Converted from ether_addr.c rev 62*47a64631SHidetoshi Shimokawa * FreeBSD: src/lib/libc/net/eui64.c,v 1.15 2002/04/08 07:51:10 ru Exp 63*47a64631SHidetoshi Shimokawa * by Brooks Davis 64*47a64631SHidetoshi Shimokawa * 65*47a64631SHidetoshi Shimokawa * Written by Bill Paul <wpaul@ctr.columbia.edu> 66*47a64631SHidetoshi Shimokawa * Center for Telecommunications Research 67*47a64631SHidetoshi Shimokawa * Columbia University, New York City 68*47a64631SHidetoshi Shimokawa * 69*47a64631SHidetoshi Shimokawa * $DragonFly: src/lib/libc/net/eui64.c,v 1.1 2004/09/23 06:33:04 simokawa Exp $ 70*47a64631SHidetoshi Shimokawa */ 71*47a64631SHidetoshi Shimokawa 72*47a64631SHidetoshi Shimokawa #include <sys/cdefs.h> 73*47a64631SHidetoshi Shimokawa #ifdef __FBSDID__ 74*47a64631SHidetoshi Shimokawa __FBSDID("$FreeBSD: src/lib/libc/net/eui64.c,v 1.2 2004/06/01 19:30:13 brooks Exp $"); 75*47a64631SHidetoshi Shimokawa #endif 76*47a64631SHidetoshi Shimokawa 77*47a64631SHidetoshi Shimokawa #include <stdio.h> 78*47a64631SHidetoshi Shimokawa #include <paths.h> 79*47a64631SHidetoshi Shimokawa #include <sys/types.h> 80*47a64631SHidetoshi Shimokawa #include <sys/eui64.h> 81*47a64631SHidetoshi Shimokawa #include <string.h> 82*47a64631SHidetoshi Shimokawa #include <stdlib.h> 83*47a64631SHidetoshi Shimokawa #include <sys/param.h> 84*47a64631SHidetoshi Shimokawa #ifdef YP 85*47a64631SHidetoshi Shimokawa #include <rpc/rpc.h> 86*47a64631SHidetoshi Shimokawa #include <rpcsvc/yp_prot.h> 87*47a64631SHidetoshi Shimokawa #include <rpcsvc/ypclnt.h> 88*47a64631SHidetoshi Shimokawa #endif 89*47a64631SHidetoshi Shimokawa 90*47a64631SHidetoshi Shimokawa #ifndef _PATH_EUI64 91*47a64631SHidetoshi Shimokawa #define _PATH_EUI64 "/etc/eui64" 92*47a64631SHidetoshi Shimokawa #endif 93*47a64631SHidetoshi Shimokawa 94*47a64631SHidetoshi Shimokawa static int eui64_line(const char *l, struct eui64 *e, char *hostname, 95*47a64631SHidetoshi Shimokawa size_t len); 96*47a64631SHidetoshi Shimokawa 97*47a64631SHidetoshi Shimokawa /* 98*47a64631SHidetoshi Shimokawa * Parse a string of text containing an EUI-64 and hostname 99*47a64631SHidetoshi Shimokawa * and separate it into its component parts. 100*47a64631SHidetoshi Shimokawa */ 101*47a64631SHidetoshi Shimokawa static int 102*47a64631SHidetoshi Shimokawa eui64_line(const char *l, struct eui64 *e, char *hostname, size_t len) 103*47a64631SHidetoshi Shimokawa { 104*47a64631SHidetoshi Shimokawa char *line, *linehead, *cur; 105*47a64631SHidetoshi Shimokawa 106*47a64631SHidetoshi Shimokawa linehead = strdup(l); 107*47a64631SHidetoshi Shimokawa if (linehead == NULL) 108*47a64631SHidetoshi Shimokawa return (-1); 109*47a64631SHidetoshi Shimokawa line = linehead; 110*47a64631SHidetoshi Shimokawa 111*47a64631SHidetoshi Shimokawa /* Find and parse the EUI64 */ 112*47a64631SHidetoshi Shimokawa while ((cur = strsep(&line, " \t\r\n")) != NULL) { 113*47a64631SHidetoshi Shimokawa if (*cur != '\0') { 114*47a64631SHidetoshi Shimokawa if (eui64_aton(cur, e) == 0) 115*47a64631SHidetoshi Shimokawa break; 116*47a64631SHidetoshi Shimokawa else 117*47a64631SHidetoshi Shimokawa goto bad; 118*47a64631SHidetoshi Shimokawa } 119*47a64631SHidetoshi Shimokawa } 120*47a64631SHidetoshi Shimokawa 121*47a64631SHidetoshi Shimokawa /* Find the hostname */ 122*47a64631SHidetoshi Shimokawa while ((cur = strsep(&line, " \t\r\n")) != NULL) { 123*47a64631SHidetoshi Shimokawa if (*cur != '\0') { 124*47a64631SHidetoshi Shimokawa if (strlcpy(hostname, cur, len) <= len) 125*47a64631SHidetoshi Shimokawa break; 126*47a64631SHidetoshi Shimokawa else 127*47a64631SHidetoshi Shimokawa goto bad; 128*47a64631SHidetoshi Shimokawa } 129*47a64631SHidetoshi Shimokawa } 130*47a64631SHidetoshi Shimokawa 131*47a64631SHidetoshi Shimokawa /* Make sure what remains is either whitespace or a comment */ 132*47a64631SHidetoshi Shimokawa while ((cur = strsep(&line, " \t\r\n")) != NULL) { 133*47a64631SHidetoshi Shimokawa if (*cur == '#') 134*47a64631SHidetoshi Shimokawa break; 135*47a64631SHidetoshi Shimokawa if (*cur != '\0') 136*47a64631SHidetoshi Shimokawa goto bad; 137*47a64631SHidetoshi Shimokawa } 138*47a64631SHidetoshi Shimokawa 139*47a64631SHidetoshi Shimokawa return (0); 140*47a64631SHidetoshi Shimokawa 141*47a64631SHidetoshi Shimokawa bad: 142*47a64631SHidetoshi Shimokawa free(linehead); 143*47a64631SHidetoshi Shimokawa return (-1); 144*47a64631SHidetoshi Shimokawa } 145*47a64631SHidetoshi Shimokawa 146*47a64631SHidetoshi Shimokawa /* 147*47a64631SHidetoshi Shimokawa * Convert an ASCII representation of an EUI-64 to binary form. 148*47a64631SHidetoshi Shimokawa */ 149*47a64631SHidetoshi Shimokawa int 150*47a64631SHidetoshi Shimokawa eui64_aton(const char *a, struct eui64 *e) 151*47a64631SHidetoshi Shimokawa { 152*47a64631SHidetoshi Shimokawa int i; 153*47a64631SHidetoshi Shimokawa unsigned int o0, o1, o2, o3, o4, o5, o6, o7; 154*47a64631SHidetoshi Shimokawa 155*47a64631SHidetoshi Shimokawa /* canonical form */ 156*47a64631SHidetoshi Shimokawa i = sscanf(a, "%x-%x-%x-%x-%x-%x-%x-%x", 157*47a64631SHidetoshi Shimokawa &o0, &o1, &o2, &o3, &o4, &o5, &o6, &o7); 158*47a64631SHidetoshi Shimokawa if (i == EUI64_LEN) 159*47a64631SHidetoshi Shimokawa goto good; 160*47a64631SHidetoshi Shimokawa /* ethernet form */ 161*47a64631SHidetoshi Shimokawa i = sscanf(a, "%x:%x:%x:%x:%x:%x:%x:%x", 162*47a64631SHidetoshi Shimokawa &o0, &o1, &o2, &o3, &o4, &o5, &o6, &o7); 163*47a64631SHidetoshi Shimokawa if (i == EUI64_LEN) 164*47a64631SHidetoshi Shimokawa goto good; 165*47a64631SHidetoshi Shimokawa /* classic fwcontrol/dconschat form */ 166*47a64631SHidetoshi Shimokawa i = sscanf(a, "0x%2x%2x%2x%2x%2x%2x%2x%2x", 167*47a64631SHidetoshi Shimokawa &o0, &o1, &o2, &o3, &o4, &o5, &o6, &o7); 168*47a64631SHidetoshi Shimokawa if (i == EUI64_LEN) 169*47a64631SHidetoshi Shimokawa goto good; 170*47a64631SHidetoshi Shimokawa /* MAC format (-) */ 171*47a64631SHidetoshi Shimokawa i = sscanf(a, "%x-%x-%x-%x-%x-%x", 172*47a64631SHidetoshi Shimokawa &o0, &o1, &o2, &o5, &o6, &o7); 173*47a64631SHidetoshi Shimokawa if (i == 6) { 174*47a64631SHidetoshi Shimokawa o3 = 0xff; 175*47a64631SHidetoshi Shimokawa o4 = 0xfe; 176*47a64631SHidetoshi Shimokawa goto good; 177*47a64631SHidetoshi Shimokawa } 178*47a64631SHidetoshi Shimokawa /* MAC format (:) */ 179*47a64631SHidetoshi Shimokawa i = sscanf(a, "%x:%x:%x:%x:%x:%x", 180*47a64631SHidetoshi Shimokawa &o0, &o1, &o2, &o5, &o6, &o7); 181*47a64631SHidetoshi Shimokawa if (i == 6) { 182*47a64631SHidetoshi Shimokawa o3 = 0xff; 183*47a64631SHidetoshi Shimokawa o4 = 0xfe; 184*47a64631SHidetoshi Shimokawa goto good; 185*47a64631SHidetoshi Shimokawa } 186*47a64631SHidetoshi Shimokawa 187*47a64631SHidetoshi Shimokawa return (-1); 188*47a64631SHidetoshi Shimokawa 189*47a64631SHidetoshi Shimokawa good: 190*47a64631SHidetoshi Shimokawa e->octet[0]=o0; 191*47a64631SHidetoshi Shimokawa e->octet[1]=o1; 192*47a64631SHidetoshi Shimokawa e->octet[2]=o2; 193*47a64631SHidetoshi Shimokawa e->octet[3]=o3; 194*47a64631SHidetoshi Shimokawa e->octet[4]=o4; 195*47a64631SHidetoshi Shimokawa e->octet[5]=o5; 196*47a64631SHidetoshi Shimokawa e->octet[6]=o6; 197*47a64631SHidetoshi Shimokawa e->octet[7]=o7; 198*47a64631SHidetoshi Shimokawa 199*47a64631SHidetoshi Shimokawa return (0); 200*47a64631SHidetoshi Shimokawa } 201*47a64631SHidetoshi Shimokawa 202*47a64631SHidetoshi Shimokawa /* 203*47a64631SHidetoshi Shimokawa * Convert a binary representation of an EUI-64 to an ASCII string. 204*47a64631SHidetoshi Shimokawa */ 205*47a64631SHidetoshi Shimokawa int 206*47a64631SHidetoshi Shimokawa eui64_ntoa(const struct eui64 *id, char *a, size_t len) 207*47a64631SHidetoshi Shimokawa { 208*47a64631SHidetoshi Shimokawa int i; 209*47a64631SHidetoshi Shimokawa 210*47a64631SHidetoshi Shimokawa i = snprintf(a, len, "%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x", 211*47a64631SHidetoshi Shimokawa id->octet[0], id->octet[1], id->octet[2], id->octet[3], 212*47a64631SHidetoshi Shimokawa id->octet[4], id->octet[5], id->octet[6], id->octet[7]); 213*47a64631SHidetoshi Shimokawa if (i < 23 || i >= len) 214*47a64631SHidetoshi Shimokawa return (-1); 215*47a64631SHidetoshi Shimokawa return (0); 216*47a64631SHidetoshi Shimokawa } 217*47a64631SHidetoshi Shimokawa 218*47a64631SHidetoshi Shimokawa /* 219*47a64631SHidetoshi Shimokawa * Map an EUI-64 to a hostname. Use either /etc/eui64 or NIS/YP. 220*47a64631SHidetoshi Shimokawa */ 221*47a64631SHidetoshi Shimokawa int 222*47a64631SHidetoshi Shimokawa eui64_ntohost(char *hostname, size_t len, const struct eui64 *id) 223*47a64631SHidetoshi Shimokawa { 224*47a64631SHidetoshi Shimokawa FILE *fp; 225*47a64631SHidetoshi Shimokawa char buf[BUFSIZ + 2]; 226*47a64631SHidetoshi Shimokawa struct eui64 local_eui64; 227*47a64631SHidetoshi Shimokawa char local_host[MAXHOSTNAMELEN]; 228*47a64631SHidetoshi Shimokawa #ifdef YP 229*47a64631SHidetoshi Shimokawa char *result; 230*47a64631SHidetoshi Shimokawa int resultlen; 231*47a64631SHidetoshi Shimokawa char eui64_a[24]; 232*47a64631SHidetoshi Shimokawa char *yp_domain; 233*47a64631SHidetoshi Shimokawa #endif 234*47a64631SHidetoshi Shimokawa if ((fp = fopen(_PATH_EUI64, "r")) == NULL) 235*47a64631SHidetoshi Shimokawa return (1); 236*47a64631SHidetoshi Shimokawa 237*47a64631SHidetoshi Shimokawa while (fgets(buf,BUFSIZ,fp)) { 238*47a64631SHidetoshi Shimokawa if (buf[0] == '#') 239*47a64631SHidetoshi Shimokawa continue; 240*47a64631SHidetoshi Shimokawa #ifdef YP 241*47a64631SHidetoshi Shimokawa if (buf[0] == '+') { 242*47a64631SHidetoshi Shimokawa if (yp_get_default_domain(&yp_domain)) 243*47a64631SHidetoshi Shimokawa continue; 244*47a64631SHidetoshi Shimokawa eui64_ntoa(id, eui64_a, sizeof(eui64_a)); 245*47a64631SHidetoshi Shimokawa if (yp_match(yp_domain, "eui64.byid", eui64_a, 246*47a64631SHidetoshi Shimokawa strlen(eui64_a), &result, &resultlen)) { 247*47a64631SHidetoshi Shimokawa continue; 248*47a64631SHidetoshi Shimokawa } 249*47a64631SHidetoshi Shimokawa strncpy(buf, result, resultlen); 250*47a64631SHidetoshi Shimokawa buf[resultlen] = '\0'; 251*47a64631SHidetoshi Shimokawa free(result); 252*47a64631SHidetoshi Shimokawa } 253*47a64631SHidetoshi Shimokawa #endif 254*47a64631SHidetoshi Shimokawa if (eui64_line(buf, &local_eui64, local_host, 255*47a64631SHidetoshi Shimokawa sizeof(local_host)) == 0) { 256*47a64631SHidetoshi Shimokawa if (bcmp(&local_eui64.octet[0], 257*47a64631SHidetoshi Shimokawa &id->octet[0], EUI64_LEN) == 0) { 258*47a64631SHidetoshi Shimokawa /* We have a match */ 259*47a64631SHidetoshi Shimokawa strcpy(hostname, local_host); 260*47a64631SHidetoshi Shimokawa fclose(fp); 261*47a64631SHidetoshi Shimokawa return(0); 262*47a64631SHidetoshi Shimokawa } 263*47a64631SHidetoshi Shimokawa } 264*47a64631SHidetoshi Shimokawa } 265*47a64631SHidetoshi Shimokawa fclose(fp); 266*47a64631SHidetoshi Shimokawa return (1); 267*47a64631SHidetoshi Shimokawa } 268*47a64631SHidetoshi Shimokawa 269*47a64631SHidetoshi Shimokawa /* 270*47a64631SHidetoshi Shimokawa * Map a hostname to an EUI-64 using /etc/eui64 or NIS/YP. 271*47a64631SHidetoshi Shimokawa */ 272*47a64631SHidetoshi Shimokawa int 273*47a64631SHidetoshi Shimokawa eui64_hostton(const char *hostname, struct eui64 *id) 274*47a64631SHidetoshi Shimokawa { 275*47a64631SHidetoshi Shimokawa FILE *fp; 276*47a64631SHidetoshi Shimokawa char buf[BUFSIZ + 2]; 277*47a64631SHidetoshi Shimokawa struct eui64 local_eui64; 278*47a64631SHidetoshi Shimokawa char local_host[MAXHOSTNAMELEN]; 279*47a64631SHidetoshi Shimokawa #ifdef YP 280*47a64631SHidetoshi Shimokawa char *result; 281*47a64631SHidetoshi Shimokawa int resultlen; 282*47a64631SHidetoshi Shimokawa char *yp_domain; 283*47a64631SHidetoshi Shimokawa #endif 284*47a64631SHidetoshi Shimokawa if ((fp = fopen(_PATH_EUI64, "r")) == NULL) 285*47a64631SHidetoshi Shimokawa return (1); 286*47a64631SHidetoshi Shimokawa 287*47a64631SHidetoshi Shimokawa while (fgets(buf,BUFSIZ,fp)) { 288*47a64631SHidetoshi Shimokawa if (buf[0] == '#') 289*47a64631SHidetoshi Shimokawa continue; 290*47a64631SHidetoshi Shimokawa #ifdef YP 291*47a64631SHidetoshi Shimokawa if (buf[0] == '+') { 292*47a64631SHidetoshi Shimokawa if (yp_get_default_domain(&yp_domain)) 293*47a64631SHidetoshi Shimokawa continue; 294*47a64631SHidetoshi Shimokawa if (yp_match(yp_domain, "eui64.byname", hostname, 295*47a64631SHidetoshi Shimokawa strlen(hostname), &result, &resultlen)) { 296*47a64631SHidetoshi Shimokawa continue; 297*47a64631SHidetoshi Shimokawa } 298*47a64631SHidetoshi Shimokawa strncpy(buf, result, resultlen); 299*47a64631SHidetoshi Shimokawa buf[resultlen] = '\0'; 300*47a64631SHidetoshi Shimokawa free(result); 301*47a64631SHidetoshi Shimokawa } 302*47a64631SHidetoshi Shimokawa #endif 303*47a64631SHidetoshi Shimokawa if (eui64_line(buf, &local_eui64, local_host, 304*47a64631SHidetoshi Shimokawa sizeof(local_host)) == 0) { 305*47a64631SHidetoshi Shimokawa if (strcmp(hostname, local_host) == 0) { 306*47a64631SHidetoshi Shimokawa /* We have a match */ 307*47a64631SHidetoshi Shimokawa bcopy(&local_eui64, id, sizeof(struct eui64)); 308*47a64631SHidetoshi Shimokawa fclose(fp); 309*47a64631SHidetoshi Shimokawa return(0); 310*47a64631SHidetoshi Shimokawa } 311*47a64631SHidetoshi Shimokawa } 312*47a64631SHidetoshi Shimokawa } 313*47a64631SHidetoshi Shimokawa fclose(fp); 314*47a64631SHidetoshi Shimokawa return (1); 315*47a64631SHidetoshi Shimokawa } 316