28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna/*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * CDDL HEADER START
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * The contents of this file are subject to the terms of the
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Common Development and Distribution License (the "License").
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * You may not use this file except in compliance with the License.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * or http://www.opensolaris.org/os/licensing.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * See the License for the specific language governing permissions
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * and limitations under the License.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * When distributing Covered Code, include this CDDL HEADER in each
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * If applicable, add the following below this CDDL HEADER, with the
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * fields enclosed by brackets "[]" replaced with your own identifying
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * information: Portions Copyright [yyyy] [name of copyright owner]
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * CDDL HEADER END
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna/*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Use is subject to license terms.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna/*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Authorization checking:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * These functions check 'vntsd' authorization to access guest consoles.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * The mechanism used is Solaris authorizations. The local client (telnet)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * process requesting the connection to a console is verified to have the
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * required authorization.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Authorizations available are to access the console of any/all guests or to
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * access the consoles of a specific console group. A client connecting to the
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * console through telnet must have the appropriate authorization from file
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * /etc/security/auth_attr.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * The all-consoles authorization is added during vntsd installation:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * solaris.vntsd.consoles:::Access All LDoms Guest Consoles::
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Example of a specific console group authorization based on the name of the
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * console group (added manually by a user with 'vntsd.grant' authorization,
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * such as 'root'); the group name in this example is "ldg1" :
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * solaris.vntsd.console-ldg1:::Access Specific LDoms Guest Console::
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Specific users are authorized with usermod(1M). To add an authorization
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * (to /etc/user_attr) type a command similar to this (when user NOT
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * logged in):
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * To authorize a user 'user1' to access all guest consoles:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * # usermod -A solaris.vntsd.consoles user1
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#include <sys/types.h> /* uid_t */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#include <sys/param.h> /* MAXNAMELEN */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#include <pwd.h> /* getpw*() */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#include <auth_attr.h> /* chkauthattr() */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#include <secdb.h> /* chkauthattr() */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#include <ucred.h> /* getpeerucred() */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#include <errno.h> /* errno */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#define VNTSD_AUTH_ALLCONS "solaris.vntsd.consoles" /* all-consoles auth */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#define VNTSD_AUTH_GRPCONS "solaris.vntsd.console-" /* cons-group auth */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna#define VNTSD_AUTH_PREFIXLEN 32 /* max len of prefix */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna/*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * socket_peer_euid()
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Return the effective UID (EUID) of the socket peer.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * If none, return -1.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Parameters:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * sock_fd The socket fd of a locally-connected socket (mapped to a pid)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Returns:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * EUID if OK
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * -1 on failure or unknown EUID (passed on from ucred_geteuid()).
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnastatic uid_t
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnasocket_peer_euid(int sock_fd)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna{
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna int rc;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna uid_t peer_euid;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna ucred_t *ucredp = NULL;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* Get info on the peer on the other side of the socket */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna rc = getpeerucred(sock_fd, &ucredp);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if (rc == -1) {
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* If errno is EINVAL, it's probably a non-local socket peer */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return ((uid_t)-1);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna }
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* Extract effective UID (EUID) info for the socket peer process */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna peer_euid = ucred_geteuid(ucredp);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna ucred_free(ucredp);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* Return EUID */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (peer_euid);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna}
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna/*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * auth_check_username()
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Check vntsd console authorization, given a user account.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Parameters:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * username The name of a user account to check authorization
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * group_name The name of the console group to check authorization. The max
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * length of group name is MAXPATHLEN.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Returns:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * 0 if OK (authorized), 1 on authorization failure.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnastatic int
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnaauth_check_username(char *username, char *group_name)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna{
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna int auth_granted = 0;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna char authname[VNTSD_AUTH_PREFIXLEN + MAXPATHLEN];
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna size_t len = VNTSD_AUTH_PREFIXLEN + MAXPATHLEN;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* Sanity check: */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if ((username == NULL) || (username[0] == '\0') ||
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna (group_name == NULL) || (group_name[0] == '\0')) {
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (1); /* error (bad parameter) */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna }
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna (void) snprintf(authname, len, VNTSD_AUTH_GRPCONS"%s", group_name);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Do authorization checking.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * First, check if the user is authorized access to all consoles. If it
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * fails, check authorization to the specific console group.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna auth_granted = chkauthattr(VNTSD_AUTH_ALLCONS, username);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if (auth_granted)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (0);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna auth_granted = chkauthattr(authname, username);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if (auth_granted)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (0);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (1);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna}
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna/*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * auth_check_euid()
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Check vntsd console authorization, given a EUID.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Parameters:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * euid The effective UID of a user account to check authorization
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * group_name The name of the console group to check authorization
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Returns:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * 0 if OK (authorized), 1 on authorization failure.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnastatic int
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnaauth_check_euid(uid_t euid, char *group_name)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna{
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna struct passwd *passwdp = NULL;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna char *username = NULL;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* If EUID is -1, then it's unknown, so fail */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if (euid == (uid_t)-1) {
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (1);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna }
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* Map EUID to user name */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna passwdp = getpwuid(euid);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if (passwdp == NULL) { /* lookup failed */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (1);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna }
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna username = passwdp->pw_name;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* Do authorization check: */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (auth_check_username(username, group_name));
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna}
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna/*
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * auth_check_fd()
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Check vntsd authorization, given a fd of a socket. The socket fd is mapped
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * to a pid (and should not be used for remote connections).
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Parameters:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * sock_fd The socket fd of a locally-connected socket (mapped to a pid)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * group_name The name of the console group to check authorization
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna *
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Returns:
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * B_TRUE if OK (authorized), B_FALSE on authorization failure.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnaboolean_t
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnaauth_check_fd(int sock_fd, char *group_name)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna{
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna uid_t peer_euid;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna int rv;
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna peer_euid = socket_peer_euid(sock_fd);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if (peer_euid == (uid_t)-1) { /* unknown EUID */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (B_FALSE);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna }
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna /* Do authorization check: */
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna rv = auth_check_euid(peer_euid, group_name);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna if (rv != 0) {
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (B_FALSE);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna }
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna return (B_TRUE);
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna}