xref: /illumos-gate/usr/src/cmd/sgs/libconv/common/audit.c (revision 43449cdcd0600512dd862537f2cf014140dd0844)
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  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #include	<string.h>
27 #include	<link.h>
28 #include	"_conv.h"
29 #include	"audit_msg.h"
30 
31 #define	BINDSZ	CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
32 		MSG_LA_FLG_BINDTO_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
33 		MSG_LA_FLG_BINDFROM_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
34 		CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
35 
36 /*
37  * Ensure that Conv_la_bind_buf_t is large enough:
38  *
39  * BINDSZ is the real minimum size of the buffer required by conv_la_bind().
40  * However, Conv_la_bind_buf_t uses CONV_LA_BIND_BUFSIZE to set the
41  * buffer size. We do things this way because the definition of BINDSZ uses
42  * information that is not available in the environment of other programs
43  * that include the conv.h header file.
44  */
45 #if (CONV_LA_BIND_BUFSIZE != BINDSZ) && !defined(__lint)
46 #define	REPORT_BUFSIZE BINDSZ
47 #include "report_bufsize.h"
48 #error "CONV_LA_BIND_BUFSIZE does not match BINDSZ"
49 #endif
50 
51 /*
52  * String conversion routine for la_objopen() return flags.
53  */
54 const char *
55 conv_la_bind(uint_t bind, Conv_la_bind_buf_t *la_bind_buf)
56 {
57 	static const Val_desc vda[] = {
58 		{ LA_FLG_BINDTO,	MSG_LA_FLG_BINDTO },
59 		{ LA_FLG_BINDFROM,	MSG_LA_FLG_BINDFROM },
60 		{ 0,			0 }
61 	};
62 	static CONV_EXPN_FIELD_ARG conv_arg = {
63 	    NULL, sizeof (la_bind_buf->buf), NULL };
64 
65 	if (bind == 0)
66 		return (MSG_ORIG(MSG_GBL_ZERO));
67 
68 	conv_arg.buf = la_bind_buf->buf;
69 	conv_arg.oflags = conv_arg.rflags = bind;
70 
71 	(void) conv_expn_field(&conv_arg, vda, 0);
72 
73 	return ((const char *)la_bind_buf->buf);
74 }
75 
76 #define	SEARCHSZ CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
77 		MSG_LA_SER_ORIG_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
78 		MSG_LA_SER_LIBPATH_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
79 		MSG_LA_SER_RUNPATH_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
80 		MSG_LA_SER_DEFAULT_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
81 		MSG_LA_SER_CONFIG_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
82 		MSG_LA_SER_SECURE_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
83 		CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
84 
85 /*
86  * Ensure that Conv_la_search_buf_t is large enough:
87  *
88  * SEARCHSZ is the real minimum size of the buffer required by conv_la_search().
89  * However, Conv_la_search_buf_t uses CONV_LA_SEARCH_BUFSIZE to set the
90  * buffer size. We do things this way because the definition of SEARCHSZ uses
91  * information that is not available in the environment of other programs
92  * that include the conv.h header file.
93  */
94 #if (CONV_LA_SEARCH_BUFSIZE != SEARCHSZ) && !defined(__lint)
95 #define	REPORT_BUFSIZE SEARCHSZ
96 #include "report_bufsize.h"
97 #error "CONV_LA_SEARCH_BUFSIZE does not match SEARCHSZ"
98 #endif
99 
100 /*
101  * String conversion routine for la_objsearch() flags.
102  */
103 const char *
104 conv_la_search(uint_t search, Conv_la_search_buf_t *la_search_buf)
105 {
106 	static const Val_desc vda[] = {
107 		{ LA_SER_ORIG,		MSG_LA_SER_ORIG },
108 		{ LA_SER_LIBPATH,	MSG_LA_SER_LIBPATH },
109 		{ LA_SER_RUNPATH,	MSG_LA_SER_RUNPATH },
110 		{ LA_SER_DEFAULT,	MSG_LA_SER_DEFAULT },
111 		{ LA_SER_CONFIG,	MSG_LA_SER_CONFIG },
112 		{ LA_SER_SECURE,	MSG_LA_SER_SECURE },
113 		{ 0,			0 }
114 	};
115 	static CONV_EXPN_FIELD_ARG conv_arg = {
116 	    NULL, sizeof (la_search_buf->buf), NULL };
117 
118 	if (search == 0)
119 		return (MSG_ORIG(MSG_GBL_NULL));
120 
121 	conv_arg.buf = la_search_buf->buf;
122 	conv_arg.oflags = conv_arg.rflags = search;
123 
124 	(void) conv_expn_field(&conv_arg, vda, 0);
125 
126 	return ((const char *)la_search_buf->buf);
127 }
128 
129 /*
130  * String conversion routine for la_objopen() return flags.
131  */
132 
133 /*
134  * String conversion routine for la_activity() flags.
135  */
136 const char *
137 conv_la_activity(uint_t request, Conv_fmt_flags_t fmt_flags,
138     Conv_inv_buf_t *inv_buf)
139 {
140 	static const Msg	requests[LA_ACT_MAX] = {
141 		MSG_LA_ACT_CONSISTENT,	/* MSG_ORIG(MSG_LA_ACT_CONSISTENT) */
142 		MSG_LA_ACT_ADD,		/* MSG_ORIG(MSG_LA_ACT_ADD) */
143 		MSG_LA_ACT_DELETE	/* MSG_ORIG(MSG_LA_ACT_DELETE) */
144 	};
145 	static const conv_ds_msg_t ds_requests = {
146 	    CONV_DS_MSG_INIT(LA_ACT_CONSISTENT, requests) };
147 
148 	static const conv_ds_t	*ds[] = { CONV_DS_ADDR(ds_requests), NULL };
149 
150 	return (conv_map_ds(ELFOSABI_NONE, EM_NONE, request, ds, fmt_flags,
151 	    inv_buf));
152 }
153 
154 #define	SYMBSZ	CONV_EXPN_FIELD_DEF_PREFIX_SIZE + \
155 		MSG_LA_SYMB_NOPLTENTER_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
156 		MSG_LA_SYMB_NOPLTEXIT_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
157 		MSG_LA_SYMB_STRUCTCALL_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
158 		MSG_LA_SYMB_DLSYM_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
159 		MSG_LA_SYMB_ALTVALUE_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \
160 		CONV_INV_BUFSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE
161 
162 /*
163  * Ensure that Conv_la_symbind_buf_t is large enough:
164  *
165  * SYMBSZ is the real minimum size of the buffer required by conv_la_symbind().
166  * However, Conv_la_symbind_buf_t uses CONV_LA_SYMB_BUFSIZE to set the
167  * buffer size. We do things this way because the definition of SYMBSZ uses
168  * information that is not available in the environment of other programs
169  * that include the conv.h header file.
170  */
171 #if (CONV_LA_SYMBIND_BUFSIZE != SYMBSZ) && !defined(__lint)
172 #define	REPORT_BUFSIZE SYMBSZ
173 #include "report_bufsize.h"
174 #error "CONV_LA_SYMBIND_BUFSIZE does not match SYMBSZ"
175 #endif
176 
177 /*
178  * String conversion routine for la_symbind() flags.
179  */
180 const char *
181 conv_la_symbind(uint_t symbind, Conv_la_symbind_buf_t *la_symbind_buf)
182 {
183 	static const Val_desc vda[] = {
184 		{ LA_SYMB_NOPLTENTER,	MSG_LA_SYMB_NOPLTENTER },
185 		{ LA_SYMB_NOPLTEXIT,	MSG_LA_SYMB_NOPLTEXIT },
186 		{ LA_SYMB_STRUCTCALL,	MSG_LA_SYMB_STRUCTCALL },
187 		{ LA_SYMB_DLSYM,	MSG_LA_SYMB_DLSYM },
188 		{ LA_SYMB_ALTVALUE,	MSG_LA_SYMB_ALTVALUE },
189 		{ 0,			0 }
190 	};
191 	static CONV_EXPN_FIELD_ARG conv_arg = {
192 	    NULL, sizeof (la_symbind_buf->buf), NULL };
193 
194 	if (symbind == 0)
195 		return (MSG_ORIG(MSG_GBL_NULL));
196 
197 	conv_arg.buf = la_symbind_buf->buf;
198 	conv_arg.oflags = conv_arg.rflags = symbind;
199 
200 	(void) conv_expn_field(&conv_arg, vda, 0);
201 
202 	return ((const char *)la_symbind_buf->buf);
203 }
204