usr/src/lib/libproc/common/Pzone.c
author Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
Tue, 23 Sep 2008 22:32:10 -0700
changeset 7675 df8814607da7
parent 5041 usr/src/lib/libproc/common/Pbrand.c@8bd749a329c9
child 7898 aabf3b67d20c
permissions -rw-r--r--
PSARC/2008/490 pmadvise/pldd unresolved link map flag 6599704 libproc should look inside zones for objects
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     1
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     2
 * CDDL HEADER START
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     3
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     7
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    11
 * and limitations under the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    12
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    18
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    19
 * CDDL HEADER END
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    20
 */
7675
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    21
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    22
/*
7675
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    24
 * Use is subject to license terms.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    25
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    26
7675
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    27
#include <assert.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    28
#include <dlfcn.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    29
#include <errno.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    30
#include <libzonecfg.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    31
#include <link.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    32
#include <string.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    33
#include <strings.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    34
#include <sys/list.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    35
#include <sys/types.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    36
#include <sys/mkdev.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    37
#include <sys/mman.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    38
#include <sys/mnttab.h>
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    39
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    40
#include "Pcontrol.h"
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    41
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    42
struct path_node {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    43
	struct path_node	*pn_next;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    44
	char			*pn_path;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    45
};
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    46
typedef struct path_node path_node_t;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    47
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    48
static path_node_t *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    49
pn_push(path_node_t **pnp, char *path)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    50
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    51
	path_node_t *pn;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    52
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    53
	if ((pn = calloc(sizeof (path_node_t), 1)) == NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    54
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    55
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    56
	if ((pn->pn_path = strdup(path)) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    57
		free(pn);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    58
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    59
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    60
	pn->pn_next = *pnp;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    61
	return (*pnp = pn);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    62
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    63
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    64
static void
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    65
pn_free(path_node_t **pnp)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    66
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    67
	path_node_t *pn;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    68
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    69
	while (*pnp != NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    70
		pn = *pnp;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    71
		*pnp = pn->pn_next;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    72
		free(pn->pn_path);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    73
		free(pn);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    74
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    75
}
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    76
7675
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    77
static void
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    78
pn_free2(path_node_t **pn1, path_node_t **pn2)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    79
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    80
	pn_free(pn1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    81
	pn_free(pn2);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    82
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    83
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    84
static char *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    85
pn_pop(path_node_t **pnp, char *path)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    86
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    87
	path_node_t *pn;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    88
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    89
	if (*pnp == NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    90
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    91
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    92
	pn = *pnp;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    93
	*pnp = pn->pn_next;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    94
	pn->pn_next = NULL;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    95
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    96
	if (path == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    97
		pn_free(&pn);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    98
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
    99
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   100
	(void) strlcpy(path, pn->pn_path, PATH_MAX);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   101
	pn_free(&pn);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   102
	return (path);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   103
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   104
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   105
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   106
/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   107
 * Libzonecfg.so links against libproc, so libproc can't link against
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   108
 * libzonecfg.so.  Also, libzonecfg.so is optional and might not be
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   109
 * installed.  Hence instead of relying on linking to access libzonecfg.so,
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   110
 * we'll try dlopening it here.  This trick is borrowed from
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   111
 * libc`zone_get_id(), see that function for more detailed comments.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   112
 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   113
static int
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   114
i_zone_get_zonepath(char *zone_name, char *zonepath, size_t rp_sz)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   115
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   116
	typedef	int (*zone_get_zonepath_t)(char *, char *, size_t);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   117
	static zone_get_zonepath_t zone_get_zonepath_fp = NULL;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   118
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   119
	if (zone_get_zonepath_fp == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   120
		/* There's no harm in doing this multiple times. */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   121
		void *dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   122
		void *sym = (void *)(-1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   123
		if (dlhandle != NULL &&
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   124
		    (sym = dlsym(dlhandle, "zone_get_zonepath")) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   125
			sym = (void *)(-1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   126
			(void) dlclose(dlhandle);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   127
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   128
		zone_get_zonepath_fp = (zone_get_zonepath_t)sym;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   129
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   130
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   131
	/* If we've successfully loaded it, call the real function */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   132
	if (zone_get_zonepath_fp != (zone_get_zonepath_t)(-1))
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   133
		return (zone_get_zonepath_fp(zone_name, zonepath, rp_sz));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   134
	return (Z_NO_ZONE);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   135
}
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   136
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   137
char *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   138
Pbrandname(struct ps_prochandle *P, char *buf, size_t buflen)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   139
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   140
	long	addr;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   141
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   142
	if ((addr = Pgetauxval(P, AT_SUN_BRANDNAME)) == -1)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   143
		return (NULL);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   144
5041
8bd749a329c9 6599699 libproc sometimes fails to determine a processes brand
edp
parents: 2712
diff changeset
   145
	if (Pread_string(P, buf, buflen, addr) == -1)
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   146
		return (NULL);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   147
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   148
	return (buf);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   149
}
7675
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   150
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   151
/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   152
 * Get the zone name from the core file if we have it; look up the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   153
 * name based on the zone id if this is a live process.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   154
 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   155
char *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   156
Pzonename(struct ps_prochandle *P, char *s, size_t n)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   157
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   158
	if (P->state == PS_IDLE) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   159
		errno = ENODATA;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   160
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   161
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   162
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   163
	if (P->state == PS_DEAD) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   164
		if (P->core->core_zonename == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   165
			errno = ENODATA;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   166
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   167
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   168
		(void) strlcpy(s, P->core->core_zonename, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   169
	} else {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   170
		if (getzonenamebyid(P->status.pr_zoneid, s, n) < 0)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   171
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   172
		s[n - 1] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   173
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   174
	return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   175
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   176
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   177
char *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   178
Pzoneroot(struct ps_prochandle *P, char *s, size_t n)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   179
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   180
	char zname[ZONENAME_MAX], zpath[PATH_MAX], tmp[PATH_MAX];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   181
	int rv;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   182
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   183
	if (P->zoneroot != NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   184
		(void) strlcpy(s, P->zoneroot, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   185
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   186
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   187
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   188
	if ((Pzonename(P, zname, sizeof (zname)) == NULL) ||
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   189
	    (strcmp(zname, GLOBAL_ZONENAME) == 0)) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   190
		if ((P->zoneroot = strdup("")) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   191
			errno = ENOMEM;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   192
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   193
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   194
		dprintf("Pzoneroot defaulting to '%s'\n", GLOBAL_ZONENAME);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   195
		(void) strlcpy(s, P->zoneroot, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   196
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   197
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   198
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   199
	if (i_zone_get_zonepath(zname, zpath, sizeof (zpath)) != Z_OK) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   200
		if ((P->zoneroot = strdup("")) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   201
			errno = ENOMEM;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   202
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   203
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   204
		dprintf(
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   205
		    "Pzoneroot zone not found '%s', defaulting to '%s'\n",
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   206
		    zname, GLOBAL_ZONENAME);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   207
		(void) strlcpy(s, P->zoneroot, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   208
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   209
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   210
	(void) strlcat(zpath, "/root", sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   211
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   212
	if ((rv = resolvepath(zpath, tmp, sizeof (tmp) - 1)) < 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   213
		if ((P->zoneroot = strdup("")) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   214
			errno = ENOMEM;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   215
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   216
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   217
		dprintf(
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   218
		    "Pzoneroot can't access '%s:%s', defaulting to '%s'\n",
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   219
		    zname, zpath, GLOBAL_ZONENAME);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   220
		(void) strlcpy(s, P->zoneroot, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   221
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   222
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   223
	tmp[rv] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   224
	(void) strlcpy(zpath, tmp, sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   225
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   226
	if ((P->zoneroot = strdup(zpath)) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   227
		errno = ENOMEM;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   228
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   229
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   230
	dprintf("Pzoneroot found zone root '%s:%s'\n", zname, zpath);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   231
	(void) strlcpy(s, P->zoneroot, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   232
	return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   233
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   234
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   235
/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   236
 * Plofspath() takes a path, "path",  and removes any lofs components from
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   237
 * that path.  The resultant path (if different from the starting path)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   238
 * is placed in "s", which is limited to "n" characters, and the return
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   239
 * value is the pointer s.  If there are no lofs components in the path
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   240
 * the NULL is returned and s is not modified.  It's ok for "path" and
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   241
 * "s" to be the same pointer.  (ie, the results can be stored directly
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   242
 * in the input buffer.)  The path that is passed in must be an absolute
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   243
 * path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   244
 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   245
 * Example:
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   246
 *	if "path" == "/foo/bar", and "/candy/" is lofs mounted on "/foo/"
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   247
 *	then "/candy/bar/" will be written into "s" and "s" will be returned.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   248
 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   249
char *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   250
Plofspath(const char *path, char *s, size_t n)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   251
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   252
	char tmp[PATH_MAX + 1];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   253
	struct mnttab mt, mt_find;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   254
	FILE *fp;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   255
	char *p, *p2;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   256
	int rv;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   257
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   258
	dprintf("Plofspath path '%s'\n", path);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   259
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   260
	/* We only deal with absolute paths */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   261
	if (path[0] != '/')
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   262
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   263
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   264
	/* Open /etc/mnttab */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   265
	if ((fp = fopen(MNTTAB, "r")) == NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   266
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   267
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   268
	/* Make a copy of the path so that we can muck with it */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   269
	(void) strlcpy(tmp, path, sizeof (tmp) - 1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   270
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   271
	/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   272
	 * Use resolvepath() to make sure there are no consecutive or
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   273
	 * trailing '/'s in the path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   274
	 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   275
	if ((rv = resolvepath(tmp, tmp, sizeof (tmp) - 1)) >= 0)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   276
		tmp[rv] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   277
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   278
	/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   279
	 * So now we're going to search the path for any components that
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   280
	 * might be lofs mounts.  We'll start out search from the full
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   281
	 * path and then step back through each parent directly till
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   282
	 * we reach the root.  If we find a lofs mount point in the path
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   283
	 * then we'll replace the initial portion of the path (up
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   284
	 * to that mount point) with the source of that mount point
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   285
	 * and then start our search over again.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   286
	 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   287
	 * Here's some of the variables we're going to use:
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   288
	 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   289
	 *	tmp - A pointer to our working copy of the path.  Sometimes
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   290
	 *		this path will be divided into two strings by a
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   291
	 *		'\0' (NUL) character.  The first string is the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   292
	 *		component we're currently checking and the second
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   293
	 *		string is the path components we've already checked.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   294
	 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   295
	 *	p - A pointer to the last '/' seen in the string.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   296
	 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   297
	 *	p[1] - A pointer to the component of the string we've already
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   298
	 *		checked.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   299
	 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   300
	 * Initially, p will point to the end of our path and p[1] will point
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   301
	 * to an extra '\0' (NUL) that we'll append to the end of the string.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   302
	 * (This is why we declared tmp with a size of PATH_MAX + 1).
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   303
	 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   304
	p = &tmp[strlen(tmp)];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   305
	p[1] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   306
	for (;;) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   307
		/* Check if tmp is a mount point */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   308
		rewind(fp);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   309
		bzero(&mt_find, sizeof (mt_find));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   310
		mt_find.mnt_mountp = tmp;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   311
		rv = getmntany(fp, &mt, &mt_find);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   312
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   313
		/* We only care about lofs mount points */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   314
		if ((rv == 0) && (strcmp(mt.mnt_fstype, "lofs") == 0)) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   315
			char tmp2[PATH_MAX + 1];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   316
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   317
			/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   318
			 * We found a lofs mount.  Update the path that we're
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   319
			 * checking and start over.  This means append the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   320
			 * portion of the path we've already checked to the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   321
			 * source of the lofs mount and re-start this entire
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   322
			 * lofs resolution loop.  Use resolvepath() to make
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   323
			 * sure there are no consecutive or trailing '/'s
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   324
			 * in the path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   325
			 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   326
			(void) strlcpy(tmp2, mt.mnt_special, sizeof (tmp2) - 1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   327
			(void) strlcat(tmp2, "/", sizeof (tmp2) - 1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   328
			(void) strlcat(tmp2, &p[1], sizeof (tmp2) - 1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   329
			(void) strlcpy(tmp, tmp2, sizeof (tmp) - 1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   330
			if ((rv = resolvepath(tmp, tmp, sizeof (tmp) - 1)) >= 0)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   331
				tmp[rv] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   332
			p = &tmp[strlen(tmp)];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   333
			p[1] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   334
			continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   335
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   336
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   337
		/* No lofs mount found */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   338
		if ((p2 = strrchr(tmp, '/')) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   339
			char tmp2[PATH_MAX];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   340
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   341
			/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   342
			 * We know that tmp was an absolute path, so if we
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   343
			 * made it here we know that (p == tmp) and that
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   344
			 * (*p == '\0').  This means that we've managed
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   345
			 * to check the whole path and so we're done.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   346
			 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   347
			assert(p == tmp);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   348
			assert(p[0] == '\0');
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   349
			(void) fclose(fp);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   350
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   351
			/* Restore the leading '/' in the path */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   352
			p[0] = '/';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   353
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   354
			if (strcmp(tmp, path) == 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   355
				/* The path didn't change */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   356
				return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   357
			}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   358
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   359
			/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   360
			 * It's possible that lofs source path we just
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   361
			 * obtained contains a symbolic link.  Use
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   362
			 * resolvepath() to clean it up.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   363
			 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   364
			(void) strlcpy(tmp2, tmp, sizeof (tmp2));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   365
			if ((rv = resolvepath(tmp, tmp, sizeof (tmp) - 1)) >= 0)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   366
				tmp[rv] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   367
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   368
			/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   369
			 * It's always possible that our lofs source path is
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   370
			 * actually another lofs mount.  So call ourselves
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   371
			 * recursively to resolve that path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   372
			 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   373
			(void) Plofspath(tmp, tmp, PATH_MAX);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   374
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   375
			/* Copy out our final resolved lofs source path */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   376
			(void) strlcpy(s, tmp, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   377
			dprintf("Plofspath path result '%s'\n", s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   378
			return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   379
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   380
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   381
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   382
		 * So the path we just checked is not a lofs mount.  Next we
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   383
		 * want to check the parent path component for a lofs mount.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   384
		 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   385
		 * First, restore any '/' that we replaced with a '\0' (NUL).
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   386
		 * We can determine if we should do this by looking at p[1].
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   387
		 * If p[1] points to a '\0' (NUL) then we know that p points
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   388
		 * to the end of the string and there is no '/' to restore.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   389
		 * if p[1] doesn't point to a '\0' (NUL) then it points to
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   390
		 * the part of the path that we've already verified so there
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   391
		 * is a '/' to restore.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   392
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   393
		if (p[1] != '\0')
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   394
			p[0] = '/';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   395
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   396
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   397
		 * Second, replace the last '/' in the part of the path
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   398
		 * that we've already checked with a '\0' (NUL) so that
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   399
		 * when we loop around we check the parent component of the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   400
		 * path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   401
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   402
		p2[0] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   403
		p = p2;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   404
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   405
	/*NOTREACHED*/
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   406
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   407
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   408
/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   409
 * Pzonepath() - Way too much code to attempt to derive the full path of
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   410
 * an object within a zone.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   411
 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   412
 * Pzonepath() takes a path and attempts to resolve it relative to the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   413
 * root associated with the current process handle.  If it fails it will
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   414
 * not update the results string.  It is safe to specify the same pointer
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   415
 * for the file string and the results string.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   416
 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   417
 * Doing this resolution is more difficult than it initially sounds.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   418
 * We can't simply append the file path to the zone root, because in
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   419
 * a root directory, '..' is treated the same as '.'.  Also, symbolic
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   420
 * links that specify an absolute path need to be interpreted relative
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   421
 * to the zone root.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   422
 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   423
 * It seems like perhaps we could do a chroot(<zone root>) followed by a
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   424
 * resolvepath().  But we can't do this because chroot requires special
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   425
 * privileges and affects the entire process.  Perhaps if there was a
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   426
 * special version of resolvepath() which took an addition root path
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   427
 * we could use that, but this isn't ideal either.  The reason is
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   428
 * that we want to have special handling for native paths.  (A native path
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   429
 * is a path that begins with "/native/" or "/.SUNWnative/".)  Native
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   430
 * paths could be passed explicity to this function or could be embedded
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   431
 * in a symlink that is part of the path passed into this function.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   432
 * These paths are always lofs mounts of global zone paths, but lofs
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   433
 * mounts only exist when a zone is booted.  So if we were to try to do
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   434
 * a resolvepath() on a native path when the zone wasn't booted the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   435
 * resolvepath() would fail even though we know that the components
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   436
 * exists in the global zone.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   437
 *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   438
 * Given all these constraints, we just implement a path walking function
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   439
 * that resolves a file path relative to a zone root by manually inspecting
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   440
 * each of the path components and verifying its existence.  This means that
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   441
 * we must have access to the zone and that all the components of the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   442
 * path must exist for this operation to succeed.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   443
 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   444
char *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   445
Pzonepath(struct ps_prochandle *P, const char *path, char *s, size_t n)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   446
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   447
	char zroot[PATH_MAX], zpath[PATH_MAX], tmp[PATH_MAX], link[PATH_MAX];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   448
	path_node_t *pn_stack = NULL, *pn_links = NULL, *pn;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   449
	struct stat64 sb;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   450
	char *p;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   451
	int i, rv;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   452
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   453
	dprintf("Pzonepath lookup '%s'\n", path);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   454
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   455
	/* First lookup the zone root */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   456
	if (Pzoneroot(P, zroot, sizeof (zroot)) == NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   457
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   458
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   459
	/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   460
	 * Make a temporary copy of the path specified.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   461
	 * If it's a relative path then make it into an absolute path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   462
	 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   463
	tmp[0] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   464
	if (path[0] != '/')
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   465
		(void) strlcat(tmp, "/", sizeof (tmp));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   466
	(void) strlcat(tmp, path, sizeof (tmp));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   467
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   468
	/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   469
	 * If the path that was passed in is the zone root, we're done.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   470
	 * If the path that was passed in already contains the zone root
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   471
	 * then strip the zone root out and verify the rest of the path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   472
	 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   473
	if (strcmp(tmp, zroot) == 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   474
		(void) Plofspath(zroot, zroot, sizeof (zroot));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   475
		dprintf("Pzonepath found zone path (1) '%s'\n", zroot);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   476
		(void) strlcpy(s, zroot, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   477
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   478
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   479
	i = strlen(zroot);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   480
	if ((strncmp(tmp, zroot, i) == 0) && (tmp[i] == '/'))
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   481
		(void) memmove(tmp, tmp + i, strlen(tmp + i) + 1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   482
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   483
	/* If no path is passed in, then it maps to the zone root */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   484
	if (strlen(tmp) == 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   485
		(void) Plofspath(zroot, zroot, sizeof (zroot));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   486
		dprintf("Pzonepath found zone path (2) '%s'\n", zroot);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   487
		(void) strlcpy(s, zroot, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   488
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   489
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   490
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   491
	/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   492
	 * Push each path component that we plan to verify onto a stack of
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   493
	 * path components, with parent components at the top of the stack.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   494
	 * So for example, if we're going to verify the path /foo/bar/bang
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   495
	 * then our stack will look like:
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   496
	 *	foo	(top)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   497
	 *	bar
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   498
	 *	bang	(bottom)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   499
	 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   500
	while ((p = strrchr(tmp, '/')) != NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   501
		*p = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   502
		if (pn_push(&pn_stack, &p[1]) != NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   503
			continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   504
		pn_free(&pn_stack);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   505
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   506
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   507
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   508
	/* We're going to store the final zone relative path in zpath */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   509
	*zpath = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   510
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   511
	while (pn_pop(&pn_stack, tmp) != NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   512
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   513
		 * Drop zero length path components (which come from
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   514
		 * consecutive '/'s) and '.' path components.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   515
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   516
		if ((strlen(tmp) == 0) || (strcmp(tmp, ".") == 0))
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   517
			continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   518
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   519
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   520
		 * Check the current path component for '..', if found
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   521
		 * drop any previous path component.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   522
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   523
		if (strcmp(tmp, "..") == 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   524
			if ((p = strrchr(zpath, '/')) != NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   525
				*p = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   526
			continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   527
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   528
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   529
		/* The path we want to verify now is zpath + / + tmp. */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   530
		(void) strlcat(zpath, "/", sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   531
		(void) strlcat(zpath, tmp, sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   532
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   533
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   534
		 * Check if this is a native object.  A native object is an
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   535
		 * object from the global zone that is running in a branded
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   536
		 * zone.  These objects are lofs mounted into a zone.  So if a
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   537
		 * branded zone is not booted then lofs mounts won't be setup
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   538
		 * so we won't be able to find these objects.  Luckily, we know
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   539
		 * that they exist in the global zone with the same path sans
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   540
		 * the initial native component, so we'll just strip out the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   541
		 * native component here.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   542
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   543
		if ((strncmp(zpath, "/native", sizeof ("/native")) == 0) ||
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   544
		    (strncmp(zpath, "/.SUNWnative",
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   545
		    sizeof ("/.SUNWnative")) == 0)) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   546
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   547
			/* Free any cached symlink paths */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   548
			pn_free(&pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   549
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   550
			/* Reconstruct the path from our path component stack */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   551
			*zpath = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   552
			while (pn_pop(&pn_stack, tmp) != NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   553
				(void) strlcat(zpath, "/", sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   554
				(void) strlcat(zpath, tmp, sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   555
			}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   556
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   557
			/* Verify that the path actually exists */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   558
			rv = resolvepath(zpath, tmp, sizeof (tmp) - 1);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   559
			if (rv < 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   560
				dprintf("Pzonepath invalid native path '%s'\n",
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   561
				    zpath);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   562
				return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   563
			}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   564
			tmp[rv] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   565
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   566
			/* Return the path */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   567
			dprintf("Pzonepath found native path '%s'\n", tmp);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   568
			(void) Plofspath(tmp, tmp, sizeof (tmp));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   569
			(void) strlcpy(s, tmp, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   570
			return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   571
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   572
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   573
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   574
		 * Check if the path points to a symlink.  We do this
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   575
		 * explicitly since any absolute symlink needs to be
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   576
		 * interpreted relativly to the zone root and not "/".
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   577
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   578
		(void) strlcpy(tmp, zroot, sizeof (tmp));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   579
		(void) strlcat(tmp, zpath, sizeof (tmp));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   580
		if (lstat64(tmp, &sb) != 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   581
			pn_free2(&pn_stack, &pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   582
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   583
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   584
		if (!S_ISLNK(sb.st_mode)) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   585
			/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   586
			 * Since the lstat64() above succeeded we know that
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   587
			 * zpath exists, since this is not a symlink loop
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   588
			 * around and check the next path component.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   589
			 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   590
			continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   591
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   592
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   593
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   594
		 * Symlink allow for paths with loops.  Make sure
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   595
		 * we're not stuck in a loop.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   596
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   597
		for (pn = pn_links; pn != NULL; pn = pn->pn_next) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   598
			if (strcmp(zpath, pn->pn_path) != 0)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   599
				continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   600
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   601
			/* We have a loop.  Fail. */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   602
			dprintf("Pzonepath symlink loop '%s'\n", zpath);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   603
			pn_free2(&pn_stack, &pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   604
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   605
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   606
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   607
		/* Save this symlink path for future loop checks */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   608
		if (pn_push(&pn_links, zpath) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   609
			/* Out of memory */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   610
			pn_free2(&pn_stack, &pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   611
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   612
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   613
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   614
		/* Now follow the contents of the symlink */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   615
		bzero(link, sizeof (link));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   616
		if (readlink(tmp, link, sizeof (link)) == -1) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   617
			pn_free2(&pn_stack, &pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   618
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   619
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   620
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   621
		dprintf("Pzonepath following symlink '%s' -> '%s'\n",
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   622
		    zpath, link);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   623
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   624
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   625
		 * Push each path component of the symlink target onto our
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   626
		 * path components stack since we need to verify each one.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   627
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   628
		while ((p = strrchr(link, '/')) != NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   629
			*p = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   630
			if (pn_push(&pn_stack, &p[1]) != NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   631
				continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   632
			pn_free2(&pn_stack, &pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   633
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   634
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   635
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   636
		/* absolute or relative symlink? */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   637
		if (*link == '\0') {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   638
			/* Absolute symlink, nuke existing zpath. */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   639
			*zpath = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   640
			continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   641
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   642
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   643
		/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   644
		 * Relative symlink.  Push the first path component of the
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   645
		 * symlink target onto our stack for verification and then
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   646
		 * remove the current path component from zpath.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   647
		 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   648
		if (pn_push(&pn_stack, link) == NULL) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   649
			pn_free2(&pn_stack, &pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   650
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   651
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   652
		p = strrchr(zpath, '/');
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   653
		assert(p != NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   654
		*p = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   655
		continue;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   656
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   657
	pn_free(&pn_links);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   658
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   659
	/* Place the final result in zpath */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   660
	(void) strlcpy(tmp, zroot, sizeof (tmp));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   661
	(void) strlcat(tmp, zpath, sizeof (tmp));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   662
	(void) strlcpy(zpath, tmp, sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   663
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   664
	(void) Plofspath(zpath, zpath, sizeof (zpath));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   665
	dprintf("Pzonepath found zone path (3) '%s'\n", zpath);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   666
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   667
	(void) strlcpy(s, zpath, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   668
	return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   669
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   670
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   671
char *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   672
Pfindobj(struct ps_prochandle *P, const char *path, char *s, size_t n)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   673
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   674
	int len;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   675
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   676
	dprintf("Pfindobj '%s'\n", path);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   677
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   678
	/* We only deal with absolute paths */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   679
	if (path[0] != '/')
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   680
		return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   681
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   682
	/* First try to resolve the path to some zone */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   683
	if (Pzonepath(P, path, s, n) != NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   684
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   685
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   686
	/* If that fails resolve any lofs links in the path */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   687
	if (Plofspath(path, s, n) != NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   688
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   689
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   690
	/* If that fails then just see if the path exists */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   691
	if ((len = resolvepath(path, s, n)) > 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   692
		s[len] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   693
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   694
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   695
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   696
	return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   697
}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   698
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   699
char *
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   700
Pfindmap(struct ps_prochandle *P, map_info_t *mptr, char *s, size_t n)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   701
{
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   702
	file_info_t *fptr = mptr->map_file;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   703
	char buf[PATH_MAX];
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   704
	int len;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   705
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   706
	/* If it's already been explicity set return that */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   707
	if ((fptr != NULL) && (fptr->file_rname != NULL)) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   708
		(void) strlcpy(s, fptr->file_rname, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   709
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   710
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   711
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   712
	/* If it's the a.out segment, defer to the magical Pexecname() */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   713
	if ((P->map_exec == mptr) ||
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   714
	    (strcmp(mptr->map_pmap.pr_mapname, "a.out") == 0) ||
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   715
	    ((fptr != NULL) && (fptr->file_lname != NULL) &&
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   716
	    (strcmp(fptr->file_lname, "a.out") == 0))) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   717
		(void) Pexecname(P, buf, sizeof (buf));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   718
		(void) strlcpy(s, buf, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   719
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   720
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   721
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   722
	/* Try /proc first to get the real object name */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   723
	if ((Pstate(P) != PS_DEAD) && (mptr->map_pmap.pr_mapname[0] != '\0')) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   724
		(void) snprintf(buf, sizeof (buf), "%s/%d/path/%s",
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   725
		    procfs_path, (int)P->pid, mptr->map_pmap.pr_mapname);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   726
		if ((len = readlink(buf, buf, sizeof (buf))) > 0) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   727
			buf[len] = '\0';
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   728
			(void) Plofspath(buf, buf, sizeof (buf));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   729
			(void) strlcpy(s, buf, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   730
			return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   731
		}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   732
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   733
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   734
	/*
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   735
	 * If we couldn't get the name from /proc, take the lname and
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   736
	 * try to expand it on the current system to a real object path.
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   737
	 */
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   738
	fptr = mptr->map_file;
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   739
	if ((fptr != NULL) && (fptr->file_lname != NULL)) {
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   740
		(void) strlcpy(buf, fptr->file_lname, sizeof (buf));
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   741
		if (Pfindobj(P, buf, buf, sizeof (buf)) == NULL)
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   742
			return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   743
		(void) strlcpy(s, buf, n);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   744
		return (s);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   745
	}
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   746
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   747
	return (NULL);
df8814607da7 PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 5041
diff changeset
   748
}