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/*
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel * Copyright 2007 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
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Name: getpathbylabel.c
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Description: Returns the global zone pathname corresponding
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * to the specified label. The pathname does
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * not need to match an existing file system object.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdio.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <string.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <unistd.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <errno.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/types.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <tsol/label.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdlib.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <zone.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/mntent.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/mnttab.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdarg.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * This structure is used to chain mntent structures into a list
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * and to cache stat information for each member of the list.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstruct mntlist {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *mntl_mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mntlist *mntl_next;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk};
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Return a pointer to the trailing suffix of full that follows the prefix
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * given by pref. If pref isn't a prefix of full, return NULL. Apply
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * pathname semantics to the prefix test, so that pref must match at a
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * component boundary.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic char *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkpathsuffix(char *full, char *pref)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int preflen;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (full == NULL || pref == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk preflen = strlen(pref);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strncmp(pref, full, preflen) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * pref is a substring of full. To be a subpath, it cannot cover a
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * partial component of full. The last clause of the test handles the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * special case of the root.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (full[preflen] != '\0' && full[preflen] != '/' && preflen > 1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (preflen == 1 && full[0] == '/')
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (full);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (full + preflen);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Return zero iff the path named by sub is a leading subpath
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * of the path named by full.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Treat null paths as matching nothing.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpksubpath(char *full, char *sub)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (pathsuffix(full, sub) == NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpktsol_mnt_free(struct mnttab *mnt)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mnt->mnt_special)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(mnt->mnt_special);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mnt->mnt_mountp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(mnt->mnt_mountp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mnt->mnt_fstype)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(mnt->mnt_fstype);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mnt->mnt_mntopts)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(mnt->mnt_mntopts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(mnt);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpktsol_mlist_free(struct mntlist *mlist)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mntlist *mlp;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel struct mntlist *oldmlp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel mlp = mlist;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel while (mlp) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *mnt = mlp->mntl_mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mnt)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mnt_free(mnt);
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel oldmlp = mlp;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel mlp = mlp->mntl_next;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel free(oldmlp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic struct mnttab *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkmntdup(struct mnttab *mnt)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *new;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new = (struct mnttab *)malloc(sizeof (*new));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (new == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_special = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_mountp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_fstype = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_mntopts = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_special = strdup(mnt->mnt_special);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (new->mnt_special == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mnt_free(new);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_mountp = strdup(mnt->mnt_mountp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (new->mnt_mountp == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mnt_free(new);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_fstype = strdup(mnt->mnt_fstype);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (new->mnt_fstype == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mnt_free(new);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new->mnt_mntopts = strdup(mnt->mnt_mntopts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (new->mnt_mntopts == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mnt_free(new);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (new);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic struct mntlist *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpktsol_mkmntlist(void)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk FILE *mounted;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mntlist *mntl;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mntlist *mntst = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
004388ebfdfe2ed7dfd2d153a876dfcc22d2c006casper if ((mounted = fopen(MNTTAB, "rF")) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk perror(MNTTAB);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk resetmnttab(mounted);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (getmntent(mounted, &mnt) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mntl = (struct mntlist *)malloc(sizeof (*mntl));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mntl == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mlist_free(mntst);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mntst = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mntl->mntl_mnt = mntdup((struct mnttab *)(&mnt));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mntl->mntl_mnt == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mlist_free(mntst);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mntst = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mntl->mntl_next = mntst;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mntst = mntl;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(mounted);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (mntst);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * This function attempts to convert local zone NFS mounted pathnames
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * into equivalent global zone NFS mounted pathnames. At present
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * it only works for automounted filesystems. It depends on the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * assumption that both the local and global zone automounters
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * share the same nameservices. It also assumes that any automount
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * map used by a local zone is available to the global zone automounter.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * The algorithm used consists of three phases.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 1. The local zone's mnttab is searched to find the automount map
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * with the closest matching mountpath.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 2. The matching autmount map name is looked up in the global zone's
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * mnttab to determine the path where it should be mounted in the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * global zone.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 3. A pathname covered by an appropiate autofs trigger mount in
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * the global zone is generated as the resolved pathname
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Among the things that can go wrong is that global zone doesn't have
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * a matching automount map or the mount was not done via the automounter.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Either of these cases return a NULL path.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define ZONE_OPT "zone="
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkgetnfspathbyautofs(struct mntlist *mlist, zoneid_t zoneid,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *autofs_mnt, char *globalpath, char *zonepath, int global_len)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mntlist *mlp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char zonematch[ZONENAME_MAX + 20];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char zonename[ZONENAME_MAX];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int longestmatch;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *mountmatch;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (autofs_mnt) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mountmatch = autofs_mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk longestmatch = strlen(mountmatch->mnt_mountp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * First we need to get the zonename to look for
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (zone_getattr(zoneid, ZONE_ATTR_NAME, zonename,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ZONENAME_MAX) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strncpy(zonematch, ZONE_OPT, sizeof (zonematch));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strlcat(zonematch, zonename, sizeof (zonematch));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Find the best match for an automount map that
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * corresponds to the local zone's pathname
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk longestmatch = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (mlp = mlist; mlp; mlp = mlp->mntl_next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *mnt = mlp->mntl_mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int matchfound;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *token;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *lasts;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char mntopts[MAXPATHLEN];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (subpath(globalpath, mnt->mnt_mountp) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(mnt->mnt_fstype, MNTTYPE_AUTOFS))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk matchfound = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strncpy(mntopts, mnt->mnt_mntopts, MAXPATHLEN);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((token = strtok_r(mntopts, ",", &lasts)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(token, zonematch) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk matchfound = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else while ((token = strtok_r(NULL, ",",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk &lasts)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(token, zonematch) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk matchfound = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (matchfound) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk len = strlen(mnt->mnt_mountp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (len > longestmatch) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mountmatch = mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk longestmatch = len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (longestmatch == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Now we may have found the corresponding autofs mount
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Try to find the matching global zone autofs entry
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (mlp = mlist; mlp; mlp = mlp->mntl_next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char p[MAXPATHLEN];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t zp_len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t mp_len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *mnt = mlp->mntl_mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(mountmatch->mnt_special,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mnt->mnt_special) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(mnt->mnt_fstype, MNTTYPE_AUTOFS))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strstr(mnt->mnt_mntopts, ZONE_OPT) != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * OK, we have a matching global zone automap
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * so adjust the path for the global zone.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk zp_len = strlen(zonepath);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mp_len = strlen(mnt->mnt_mountp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strncpy(p, globalpath + zp_len, MAXPATHLEN);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If both global zone and zone-relative
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * mountpoint match, just use the same pathname
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strncmp(mnt->mnt_mountp, p, mp_len) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strncpy(globalpath, p, global_len);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strncpy(p, globalpath, MAXPATHLEN);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strncpy(globalpath, mnt->mnt_mountp,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk global_len);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strlcat(globalpath,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk p + strlen(mountmatch->mnt_mountp),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk global_len);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel/*
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel * Find the pathname for the entry in mlist that corresponds to the
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel * file named by path (i.e., that names a mount table entry for the
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel * file system in which path lies).
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel *
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel * Return 0 is there an error.
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel */
e1dfad11282f1a85298f6361995ffb5d098c2630jparcelstatic int
e1dfad11282f1a85298f6361995ffb5d098c2630jparcelgetglobalpath(const char *path, zoneid_t zoneid, struct mntlist *mlist,
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel char *globalpath)
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel{
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel struct mntlist *mlp;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel char lofspath[MAXPATHLEN];
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel char zonepath[MAXPATHLEN];
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel int longestmatch;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel struct mnttab *mountmatch;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel if (zoneid != GLOBAL_ZONEID) {
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel char *prefix;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel if ((prefix = getzonerootbyid(zoneid)) == NULL) {
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel (void) strncpy(zonepath, prefix, MAXPATHLEN);
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel (void) strlcpy(globalpath, prefix, MAXPATHLEN);
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel (void) strlcat(globalpath, path, MAXPATHLEN);
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel free(prefix);
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel } else {
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel (void) strlcpy(globalpath, path, MAXPATHLEN);
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel for (;;) {
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel longestmatch = 0;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel for (mlp = mlist; mlp; mlp = mlp->mntl_next) {
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel struct mnttab *mnt = mlp->mntl_mnt;
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel int len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (subpath(globalpath, mnt->mnt_mountp) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk len = strlen(mnt->mnt_mountp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (len > longestmatch) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mountmatch = mnt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk longestmatch = len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Handle interesting mounts.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((strcmp(mountmatch->mnt_fstype, MNTTYPE_NFS) == 0) ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (strcmp(mountmatch->mnt_fstype, MNTTYPE_AUTOFS) == 0)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (zoneid > GLOBAL_ZONEID) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mnttab *m = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(mountmatch->mnt_fstype,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk MNTTYPE_AUTOFS) == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk m = mountmatch;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (getnfspathbyautofs(mlist, zoneid, m,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk globalpath, zonepath, MAXPATHLEN) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (strcmp(mountmatch->mnt_fstype, MNTTYPE_LOFS) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * count up what's left
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int remainder;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk remainder = strlen(globalpath) - longestmatch;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (remainder > 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk path = pathsuffix(globalpath,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mountmatch->mnt_mountp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strlcpy(lofspath, path, MAXPATHLEN);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strlcpy(globalpath, mountmatch->mnt_special,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk MAXPATHLEN);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (remainder > 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strlcat(globalpath, lofspath,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk MAXPATHLEN);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((zoneid > GLOBAL_ZONEID) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (strncmp(path, "/home/", strlen("/home/")) == 0)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char zonename[ZONENAME_MAX];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If this is a cross-zone reference to
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * a home directory, it must be corrected.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * We should only get here if the zone's
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * automounter hasn't yet mounted its
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * autofs trigger on /home.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Since it is likely to do so in the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * future, we will assume that the global
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * zone already has an equivalent autofs
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * mount established. By convention,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * this should be mounted at the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * /zone/<zonename>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (zone_getattr(zoneid, ZONE_ATTR_NAME,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk zonename, ZONENAME_MAX) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(globalpath, MAXPATHLEN,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "/zone/%s%s", zonename, path);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * This function is only useful for global zone callers
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * It uses the global zone mnttab to translate local zone pathnames
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * into global zone pathnames.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkchar *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkgetpathbylabel(const char *path_name, char *resolved_path, size_t bufsize,
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel const bslabel_t *sl)
e1dfad11282f1a85298f6361995ffb5d098c2630jparcel{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char ret_path[MAXPATHLEN]; /* pathname to return */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk zoneid_t zoneid;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct mntlist *mlist;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (getzoneid() != GLOBAL_ZONEID) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk errno = EINVAL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (path_name[0] != '/') { /* need absolute pathname */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk errno = EINVAL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (resolved_path == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk errno = EINVAL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((zoneid = getzoneidbylabel(sl)) == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Construct the list of mounted file systems.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((mlist = tsol_mkmntlist()) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (getglobalpath(path_name, zoneid, mlist, ret_path) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mlist_free(mlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tsol_mlist_free(mlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strlen(ret_path) >= bufsize) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk errno = EFAULT;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (strcpy(resolved_path, ret_path));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* end getpathbylabel() */