45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER START
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * The contents of this file are subject to the terms of the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Common Development and Distribution License (the "License").
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You may not use this file except in compliance with the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or http://www.opensolaris.org/os/licensing.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * See the License for the specific language governing permissions
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * and limitations under the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * When distributing Covered Code, include this CDDL HEADER in each
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If applicable, add the following below this CDDL HEADER, with the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * fields enclosed by brackets "[]" replaced with your own identifying
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * information: Portions Copyright [yyyy] [name of copyright owner]
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER END
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Use is subject to license terms.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#pragma ident "%Z%%M% %I% %E% SMI"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include "files_common.h"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <string.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <libtsnet.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <netinet/in.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * files/tsol_getrhent.c --
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * "files" backend for nsswitch "tnrhdb" database
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
cb5caa98562cf06753163f558cbcfe30b8f4673adjlcheck_addr(nss_XbyY_args_t *args, const char *line, int linelen)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl const char *limit, *linep, *keyp;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char prev;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl int ipv6;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
cb5caa98562cf06753163f558cbcfe30b8f4673adjl linep = line;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl limit = line + linelen;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl keyp = args->key.hostaddr.addr;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl prev = '\0';
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (strstr(linep, "\\:") != NULL)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl ipv6 = 1;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl else
cb5caa98562cf06753163f558cbcfe30b8f4673adjl ipv6 = 0;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * compare addr in
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * 192.168.120.6:public
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * fec0\:\:a00\:20ff\:fea0\:21f7:cipso
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * ':' is the seperator.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl while (*keyp && linep < limit && *keyp == *linep) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if ((ipv6 == 0 && *linep == ':') ||
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (ipv6 == 1 && prev != '\\' && *linep == ':'))
cb5caa98562cf06753163f558cbcfe30b8f4673adjl break;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl prev = *linep;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl keyp++;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl linep++;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (*keyp == '\0' && linep < limit && ((ipv6 == 0 && *linep == ':') ||
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (ipv6 == 1 && prev != '\\' && *linep == ':')))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
cb5caa98562cf06753163f558cbcfe30b8f4673adjlstatic void
cb5caa98562cf06753163f558cbcfe30b8f4673adjlescape_colon(const char *in, char *out) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl int i, j;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl for (i = 0, j = 0; in[i] != '\0'; i++) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (in[i] == ':') {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl out[j++] = '\\';
cb5caa98562cf06753163f558cbcfe30b8f4673adjl out[j++] = in[i];
cb5caa98562cf06753163f558cbcfe30b8f4673adjl } else
cb5caa98562cf06753163f558cbcfe30b8f4673adjl out[j++] = in[i];
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl out[j] = '\0';
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic nss_status_t
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkgetbyaddr(files_backend_ptr_t be, void *a)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nss_XbyY_args_t *argp = a;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char addr6[INET6_ADDRSTRLEN + 5]; /* 5 '\' for ':' */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl const char *addr = NULL;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nss_status_t rc;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (argp->key.hostaddr.addr == NULL ||
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (argp->key.hostaddr.type != AF_INET &&
cb5caa98562cf06753163f558cbcfe30b8f4673adjl argp->key.hostaddr.type != AF_INET6))
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSS_NOTFOUND);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (strchr(argp->key.hostaddr.addr, ':') != NULL) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /* IPV6 */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (argp->key.hostaddr.type == AF_INET)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSS_NOTFOUND);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl escape_colon(argp->key.hostaddr.addr, addr6);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /* save the key in original format */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl addr = argp->key.hostaddr.addr;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /* Replace the key with escaped format */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl argp->key.hostaddr.addr = addr6;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl } else {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /* IPV4 */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (argp->key.hostaddr.type == AF_INET6)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSS_NOTFOUND);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl rc = _nss_files_XY_all(be, argp, 1,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl argp->key.hostaddr.addr, check_addr);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /* restore argp->key.hostaddr.addr */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (addr)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl argp->key.hostaddr.addr = addr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (rc);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic files_backend_op_t tsol_rh_ops[] = {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _nss_files_destr,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _nss_files_endent,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _nss_files_setent,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _nss_files_getent_netdb,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk getbyaddr
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk};
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpknss_backend_t *
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* LINTED E_FUNC_ARG_UNUSED */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_nss_files_tnrhdb_constr(const char *dummy1, const char *dummy2,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* LINTED E_FUNC_ARG_UNUSED */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk const char *dummy3)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (_nss_files_constr(tsol_rh_ops,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk sizeof (tsol_rh_ops) / sizeof (tsol_rh_ops[0]), TNRHDB_PATH,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk NSS_LINELEN_TSOL_RH, NULL));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}