1005d3febSMarek Pospisil /*
2005d3febSMarek Pospisil * CDDL HEADER START
3005d3febSMarek Pospisil *
4005d3febSMarek Pospisil * The contents of this file are subject to the terms of the
5005d3febSMarek Pospisil * Common Development and Distribution License (the "License").
6005d3febSMarek Pospisil * You may not use this file except in compliance with the License.
7005d3febSMarek Pospisil *
8005d3febSMarek Pospisil * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9005d3febSMarek Pospisil * or http://www.opensolaris.org/os/licensing.
10005d3febSMarek Pospisil * See the License for the specific language governing permissions
11005d3febSMarek Pospisil * and limitations under the License.
12005d3febSMarek Pospisil *
13005d3febSMarek Pospisil * When distributing Covered Code, include this CDDL HEADER in each
14005d3febSMarek Pospisil * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15005d3febSMarek Pospisil * If applicable, add the following below this CDDL HEADER, with the
16005d3febSMarek Pospisil * fields enclosed by brackets "[]" replaced with your own identifying
17005d3febSMarek Pospisil * information: Portions Copyright [yyyy] [name of copyright owner]
18005d3febSMarek Pospisil *
19005d3febSMarek Pospisil * CDDL HEADER END
20005d3febSMarek Pospisil */
21005d3febSMarek Pospisil /*
22005d3febSMarek Pospisil * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23005d3febSMarek Pospisil * Use is subject to license terms.
24005d3febSMarek Pospisil */
25005d3febSMarek Pospisil
26005d3febSMarek Pospisil #include <sys/param.h>
27005d3febSMarek Pospisil #include <sys/types.h>
28005d3febSMarek Pospisil #include <sys/kmem.h>
29005d3febSMarek Pospisil #include <c2/audit.h>
30005d3febSMarek Pospisil #include <c2/audit_kernel.h>
31005d3febSMarek Pospisil
32005d3febSMarek Pospisil
33005d3febSMarek Pospisil /* process audit data (pad) cache */
34005d3febSMarek Pospisil kmem_cache_t *au_pad_cache;
35005d3febSMarek Pospisil
36005d3febSMarek Pospisil /*
37005d3febSMarek Pospisil * increment audit path reference count
38005d3febSMarek Pospisil */
39005d3febSMarek Pospisil void
au_pathhold(struct audit_path * app)40005d3febSMarek Pospisil au_pathhold(struct audit_path *app)
41005d3febSMarek Pospisil {
42*1a5e258fSJosef 'Jeff' Sipek atomic_inc_32(&app->audp_ref);
43005d3febSMarek Pospisil }
44005d3febSMarek Pospisil
45005d3febSMarek Pospisil /*
46005d3febSMarek Pospisil * decrement audit path reference count
47005d3febSMarek Pospisil */
48005d3febSMarek Pospisil void
au_pathrele(struct audit_path * app)49005d3febSMarek Pospisil au_pathrele(struct audit_path *app)
50005d3febSMarek Pospisil {
51*1a5e258fSJosef 'Jeff' Sipek if (atomic_dec_32_nv(&app->audp_ref) > 0)
52005d3febSMarek Pospisil return;
53005d3febSMarek Pospisil kmem_free(app, app->audp_size);
54005d3febSMarek Pospisil }
55005d3febSMarek Pospisil
56005d3febSMarek Pospisil /*
57005d3febSMarek Pospisil * allocate a new auditpath
58005d3febSMarek Pospisil * newsect = increment sections count,
59005d3febSMarek Pospisil * charincr = change in strings storage
60005d3febSMarek Pospisil */
61005d3febSMarek Pospisil
62005d3febSMarek Pospisil struct audit_path *
au_pathdup(const struct audit_path * oldapp,int newsect,int charincr)63005d3febSMarek Pospisil au_pathdup(const struct audit_path *oldapp, int newsect, int charincr)
64005d3febSMarek Pospisil {
65005d3febSMarek Pospisil struct audit_path *newapp;
66005d3febSMarek Pospisil int i, alloc_size, oldlen;
67005d3febSMarek Pospisil char *oldcp, *newcp;
68005d3febSMarek Pospisil
69005d3febSMarek Pospisil newsect = (newsect != 0);
70005d3febSMarek Pospisil oldcp = oldapp->audp_sect[0];
71005d3febSMarek Pospisil oldlen = (oldapp->audp_sect[oldapp->audp_cnt] - oldcp);
72005d3febSMarek Pospisil alloc_size = sizeof (struct audit_path) +
73005d3febSMarek Pospisil (oldapp->audp_cnt + newsect) * sizeof (char *) +
74005d3febSMarek Pospisil oldlen + charincr;
75005d3febSMarek Pospisil
76005d3febSMarek Pospisil newapp = kmem_alloc(alloc_size, KM_SLEEP);
77005d3febSMarek Pospisil newapp->audp_ref = 1;
78005d3febSMarek Pospisil newapp->audp_size = alloc_size;
79005d3febSMarek Pospisil
80005d3febSMarek Pospisil newapp->audp_cnt = oldapp->audp_cnt + newsect;
81005d3febSMarek Pospisil newcp = (char *)(&newapp->audp_sect[newapp->audp_cnt + 1]);
82005d3febSMarek Pospisil for (i = 0; i <= oldapp->audp_cnt; i++) {
83005d3febSMarek Pospisil newapp->audp_sect[i] = newcp +
84005d3febSMarek Pospisil (oldapp->audp_sect[i] - oldcp);
85005d3febSMarek Pospisil }
86005d3febSMarek Pospisil /*
87005d3febSMarek Pospisil * if this is a new section, set its end
88005d3febSMarek Pospisil * if this is an extended section, reset its end
89005d3febSMarek Pospisil */
90005d3febSMarek Pospisil newapp->audp_sect[newapp->audp_cnt] = newcp + oldlen + charincr;
91005d3febSMarek Pospisil /* copy all of the old strings */
92005d3febSMarek Pospisil bcopy(oldcp, newcp, oldlen);
93005d3febSMarek Pospisil
94005d3febSMarek Pospisil return (newapp);
95005d3febSMarek Pospisil }
96005d3febSMarek Pospisil
97005d3febSMarek Pospisil /*ARGSUSED1*/
98005d3febSMarek Pospisil static int
au_pad_const(void * vpad,void * priv,int flags)99005d3febSMarek Pospisil au_pad_const(void *vpad, void *priv, int flags)
100005d3febSMarek Pospisil {
101005d3febSMarek Pospisil p_audit_data_t *pad = vpad;
102005d3febSMarek Pospisil
103005d3febSMarek Pospisil mutex_init(&pad->pad_lock, NULL, MUTEX_DEFAULT, NULL);
104005d3febSMarek Pospisil
105005d3febSMarek Pospisil return (0);
106005d3febSMarek Pospisil }
107005d3febSMarek Pospisil
108005d3febSMarek Pospisil /*ARGSUSED1*/
109005d3febSMarek Pospisil static void
au_pad_destr(void * vpad,void * priv)110005d3febSMarek Pospisil au_pad_destr(void *vpad, void *priv)
111005d3febSMarek Pospisil {
112005d3febSMarek Pospisil p_audit_data_t *pad = vpad;
113005d3febSMarek Pospisil
114005d3febSMarek Pospisil mutex_destroy(&pad->pad_lock);
115005d3febSMarek Pospisil }
116005d3febSMarek Pospisil
117005d3febSMarek Pospisil void
au_pad_init()118005d3febSMarek Pospisil au_pad_init()
119005d3febSMarek Pospisil {
120005d3febSMarek Pospisil au_pad_cache = kmem_cache_create("audit_proc",
121005d3febSMarek Pospisil sizeof (p_audit_data_t), 0, au_pad_const, au_pad_destr,
122005d3febSMarek Pospisil NULL, NULL, NULL, 0);
123005d3febSMarek Pospisil }
124