#include <sys/param.h>
#include <sys/types.h>
#include <sys/kmem.h>
#include <c2/audit.h>
#include <c2/audit_kernel.h>
kmem_cache_t *au_pad_cache;
void
au_pathhold(struct audit_path *app)
{
atomic_inc_32(&app->audp_ref);
}
void
au_pathrele(struct audit_path *app)
{
if (atomic_dec_32_nv(&app->audp_ref) > 0)
return;
kmem_free(app, app->audp_size);
}
struct audit_path *
au_pathdup(const struct audit_path *oldapp, int newsect, int charincr)
{
struct audit_path *newapp;
int i, alloc_size, oldlen;
char *oldcp, *newcp;
newsect = (newsect != 0);
oldcp = oldapp->audp_sect[0];
oldlen = (oldapp->audp_sect[oldapp->audp_cnt] - oldcp);
alloc_size = sizeof (struct audit_path) +
(oldapp->audp_cnt + newsect) * sizeof (char *) +
oldlen + charincr;
newapp = kmem_alloc(alloc_size, KM_SLEEP);
newapp->audp_ref = 1;
newapp->audp_size = alloc_size;
newapp->audp_cnt = oldapp->audp_cnt + newsect;
newcp = (char *)(&newapp->audp_sect[newapp->audp_cnt + 1]);
for (i = 0; i <= oldapp->audp_cnt; i++) {
newapp->audp_sect[i] = newcp +
(oldapp->audp_sect[i] - oldcp);
}
newapp->audp_sect[newapp->audp_cnt] = newcp + oldlen + charincr;
bcopy(oldcp, newcp, oldlen);
return (newapp);
}
struct audit_path *
au_pathmake(const char *path)
{
struct audit_path *app;
int alloc_size, len;
char *cp;
len = strlen(path) + 1;
alloc_size = sizeof (struct audit_path) + sizeof (char *) + len;
app = kmem_alloc(alloc_size, KM_SLEEP);
app->audp_ref = 1;
app->audp_size = alloc_size;
app->audp_cnt = 1;
cp = (char *)(&app->audp_sect[app->audp_cnt + 1]);
app->audp_sect[0] = cp;
app->audp_sect[1] = cp + len;
bcopy(path, cp, len);
return (app);
}
static int
au_pad_const(void *vpad, void *priv, int flags)
{
p_audit_data_t *pad = vpad;
mutex_init(&pad->pad_lock, NULL, MUTEX_DEFAULT, NULL);
return (0);
}
static void
au_pad_destr(void *vpad, void *priv)
{
p_audit_data_t *pad = vpad;
mutex_destroy(&pad->pad_lock);
}
void
au_pad_init()
{
au_pad_cache = kmem_cache_create("audit_proc",
sizeof (p_audit_data_t), 0, au_pad_const, au_pad_destr,
NULL, NULL, NULL, 0);
}