1*4b22b933Srs200217 /* 2*4b22b933Srs200217 * CDDL HEADER START 3*4b22b933Srs200217 * 4*4b22b933Srs200217 * The contents of this file are subject to the terms of the 5*4b22b933Srs200217 * Common Development and Distribution License (the "License"). 6*4b22b933Srs200217 * You may not use this file except in compliance with the License. 7*4b22b933Srs200217 * 8*4b22b933Srs200217 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*4b22b933Srs200217 * or http://www.opensolaris.org/os/licensing. 10*4b22b933Srs200217 * See the License for the specific language governing permissions 11*4b22b933Srs200217 * and limitations under the License. 12*4b22b933Srs200217 * 13*4b22b933Srs200217 * When distributing Covered Code, include this CDDL HEADER in each 14*4b22b933Srs200217 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*4b22b933Srs200217 * If applicable, add the following below this CDDL HEADER, with the 16*4b22b933Srs200217 * fields enclosed by brackets "[]" replaced with your own identifying 17*4b22b933Srs200217 * information: Portions Copyright [yyyy] [name of copyright owner] 18*4b22b933Srs200217 * 19*4b22b933Srs200217 * CDDL HEADER END 20*4b22b933Srs200217 */ 21*4b22b933Srs200217 22*4b22b933Srs200217 /* 23*4b22b933Srs200217 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24*4b22b933Srs200217 * Use is subject to license terms. 25*4b22b933Srs200217 */ 26*4b22b933Srs200217 27*4b22b933Srs200217 #pragma ident "%Z%%M% %I% %E% SMI" 28*4b22b933Srs200217 29*4b22b933Srs200217 #include "mdns_common.h" 30*4b22b933Srs200217 31*4b22b933Srs200217 /* 32*4b22b933Srs200217 * gethostby* functions for the ipnodes database. The ipnodes 33*4b22b933Srs200217 * database stores both IPv4 and IPv6 address information. 34*4b22b933Srs200217 * mDNS query functions to perform the host lookup are 35*4b22b933Srs200217 * in mdns/common/mdns_common.c file. 36*4b22b933Srs200217 * _nss_mdns_ipnodes_constr is called to initialize 37*4b22b933Srs200217 * the nsswitch backend data structures. 38*4b22b933Srs200217 */ 39*4b22b933Srs200217 40*4b22b933Srs200217 static nss_status_t 41*4b22b933Srs200217 getbyname(be, a) 42*4b22b933Srs200217 mdns_backend_ptr_t be; 43*4b22b933Srs200217 void *a; 44*4b22b933Srs200217 { 45*4b22b933Srs200217 nss_XbyY_args_t *argp = (nss_XbyY_args_t *)a; 46*4b22b933Srs200217 int af = argp->key.ipnode.af_family; 47*4b22b933Srs200217 char *hname = (char *)argp->key.ipnode.name; 48*4b22b933Srs200217 struct mdns_querydata qdata; 49*4b22b933Srs200217 50*4b22b933Srs200217 (void) memset(&qdata, 0, sizeof (struct mdns_querydata)); 51*4b22b933Srs200217 qdata.argp = argp; 52*4b22b933Srs200217 53*4b22b933Srs200217 _nss_mdns_updatecfg(be); 54*4b22b933Srs200217 return (_nss_mdns_querybyname(be, hname, af, &qdata)); 55*4b22b933Srs200217 } 56*4b22b933Srs200217 57*4b22b933Srs200217 static nss_status_t 58*4b22b933Srs200217 getbyaddr(be, a) 59*4b22b933Srs200217 mdns_backend_ptr_t be; 60*4b22b933Srs200217 void *a; 61*4b22b933Srs200217 { 62*4b22b933Srs200217 int i; 63*4b22b933Srs200217 char ch; 64*4b22b933Srs200217 char *chptr; 65*4b22b933Srs200217 uint8_t *p; 66*4b22b933Srs200217 struct in6_addr *addr; 67*4b22b933Srs200217 struct mdns_querydata qdata; 68*4b22b933Srs200217 char addrqryname[ sizeof ("f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f") + \ 69*4b22b933Srs200217 sizeof (".f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.ip6.arpa.")]; 70*4b22b933Srs200217 nss_XbyY_args_t *argp = (nss_XbyY_args_t *)a; 71*4b22b933Srs200217 72*4b22b933Srs200217 (void) memset(&qdata, 0, sizeof (struct mdns_querydata)); 73*4b22b933Srs200217 qdata.argp = argp; 74*4b22b933Srs200217 argp->h_errno = 0; 75*4b22b933Srs200217 76*4b22b933Srs200217 if ((argp->key.hostaddr.type != AF_INET6) || 77*4b22b933Srs200217 (argp->key.hostaddr.len != sizeof (*addr))) 78*4b22b933Srs200217 return (NSS_NOTFOUND); 79*4b22b933Srs200217 80*4b22b933Srs200217 /* LINTED E_BAD_PTR_CAST_ALIGN */ 81*4b22b933Srs200217 addr = (struct in6_addr *)(argp->key.hostaddr.addr); 82*4b22b933Srs200217 83*4b22b933Srs200217 if (IN6_IS_ADDR_V4MAPPED(addr)) { 84*4b22b933Srs200217 struct in_addr ipv4addr; 85*4b22b933Srs200217 86*4b22b933Srs200217 IN6_V4MAPPED_TO_INADDR(addr, &ipv4addr); 87*4b22b933Srs200217 if (inet_ntop(AF_INET, (void *) &ipv4addr.s_addr, 88*4b22b933Srs200217 (void *)qdata.paddrbuf, sizeof (qdata.paddrbuf)) == NULL) 89*4b22b933Srs200217 return (NSS_NOTFOUND); 90*4b22b933Srs200217 qdata.af = AF_INET; 91*4b22b933Srs200217 p = (uint8_t *)&ipv4addr.s_addr; 92*4b22b933Srs200217 (void) snprintf(addrqryname, sizeof (addrqryname), 93*4b22b933Srs200217 "%u.%u.%u.%u.in-addr.arpa.", p[3], p[2], p[1], p[0]); 94*4b22b933Srs200217 } else { 95*4b22b933Srs200217 if (inet_ntop(AF_INET6, (void *)addr, 96*4b22b933Srs200217 (void *)qdata.paddrbuf, 97*4b22b933Srs200217 sizeof (qdata.paddrbuf)) == NULL) 98*4b22b933Srs200217 return (NSS_NOTFOUND); 99*4b22b933Srs200217 qdata.af = AF_INET6; 100*4b22b933Srs200217 chptr = addrqryname; 101*4b22b933Srs200217 for (i = 0; i < 16; i++) 102*4b22b933Srs200217 { 103*4b22b933Srs200217 ch = ((char *)addr)[15-i]; 104*4b22b933Srs200217 chptr += snprintf(chptr, sizeof (addrqryname)-i*4, 105*4b22b933Srs200217 "%X.%X.", ch&0x0f, (ch>>4)&0x0f); 106*4b22b933Srs200217 } 107*4b22b933Srs200217 (void) strlcpy(chptr, "ip6.arpa.", sizeof (addrqryname)-64); 108*4b22b933Srs200217 } 109*4b22b933Srs200217 110*4b22b933Srs200217 _nss_mdns_updatecfg(be); 111*4b22b933Srs200217 return (_nss_mdns_querybyaddr(be, addrqryname, qdata.af, &qdata)); 112*4b22b933Srs200217 } 113*4b22b933Srs200217 114*4b22b933Srs200217 /*ARGSUSED*/ 115*4b22b933Srs200217 static nss_status_t 116*4b22b933Srs200217 _nss_mdns_getent(be, args) 117*4b22b933Srs200217 mdns_backend_ptr_t be; 118*4b22b933Srs200217 void *args; 119*4b22b933Srs200217 { 120*4b22b933Srs200217 return (NSS_UNAVAIL); 121*4b22b933Srs200217 } 122*4b22b933Srs200217 123*4b22b933Srs200217 /*ARGSUSED*/ 124*4b22b933Srs200217 static nss_status_t 125*4b22b933Srs200217 _nss_mdns_setent(be, dummy) 126*4b22b933Srs200217 mdns_backend_ptr_t be; 127*4b22b933Srs200217 void *dummy; 128*4b22b933Srs200217 { 129*4b22b933Srs200217 return (NSS_UNAVAIL); 130*4b22b933Srs200217 } 131*4b22b933Srs200217 132*4b22b933Srs200217 /*ARGSUSED*/ 133*4b22b933Srs200217 static nss_status_t 134*4b22b933Srs200217 _nss_mdns_endent(be, dummy) 135*4b22b933Srs200217 mdns_backend_ptr_t be; 136*4b22b933Srs200217 void *dummy; 137*4b22b933Srs200217 { 138*4b22b933Srs200217 return (NSS_UNAVAIL); 139*4b22b933Srs200217 } 140*4b22b933Srs200217 141*4b22b933Srs200217 /*ARGSUSED*/ 142*4b22b933Srs200217 static nss_status_t 143*4b22b933Srs200217 _nss_mdns_ipnodes_destr(be, dummy) 144*4b22b933Srs200217 mdns_backend_ptr_t be; 145*4b22b933Srs200217 void *dummy; 146*4b22b933Srs200217 { 147*4b22b933Srs200217 _nss_mdns_destr(be); 148*4b22b933Srs200217 return (NSS_SUCCESS); 149*4b22b933Srs200217 } 150*4b22b933Srs200217 151*4b22b933Srs200217 static mdns_backend_op_t ipnodes_ops[] = { 152*4b22b933Srs200217 _nss_mdns_ipnodes_destr, 153*4b22b933Srs200217 _nss_mdns_endent, 154*4b22b933Srs200217 _nss_mdns_setent, 155*4b22b933Srs200217 _nss_mdns_getent, 156*4b22b933Srs200217 getbyname, 157*4b22b933Srs200217 getbyaddr, 158*4b22b933Srs200217 }; 159*4b22b933Srs200217 160*4b22b933Srs200217 /*ARGSUSED*/ 161*4b22b933Srs200217 nss_backend_t * 162*4b22b933Srs200217 _nss_mdns_ipnodes_constr(dummy1, dummy2, dummy3) 163*4b22b933Srs200217 const char *dummy1, *dummy2, *dummy3; 164*4b22b933Srs200217 { 165*4b22b933Srs200217 return (_nss_mdns_constr(ipnodes_ops, 166*4b22b933Srs200217 sizeof (ipnodes_ops) / sizeof (ipnodes_ops[0]))); 167*4b22b933Srs200217 } 168*4b22b933Srs200217 169*4b22b933Srs200217 /*ARGSUSED*/ 170*4b22b933Srs200217 nss_status_t 171*4b22b933Srs200217 _nss_get_mdns_ipnodes_name(mdns_backend_ptr_t *be, void **bufp, size_t *sizep) 172*4b22b933Srs200217 { 173*4b22b933Srs200217 return (_nss_mdns_gethost_withttl(*bufp, *sizep, 1)); 174*4b22b933Srs200217 } 175