1*11861SMarek.Pospisil@Sun.COM /*
2*11861SMarek.Pospisil@Sun.COM * CDDL HEADER START
3*11861SMarek.Pospisil@Sun.COM *
4*11861SMarek.Pospisil@Sun.COM * The contents of this file are subject to the terms of the
5*11861SMarek.Pospisil@Sun.COM * Common Development and Distribution License (the "License").
6*11861SMarek.Pospisil@Sun.COM * You may not use this file except in compliance with the License.
7*11861SMarek.Pospisil@Sun.COM *
8*11861SMarek.Pospisil@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*11861SMarek.Pospisil@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*11861SMarek.Pospisil@Sun.COM * See the License for the specific language governing permissions
11*11861SMarek.Pospisil@Sun.COM * and limitations under the License.
12*11861SMarek.Pospisil@Sun.COM *
13*11861SMarek.Pospisil@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*11861SMarek.Pospisil@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*11861SMarek.Pospisil@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*11861SMarek.Pospisil@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*11861SMarek.Pospisil@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*11861SMarek.Pospisil@Sun.COM *
19*11861SMarek.Pospisil@Sun.COM * CDDL HEADER END
20*11861SMarek.Pospisil@Sun.COM */
21*11861SMarek.Pospisil@Sun.COM /*
22*11861SMarek.Pospisil@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23*11861SMarek.Pospisil@Sun.COM * Use is subject to license terms.
24*11861SMarek.Pospisil@Sun.COM */
25*11861SMarek.Pospisil@Sun.COM
26*11861SMarek.Pospisil@Sun.COM #include <sys/param.h>
27*11861SMarek.Pospisil@Sun.COM #include <sys/types.h>
28*11861SMarek.Pospisil@Sun.COM #include <sys/kmem.h>
29*11861SMarek.Pospisil@Sun.COM #include <c2/audit.h>
30*11861SMarek.Pospisil@Sun.COM #include <c2/audit_kernel.h>
31*11861SMarek.Pospisil@Sun.COM
32*11861SMarek.Pospisil@Sun.COM
33*11861SMarek.Pospisil@Sun.COM /* process audit data (pad) cache */
34*11861SMarek.Pospisil@Sun.COM kmem_cache_t *au_pad_cache;
35*11861SMarek.Pospisil@Sun.COM
36*11861SMarek.Pospisil@Sun.COM /*
37*11861SMarek.Pospisil@Sun.COM * increment audit path reference count
38*11861SMarek.Pospisil@Sun.COM */
39*11861SMarek.Pospisil@Sun.COM void
au_pathhold(struct audit_path * app)40*11861SMarek.Pospisil@Sun.COM au_pathhold(struct audit_path *app)
41*11861SMarek.Pospisil@Sun.COM {
42*11861SMarek.Pospisil@Sun.COM atomic_add_32(&app->audp_ref, 1);
43*11861SMarek.Pospisil@Sun.COM }
44*11861SMarek.Pospisil@Sun.COM
45*11861SMarek.Pospisil@Sun.COM /*
46*11861SMarek.Pospisil@Sun.COM * decrement audit path reference count
47*11861SMarek.Pospisil@Sun.COM */
48*11861SMarek.Pospisil@Sun.COM void
au_pathrele(struct audit_path * app)49*11861SMarek.Pospisil@Sun.COM au_pathrele(struct audit_path *app)
50*11861SMarek.Pospisil@Sun.COM {
51*11861SMarek.Pospisil@Sun.COM if (atomic_add_32_nv(&app->audp_ref, -1) > 0)
52*11861SMarek.Pospisil@Sun.COM return;
53*11861SMarek.Pospisil@Sun.COM kmem_free(app, app->audp_size);
54*11861SMarek.Pospisil@Sun.COM }
55*11861SMarek.Pospisil@Sun.COM
56*11861SMarek.Pospisil@Sun.COM /*
57*11861SMarek.Pospisil@Sun.COM * allocate a new auditpath
58*11861SMarek.Pospisil@Sun.COM * newsect = increment sections count,
59*11861SMarek.Pospisil@Sun.COM * charincr = change in strings storage
60*11861SMarek.Pospisil@Sun.COM */
61*11861SMarek.Pospisil@Sun.COM
62*11861SMarek.Pospisil@Sun.COM struct audit_path *
au_pathdup(const struct audit_path * oldapp,int newsect,int charincr)63*11861SMarek.Pospisil@Sun.COM au_pathdup(const struct audit_path *oldapp, int newsect, int charincr)
64*11861SMarek.Pospisil@Sun.COM {
65*11861SMarek.Pospisil@Sun.COM struct audit_path *newapp;
66*11861SMarek.Pospisil@Sun.COM int i, alloc_size, oldlen;
67*11861SMarek.Pospisil@Sun.COM char *oldcp, *newcp;
68*11861SMarek.Pospisil@Sun.COM
69*11861SMarek.Pospisil@Sun.COM newsect = (newsect != 0);
70*11861SMarek.Pospisil@Sun.COM oldcp = oldapp->audp_sect[0];
71*11861SMarek.Pospisil@Sun.COM oldlen = (oldapp->audp_sect[oldapp->audp_cnt] - oldcp);
72*11861SMarek.Pospisil@Sun.COM alloc_size = sizeof (struct audit_path) +
73*11861SMarek.Pospisil@Sun.COM (oldapp->audp_cnt + newsect) * sizeof (char *) +
74*11861SMarek.Pospisil@Sun.COM oldlen + charincr;
75*11861SMarek.Pospisil@Sun.COM
76*11861SMarek.Pospisil@Sun.COM newapp = kmem_alloc(alloc_size, KM_SLEEP);
77*11861SMarek.Pospisil@Sun.COM newapp->audp_ref = 1;
78*11861SMarek.Pospisil@Sun.COM newapp->audp_size = alloc_size;
79*11861SMarek.Pospisil@Sun.COM
80*11861SMarek.Pospisil@Sun.COM newapp->audp_cnt = oldapp->audp_cnt + newsect;
81*11861SMarek.Pospisil@Sun.COM newcp = (char *)(&newapp->audp_sect[newapp->audp_cnt + 1]);
82*11861SMarek.Pospisil@Sun.COM for (i = 0; i <= oldapp->audp_cnt; i++) {
83*11861SMarek.Pospisil@Sun.COM newapp->audp_sect[i] = newcp +
84*11861SMarek.Pospisil@Sun.COM (oldapp->audp_sect[i] - oldcp);
85*11861SMarek.Pospisil@Sun.COM }
86*11861SMarek.Pospisil@Sun.COM /*
87*11861SMarek.Pospisil@Sun.COM * if this is a new section, set its end
88*11861SMarek.Pospisil@Sun.COM * if this is an extended section, reset its end
89*11861SMarek.Pospisil@Sun.COM */
90*11861SMarek.Pospisil@Sun.COM newapp->audp_sect[newapp->audp_cnt] = newcp + oldlen + charincr;
91*11861SMarek.Pospisil@Sun.COM /* copy all of the old strings */
92*11861SMarek.Pospisil@Sun.COM bcopy(oldcp, newcp, oldlen);
93*11861SMarek.Pospisil@Sun.COM
94*11861SMarek.Pospisil@Sun.COM return (newapp);
95*11861SMarek.Pospisil@Sun.COM }
96*11861SMarek.Pospisil@Sun.COM
97*11861SMarek.Pospisil@Sun.COM /*ARGSUSED1*/
98*11861SMarek.Pospisil@Sun.COM static int
au_pad_const(void * vpad,void * priv,int flags)99*11861SMarek.Pospisil@Sun.COM au_pad_const(void *vpad, void *priv, int flags)
100*11861SMarek.Pospisil@Sun.COM {
101*11861SMarek.Pospisil@Sun.COM p_audit_data_t *pad = vpad;
102*11861SMarek.Pospisil@Sun.COM
103*11861SMarek.Pospisil@Sun.COM mutex_init(&pad->pad_lock, NULL, MUTEX_DEFAULT, NULL);
104*11861SMarek.Pospisil@Sun.COM
105*11861SMarek.Pospisil@Sun.COM return (0);
106*11861SMarek.Pospisil@Sun.COM }
107*11861SMarek.Pospisil@Sun.COM
108*11861SMarek.Pospisil@Sun.COM /*ARGSUSED1*/
109*11861SMarek.Pospisil@Sun.COM static void
au_pad_destr(void * vpad,void * priv)110*11861SMarek.Pospisil@Sun.COM au_pad_destr(void *vpad, void *priv)
111*11861SMarek.Pospisil@Sun.COM {
112*11861SMarek.Pospisil@Sun.COM p_audit_data_t *pad = vpad;
113*11861SMarek.Pospisil@Sun.COM
114*11861SMarek.Pospisil@Sun.COM mutex_destroy(&pad->pad_lock);
115*11861SMarek.Pospisil@Sun.COM }
116*11861SMarek.Pospisil@Sun.COM
117*11861SMarek.Pospisil@Sun.COM void
au_pad_init()118*11861SMarek.Pospisil@Sun.COM au_pad_init()
119*11861SMarek.Pospisil@Sun.COM {
120*11861SMarek.Pospisil@Sun.COM au_pad_cache = kmem_cache_create("audit_proc",
121*11861SMarek.Pospisil@Sun.COM sizeof (p_audit_data_t), 0, au_pad_const, au_pad_destr,
122*11861SMarek.Pospisil@Sun.COM NULL, NULL, NULL, 0);
123*11861SMarek.Pospisil@Sun.COM }
124