usr/src/lib/libbsm/common/au_open.c
author jpk
Fri, 24 Mar 2006 12:29:20 -0800
changeset 1676 37f4a3e2bd99
parent 0 68f95e015346
child 6812 febeba71273d
permissions -rw-r--r--
PSARC/2002/762 Layered Trusted Solaris PSARC/2005/060 TSNET: Trusted Networking with Security Labels PSARC/2005/259 Layered Trusted Solaris Label Interfaces PSARC/2005/573 Solaris Trusted Extensions for Printing PSARC/2005/691 Trusted Extensions for Device Allocation PSARC/2005/723 Solaris Trusted Extensions Filesystem Labeling PSARC/2006/009 Labeled Auditing PSARC/2006/155 Trusted Extensions RBAC Changes PSARC/2006/191 is_system_labeled 6293271 Zone processes should use zone_kcred instead of kcred 6394554 integrate Solaris Trusted Extensions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/time.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <bsm/audit.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <bsm/libbsm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <bsm/audit_record.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * Open an audit record = find a free descriptor and pass it back.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * The descriptors are in a "fixed" length array which is extended
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * whenever it gets full.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *  Since the expected frequency of copies is expected to be low,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *  and since realloc loses data if it fails to expand the buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 *  calloc() is used rather than realloc().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * AU_TABLE_MAX must be a integer multiple of AU_TABLE_LENGTH
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#define	AU_TABLE_LENGTH	16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#define	AU_TABLE_MAX	256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
extern int _mutex_lock(mutex_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
extern int _mutex_unlock(mutex_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static token_t	**au_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static int	au_d_length = 0;	/* current table length */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
static int	au_d_required_length = AU_TABLE_LENGTH; /* new table length */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static mutex_t  mutex_au_d = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#ifdef __STDC__
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
au_open(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
au_open()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	int d;			/* descriptor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	token_t	**au_d_new;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	_mutex_lock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	if (au_d_required_length > au_d_length) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		au_d_new = (token_t **)calloc(au_d_required_length,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
		    sizeof (au_d));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
		if (au_d_new == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
			au_d_required_length = au_d_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
			_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
		if (au_d_length > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
			(void) memcpy(au_d_new, au_d, au_d_length *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
			    sizeof (au_d));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
			free(au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
		au_d = au_d_new;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		au_d_length = au_d_required_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	for (d = 0; d < au_d_length; d++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		if (au_d[d] == (token_t *)0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
			au_d[d] = (token_t *)&au_d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
			_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
			return (d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	 * table full; make more room.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	 * AU_TABLE_MAX limits recursion.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	 * Logic here expects AU_TABLE_MAX to be multiple of AU_TABLE_LENGTH
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if (au_d_length >= AU_TABLE_MAX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	au_d_required_length += AU_TABLE_LENGTH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	return (au_open());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
 * Write to an audit descriptor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
 * Add the mbuf to the descriptor chain and free the chain passed in.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
#ifdef __STDC__
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
au_write(int d, token_t *m)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
au_write(d, m)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	int d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	token_t *m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	token_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	if (d < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	if (m == (token_t *)0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	_mutex_lock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	if ((d >= au_d_length) || (au_d[d] == (token_t *)0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	} else if (au_d[d] == (token_t *)&au_d) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		au_d[d] = m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	for (mp = au_d[d]; mp->tt_next != (token_t *)0; mp = mp->tt_next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	mp->tt_next = m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
 * Close an audit descriptor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
 * Use the second parameter to indicate if it should be written or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
#ifdef __STDC__
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
au_close(int d, int right, short e_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
au_close(d, right, e_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	int d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	int right;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	short e_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	short e_mod;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	struct timeval now;	/* current time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	adr_t adr;		/* adr header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	auditinfo_addr_t	audit_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	au_tid_addr_t	*host_info = &audit_info.ai_termid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	token_t *dchain;	/* mbuf chain which is the tokens */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	token_t *record;	/* mbuf chain which is the record */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	char data_header;	/* token type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	char version;		/* token version */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	char *buffer;		/* to build record into */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	int  byte_count;	/* bytes in the record */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	int   v;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	_mutex_lock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	if (d < 0 || d >= au_d_length ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	    ((dchain = au_d[d]) == (token_t *)0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	au_d[d] = (token_t *)0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	if (dchain == (token_t *)&au_d) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	 * If not to be written toss the record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	if (!right) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		while (dchain != (token_t *)0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
			record = dchain;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
			dchain = dchain->tt_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
			free(record->tt_data);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
			free(record);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	 * Count up the bytes used in the record.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	byte_count = sizeof (char) * 2 + sizeof (short) * 2 +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
			sizeof (int32_t) + sizeof (struct timeval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	for (record = dchain; record != (token_t *)0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		record = record->tt_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
			byte_count += record->tt_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
#define	HEADER_ID	AUT_HEADER64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
#define	HEADER_ID_EX	AUT_HEADER64_EX
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
#define	HEADER_ID	AUT_HEADER32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
#define	HEADER_ID_EX	AUT_HEADER32_EX
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	/* Use the extended headed if our host address can be determined. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	data_header = HEADER_ID;		/* Assume the worst */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	if (auditon(A_GETKAUDIT, (caddr_t)&audit_info,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	    sizeof (audit_info)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		int	have_valid_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		if (host_info->at_type == AU_IPv6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
			have_valid_addr = IN6_IS_ADDR_UNSPECIFIED(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
			    (in6_addr_t *)host_info->at_addr) ? 0 : 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
			have_valid_addr = (host_info->at_addr[0] ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
			    htonl(INADDR_ANY)) ? 0 : 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		if (have_valid_addr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			data_header = HEADER_ID_EX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
			byte_count += sizeof (int32_t) + host_info->at_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	 * Build the header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	buffer = malloc((size_t)byte_count);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	(void) gettimeofday(&now, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	version = TOKEN_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	e_mod = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	adr_start(&adr, buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	adr_char(&adr, &data_header, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	adr_int32(&adr, (int32_t *)&byte_count, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	adr_char(&adr, &version, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	adr_short(&adr, &e_type, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	adr_short(&adr, &e_mod, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	if (data_header == HEADER_ID_EX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		adr_int32(&adr, (int32_t *)&host_info->at_type, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		adr_char(&adr, (char *)&host_info->at_addr[0],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		    (int)host_info->at_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	adr_int64(&adr, (int64_t *)&now, 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	adr_int32(&adr, (int32_t *)&now, 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	 * Tack on the data, and free the tokens.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	 * We're not supposed to know how adr works, but ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	while (dchain != (token_t *)0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		(void) memcpy(adr.adr_now, dchain->tt_data, dchain->tt_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		adr.adr_now += dchain->tt_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		record = dchain;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
		dchain = dchain->tt_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		free(record->tt_data);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		free(record);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	 * Send it down to the system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	v = audit((caddr_t)buffer, byte_count);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	free(buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	_mutex_unlock(&mutex_au_d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	return (v);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
}