xref: /onnv-gate/usr/src/lib/libadt_jni/auditxml_jni (revision 12692:4341b447c069)
14176Stz204579#!/usr/perl5/bin/perl -w
24176Stz204579#
34176Stz204579# CDDL HEADER START
44176Stz204579#
54176Stz204579# The contents of this file are subject to the terms of the
64176Stz204579# Common Development and Distribution License (the "License").
74176Stz204579# You may not use this file except in compliance with the License.
84176Stz204579#
94176Stz204579# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
104176Stz204579# or http://www.opensolaris.org/os/licensing.
114176Stz204579# See the License for the specific language governing permissions
124176Stz204579# and limitations under the License.
134176Stz204579#
144176Stz204579# When distributing Covered Code, include this CDDL HEADER in each
154176Stz204579# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
164176Stz204579# If applicable, add the following below this CDDL HEADER, with the
174176Stz204579# fields enclosed by brackets "[]" replaced with your own identifying
184176Stz204579# information: Portions Copyright [yyyy] [name of copyright owner]
194176Stz204579#
204176Stz204579# CDDL HEADER END
214176Stz204579#
224176Stz204579#
23*12692SAli.Bahrami@Oracle.COM# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
244176Stz204579#
254176Stz204579
264176Stz204579# auditxml_jni [-d] <xml input file>
274176Stz204579
284176Stz204579# auditxml takes the audit record description (.xml file) and
294176Stz204579# generates the files needed for the Java
304176Stz204579
314176Stz204579use auditxml;
324176Stz204579use Getopt::Std;
334176Stz204579use vars qw($opt_d);
344176Stz204579use strict;
354176Stz204579
364176Stz204579
374176Stz204579our $debug = 0; # normal use is to set via the file being parsed.
384176Stz204579               # <debug set="on"/> or <debug set="off"/> or <debug/>
394176Stz204579               # if the set attribute is omitted, debug state is toggled
404176Stz204579               # Override with appDebug, but toggle won't do what you
414176Stz204579               # want.
424176Stz204579my $appDebug = 0; # used after return from "new auditxml";
434176Stz204579
444176Stz204579my $genNotice = "
454176Stz204579DO NOT EDIT. This file is auto generated by the Solaris Audit
464176Stz204579system from adt.xml.
474176Stz204579
484176Stz204579See http://opensolaris.org/os/project/audit/
494176Stz204579";
504176Stz204579
514176Stz204579# trim leading/trailing newlines
524176Stz204579$genNotice =~ s/^\n//s;
534176Stz204579$genNotice =~ s/\n$//s;
544176Stz204579my $prog = $0; $prog =~ s|.*/||g;
554176Stz204579my $usage = "usage: $prog [-d] file.xml\n";
564176Stz204579
574176Stz204579getopts('d');
584176Stz204579
594176Stz204579$appDebug = $opt_d;
604176Stz204579
614176Stz204579my $uniLabel = "adr";
624176Stz204579my $xlateUniLabelInc = 0;
634176Stz204579
644176Stz204579die $usage if ($#ARGV < 0);
654176Stz204579
664176Stz204579# where everything comes from and where it goes:
674176Stz204579
684176Stz204579my $templatePath = './';
694176Stz204579my $javaPath     = $templatePath;
704176Stz204579my $bsmBuildPath = "../libbsm";
714176Stz204579
724176Stz204579my $jniBuildPath = "$javaPath";
734176Stz204579
744176Stz204579my $buildPathJ	 = "$jniBuildPath/com/sun/audit";
754176Stz204579my $buildPathJNI = "$jniBuildPath/common";
764176Stz204579
774176Stz204579my $auditEventJ = "$buildPathJ/AuditEvent.java";
784176Stz204579my $jniC = "$buildPathJNI/adt_jni_event.c";
794176Stz204579my $mapFile = "$jniBuildPath/common/mapfile-vers";
804176Stz204579
814176Stz204579my $doc = new auditxml ($ARGV[0]);  # input XML file
824176Stz204579
834176Stz204579$debug = $appDebug;
844176Stz204579
854176Stz204579my %jniEventTable = ();
864176Stz204579my %externalIdNo = ();
874176Stz204579my %msg_list = ();
884176Stz204579my %eventCode = ();
894176Stz204579
904176Stz204579readAuditEventFile("$bsmBuildPath/audit_event.txt");
914176Stz204579
924176Stz204579my $event;
934176Stz204579while ($event = $doc->getNextEvent()) {
944176Stz204579    my $eventId = $event->getId();
954176Stz204579    my $idNo = $event->getIdNo();
964176Stz204579    $externalIdNo{$eventId} = $idNo;
974176Stz204579    my $super;
984176Stz204579    my $omit = $event->getOmit();
994176Stz204579    my $eventType = '';
1004176Stz204579    if ($super = $event->getSuperClass()) {
1014176Stz204579	$event = $super;
1024176Stz204579	$eventType = 'instance';
1034176Stz204579    } else {
1044176Stz204579	$eventType = $event->getType();
1054176Stz204579    }
1064176Stz204579
1074176Stz204579    # c file table for translation
1084176Stz204579    generateTableC($event, $eventId, $eventType, undef, $omit);
1094176Stz204579}
1104176Stz204579
1114176Stz204579while (my $textList = $doc->getNextMsgId()) {
1124176Stz204579    generateMsgLists($textList);  # enum -> text mappings
1134176Stz204579}
1144176Stz204579
1154176Stz204579printJavaFiles($jniC, $auditEventJ, $buildPathJ, $mapFile);
1164176Stz204579
1174176Stz204579exit 0;
1184176Stz204579
1194176Stz204579
1204176Stz204579
1214176Stz204579sub printJavaFiles {
1224176Stz204579    my $jniFile = shift;
1234176Stz204579    my $javaFile = shift;
1244176Stz204579    my $subclassPath = shift;
1254176Stz204579    my $mapFile = shift;
1264176Stz204579
1274176Stz204579    # warning: time_t is equated to jlong since there is no
1284176Stz204579    # way to use sys/types.h in Java code.
1294176Stz204579    # java long is C long long, 64 bits.
1304176Stz204579    # java int is 32 bits.
1314176Stz204579
1324176Stz204579    my %java_jni = ('ADT_DATE'		=> ['long',	'jlong'],
1334176Stz204579		    'ADT_UINT'		=> ['int',	'jint'],
1344176Stz204579		    'ADT_INT'		=> ['int',	'jint'],
1354176Stz204579		    'ADT_INT32'		=> ['int',	'jint'],
1364176Stz204579		    'ADT_UID'		=> ['int',	'jint'],
1374176Stz204579		    'ADT_GID'		=> ['int',	'jint'],
1384176Stz204579		    'ADT_UIDSTAR'	=> ['int[]',	'jintArray'],
1394176Stz204579		    'ADT_GIDSTAR'	=> ['int[]',	'jintArray'],
1404176Stz204579		    'ADT_CHAR'		=> ['String',	'jchar'],
1414176Stz204579		    'ADT_CHARSTAR'	=> ['String',	'jstring'],
1424176Stz204579		    'ADT_CHAR2STAR'	=> ['String[]',	'jstring'],
1434176Stz204579		    'ADT_MSG'		=> ['int',	'jint'],
1444176Stz204579		    'ADT_PID'		=> ['int',	'jint'],
1454176Stz204579# ADT_PRIVSTAR omitted -- not implemented and the audit records that
1464176Stz204579# use it must be coded to emit no java.  We'll cross that bridge
1474176Stz204579# when someone in Java land needs to generate a priv token.
1484176Stz204579		    'ADT_LONG'		=> ['int',	'jint'],
1494176Stz204579		    'ADT_TERMIDSTAR'	=> ['String',	'jstring'],	# hostname -> termid
1504176Stz204579		    'ADT_ULONG'		=> ['int',	'jint'],
1514176Stz204579		    'ADT_UINT16'	=> ['int',	'jint'],
1524176Stz204579		    'ADT_UINT32'	=> ['int',	'jint'],
1534176Stz204579		    'ADT_UINT32STAR'	=> ['int[]',	'jintArray'],
1544176Stz204579# ADT_UINT32ARRAY omitted; no Java implementation yet
1554176Stz204579		    'ADT_UINT64'	=> ['long',	'jlong'],
1564176Stz204579		    'ADT_UINT64STAR'	=> ['long[]',	'jlongArray']
1574176Stz204579		   );
1584176Stz204579    my $noMemory = 'gettext("Out of memory")';
1594176Stz204579
1604176Stz204579    # open output files
1614176Stz204579    open (Cfile, ">$jniFile") or
1624176Stz204579	die "can't open output file ($jniFile): $!\n";
1634176Stz204579    open (Jfile, ">$javaFile") or
1644176Stz204579	die "can't open output file ($javaFile): $!\n";
1654176Stz204579    open (MapFile, ">$mapFile") or
1664176Stz204579	die "can't open output file ($mapFile): $!\n";
1674176Stz204579
1684176Stz204579    # write headers
1694176Stz204579    my $notice = $genNotice;
1704176Stz204579    $notice =~ s/\n/\n * /gs;
1714176Stz204579    $notice =~ s/\s+\n/\n/gs;
1724176Stz204579    print Cfile <<EOF;
1734176Stz204579/*
1744176Stz204579 * $notice
1754176Stz204579 */
1764176Stz204579
1774176Stz204579#include "../../libbsm/common/adt_xlate.h"
1784176Stz204579#include <jni.h>
1794176Stz204579#include "../com/sun/audit/AuditSession.h"	/* javah output */
1804176Stz204579#include "adt_jni.h"
1814176Stz204579#include <stdlib.h>
1824176Stz204579#include <string.h>
1834176Stz204579
1844176Stz204579static char *except_class = "java/lang/Exception";
1854176Stz204579
1864176Stz204579EOF
1874176Stz204579    print Jfile <<EOF;
1884176Stz204579/*
1894176Stz204579 * $notice
1904176Stz204579 */
1914176Stz204579
1924176Stz204579package com.sun.audit;
1934176Stz204579
1944176Stz204579public class AuditEvent {
1954176Stz204579	protected AuditSession sh;	// associated session object
1964176Stz204579
1974176Stz204579	public AuditEvent(AuditSession auSession)
1984176Stz204579	    throws Error
1994176Stz204579	{
2004176Stz204579
2014176Stz204579		sh = auSession;
2024176Stz204579	}
2034176Stz204579
2048844Sgww@eng.sun.com	// Manifest values: keep them in sync with generated <bsm/adt_event.h>.
2058844Sgww@eng.sun.com	// It is generated by \$SRC/lib/libbsm/auditxml
2068844Sgww@eng.sun.com
2078844Sgww@eng.sun.com	public static final int ADT_SUCCESS = 0;	// generated
2088844Sgww@eng.sun.com	public static final int ADT_FAILURE = -1;	// generated
2098844Sgww@eng.sun.com
2104176Stz204579	// See the subclasses of AuditEvent for mapping message codes
2114176Stz204579	// to events
2124176Stz204579EOF
2134176Stz204579
2144176Stz204579    my $notice_map = $genNotice;
2154176Stz204579    $notice_map =~ s/\n/\n# /gs;
2164176Stz204579    $notice_map =~ s/\s+\n/\n/gs;
2174176Stz204579    print MapFile <<EOF;
2184176Stz204579#
2194176Stz204579# $notice_map
2204176Stz204579#
2214176Stz204579
222*12692SAli.Bahrami@Oracle.COM\$mapfile_version 2
223*12692SAli.Bahrami@Oracle.COM
224*12692SAli.Bahrami@Oracle.COMSYMBOL_VERSION SUNWprivate_1.1 {
2254176Stz204579    global:
2264176Stz204579	c2j_pointer;
2274176Stz204579	j2c_pointer;
2284176Stz204579	Java_com_sun_audit_AuditSession_bsmAuditOn;
2294176Stz204579	Java_com_sun_audit_AuditSession_startSession;
2304176Stz204579	Java_com_sun_audit_AuditSession_endSession;
2314176Stz204579	Java_com_sun_audit_AuditSession_dupSession;
2324176Stz204579	Java_com_sun_audit_AuditSession_getSessionId;
2334176Stz204579	Java_com_sun_audit_AuditSession_exportSessionData;
2344428Stz204579	Java_com_sun_audit_AuditSession_sessionAttr;
2354176Stz204579
2364176Stz204579# One subclass of AuditEvent per audit record...
2374176Stz204579EOF
2384176Stz204579
2394176Stz204579    # generate java final int classes to line up with string/enums
2404176Stz204579
2414176Stz204579    foreach my $listName (sort keys %msg_list) {
2424176Stz204579        my $shortName = uc $listName;
2434176Stz204579        $shortName =~ s/_TEXT//;
2444176Stz204579        my ($listRef, $headref) = @{$msg_list{$listName}};
2454176Stz204579        my @listValue =  @$listRef;
2464176Stz204579        my ($header, $enumValue, $public, $deprecated) = @$headref;
2474176Stz204579        my $listValue;
2484176Stz204579
2494176Stz204579        print Jfile "\n\t// adt_$listName" . "\n\n";
2504176Stz204579        print Jfile "\tpublic static final int ADT_$shortName",
2514176Stz204579    		" = $enumValue;\n" if $enumValue;
2524176Stz204579
2534176Stz204579        next unless ($#listValue >= 0);
2544176Stz204579        print Jfile "\t// Deprecated message list\n" if $deprecated;
2554176Stz204579        foreach $listValue (@listValue) {
2564176Stz204579            my ($id, $text) = split(/\s*::\s*/, $listValue);
2574176Stz204579    	    print Jfile "\t// $text\n";
2584176Stz204579    	    print Jfile "\tpublic static final int ADT_$shortName";
2594176Stz204579	    print Jfile "_$id = $enumValue;\n";
2604176Stz204579    	    $enumValue++;
2614176Stz204579        }
2624176Stz204579    }
2634176Stz204579
2644176Stz204579    # generate event creation and access functions and event
2654176Stz204579    # generation for both Java and JNI
2664176Stz204579    # com.sun.audit.AuditEvent_xxx.java
2674176Stz204579    foreach my $eventId (sort keys %jniEventTable) {
2684176Stz204579	my ($ref1, $eventType, $allowedIds, $header) = @{$jniEventTable{$eventId}};
2694176Stz204579	$eventCode{$eventId} = -1 if ($eventType eq 'generic');
2704176Stz204579	my @entries = @$ref1;
2714176Stz204579	my $entries = $#entries;
2724176Stz204579	my $root = $eventId;
2734176Stz204579	$root =~ s/AUE_//;
2744176Stz204579	my $javaPutEvent = 'putEvent';
2754176Stz204579	my $putMethod = "_$root";
2764176Stz204579	$putMethod =~ s/_/_1/g;
2774176Stz204579
2784176Stz204579	my $jniPutEvent = "Java_com_sun_audit_AuditEvent$putMethod" . "_$javaPutEvent";
2794176Stz204579
2804176Stz204579	# the subclass file template isn't used; it may be needed to get
2814176Stz204579	# the right file header stuff in place.  The subclassPath is
2824176Stz204579	# the directory that contains 'em.
2834176Stz204579
2844176Stz204579	my $validSfile = 1;
2854176Stz204579	unless (open(Sfile, ">$subclassPath/AuditEvent_$root.java")) {
2864176Stz204579	    print STDERR "can't open class file AuditEvent_$root.java: $!\n";
2874176Stz204579	    $validSfile = 0;
2884176Stz204579	}
2894176Stz204579	if ($eventCode{"AUE_$root"}) {
2904176Stz204579	    if ($validSfile) {
2914176Stz204579		print Sfile <<EOF;
2924176Stz204579/*
2934176Stz204579 * $notice
2944176Stz204579 */
2954176Stz204579
2964176Stz204579package com.sun.audit;
2974176Stz204579
2984176Stz204579// audit event:  $eventId = $eventCode{"AUE_$root"}
2994176Stz204579
3004176Stz204579public class AuditEvent_$root extends AuditEvent {
3014176Stz204579
3024176Stz204579EOF
3034176Stz204579	    }
3044176Stz204579	} else {
3054176Stz204579	    print STDERR "no event code for $eventId.  Is audit_event current?\n";
3064176Stz204579	}
3074176Stz204579	my $nativeParameterList = '';
3084176Stz204579	my $jniParameterList = '';
3094176Stz204579	my $specParameterList = '';
3104176Stz204579	my $jniStorageList = '';
3114176Stz204579	my $needCleanupTarget = 0;
3124176Stz204579	my $jniFreeList = '';
3134176Stz204579
3144176Stz204579	my $haveStringDef = 0;
3154176Stz204579	my $haveCDef = 0;
3164176Stz204579	my $haveLengthDef = 0;
3174176Stz204579	my $haveStringArrayDef = 0;
3184176Stz204579	my $cntTermidDef = 0;
3194176Stz204579	my $jniDefine;
3204176Stz204579	my $needLocaleDefined = 0;
3214176Stz204579	my $jniADTalloc;
3224176Stz204579	if (defined $header && ($header > 0) ) {
3234176Stz204579	    $jniDefine = "union union_of_events	*event;\n" .
3244176Stz204579		"\tadt_session_data_t	*session;\n";
3254176Stz204579	    $jniADTalloc = '(union union_of_events *)adt_alloc_event';
3264176Stz204579	} else {
3274176Stz204579	    $jniDefine = "adt_event_data_t	*event;\n" .
3284176Stz204579		"\tadt_session_data_t	*session;\n";
3294176Stz204579	    $jniADTalloc = 'adt_alloc_event';
3304176Stz204579	}
3314176Stz204579	my $ref2;
3324176Stz204579	foreach $ref2 (@entries) {
3334176Stz204579	    my ($id, $type) = @$ref2;
3344176Stz204579	    my $jniRoot = $root . $id;
3354176Stz204579	    $jniRoot =~ s/_/_1/g;  # escape unicode "_"
3364176Stz204579
3374176Stz204579	    my $p_event;
3384176Stz204579	    if (defined $header && ($header > 0) ) {
3394176Stz204579		$p_event = "event->d$header.adt_$root.$id";
3404176Stz204579	    } else {
3414176Stz204579		$p_event = "event->adt_$root.$id";
3424176Stz204579	    }
3434176Stz204579
3444176Stz204579	    if ($type eq 'ADT_UINT32STAR') { # int array
3454176Stz204579	        $needLocaleDefined = 1;
3464176Stz204579
3474176Stz204579
3484176Stz204579	        $jniStorageList .= <<EOF;
3494176Stz204579	/* $id */
3504176Stz204579	length = (*env)->GetArrayLength(env, $id);
3514176Stz204579	$p_event =
3524176Stz204579	    (int *)malloc(length * sizeof (int));
3534176Stz204579	if ($p_event == NULL) {
3544176Stz204579		locale = I18N_SETUP;
3554176Stz204579		local_throw(env, except_class,
3564176Stz204579		    $noMemory);
3574176Stz204579		(void) setlocale(LC_MESSAGES, locale);
3584176Stz204579		goto cleanup;
3594176Stz204579	}
3604176Stz204579	(*env)->GetIntArrayRegion(env, $id, 0, length,
3614176Stz204579	    (int *)$p_event);
3624176Stz204579EOF
3634176Stz204579
3644176Stz204579
3654176Stz204579		$jniFreeList .= "\n\tif ($p_event != NULL)\n" .
3664176Stz204579		    "\t\tfree($p_event);\n";
3674176Stz204579		unless ($haveLengthDef) {
3684176Stz204579		    $haveLengthDef = 1;
3694176Stz204579		    $jniDefine .= "\tint\t\t\tlength;\n";
3704176Stz204579		}
3714176Stz204579		$nativeParameterList .= ",\n\t    int[]\t$id";
3724176Stz204579		$jniParameterList .= ",\n    jintArray\t$id";
3734176Stz204579		$specParameterList .= ", jintArray";
3744176Stz204579		$needCleanupTarget = 1;
3754176Stz204579	    } elsif (($type eq 'ADT_UIDSTAR') ||
3764176Stz204579		     ($type eq 'ADT_GIDSTAR')) { # gid_t array
3774176Stz204579		my $cType = 'uid_t';
3784176Stz204579		$cType = 'gid_t' if ($type eq 'ADT_GIDSTAR');
3794176Stz204579		$needLocaleDefined = 1;
3804176Stz204579
3814176Stz204579
3824176Stz204579		$jniStorageList .= <<EOF;
3834176Stz204579	/* $id */
3844176Stz204579	length = (*env)->GetArrayLength(env, $id);
3854176Stz204579	$p_event =
3864176Stz204579	    ($cType *)malloc(length * sizeof ($cType));
3874176Stz204579	if ($p_event == NULL) {
3884176Stz204579		locale = I18N_SETUP;
3894176Stz204579		local_throw(env, except_class,
3904176Stz204579		    $noMemory);
3914176Stz204579		(void) setlocale(LC_MESSAGES, locale);
3924176Stz204579		goto cleanup;
3934176Stz204579	}
3944176Stz204579	(*env)->GetIntArrayRegion(env, $id, 0, length,
3954176Stz204579	    (int *)$p_event);
3964176Stz204579EOF
3974176Stz204579
3984176Stz204579
3994176Stz204579		$jniFreeList .=
4004176Stz204579		    "\n\tif ($p_event != NULL)\n" .
4014176Stz204579		    "\t\tfree($p_event);\n";
4024176Stz204579		unless ($haveLengthDef) {
4034176Stz204579		    $haveLengthDef = 1;
4044176Stz204579		    $jniDefine .= "\tint\t\t\tlength;\n";
4054176Stz204579		}
4064176Stz204579		$nativeParameterList .= ",\n\t    int[]\t$id";
4074176Stz204579		$jniParameterList .= ",\n    jintArray\t$id";
4084176Stz204579		$specParameterList .= ", jintArray";
4094176Stz204579		$needCleanupTarget = 1;
4104176Stz204579	    } elsif ($type eq 'ADT_UINT64STAR') { # long array
4114176Stz204579	        $needLocaleDefined = 1;
4124176Stz204579	        $jniStorageList .= <<EOF;
4134176Stz204579	/* $id */
4144176Stz204579	length = (*env)->GetArrayLength(env, $id);
4154176Stz204579	$p_event =
4164176Stz204579	    (long *)malloc(length * sizeof (long long));
4174176Stz204579	if ($p_event == NULL) {
4184176Stz204579		locale = I18N_SETUP;
4194176Stz204579		local_throw(env, except_class,
4204176Stz204579		    $noMemory);
4214176Stz204579		(void) setlocale(LC_MESSAGES, locale);
4224176Stz204579		goto cleanup;
4234176Stz204579	}
4244176Stz204579	(*env)->GetLongArrayRegion(env, $id, 0, length,
4254176Stz204579	    $p_event);
4264176Stz204579EOF
4274176Stz204579		$jniFreeList .= "\n\tif ($p_event != NULL)\n" .
4284176Stz204579		    "\t\tfree($p_event);\n";
4294176Stz204579		unless ($haveLengthDef) {
4304176Stz204579		    $haveLengthDef = 1;
4314176Stz204579		    $jniDefine .= "\tint\t\t\tlength;\n";
4324176Stz204579		}
4334176Stz204579		$nativeParameterList .= ",\n\t    long[]\t$id";
4344176Stz204579		$jniParameterList .= ",\n    jlongArray\t$id";
4354176Stz204579		$specParameterList .= ", jlongArray";
4364176Stz204579		$needCleanupTarget = 1;
4374176Stz204579	    } elsif ($type eq 'ADT_CHAR') { # string in Java, char in C
4384176Stz204579		$jniStorageList .= <<EOF;
4394176Stz204579
4404176Stz204579	/* $id */
4414176Stz204579	c = (char *)(*env)->GetStringUTFChars(env, $id, NULL);
4424176Stz204579	if (c == NULL)
4434176Stz204579		goto cleanup; /* exception thrown */
4444176Stz204579	$p_event = *c;
4454176Stz204579	(*env)->ReleaseStringUTFChars(env, $id, c);
4464176Stz204579EOF
4474176Stz204579		# no need to free anything
4484176Stz204579		unless ($haveCDef) {
4494176Stz204579		    $haveCDef = 1;
4504176Stz204579		    $jniDefine .= "\tchar\t\t\t*c\n";
4514176Stz204579		}
4524176Stz204579		$nativeParameterList .= ",\n\t    String\t$id";
4534176Stz204579		$jniParameterList .= ",\n    jstring\t$id";
4544176Stz204579		$specParameterList .= ", jstring";
4554176Stz204579	    } elsif ($type eq 'ADT_CHARSTAR') {
4564176Stz204579	        $needLocaleDefined = 1;
4574176Stz204579		$jniStorageList .= <<EOF;
4584176Stz204579	/* $id */
4594176Stz204579	if ($id != NULL) {
4604176Stz204579		string = (char *)(*env)->GetStringUTFChars(
4614176Stz204579		    env, $id, NULL);
4624176Stz204579		if (string == NULL)
4634176Stz204579			goto cleanup; /* exception thrown */
4644176Stz204579		$p_event = strdup(string);
4654176Stz204579		(*env)->ReleaseStringUTFChars(env, $id, string);
4664176Stz204579		if ($p_event == NULL) {
4674176Stz204579			locale = I18N_SETUP;
4684176Stz204579			local_throw(env, except_class,
4694176Stz204579			    $noMemory);
4704176Stz204579			(void) setlocale(LC_MESSAGES, locale);
4714176Stz204579			goto cleanup;
4724176Stz204579		}
4734176Stz204579	}
4744176Stz204579EOF
4754176Stz204579		$jniFreeList .= "\n\tif ($p_event != NULL)\n" .
4764176Stz204579		    "\t\tfree($p_event);\n";
4774176Stz204579		unless ($haveStringDef) {
4784176Stz204579		    $haveStringDef = 1;
4794176Stz204579		    $jniDefine .= "\tchar\t\t\t*string;\n";
4804176Stz204579		}
4814176Stz204579		$nativeParameterList .= ",\n\t    String\t$id";
4824176Stz204579		$jniParameterList .= ",\n    jstring\t$id";
4834176Stz204579		$specParameterList .= ", jstring";
4844176Stz204579		$needCleanupTarget = 1;
4854176Stz204579	    } elsif ($type eq 'ADT_CHAR2STAR') { # array of string
4864176Stz204579	        $needLocaleDefined = 1;
4874176Stz204579		$jniStorageList .= <<EOF;
4884176Stz204579	/* $id */
4894176Stz204579	length = (*env)->GetArrayLength(env, $id);
4904176Stz204579	$p_event = (char **)malloc(length
4914176Stz204579	    * sizeof (char *));
4924176Stz204579	if ($p_event == NULL) {
4934176Stz204579		locale = I18N_SETUP;
4944176Stz204579		local_throw(env, except_class,
4954176Stz204579		    $noMemory);
4964176Stz204579		(void) setlocale(LC_MESSAGES, locale);
4974176Stz204579		goto cleanup;
4984176Stz204579	}
4994176Stz204579	p = $p_event;
5004176Stz204579	for (i = 0; i < length; i++) {
5014176Stz204579		jString = (*env)->GetObjectArrayElement(env, $id, i);
5024176Stz204579		string = (char *)(*env)->GetStringUTFChars(
5034176Stz204579		    env, jString, NULL);
5044176Stz204579		if (string == NULL)
5054176Stz204579			goto cleanup; /* exception thrown */
5064176Stz204579		*p = strdup(string);
5074176Stz204579		(*env)->ReleaseStringUTFChars(env, jString, string);
5084176Stz204579		if (*p == NULL) {
5094176Stz204579			locale = I18N_SETUP;
5104176Stz204579			local_throw(env, except_class,
5114176Stz204579			    $noMemory);
5124176Stz204579			(void) setlocale(LC_MESSAGES, locale);
5134176Stz204579			while (p >= $p_event)
5144176Stz204579				free(*p--);
5154176Stz204579			goto cleanup;
5164176Stz204579		}
5174176Stz204579		p++;
5184176Stz204579	}
5194176Stz204579EOF
5204176Stz204579		$jniFreeList .=
5214176Stz204579		    "\n\tif ($p_event != NULL)\n" .
5224176Stz204579		    "\t\tfree($p_event);\n";
5234176Stz204579		unless ($haveStringArrayDef) {
5244176Stz204579		    unless ($haveStringDef) {
5254176Stz204579			$haveStringDef = 1;
5264176Stz204579			$jniDefine .= <<EOF;
5274176Stz204579	char			*string;
5284176Stz204579EOF
5294176Stz204579		    }
5304176Stz204579		    unless ($haveLengthDef) {
5314176Stz204579			$haveLengthDef = 1;
5324176Stz204579			$jniDefine .= <<EOF;
5334176Stz204579	int			length;
5344176Stz204579EOF
5354176Stz204579		    }
5364176Stz204579		    $haveStringArrayDef = 1;
5374176Stz204579		    $jniDefine .= <<EOF;
5384176Stz204579	int			i;
5394176Stz204579	char			**p;
5404176Stz204579	jstring			jString;
5414176Stz204579EOF
5424176Stz204579		}
5434176Stz204579		$nativeParameterList .= ",\n\t    String[]\t$id";
5444176Stz204579		$jniParameterList .= ",\n    jstring\t$id";
5454176Stz204579		$specParameterList .= ", jstring";
5464176Stz204579		$needCleanupTarget = 1;
5474176Stz204579	      } elsif ($type eq 'ADT_TERMIDSTAR') {
5484176Stz204579	        $needLocaleDefined = 1;
5494176Stz204579
5504176Stz204579	        $jniStorageList .= <<EOF;
5514176Stz204579	/* $id */
5524176Stz204579	hostname$cntTermidDef = (char *)(*env)->GetStringUTFChars(env, $id, NULL);
5534176Stz204579
5544176Stz204579	if (adt_load_hostname((const char *)hostname$cntTermidDef, &termid$cntTermidDef)) {
5554176Stz204579		local_throw(env, except_class,
5564176Stz204579			gettext("hostname lookup failed"));
5574176Stz204579	}
5584176Stz204579	$p_event = termid$cntTermidDef;
5594176Stz204579
5604176Stz204579	(*env)->ReleaseStringUTFChars(env, $id, hostname$cntTermidDef);
5614176Stz204579EOF
5624176Stz204579
5634176Stz204579		$jniFreeList .= "\n\tif (hostname$cntTermidDef != NULL)\n" .
5644176Stz204579		    "\t\tfree(hostname$cntTermidDef);\n";
5654176Stz204579		$jniFreeList .= "\n\tif (termid$cntTermidDef != NULL)\n" .
5664176Stz204579		    "\t\tfree(termid$cntTermidDef);\n";
5674176Stz204579
5684176Stz204579		$jniDefine .= "\tchar\t\t\t*hostname$cntTermidDef;\n";
5694176Stz204579		$jniDefine .= "\tadt_termid_t\t\t*termid$cntTermidDef;\n"; #djdj
5704176Stz204579
5714176Stz204579		$cntTermidDef++;
5724176Stz204579
5734176Stz204579		my ($nativeParameter, $jniParameter) = @{$java_jni{$type}};
5744176Stz204579		$nativeParameterList .= ",\n\t    $nativeParameter\t$id";
5754176Stz204579		$jniParameterList .= ",\n    $jniParameter\t$id";
5764176Stz204579		$specParameterList .= ", $jniParameter";
5774176Stz204579		$needCleanupTarget = 1;
5784176Stz204579	    } else {  # all others are primitive types
5794176Stz204579		$jniStorageList .= "\n\t$p_event = $id;\n";
5804176Stz204579		my ($nativeParameter, $jniParameter) = @{$java_jni{$type}};
5814176Stz204579		$nativeParameter = "$nativeParameter\t"
5824176Stz204579		    if length $nativeParameter < 4;  # why?
5834176Stz204579		$nativeParameterList .= ",\n\t    $nativeParameter\t$id";
5844176Stz204579		$jniParameterList .= ",\n    $jniParameter\t$id";
5854176Stz204579		$specParameterList .= ", $jniParameter";
5864176Stz204579	    }
5874176Stz204579	}
5884176Stz204579	if ($needLocaleDefined) {
5894176Stz204579		$jniDefine .= <<EOF
5904176Stz204579	char			*locale;
5914176Stz204579EOF
5924176Stz204579	}
5934176Stz204579	my $genericOverride = '';
5944176Stz204579	my $idParameter = $eventId;
5954176Stz204579	$idParameter =~ s/AUE_/ADT_/;
5964176Stz204579	if ($eventType eq 'generic') {
5974176Stz204579	    $genericOverride = ', jint eventId';
5984176Stz204579	    $idParameter = 'eventId';
5994176Stz204579	}
6004176Stz204579	$jniFreeList = "\tcleanup:\n" . $jniFreeList if $needCleanupTarget;
6014176Stz204579
6024176Stz204579	print Cfile qq{/* ARGSUSED */
6034176Stz204579JNIEXPORT void JNICALL
6044176Stz204579$jniPutEvent(
6054176Stz204579    JNIEnv	*env,
6064176Stz204579    jobject	self,
6074176Stz204579    jbyteArray	jsession$genericOverride,
6084176Stz204579    jint	status,
6094176Stz204579    jint	ret_val$jniParameterList)
6104176Stz204579{
6114176Stz204579	$jniDefine
6124176Stz204579	(void) j2c_pointer(env, jsession, (char **)&session);
6134176Stz204579
6144176Stz204579	event = $jniADTalloc(session, $idParameter);
6154176Stz204579
6164176Stz204579$jniStorageList
6174176Stz204579	(void) adt_put_event((adt_event_data_t *)event, status, ret_val);
6184176Stz204579
6194176Stz204579$jniFreeList
6204176Stz204579	adt_free_event((adt_event_data_t *)event);
6214176Stz204579}
6224176Stz204579};
6234176Stz204579	print MapFile qq{
6244176Stz204579	$jniPutEvent; };
6254176Stz204579	my $overrideParameter = '';
6264176Stz204579	if ($eventType eq 'generic') {
6274176Stz204579	    $overrideParameter = 'int eventId,';
6284176Stz204579	    my @allowed = @$allowedIds;
6294176Stz204579	    if (@allowed) {
6304176Stz204579		my $i;
6314176Stz204579		if ($validSfile) {
6324176Stz204579		    print Sfile "\t// Allowed values for eventId in putEvent:\n";
6334176Stz204579		    for ($i = 0; $i <= $#allowed; $i++) {
6344176Stz204579			my $idNo = $externalIdNo{$allowed[$i]};
6354176Stz204579			$allowed[$i] =~ s/AUE_/ADT_/;
6364176Stz204579			print Sfile "\tstatic final int $allowed[$i] = ",
6374176Stz204579			     "$idNo;\n";
6384176Stz204579		    }
6394176Stz204579		    print Sfile "\n";
6404176Stz204579		}
6414176Stz204579	    } else {
6424176Stz204579		print STDERR "Generic event with no allowed instances: $eventId\n";
6434176Stz204579	    }
6444176Stz204579	}
6454176Stz204579	if ($validSfile) {
6464176Stz204579	    print Sfile <<EOF;
6474176Stz204579	private native void $javaPutEvent(byte[]session, $overrideParameter
6484176Stz204579	    int status, int ret_val$nativeParameterList);
6494176Stz204579
6504176Stz204579	public AuditEvent_$root(AuditSession session)
6514176Stz204579		throws Exception
6524176Stz204579	{
6534176Stz204579		super(session);
6544176Stz204579	}
6554176Stz204579
6564176Stz204579EOF
6574176Stz204579	    my $javaParameterList = '';
6584176Stz204579	    foreach $ref2 (@entries) {
6594176Stz204579		my ($id, $type, $format, $jComment, $required) = @$ref2;
6604176Stz204579
6614176Stz204579		# generate java native method prototypes
6624176Stz204579		# and the corresponding C method implementation
6634176Stz204579
6644176Stz204579		my $javaMethodName = "$id";
6654176Stz204579		my $javaStorageName = $javaMethodName . '_val';
6664176Stz204579		my $jniMethodName = $root . $id;
6674176Stz204579		my $storage;
6684176Stz204579		my $enumUsage = '';
6694176Stz204579		my $jParam = @{$java_jni{$type}}[0];
6704176Stz204579		my $comment = '';
6714176Stz204579		if ($required) {
6724176Stz204579		    if ($format ne 'NULL') {
6734176Stz204579			$comment = "\t// (required) formatted:  $format";
6744176Stz204579		    } else {
6754176Stz204579			$comment = "\t// required";
6764176Stz204579		    }
6774176Stz204579		} else {
6784176Stz204579		    if ($format ne 'NULL') {
6794176Stz204579			$comment = "\t// (optional) formatted:  $format";
6804176Stz204579		    } else {
6814176Stz204579			$comment = "\t// optional";
6824176Stz204579		    }
6834176Stz204579		}
6844176Stz204579		if (($type eq 'ADT_UINT32STAR') ||
6854176Stz204579		    ($type eq 'ADT_UIDSTAR') ||
6864176Stz204579		    ($type eq 'ADT_GIDSTAR')) { # int array
6874176Stz204579		    $storage = "int[] $javaStorageName" . ($required ?
6884176Stz204579							   ' = {}' : '');
6894176Stz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
6904176Stz204579		} elsif ($type eq 'ADT_UINT64STAR') { # long array
6914176Stz204579		    $storage = "long[] $javaStorageName" . ($required ?
6924176Stz204579							    ' = {}' : '');
6934176Stz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
6944176Stz204579		} elsif (($type eq 'ADT_CHARSTAR') ||
6954176Stz204579			 ($type eq 'ADT_CHAR')) { # string
6964176Stz204579		    $storage = "String $javaStorageName" . ($required ?
6974176Stz204579							    ' = ""' : '');
6984176Stz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
6994176Stz204579		} elsif ($type eq 'ADT_CHAR2STAR') { # array of string
7004176Stz204579		    $storage = "String[] $javaStorageName" . ($required ?
7014176Stz204579							      ' = {}' : '');
7024176Stz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
7034176Stz204579		} elsif ($type eq 'ADT_TERMIDSTAR') { # array of string
7044176Stz204579		    $storage = "String $javaStorageName" . ($required ?
7054176Stz204579							    ' = ""' : '');
7064176Stz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
7074176Stz204579		} else {  # all others are primitive types
7084176Stz204579		    $storage = "$jParam $javaStorageName = 0";
7094176Stz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
7104176Stz204579		    $enumUsage = "\n\t// See $jComment in AuditEvent.java for valid values"
7114176Stz204579			if $jComment;
7124176Stz204579		}
7134176Stz204579		print Sfile <<EOF;
7144176Stz204579$enumUsage
7154176Stz204579	private $storage;$comment
7164176Stz204579	public void $javaMethodName($jParam setTo)
7174176Stz204579	{
7184176Stz204579		$javaStorageName = setTo;
7194176Stz204579	}
7204176Stz204579EOF
7214176Stz204579	    }	# end foreach (@entries)
7224176Stz204579	    if ($eventType eq 'generic') {
7234176Stz204579		print Sfile <<EOF;
7244176Stz204579
7254176Stz204579	public void putEvent(int status, int ret_val, int eventId)
7264176Stz204579	{
7274176Stz204579		byte[]	session = super.sh.getSession();
7284176Stz204579
7294176Stz204579		if ((super.sh.AuditIsOn) && (super.sh.ValidSession))
7304176Stz204579			$javaPutEvent(session, eventId,
7314176Stz204579			    status, ret_val$javaParameterList);
7324176Stz204579	}
7334176Stz204579}
7344176Stz204579EOF
7354176Stz204579	    } else {
7364176Stz204579		print Sfile <<EOF;
7374176Stz204579
7384176Stz204579	public void putEvent(int status, int ret_val)
7394176Stz204579	{
7404176Stz204579		byte[]	session = super.sh.getSession();
7414176Stz204579
7424176Stz204579		if ((super.sh.AuditIsOn) && (super.sh.ValidSession))
7434176Stz204579			$javaPutEvent(session, status, ret_val$javaParameterList);
7444176Stz204579	}
7454176Stz204579}
7464176Stz204579EOF
7474176Stz204579	    }
7484176Stz204579	    close Sfile;
7494176Stz204579	}	# end if ($validSfile);
7504176Stz204579    }
7514176Stz204579
7524176Stz204579    # write trailers
7534176Stz204579    print Jfile <<EOF;
7544176Stz204579
7554176Stz204579}
7564176Stz204579EOF
7574176Stz204579    print MapFile <<EOF;
7584176Stz204579
7594176Stz204579    local:
7604176Stz204579	*;
7614176Stz204579};
7624176Stz204579EOF
7634176Stz204579    close Cfile;
7644176Stz204579    close Jfile;
7654176Stz204579    close MapFile;
7664176Stz204579}
7674176Stz204579
7684176Stz204579sub generateTableC {
7694176Stz204579    my $event = shift;
7704176Stz204579    my $eventId = shift;
7714176Stz204579    my $eventType = shift;
7724176Stz204579    my $eventHeader = shift;
7734176Stz204579    my $omit = shift;
7744176Stz204579
7754176Stz204579    my %tokenType = (
7764176Stz204579		  'acl'			=> 'AUT_ACL',
7774176Stz204579		  'arbitrary'		=> 'AUT_ARBITRARY',
7784176Stz204579		  'arg'			=> 'AUT_ARG',
7794176Stz204579		  'attr'		=> 'AUT_ATTR',
7804176Stz204579		  'command'		=> 'AUT_CMD',
7814176Stz204579		  'command_1'		=> 'ADT_CMD_ALT',	# dummy token id
7824176Stz204579		  'date'		=> 'AUT_TEXT',
7834176Stz204579		  'exec_args'   	=> 'AUT_EXEC_ARGS',
7844176Stz204579		  'exec_env'    	=> 'AUT_EXEC_ENV',
7854176Stz204579		  'exit'        	=> 'AUT_EXIT',
7864176Stz204579		  'file'        	=> 'AUT_FILE',
7874176Stz204579		  'fmri'        	=> 'AUT_FMRI',
7884176Stz204579		  'groups'      	=> 'AUT_GROUPS',
7894176Stz204579	#	  'header'      	=> 'AUT_HEADER',	# not used
7904176Stz204579		  'in_addr'     	=> 'AUT_IN_ADDR',
7914176Stz204579		  'ipc'         	=> 'AUT_IPC',
7924176Stz204579		  'ipc_perm'    	=> 'AUT_IPC_PERM',
7934176Stz204579		  'iport'		=> 'AUT_IPORT',
7944176Stz204579		  'label'		=> 'AUT_LABEL',
7954176Stz204579		  'newgroups'   	=> 'AUT_NEWGROUPS',
7964176Stz204579		  'opaque'      	=> 'AUT_OPAQUE',
7974176Stz204579		  'path'        	=> 'AUT_PATH',
7984176Stz204579		  'path_list'		=> '-AUT_PATH',		# dummy token id
7994176Stz204579		  'process'     	=> 'AUT_PROCESS',
8004176Stz204579		  'priv_effective'	=> 'ADT_AUT_PRIV_E',	# dummy token id
8014176Stz204579		  'priv_limit'		=> 'ADT_AUT_PRIV_L', 	# dummy token id
8024176Stz204579		  'priv_inherit'	=> 'ADT_AUT_PRIV_I',	# dummy token id
8034176Stz204579		  'return'      	=> 'AUT_RETURN',
8044176Stz204579		  'seq'         	=> 'AUT_SEQ',
8054176Stz204579		  'socket'      	=> 'AUT_SOCKET',
8064176Stz204579		  'socket-inet' 	=> 'AUT_SOCKET_INET',
8074176Stz204579		  'subject'     	=> 'AUT_SUBJECT',
8084176Stz204579		  'text'        	=> 'AUT_TEXT',
80911893Sgww@eng.sun.com		  'tid'          	=> 'AUT_TID',
8104176Stz204579	#	  'trailer'     	=> 'AUT_TRAILER',	# not used
8114176Stz204579		  'uauth'		=> 'AUT_UAUTH',
81211893Sgww@eng.sun.com		  'user'		=> 'AUT_USER',
8134176Stz204579		  'zonename'		=> 'AUT_ZONENAME'
8144176Stz204579		 );
8154176Stz204579
8164176Stz204579    my @xlateEntryList = ();
8174176Stz204579    my @jniEntryList = ();
8184176Stz204579
8194176Stz204579    my $external = $event->getExternal();
8204176Stz204579    my $internal = $event->getInternal();
8214176Stz204579
8224176Stz204579    unless ($external) {
8234176Stz204579	print STDERR "No external object captured for event $eventId\n";
8244176Stz204579	return;
8254176Stz204579    }
8264176Stz204579    unless ($internal) {
8274176Stz204579	print STDERR "No internal object captured for event $eventId\n";
8284176Stz204579	return;
8294176Stz204579    }
8304176Stz204579    my @entryRef = $internal->getEntries();
8314176Stz204579    my $entryRef;
8324176Stz204579    my @tokenOrder = ();
8334176Stz204579    my $firstTokenIndex = 0; # djdj not used yet, djdj BUG!
8344176Stz204579    			     # needs to be used by translate table
8354176Stz204579
8364176Stz204579    if ($internal->isReorder()) { # prescan the entry list to get the token order
8374176Stz204579      my @inputOrder;
8384176Stz204579      foreach $entryRef (@entryRef) {
8394176Stz204579	my ($intEntry, $entry) = @$entryRef;
8404176Stz204579	push (@inputOrder, $intEntry->getAttr('order'));
8414176Stz204579      }
8424176Stz204579
8434176Stz204579      my $i; # walk down the inputOrder list once
8444176Stz204579      my $k = 1; # discover next in line
8454176Stz204579      my $l = 0; # who should point to next in line
8464176Stz204579      for ($i = 0; $i <= $#inputOrder; $i++) {
8474176Stz204579	my $j;
8484176Stz204579	for ($j = 0; $j <= $#inputOrder; $j++) {
8494176Stz204579	  if ($k == $inputOrder[$j]) {
8504176Stz204579	    if ($k == 1) {
8514176Stz204579	        $firstTokenIndex = $j;
8524176Stz204579	    } else {
8534176Stz204579	        $tokenOrder[$l] = "&(selfReference[$j])";
8544176Stz204579	    }
8554176Stz204579	    $l = $j;
8564176Stz204579	    last;
8574176Stz204579	  }
8584176Stz204579	}
8594176Stz204579	$k++;
8604176Stz204579      }
8614176Stz204579      $tokenOrder[$l] = 'NULL';
8624176Stz204579    }
8634176Stz204579    else { # default order -- input order same as output
8644176Stz204579      my $i;
8654176Stz204579      my $j;
8664176Stz204579      for ($i = 0; $i < $#entryRef; $i++) {
8674176Stz204579	my $j = $i + 1;
8684176Stz204579	$tokenOrder[$i] = "&(selfReference[$j])";
8694176Stz204579      }
8704176Stz204579      $tokenOrder[$#entryRef] = 'NULL';
8714176Stz204579    }
8724176Stz204579
8734176Stz204579    my $sequence = 0;
8744176Stz204579    foreach $entryRef (@entryRef) {
8754176Stz204579      my ($intEntry, $entry) = @$entryRef;
8764176Stz204579      my $entryId = $entry->getAttr('id');
8774176Stz204579
8784176Stz204579      my ($extEntry, $unusedEntry, $tokenId) =
8794176Stz204579	$external->getEntry($entryId);
8804176Stz204579      my $opt = $extEntry->getAttr('opt');
8814176Stz204579
8824176Stz204579      if ($opt eq 'none') {
8834176Stz204579	if (defined ($doc->getToken($tokenId))) {
8844176Stz204579	  if (defined ($tokenType{$tokenId})) {
8854176Stz204579	    $tokenId = $tokenType{$tokenId};
8864176Stz204579	  }
8874176Stz204579	  else {
8884176Stz204579	    print STDERR "token id $tokenId not implemented\n";
8894176Stz204579	  }
8904176Stz204579	}
8914176Stz204579	else {
8924176Stz204579	  print STDERR "token = $tokenId is undefined\n";
8934176Stz204579	  $tokenId = 'error';
8944176Stz204579	}
8954176Stz204579	my ($xlate, $jni) =
8964176Stz204579	  formatTableEntry ('', $tokenId, $eventId, '', 0, 0, $tokenOrder[$sequence],
8974176Stz204579			    'NULL', '');
8984176Stz204579	push (@xlateEntryList, $xlate);
8994176Stz204579	push (@jniEntryList, @$jni);
9004176Stz204579      }
9014176Stz204579      else {
9024176Stz204579	my $dataType = $extEntry->getAttr('type');
9034176Stz204579	$dataType =~ s/\s+//g;   # remove blanks (char * => char*)
9044176Stz204579
9054176Stz204579	my $enumGroup = '';
9064176Stz204579	if ($dataType =~ /^msg/i) {
9074176Stz204579	    $enumGroup = $dataType;
9084176Stz204579	    $enumGroup =~ s/^msg\s*//i;
9094176Stz204579	    $enumGroup = 'adt_' . $enumGroup;
9104176Stz204579	}
9114176Stz204579	my $required = ($opt eq 'required') ? 1 : 0;
9124176Stz204579	my $tsol = 0;
9134176Stz204579	my $tokenId = $intEntry->getAttr('token');
9144176Stz204579	my $token;
9154176Stz204579	my $tokenName;
9164176Stz204579	my $tokenFormat = $intEntry->getAttr('format');
9174176Stz204579	if (defined ($tokenFormat)) {
9184176Stz204579	  $tokenFormat = "\"$tokenFormat\"";
9194176Stz204579	}
9204176Stz204579	else {
9214176Stz204579	  $tokenFormat = 'NULL';
9224176Stz204579	}
9234176Stz204579
9244176Stz204579	if (defined ($token = $doc->getToken($tokenId))) {
9254176Stz204579	  $tsol = (lc $token->getUsage() eq 'tsol') ? 1 : 0;
9264176Stz204579	  if (defined ($tokenType{$tokenId})) {
9274176Stz204579	    $tokenName = $tokenType{$tokenId};
9284176Stz204579	  }
9294176Stz204579	  else {
9304176Stz204579	    print STDERR "token id $tokenId not implemented\n";
9314176Stz204579	  }
9324176Stz204579	}
9334176Stz204579	else {
9344176Stz204579	  print STDERR
9354176Stz204579	    "$tokenId is an unimplemented token ($entryId in $eventId)\n";
9364176Stz204579	  $tokenName = 'AUT_TEXT';
9374176Stz204579	}
9384176Stz204579	my ($xlate, $jni) =
9394176Stz204579	  formatTableEntry($entryId, $tokenName, $eventId, $dataType, $required,
9404176Stz204579			   $tsol, $tokenOrder[$sequence], $tokenFormat,
9414176Stz204579			   $enumGroup, (uc $omit eq 'JNI'));
9424176Stz204579	push (@xlateEntryList, $xlate);
9434176Stz204579	push (@jniEntryList, @$jni);
9444176Stz204579      }
9454176Stz204579      $sequence++;
9464176Stz204579    }
9474176Stz204579    $jniEventTable{$eventId} = [\@jniEntryList, $eventType,
9484176Stz204579				$external->getAllowedTypes(), $eventHeader]
9494176Stz204579	unless (uc $omit eq 'JNI') || ($omit eq 'always');
9504176Stz204579}
9514176Stz204579
9524176Stz204579sub formatTableEntry {
9534176Stz204579    my ($id, $token, $eventId, $type, $required, $tsol, $sequence, $format, $enumGroup,
9544176Stz204579	$omitJNI) = @_;
9554176Stz204579
9564176Stz204579
9574176Stz204579    # does this map belong in the xml source?  (at least the defaults?)
9584176Stz204579    # fill in the default value only if it is other than zero.
9594176Stz204579    #		      base type		    adt name,	default value
9604176Stz204579    my %entryDef = ( 'au_asid_t'       	=> ['ADT_UINT32',	''],
9614176Stz204579		     'uint_t'		=> ['ADT_UINT32',      	''],
9624176Stz204579		     'int'		=> ['ADT_INT',		''],
9634176Stz204579		     'int32_t'		=> ['ADT_INT32',	''],
9644176Stz204579		     'uid_t'		=> ['ADT_UID',		'AU_NOAUDITID'],
9654176Stz204579		     'gid_t'		=> ['ADT_GID',		'AU_NOAUDITID'],
9664176Stz204579		     'uid_t*'		=> ['ADT_UIDSTAR',	''],
9674176Stz204579		     'gid_t*'		=> ['ADT_GIDSTAR',	''],
9684176Stz204579		     'char'		=> ['ADT_CHAR',		''],
9694176Stz204579		     'char*'		=> ['ADT_CHARSTAR',	''],
9704176Stz204579		     'char**'		=> ['ADT_CHAR2STAR',	''],
9714176Stz204579		     'long'		=> ['ADT_LONG',		''],
9724176Stz204579		     'pid_t'		=> ['ADT_PID',		''],
9734176Stz204579		     'priv_set_t*'	=> ['ADT_PRIVSTAR',	''],
9744176Stz204579		     'ulong_t'		=> ['ADT_ULONG',	''],
9754176Stz204579		     'uint16_t',	=> ['ADT_UINT16',	''],
9764176Stz204579		     'uint32_t'		=> ['ADT_UINT32',	''],
9774176Stz204579		     'uint32_t*'	=> ['ADT_UINT32STAR',	''],
9784176Stz204579		     'uint32_t[]'	=> ['ADT_UINT32ARRAY',  ''],
9794176Stz204579		     'uint64_t'		=> ['ADT_UINT64',	''],
9804176Stz204579		     'uint64_t*'	=> ['ADT_UINT64STAR',	''],
9814176Stz204579		     'm_label_t*'	=> ['ADT_MLABELSTAR',	''],
9824176Stz204579		    );
9834176Stz204579    my $xlateLabel = $uniLabel.$xlateUniLabelInc;
9844176Stz204579    my $xlateLabelInc = 0;
9854176Stz204579    my $xlateLine = '';
9864176Stz204579    my @jniLine = ();
9874176Stz204579
9884176Stz204579	# the list handling should be a simple loop with a loop of one
9894176Stz204579        # falling out naturally.
9904176Stz204579
9914176Stz204579    unless ($type =~ /,/) {	# if list, then generate sequence of entries
9924176Stz204579      my $dataType;
9934176Stz204579      my $dataSize;
9944176Stz204579      my $xlateLabelRef = '';
9954176Stz204579
9964176Stz204579      my $arraySize = '';
9974176Stz204579      $arraySize = $1 if ($type =~ s/\[(\d+)\]/[]/);
9984176Stz204579
9994176Stz204579      my $entryType = ${$entryDef{$type}}[0];
10004176Stz204579
10014176Stz204579      my @xlateType = ();	# for adt_xlate.c
10024176Stz204579      my $typeCount = 1;
10034176Stz204579
10044176Stz204579      if ($entryType) {
10054176Stz204579	$dataType = $entryType;
10064176Stz204579	$type =~ s/([^*]+)\s*(\*+)/$1 $2/;
10074176Stz204579	$type =~ s/\[\]//;
10084176Stz204579	$dataSize = "sizeof ($type)";
10094176Stz204579	if ($arraySize) {
10104176Stz204579		$dataSize = "$arraySize * " . $dataSize;
10114176Stz204579	}
10124176Stz204579	$xlateLine = "{{$dataType, $dataSize}}";
10134176Stz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
10144176Stz204579      } elsif ($type eq '') {
10154176Stz204579	  $xlateLabelRef = 'NULL';
10164176Stz204579      } elsif ($type =~ /^msg/i) {
10174176Stz204579	$type =~ s/^msg//i;
10184176Stz204579	$dataType = 'ADT_MSG';
10194176Stz204579	my $dataEnum = 'ADT_LIST_' . uc $type;
10204176Stz204579	$xlateLine = "{{$dataType, $dataEnum}}";
10214176Stz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
10224176Stz204579      } elsif ($type =~ /time_t/i) {
10234176Stz204579	$dataType = 'ADT_DATE';
10244176Stz204579	$dataSize = "sizeof (time_t)";
10254176Stz204579	$xlateLine = "{{$dataType, $dataSize}}";
10264176Stz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
10274176Stz204579      } elsif ($type =~ /termid/i) {
10284176Stz204579	$dataType = 'ADT_TERMIDSTAR';
10294176Stz204579	$dataSize = "sizeof (au_tid_addr_t *)";
10304176Stz204579	$xlateLine = "{{$dataType, $dataSize}}";
10314176Stz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
10324176Stz204579      } elsif ($omitJNI) {
10334176Stz204579	$xlateLabelRef = 'NULL';
10344176Stz204579      } else {
10354176Stz204579	print STDERR "$type is not an implemented data type\n";
10364176Stz204579	$xlateLabelRef = 'NULL';
10374176Stz204579      }
10384176Stz204579      $xlateLabelRef = '&' . $xlateLabel . '[0]'
10394176Stz204579	unless $xlateLabelRef eq 'NULL';
10404176Stz204579
10414176Stz204579      # "EOL" is where a comma should go unless end of list
10424176Stz204579      $xlateLine = "{$token,\t1,\t$xlateLabelRef,\t$sequence,\n" .
10434176Stz204579	  "\t\t0,\t$required,\t$tsol,\t$format}EOL";
10444176Stz204579
10454176Stz204579    } else {	# is a list
10464176Stz204579      my @type = split(/,/, $type);
10474176Stz204579      my @arraySize = ();
10484176Stz204579      my @id   = split(/,/, $id);
10494176Stz204579      my @jniId  = @id;
10504176Stz204579      my $dataType;
10514176Stz204579      my $typeCount = ($#type + 1);
10524176Stz204579      my @xlateType = ();
10534176Stz204579      my @default = ();
10544176Stz204579
10554176Stz204579      foreach my $dtype (@type) {
10564176Stz204579	my $jniId = shift @jniId;
10574176Stz204579	my $id = shift @id;
10584176Stz204579	my $arraySize = '';
10594176Stz204579	$arraySize = $1 if ($dtype =~ s/\[(\d+)\]/[]/);
10604176Stz204579
10614176Stz204579	my $entryType = ${$entryDef{$dtype}}[0];
10624176Stz204579	if ($entryType) {
10634176Stz204579	  my $type = $dtype;
10644176Stz204579	  $type =~ s/([^*]+)\s*(\*+)/$1 $2/;
10654176Stz204579	  $type =~ s/\[\]//;
10664176Stz204579
10674176Stz204579	  my $sizeString = "sizeof";
10684176Stz204579	  $sizeString = "$arraySize * " . $sizeString if $arraySize;
10694176Stz204579	  push (@xlateType, "\{$entryType, $sizeString ($type)\}");
10704176Stz204579	  push (@jniLine, [$jniId, $entryType, $format, $enumGroup, $required]);
10714176Stz204579	} elsif ($type =~ /^msg/i) {
10724176Stz204579	  $type =~ s/^msg//i;
10734176Stz204579	  $dataType = 'ADT_MSG';
10744176Stz204579	  my $dataEnum = 'ADT_LIST_' . uc $type;
10754176Stz204579	  push (@xlateType, "\{$dataType, $dataEnum\}};");
10764176Stz204579	  push (@jniLine, [$jniId, $dataType, $format, $enumGroup, $required]);
10774176Stz204579	} elsif ($type =~ /time_t/i) {
10784176Stz204579	  $dataType = 'ADT_DATE';
10794176Stz204579	  push (@xlateType, "\{$entryType, sizeof ($type)\}");
10804176Stz204579	  push (@jniLine, [$jniId, $entryType, $format, $enumGroup, $required]);
10814176Stz204579	} elsif ($type =~ /termid/i) {
10824176Stz204579	  $dataType = 'ADT_TERMIDSTAR';
10834176Stz204579	  push (@xlateType, "\{$dataType, sizeof (au_tid_addr_t *)\}");
10844176Stz204579	  push (@jniLine, [$jniId, $dataType, $format, $enumGroup, $required]);
10854176Stz204579	} elsif ($omitJNI) {
10864176Stz204579	  # nothing to do.
10874176Stz204579	} else {
10884176Stz204579	  print STDERR "$dtype is not an implemented data type\n";
10894176Stz204579	}
10904176Stz204579	if (${$entryDef{$dtype}}[1]) {
10914176Stz204579	  push (@default, $id, ${$entryDef{$dtype}}[1]);
10924176Stz204579	}
10934176Stz204579      }
10944176Stz204579      my $xlateArray = "\[$typeCount\] =\t{" . join(",\n\t\t\t\t", @xlateType) . "};";
10954176Stz204579
10964176Stz204579      $xlateLine =
10974176Stz204579	"{$token,\t$typeCount,\t&$xlateLabel\[0\],\t$sequence,\n" .
10984176Stz204579        "\t\t0,\t$required,\t$tsol,\t$format}EOL";
10994176Stz204579    }
11004176Stz204579    $xlateUniLabelInc++ if $xlateLabelInc;
11014176Stz204579    return ($xlateLine, \@jniLine);
11024176Stz204579}
11034176Stz204579
11044176Stz204579sub generateMsgLists {
11054176Stz204579    my $textList = shift;
11064176Stz204579
11074176Stz204579    my $textName = $textList->getId();
11084176Stz204579    my $header = $textList->getHeader();
11094176Stz204579    my $start = $textList->getMsgStart();
11104176Stz204579    my $public = $textList->getMsgPublic();
11114176Stz204579    my $deprecated = $textList->getDeprecated();
11124176Stz204579
11134176Stz204579    print "$textName starts at $start\n" if $debug;
11144176Stz204579
11154176Stz204579    my $entry;
11164176Stz204579    my @entry;
11174176Stz204579    while ($entry = $textList->getNextMsg()) {
11184176Stz204579        if ($debug) {
11194176Stz204579	    my ($id, $text) = split(/\s*::\s*/, $entry);
11204176Stz204579	    print "   $id = $text\n";
11214176Stz204579	}
11224176Stz204579	unshift (@entry, $entry);
11234176Stz204579    }
11244176Stz204579    $msg_list{$textName} =
11254176Stz204579	[\@entry, [$header, $start, $public, $deprecated]];
11264176Stz204579}
11274176Stz204579sub readAuditEventFile {
11284176Stz204579    my $eventListFile = shift;
11294176Stz204579
11304176Stz204579  open(Event, $eventListFile)
11314176Stz204579    or die "can't open $eventListFile: $!\n";
11324176Stz204579  while(<Event>) {
11334176Stz204579    next if /^\s*#/;
11344176Stz204579    next if /^\s*$/;
11354176Stz204579    my ($value, $name) = split(/\s*:\s*/);
11364176Stz204579    next if $value < 6000;
11374176Stz204579    $eventCode{$name} = $value;
11384176Stz204579  }
11394176Stz204579  close Event;
11404176Stz204579}
1141