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-- |
2712 | 1 |
/* |
2 |
* CDDL HEADER START |
|
3 |
* |
|
4 |
* The contents of this file are subject to the terms of the |
|
5 |
* Common Development and Distribution License (the "License"). |
|
6 |
* You may not use this file except in compliance with the License. |
|
7 |
* |
|
8 |
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
9 |
* or http://www.opensolaris.org/os/licensing. |
|
10 |
* See the License for the specific language governing permissions |
|
11 |
* and limitations under the License. |
|
12 |
* |
|
13 |
* When distributing Covered Code, include this CDDL HEADER in each |
|
14 |
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
15 |
* If applicable, add the following below this CDDL HEADER, with the |
|
16 |
* fields enclosed by brackets "[]" replaced with your own identifying |
|
17 |
* information: Portions Copyright [yyyy] [name of copyright owner] |
|
18 |
* |
|
19 |
* CDDL HEADER END |
|
20 |
*/ |
|
7675
df8814607da7
PSARC/2008/490 pmadvise/pldd unresolved link map flag
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents:
5041
diff
changeset
|
21 |
|
2712 | 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 | 24 |
* Use is subject to license terms. |
25 |
*/ |
|
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 | 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 | 136 |
|
137 |
char * |
|
138 |
Pbrandname(struct ps_prochandle *P, char *buf, size_t buflen) |
|
139 |
{ |
|
140 |
long addr; |
|
141 |
||
142 |
if ((addr = Pgetauxval(P, AT_SUN_BRANDNAME)) == -1) |
|
143 |
return (NULL); |
|
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 | 146 |
return (NULL); |
147 |
||
148 |
return (buf); |
|
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 |
} |