xref: /illumos-gate/usr/src/lib/libbsm/common/adr.c (revision 3db86aab)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 #ifndef lint
23 static char sccsid[] = "%Z%%M%	%I%	%E% SMI";
24 #endif
25 
26 /*
27  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
28  * Use is subject to license terms.
29  */
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 
33 /*
34  * Adr memory based encoding
35  */
36 
37 #include <sys/types.h>
38 #include <bsm/audit.h>
39 #include <bsm/libbsm.h>
40 #include <bsm/audit_record.h>
41 
42 void
43 #ifdef __STDC__
44 adr_start(adr_t *adr, char *p)
45 #else
46 adr_start(adr, p)
47 	adr_t *adr;
48 	char *p;
49 #endif
50 {
51 	adr->adr_stream = p;
52 	adr->adr_now = p;
53 }
54 
55 int
56 #ifdef __STDC__
57 adr_count(adr_t *adr)
58 #else
59 adr_count(adr)
60 	adr_t *adr;
61 #endif
62 {
63 	return (((intptr_t)adr->adr_now) - ((intptr_t)adr->adr_stream));
64 }
65 
66 
67 /*
68  * adr_char - pull out characters
69  */
70 void
71 #ifdef __STDC__
72 adr_char(adr_t *adr, char *cp, int count)
73 #else
74 adr_char(adr, cp, count)
75 	adr_t *adr;
76 	char *cp;
77 	int count;
78 #endif
79 {
80 	while (count-- > 0)
81 		*adr->adr_now++ = *cp++;
82 }
83 
84 /*
85  * adr_short - pull out shorts
86  */
87 void
88 #ifdef __STDC__
89 adr_short(adr_t *adr, short *sp, int count)
90 #else
91 adr_short(adr, sp, count)
92 	adr_t *adr;
93 	short *sp;
94 	int count;
95 #endif
96 {
97 
98 	for (; count-- > 0; sp++) {
99 		*adr->adr_now++ = (char)((*sp >> 8) & 0x00ff);
100 		*adr->adr_now++ = (char)(*sp & 0x00ff);
101 	}
102 }
103 
104 /*
105  * adr_int32 - pull out uint32
106  */
107 #pragma weak adr_long = adr_int32
108 #ifdef __STDC__
109 void adr_long(adr_t *adr, int32_t *lp, int count);
110 void
111 adr_int32(adr_t *adr, int32_t *lp, int count)
112 #else
113 void adr_long();
114 void
115 adr_int32(adr, lp, count)
116 	adr_t *adr;
117 	int32_t *lp;
118 	int count;
119 #endif
120 {
121 	int i;		/* index for counting */
122 	uint32_t l;		/* value for shifting */
123 
124 	for (; count-- > 0; lp++) {
125 		for (i = 0, l = *(uint32_t *)lp; i < 4; i++) {
126 			*adr->adr_now++ =
127 				(char)((uint32_t)(l & 0xff000000) >> 24);
128 			l <<= 8;
129 		}
130 	}
131 }
132 
133 /*
134  * adr_int64 - pull out uint64_t
135  */
136 void
137 #ifdef __STDC__
138 adr_int64(adr_t *adr, int64_t *lp, int count)
139 #else
140 adr_int64(adr, lp, count)
141 	adr_t *adr;
142 	int64_t *lp;
143 	int count;
144 #endif
145 {
146 	int i;		/* index for counting */
147 	uint64_t l;	/* value for shifting */
148 
149 	for (; count-- > 0; lp++) {
150 		for (i = 0, l = *(uint64_t *)lp; i < 8; i++) {
151 			*adr->adr_now++ = (char)
152 				((uint64_t)(l & 0xff00000000000000ULL) >> 56);
153 			l <<= 8;
154 		}
155 	}
156 }
157