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.
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.
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]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
29 #include <sys/types.h>
40 * Hash table support routines.
42 typedef struct hash_obj Hash_obj
;
43 typedef struct hash_ent Hash_ent
;
44 typedef struct hash_tbl Hash_tbl
;
52 * Each unique object (identified by dev/inode pair) is maintained as a hash
53 * object. This descriptor identifies the object (file or directory), whether
54 * it has an alternate, or represents a non-existent object.
57 Half o_flags
; /* object identification */
58 Hash_tbl
*o_tbl
; /* its dev/inode table */
59 char *o_alter
; /* any alternate path */
60 Word o_calter
; /* and its conf offset */
61 char *o_path
; /* the objects real path */
62 Lword o_info
; /* information for cache */
63 /* consistency checks */
67 * Each element of a hash table is maintained as a hash entry. Each element
68 * points to a unique hash object. Many elements can point to the same hash
69 * object (as is the case with linked files). Elements on the string table
70 * hash lists identify their directory id, either the directory itself, or the
71 * files that belong to the directory. These directory and file entries are
72 * what will be converted into object descriptors in the final cache file.
75 Hash_ent
*e_next
; /* next hash item */
76 Word e_hash
; /* hash value (or inode no.) */
77 Addr e_key
; /* name (or inode no.) */
78 int e_off
; /* offset of file in dirname */
79 Half e_id
; /* directory identifier */
80 Half e_flags
; /* entry specific flags */
81 Word e_cnt
; /* no. of files in directory */
82 Hash_ent
*e_dir
; /* files directory */
83 Hash_ent
*e_path
; /* files full path entry */
84 Hash_obj
*e_obj
; /* unique object */
85 Rtc_obj
*e_cobj
; /* final configuration object */
89 * Each hash table is maintained as a hash table descriptor. Each dev has a
90 * hash table of inodes, and all directory and file entries are also maintained
91 * on the string table hash table.
94 ulong_t t_ident
; /* dev no. for inode cache */
95 int t_size
; /* no. of buckets */
96 Hash_type t_type
; /* HASH_INT or HASH_STR */
97 Hash_ent
**t_entry
; /* entries */
100 #define HASH_FND_ENT 0x01 /* search for existing hash entry */
101 #define HASH_ADD_ENT 0x02 /* add hash entry */
104 * Environment variable support.
107 const char *e_str
; /* complete environment string */
108 size_t e_varsz
; /* variable size, ie. the LD_XXX part */
109 size_t e_totsz
; /* total string size */
114 * Filter/filtee association support. The filtees are a list of Hash_ent's.
117 Hash_ent
*f_fent
; /* filter */
118 const char *f_str
; /* filtee string and its associated */
119 size_t f_strsz
; /* size */
120 APlist
*f_filtee
; /* filtees */
124 * Global data for final configuration files construction.
126 typedef struct crle_desc
{
127 char *c_name
; /* calling program */
128 char *c_tempname
; /* temporary file, file descriptor */
129 int c_tempfd
; /* mmapped address and size */
132 Addr c_tempheadaddr
; /* Ptr to Rtc_head within c_tempaddr */
133 char *c_confil
; /* configuration file */
134 char *c_objdir
; /* current object directory for */
136 char *c_audit
; /* audit library name */
137 uint_t c_flags
; /* state flags for crle processing */
138 int c_dlflags
; /* current dldump(3dl) flags */
139 int c_strbkts
; /* internal hash table initialization */
140 int c_inobkts
; /* parameters */
141 uint_t c_dirnum
; /* no. of directories processed */
142 uint_t c_filenum
; /* no. of files processed */
143 uint_t c_hashstrnum
; /* no. of hashed strings to create */
144 Hash_tbl
*c_strtbl
; /* string table and size */
146 APlist
*c_inotbls
; /* list of inode tables */
147 const char *c_app
; /* specific application */
148 char *c_edlibpath
; /* ELF default library path */
149 char *c_adlibpath
; /* AOUT default library path */
150 char *c_eslibpath
; /* ELF secure library path */
151 char *c_aslibpath
; /* AOUT secure library path */
152 APlist
*c_env
; /* environment variables */
153 uint_t c_envnum
; /* and associated number */
154 APlist
*c_flt
; /* filter/filtee associations */
155 uint_t c_fltrnum
; /* and associated filter number */
156 uint_t c_fltenum
; /* and associated filtee number */
159 #define CRLE_CREAT 0x0001 /* config file creation required */
160 #define CRLE_ALTER 0x0002 /* alternative entries required */
161 #define CRLE_DUMP 0x0004 /* alternative create by dldump(3dl) */
162 #define CRLE_ADDID 0x0008 /* Add Rtc_id to head of new files */
163 #define CRLE_VERBOSE 0x0010 /* verbose mode */
164 #define CRLE_AOUT 0x0020 /* AOUT flag in effect */
165 #define CRLE_EXISTS 0x0040 /* config file already exists */
166 #define CRLE_DIFFDEV 0x0080 /* config file and temporary exist on */
167 /* different filesystems */
168 #define CRLE_CONFDEF 0x0100 /* configuration file is default */
169 #define CRLE_UPDATE 0x0200 /* update existing configuration file */
170 #define CRLE_RPLENV 0x0400 /* replaceable environment variable */
171 #define CRLE_PRMENV 0x0800 /* permanent environment variable */
173 #define CRLE_EDLIB 0x1000 /* default elf search path supplied */
174 #define CRLE_ESLIB 0x2000 /* default elf secure path supplied */
175 #define CRLE_ADLIB 0x4000 /* default AOUT search path supplied */
176 #define CRLE_ASLIB 0x8000 /* default AOUT secure path supplied */
178 #define AL_CNT_CRLE 10
181 * Return type code returned by inspectconfig()
184 INSCFG_RET_OK
= 0, /* Config file is OK */
185 INSCFG_RET_FAIL
= 1, /* Config file has a fatal problem */
186 INSCFG_RET_NEED64
= 2, /* 64-bit config seen by 32-bit crle */
192 extern int addlib(Crle_desc
*, char **, const char *);
193 extern int addenv(Crle_desc
*, const char *, uint_t
);
194 extern int depend(Crle_desc
*, const char *, Half
, GElf_Ehdr
*);
195 extern int dlflags(Crle_desc
*, const char *);
196 extern int dump(Crle_desc
*);
197 extern int genconfig(Crle_desc
*);
198 extern Hash_ent
*get_hash(Hash_tbl
*, Addr
, Half
, int);
199 extern int inspect(Crle_desc
*, const char *, Half
);
200 extern Hash_tbl
*make_hash(int, Hash_type
, ulong_t
);
201 extern INSCFG_RET
inspectconfig(Crle_desc
*, int);
202 extern int updateconfig(Crle_desc
*);
208 #endif /* __CRLE_H */