xref: /illumos-gate/usr/src/lib/libbsm/common/adr.c (revision 437220cd296f6d8b6654d6d52508b40b1e2d1ac7)
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  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 /*
29  * Adr memory based encoding
30  */
31 
32 #include <sys/types.h>
33 #include <bsm/audit.h>
34 #include <bsm/libbsm.h>
35 #include <bsm/audit_record.h>
36 
37 void
38 #ifdef __STDC__
39 adr_start(adr_t *adr, char *p)
40 #else
41 adr_start(adr, p)
42 	adr_t *adr;
43 	char *p;
44 #endif
45 {
46 	adr->adr_stream = p;
47 	adr->adr_now = p;
48 }
49 
50 int
51 #ifdef __STDC__
52 adr_count(adr_t *adr)
53 #else
54 adr_count(adr)
55 	adr_t *adr;
56 #endif
57 {
58 	return (((intptr_t)adr->adr_now) - ((intptr_t)adr->adr_stream));
59 }
60 
61 
62 /*
63  * adr_char - pull out characters
64  */
65 void
66 #ifdef __STDC__
67 adr_char(adr_t *adr, char *cp, int count)
68 #else
69 adr_char(adr, cp, count)
70 	adr_t *adr;
71 	char *cp;
72 	int count;
73 #endif
74 {
75 	while (count-- > 0)
76 		*adr->adr_now++ = *cp++;
77 }
78 
79 /*
80  * adr_short - pull out shorts
81  */
82 void
83 #ifdef __STDC__
84 adr_short(adr_t *adr, short *sp, int count)
85 #else
86 adr_short(adr, sp, count)
87 	adr_t *adr;
88 	short *sp;
89 	int count;
90 #endif
91 {
92 
93 	for (; count-- > 0; sp++) {
94 		*adr->adr_now++ = (char)((*sp >> 8) & 0x00ff);
95 		*adr->adr_now++ = (char)(*sp & 0x00ff);
96 	}
97 }
98 
99 /*
100  * adr_int32 - pull out uint32
101  */
102 #pragma weak adr_long = adr_int32
103 #ifdef __STDC__
104 void adr_long(adr_t *adr, int32_t *lp, int count);
105 void
106 adr_int32(adr_t *adr, int32_t *lp, int count)
107 #else
108 void adr_long();
109 void
110 adr_int32(adr, lp, count)
111 	adr_t *adr;
112 	int32_t *lp;
113 	int count;
114 #endif
115 {
116 	int i;		/* index for counting */
117 	uint32_t l;		/* value for shifting */
118 
119 	for (; count-- > 0; lp++) {
120 		for (i = 0, l = *(uint32_t *)lp; i < 4; i++) {
121 			*adr->adr_now++ =
122 				(char)((uint32_t)(l & 0xff000000) >> 24);
123 			l <<= 8;
124 		}
125 	}
126 }
127 
128 /*
129  * adr_int64 - pull out uint64_t
130  */
131 void
132 #ifdef __STDC__
133 adr_int64(adr_t *adr, int64_t *lp, int count)
134 #else
135 adr_int64(adr, lp, count)
136 	adr_t *adr;
137 	int64_t *lp;
138 	int count;
139 #endif
140 {
141 	int i;		/* index for counting */
142 	uint64_t l;	/* value for shifting */
143 
144 	for (; count-- > 0; lp++) {
145 		for (i = 0, l = *(uint64_t *)lp; i < 8; i++) {
146 			*adr->adr_now++ = (char)
147 				((uint64_t)(l & 0xff00000000000000ULL) >> 56);
148 			l <<= 8;
149 		}
150 	}
151 }
152