xref: /illumos-gate/usr/src/lib/libadt_jni/auditxml_jni (revision c0c79a3f09914f35651895ffc111883455b7f62d)
1*c0c79a3fStz204579#!/usr/perl5/bin/perl -w
2*c0c79a3fStz204579#
3*c0c79a3fStz204579# CDDL HEADER START
4*c0c79a3fStz204579#
5*c0c79a3fStz204579# The contents of this file are subject to the terms of the
6*c0c79a3fStz204579# Common Development and Distribution License (the "License").
7*c0c79a3fStz204579# You may not use this file except in compliance with the License.
8*c0c79a3fStz204579#
9*c0c79a3fStz204579# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*c0c79a3fStz204579# or http://www.opensolaris.org/os/licensing.
11*c0c79a3fStz204579# See the License for the specific language governing permissions
12*c0c79a3fStz204579# and limitations under the License.
13*c0c79a3fStz204579#
14*c0c79a3fStz204579# When distributing Covered Code, include this CDDL HEADER in each
15*c0c79a3fStz204579# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*c0c79a3fStz204579# If applicable, add the following below this CDDL HEADER, with the
17*c0c79a3fStz204579# fields enclosed by brackets "[]" replaced with your own identifying
18*c0c79a3fStz204579# information: Portions Copyright [yyyy] [name of copyright owner]
19*c0c79a3fStz204579#
20*c0c79a3fStz204579# CDDL HEADER END
21*c0c79a3fStz204579#
22*c0c79a3fStz204579#
23*c0c79a3fStz204579# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*c0c79a3fStz204579# Use is subject to license terms.
25*c0c79a3fStz204579#
26*c0c79a3fStz204579# ident	"%Z%%M%	%I%	%E% SMI"
27*c0c79a3fStz204579#
28*c0c79a3fStz204579
29*c0c79a3fStz204579# auditxml_jni [-d] <xml input file>
30*c0c79a3fStz204579
31*c0c79a3fStz204579# auditxml takes the audit record description (.xml file) and
32*c0c79a3fStz204579# generates the files needed for the Java
33*c0c79a3fStz204579
34*c0c79a3fStz204579use auditxml;
35*c0c79a3fStz204579use Getopt::Std;
36*c0c79a3fStz204579use vars qw($opt_d);
37*c0c79a3fStz204579use strict;
38*c0c79a3fStz204579
39*c0c79a3fStz204579
40*c0c79a3fStz204579our $debug = 0; # normal use is to set via the file being parsed.
41*c0c79a3fStz204579               # <debug set="on"/> or <debug set="off"/> or <debug/>
42*c0c79a3fStz204579               # if the set attribute is omitted, debug state is toggled
43*c0c79a3fStz204579               # Override with appDebug, but toggle won't do what you
44*c0c79a3fStz204579               # want.
45*c0c79a3fStz204579my $appDebug = 0; # used after return from "new auditxml";
46*c0c79a3fStz204579
47*c0c79a3fStz204579my $genNotice = "
48*c0c79a3fStz204579DO NOT EDIT. This file is auto generated by the Solaris Audit
49*c0c79a3fStz204579system from adt.xml.
50*c0c79a3fStz204579
51*c0c79a3fStz204579See http://opensolaris.org/os/project/audit/
52*c0c79a3fStz204579";
53*c0c79a3fStz204579
54*c0c79a3fStz204579# trim leading/trailing newlines
55*c0c79a3fStz204579$genNotice =~ s/^\n//s;
56*c0c79a3fStz204579$genNotice =~ s/\n$//s;
57*c0c79a3fStz204579my $prog = $0; $prog =~ s|.*/||g;
58*c0c79a3fStz204579my $usage = "usage: $prog [-d] file.xml\n";
59*c0c79a3fStz204579
60*c0c79a3fStz204579getopts('d');
61*c0c79a3fStz204579
62*c0c79a3fStz204579$appDebug = $opt_d;
63*c0c79a3fStz204579
64*c0c79a3fStz204579my $uniLabel = "adr";
65*c0c79a3fStz204579my $xlateUniLabelInc = 0;
66*c0c79a3fStz204579
67*c0c79a3fStz204579die $usage if ($#ARGV < 0);
68*c0c79a3fStz204579
69*c0c79a3fStz204579# where everything comes from and where it goes:
70*c0c79a3fStz204579
71*c0c79a3fStz204579my $templatePath = './';
72*c0c79a3fStz204579my $javaPath     = $templatePath;
73*c0c79a3fStz204579my $bsmBuildPath = "../libbsm";
74*c0c79a3fStz204579
75*c0c79a3fStz204579my $jniBuildPath = "$javaPath";
76*c0c79a3fStz204579
77*c0c79a3fStz204579my $buildPathJ	 = "$jniBuildPath/com/sun/audit";
78*c0c79a3fStz204579my $buildPathJNI = "$jniBuildPath/common";
79*c0c79a3fStz204579
80*c0c79a3fStz204579my $auditEventJ = "$buildPathJ/AuditEvent.java";
81*c0c79a3fStz204579my $jniC = "$buildPathJNI/adt_jni_event.c";
82*c0c79a3fStz204579my $mapFile = "$jniBuildPath/common/mapfile-vers";
83*c0c79a3fStz204579
84*c0c79a3fStz204579my $doc = new auditxml ($ARGV[0]);  # input XML file
85*c0c79a3fStz204579
86*c0c79a3fStz204579$debug = $appDebug;
87*c0c79a3fStz204579
88*c0c79a3fStz204579my %jniEventTable = ();
89*c0c79a3fStz204579my %externalIdNo = ();
90*c0c79a3fStz204579my %msg_list = ();
91*c0c79a3fStz204579my %eventCode = ();
92*c0c79a3fStz204579
93*c0c79a3fStz204579readAuditEventFile("$bsmBuildPath/audit_event.txt");
94*c0c79a3fStz204579
95*c0c79a3fStz204579my $event;
96*c0c79a3fStz204579while ($event = $doc->getNextEvent()) {
97*c0c79a3fStz204579    my $eventId = $event->getId();
98*c0c79a3fStz204579    my $idNo = $event->getIdNo();
99*c0c79a3fStz204579    $externalIdNo{$eventId} = $idNo;
100*c0c79a3fStz204579    my $super;
101*c0c79a3fStz204579    my $omit = $event->getOmit();
102*c0c79a3fStz204579    my $eventType = '';
103*c0c79a3fStz204579    if ($super = $event->getSuperClass()) {
104*c0c79a3fStz204579	$event = $super;
105*c0c79a3fStz204579	$eventType = 'instance';
106*c0c79a3fStz204579    } else {
107*c0c79a3fStz204579	$eventType = $event->getType();
108*c0c79a3fStz204579    }
109*c0c79a3fStz204579
110*c0c79a3fStz204579    # c file table for translation
111*c0c79a3fStz204579    generateTableC($event, $eventId, $eventType, undef, $omit);
112*c0c79a3fStz204579}
113*c0c79a3fStz204579
114*c0c79a3fStz204579while (my $textList = $doc->getNextMsgId()) {
115*c0c79a3fStz204579    generateMsgLists($textList);  # enum -> text mappings
116*c0c79a3fStz204579}
117*c0c79a3fStz204579
118*c0c79a3fStz204579printJavaFiles($jniC, $auditEventJ, $buildPathJ, $mapFile);
119*c0c79a3fStz204579
120*c0c79a3fStz204579exit 0;
121*c0c79a3fStz204579
122*c0c79a3fStz204579
123*c0c79a3fStz204579
124*c0c79a3fStz204579sub printJavaFiles {
125*c0c79a3fStz204579    my $jniFile = shift;
126*c0c79a3fStz204579    my $javaFile = shift;
127*c0c79a3fStz204579    my $subclassPath = shift;
128*c0c79a3fStz204579    my $mapFile = shift;
129*c0c79a3fStz204579
130*c0c79a3fStz204579    # warning: time_t is equated to jlong since there is no
131*c0c79a3fStz204579    # way to use sys/types.h in Java code.
132*c0c79a3fStz204579    # java long is C long long, 64 bits.
133*c0c79a3fStz204579    # java int is 32 bits.
134*c0c79a3fStz204579
135*c0c79a3fStz204579    my %java_jni = ('ADT_DATE'		=> ['long',	'jlong'],
136*c0c79a3fStz204579		    'ADT_UINT'		=> ['int',	'jint'],
137*c0c79a3fStz204579		    'ADT_INT'		=> ['int',	'jint'],
138*c0c79a3fStz204579		    'ADT_INT32'		=> ['int',	'jint'],
139*c0c79a3fStz204579		    'ADT_UID'		=> ['int',	'jint'],
140*c0c79a3fStz204579		    'ADT_GID'		=> ['int',	'jint'],
141*c0c79a3fStz204579		    'ADT_UIDSTAR'	=> ['int[]',	'jintArray'],
142*c0c79a3fStz204579		    'ADT_GIDSTAR'	=> ['int[]',	'jintArray'],
143*c0c79a3fStz204579		    'ADT_CHAR'		=> ['String',	'jchar'],
144*c0c79a3fStz204579		    'ADT_CHARSTAR'	=> ['String',	'jstring'],
145*c0c79a3fStz204579		    'ADT_CHAR2STAR'	=> ['String[]',	'jstring'],
146*c0c79a3fStz204579		    'ADT_MSG'		=> ['int',	'jint'],
147*c0c79a3fStz204579		    'ADT_PID'		=> ['int',	'jint'],
148*c0c79a3fStz204579# ADT_PRIVSTAR omitted -- not implemented and the audit records that
149*c0c79a3fStz204579# use it must be coded to emit no java.  We'll cross that bridge
150*c0c79a3fStz204579# when someone in Java land needs to generate a priv token.
151*c0c79a3fStz204579		    'ADT_LONG'		=> ['int',	'jint'],
152*c0c79a3fStz204579		    'ADT_TERMIDSTAR'	=> ['String',	'jstring'],	# hostname -> termid
153*c0c79a3fStz204579		    'ADT_ULONG'		=> ['int',	'jint'],
154*c0c79a3fStz204579		    'ADT_UINT16'	=> ['int',	'jint'],
155*c0c79a3fStz204579		    'ADT_UINT32'	=> ['int',	'jint'],
156*c0c79a3fStz204579		    'ADT_UINT32STAR'	=> ['int[]',	'jintArray'],
157*c0c79a3fStz204579# ADT_UINT32ARRAY omitted; no Java implementation yet
158*c0c79a3fStz204579		    'ADT_UINT64'	=> ['long',	'jlong'],
159*c0c79a3fStz204579		    'ADT_UINT64STAR'	=> ['long[]',	'jlongArray']
160*c0c79a3fStz204579		   );
161*c0c79a3fStz204579    my $noMemory = 'gettext("Out of memory")';
162*c0c79a3fStz204579
163*c0c79a3fStz204579    # open output files
164*c0c79a3fStz204579    open (Cfile, ">$jniFile") or
165*c0c79a3fStz204579	die "can't open output file ($jniFile): $!\n";
166*c0c79a3fStz204579    open (Jfile, ">$javaFile") or
167*c0c79a3fStz204579	die "can't open output file ($javaFile): $!\n";
168*c0c79a3fStz204579    open (MapFile, ">$mapFile") or
169*c0c79a3fStz204579	die "can't open output file ($mapFile): $!\n";
170*c0c79a3fStz204579
171*c0c79a3fStz204579    # write headers
172*c0c79a3fStz204579    my $notice = $genNotice;
173*c0c79a3fStz204579    $notice =~ s/\n/\n * /gs;
174*c0c79a3fStz204579    $notice =~ s/\s+\n/\n/gs;
175*c0c79a3fStz204579    print Cfile <<EOF;
176*c0c79a3fStz204579/*
177*c0c79a3fStz204579 * $notice
178*c0c79a3fStz204579 */
179*c0c79a3fStz204579
180*c0c79a3fStz204579#include "../../libbsm/common/adt_xlate.h"
181*c0c79a3fStz204579#include <jni.h>
182*c0c79a3fStz204579#include "../com/sun/audit/AuditSession.h"	/* javah output */
183*c0c79a3fStz204579#include "adt_jni.h"
184*c0c79a3fStz204579#include <stdlib.h>
185*c0c79a3fStz204579#include <string.h>
186*c0c79a3fStz204579
187*c0c79a3fStz204579static char *except_class = "java/lang/Exception";
188*c0c79a3fStz204579
189*c0c79a3fStz204579EOF
190*c0c79a3fStz204579    print Jfile <<EOF;
191*c0c79a3fStz204579/*
192*c0c79a3fStz204579 * $notice
193*c0c79a3fStz204579 */
194*c0c79a3fStz204579
195*c0c79a3fStz204579package com.sun.audit;
196*c0c79a3fStz204579
197*c0c79a3fStz204579public class AuditEvent {
198*c0c79a3fStz204579	protected AuditSession sh;	// associated session object
199*c0c79a3fStz204579
200*c0c79a3fStz204579	public AuditEvent(AuditSession auSession)
201*c0c79a3fStz204579	    throws Error
202*c0c79a3fStz204579	{
203*c0c79a3fStz204579
204*c0c79a3fStz204579		sh = auSession;
205*c0c79a3fStz204579	}
206*c0c79a3fStz204579
207*c0c79a3fStz204579	// See the subclasses of AuditEvent for mapping message codes
208*c0c79a3fStz204579	// to events
209*c0c79a3fStz204579EOF
210*c0c79a3fStz204579
211*c0c79a3fStz204579    my $notice_map = $genNotice;
212*c0c79a3fStz204579    $notice_map =~ s/\n/\n# /gs;
213*c0c79a3fStz204579    $notice_map =~ s/\s+\n/\n/gs;
214*c0c79a3fStz204579    print MapFile <<EOF;
215*c0c79a3fStz204579#
216*c0c79a3fStz204579# $notice_map
217*c0c79a3fStz204579#
218*c0c79a3fStz204579
219*c0c79a3fStz204579SUNWprivate_1.1 {
220*c0c79a3fStz204579    global:
221*c0c79a3fStz204579	c2j_pointer;
222*c0c79a3fStz204579	j2c_pointer;
223*c0c79a3fStz204579	Java_com_sun_audit_AuditSession_bsmAuditOn;
224*c0c79a3fStz204579	Java_com_sun_audit_AuditSession_startSession;
225*c0c79a3fStz204579	Java_com_sun_audit_AuditSession_endSession;
226*c0c79a3fStz204579	Java_com_sun_audit_AuditSession_dupSession;
227*c0c79a3fStz204579	Java_com_sun_audit_AuditSession_getSessionId;
228*c0c79a3fStz204579	Java_com_sun_audit_AuditSession_exportSessionData;
229*c0c79a3fStz204579
230*c0c79a3fStz204579# One subclass of AuditEvent per audit record...
231*c0c79a3fStz204579EOF
232*c0c79a3fStz204579
233*c0c79a3fStz204579    # generate java final int classes to line up with string/enums
234*c0c79a3fStz204579
235*c0c79a3fStz204579    foreach my $listName (sort keys %msg_list) {
236*c0c79a3fStz204579        my $shortName = uc $listName;
237*c0c79a3fStz204579        $shortName =~ s/_TEXT//;
238*c0c79a3fStz204579        my ($listRef, $headref) = @{$msg_list{$listName}};
239*c0c79a3fStz204579        my @listValue =  @$listRef;
240*c0c79a3fStz204579        my ($header, $enumValue, $public, $deprecated) = @$headref;
241*c0c79a3fStz204579        my $listValue;
242*c0c79a3fStz204579
243*c0c79a3fStz204579        print Jfile "\n\t// adt_$listName" . "\n\n";
244*c0c79a3fStz204579        print Jfile "\tpublic static final int ADT_$shortName",
245*c0c79a3fStz204579    		" = $enumValue;\n" if $enumValue;
246*c0c79a3fStz204579
247*c0c79a3fStz204579        next unless ($#listValue >= 0);
248*c0c79a3fStz204579        print Jfile "\t// Deprecated message list\n" if $deprecated;
249*c0c79a3fStz204579        foreach $listValue (@listValue) {
250*c0c79a3fStz204579            my ($id, $text) = split(/\s*::\s*/, $listValue);
251*c0c79a3fStz204579    	    print Jfile "\t// $text\n";
252*c0c79a3fStz204579    	    print Jfile "\tpublic static final int ADT_$shortName";
253*c0c79a3fStz204579	    print Jfile "_$id = $enumValue;\n";
254*c0c79a3fStz204579    	    $enumValue++;
255*c0c79a3fStz204579        }
256*c0c79a3fStz204579    }
257*c0c79a3fStz204579
258*c0c79a3fStz204579    # generate event creation and access functions and event
259*c0c79a3fStz204579    # generation for both Java and JNI
260*c0c79a3fStz204579    # com.sun.audit.AuditEvent_xxx.java
261*c0c79a3fStz204579    foreach my $eventId (sort keys %jniEventTable) {
262*c0c79a3fStz204579	my ($ref1, $eventType, $allowedIds, $header) = @{$jniEventTable{$eventId}};
263*c0c79a3fStz204579	$eventCode{$eventId} = -1 if ($eventType eq 'generic');
264*c0c79a3fStz204579	my @entries = @$ref1;
265*c0c79a3fStz204579	my $entries = $#entries;
266*c0c79a3fStz204579	my $root = $eventId;
267*c0c79a3fStz204579	$root =~ s/AUE_//;
268*c0c79a3fStz204579	my $javaPutEvent = 'putEvent';
269*c0c79a3fStz204579	my $putMethod = "_$root";
270*c0c79a3fStz204579	$putMethod =~ s/_/_1/g;
271*c0c79a3fStz204579
272*c0c79a3fStz204579	my $jniPutEvent = "Java_com_sun_audit_AuditEvent$putMethod" . "_$javaPutEvent";
273*c0c79a3fStz204579
274*c0c79a3fStz204579	# the subclass file template isn't used; it may be needed to get
275*c0c79a3fStz204579	# the right file header stuff in place.  The subclassPath is
276*c0c79a3fStz204579	# the directory that contains 'em.
277*c0c79a3fStz204579
278*c0c79a3fStz204579	my $validSfile = 1;
279*c0c79a3fStz204579	unless (open(Sfile, ">$subclassPath/AuditEvent_$root.java")) {
280*c0c79a3fStz204579	    print STDERR "can't open class file AuditEvent_$root.java: $!\n";
281*c0c79a3fStz204579	    $validSfile = 0;
282*c0c79a3fStz204579	}
283*c0c79a3fStz204579	if ($eventCode{"AUE_$root"}) {
284*c0c79a3fStz204579	    if ($validSfile) {
285*c0c79a3fStz204579		print Sfile <<EOF;
286*c0c79a3fStz204579/*
287*c0c79a3fStz204579 * $notice
288*c0c79a3fStz204579 */
289*c0c79a3fStz204579
290*c0c79a3fStz204579package com.sun.audit;
291*c0c79a3fStz204579
292*c0c79a3fStz204579// audit event:  $eventId = $eventCode{"AUE_$root"}
293*c0c79a3fStz204579
294*c0c79a3fStz204579public class AuditEvent_$root extends AuditEvent {
295*c0c79a3fStz204579
296*c0c79a3fStz204579EOF
297*c0c79a3fStz204579	    }
298*c0c79a3fStz204579	} else {
299*c0c79a3fStz204579	    print STDERR "no event code for $eventId.  Is audit_event current?\n";
300*c0c79a3fStz204579	}
301*c0c79a3fStz204579	my $nativeParameterList = '';
302*c0c79a3fStz204579	my $jniParameterList = '';
303*c0c79a3fStz204579	my $specParameterList = '';
304*c0c79a3fStz204579	my $jniStorageList = '';
305*c0c79a3fStz204579	my $needCleanupTarget = 0;
306*c0c79a3fStz204579	my $jniFreeList = '';
307*c0c79a3fStz204579
308*c0c79a3fStz204579	my $haveStringDef = 0;
309*c0c79a3fStz204579	my $haveCDef = 0;
310*c0c79a3fStz204579	my $haveLengthDef = 0;
311*c0c79a3fStz204579	my $haveStringArrayDef = 0;
312*c0c79a3fStz204579	my $cntTermidDef = 0;
313*c0c79a3fStz204579	my $jniDefine;
314*c0c79a3fStz204579	my $needLocaleDefined = 0;
315*c0c79a3fStz204579	my $jniADTalloc;
316*c0c79a3fStz204579	if (defined $header && ($header > 0) ) {
317*c0c79a3fStz204579	    $jniDefine = "union union_of_events	*event;\n" .
318*c0c79a3fStz204579		"\tadt_session_data_t	*session;\n";
319*c0c79a3fStz204579	    $jniADTalloc = '(union union_of_events *)adt_alloc_event';
320*c0c79a3fStz204579	} else {
321*c0c79a3fStz204579	    $jniDefine = "adt_event_data_t	*event;\n" .
322*c0c79a3fStz204579		"\tadt_session_data_t	*session;\n";
323*c0c79a3fStz204579	    $jniADTalloc = 'adt_alloc_event';
324*c0c79a3fStz204579	}
325*c0c79a3fStz204579	my $ref2;
326*c0c79a3fStz204579	foreach $ref2 (@entries) {
327*c0c79a3fStz204579	    my ($id, $type) = @$ref2;
328*c0c79a3fStz204579	    my $jniRoot = $root . $id;
329*c0c79a3fStz204579	    $jniRoot =~ s/_/_1/g;  # escape unicode "_"
330*c0c79a3fStz204579
331*c0c79a3fStz204579	    my $p_event;
332*c0c79a3fStz204579	    if (defined $header && ($header > 0) ) {
333*c0c79a3fStz204579		$p_event = "event->d$header.adt_$root.$id";
334*c0c79a3fStz204579	    } else {
335*c0c79a3fStz204579		$p_event = "event->adt_$root.$id";
336*c0c79a3fStz204579	    }
337*c0c79a3fStz204579
338*c0c79a3fStz204579	    if ($type eq 'ADT_UINT32STAR') { # int array
339*c0c79a3fStz204579	        $needLocaleDefined = 1;
340*c0c79a3fStz204579
341*c0c79a3fStz204579
342*c0c79a3fStz204579	        $jniStorageList .= <<EOF;
343*c0c79a3fStz204579	/* $id */
344*c0c79a3fStz204579	length = (*env)->GetArrayLength(env, $id);
345*c0c79a3fStz204579	$p_event =
346*c0c79a3fStz204579	    (int *)malloc(length * sizeof (int));
347*c0c79a3fStz204579	if ($p_event == NULL) {
348*c0c79a3fStz204579		locale = I18N_SETUP;
349*c0c79a3fStz204579		local_throw(env, except_class,
350*c0c79a3fStz204579		    $noMemory);
351*c0c79a3fStz204579		(void) setlocale(LC_MESSAGES, locale);
352*c0c79a3fStz204579		goto cleanup;
353*c0c79a3fStz204579	}
354*c0c79a3fStz204579	(*env)->GetIntArrayRegion(env, $id, 0, length,
355*c0c79a3fStz204579	    (int *)$p_event);
356*c0c79a3fStz204579EOF
357*c0c79a3fStz204579
358*c0c79a3fStz204579
359*c0c79a3fStz204579		$jniFreeList .= "\n\tif ($p_event != NULL)\n" .
360*c0c79a3fStz204579		    "\t\tfree($p_event);\n";
361*c0c79a3fStz204579		unless ($haveLengthDef) {
362*c0c79a3fStz204579		    $haveLengthDef = 1;
363*c0c79a3fStz204579		    $jniDefine .= "\tint\t\t\tlength;\n";
364*c0c79a3fStz204579		}
365*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    int[]\t$id";
366*c0c79a3fStz204579		$jniParameterList .= ",\n    jintArray\t$id";
367*c0c79a3fStz204579		$specParameterList .= ", jintArray";
368*c0c79a3fStz204579		$needCleanupTarget = 1;
369*c0c79a3fStz204579	    } elsif (($type eq 'ADT_UIDSTAR') ||
370*c0c79a3fStz204579		     ($type eq 'ADT_GIDSTAR')) { # gid_t array
371*c0c79a3fStz204579		my $cType = 'uid_t';
372*c0c79a3fStz204579		$cType = 'gid_t' if ($type eq 'ADT_GIDSTAR');
373*c0c79a3fStz204579		$needLocaleDefined = 1;
374*c0c79a3fStz204579
375*c0c79a3fStz204579
376*c0c79a3fStz204579		$jniStorageList .= <<EOF;
377*c0c79a3fStz204579	/* $id */
378*c0c79a3fStz204579	length = (*env)->GetArrayLength(env, $id);
379*c0c79a3fStz204579	$p_event =
380*c0c79a3fStz204579	    ($cType *)malloc(length * sizeof ($cType));
381*c0c79a3fStz204579	if ($p_event == NULL) {
382*c0c79a3fStz204579		locale = I18N_SETUP;
383*c0c79a3fStz204579		local_throw(env, except_class,
384*c0c79a3fStz204579		    $noMemory);
385*c0c79a3fStz204579		(void) setlocale(LC_MESSAGES, locale);
386*c0c79a3fStz204579		goto cleanup;
387*c0c79a3fStz204579	}
388*c0c79a3fStz204579	(*env)->GetIntArrayRegion(env, $id, 0, length,
389*c0c79a3fStz204579	    (int *)$p_event);
390*c0c79a3fStz204579EOF
391*c0c79a3fStz204579
392*c0c79a3fStz204579
393*c0c79a3fStz204579		$jniFreeList .=
394*c0c79a3fStz204579		    "\n\tif ($p_event != NULL)\n" .
395*c0c79a3fStz204579		    "\t\tfree($p_event);\n";
396*c0c79a3fStz204579		unless ($haveLengthDef) {
397*c0c79a3fStz204579		    $haveLengthDef = 1;
398*c0c79a3fStz204579		    $jniDefine .= "\tint\t\t\tlength;\n";
399*c0c79a3fStz204579		}
400*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    int[]\t$id";
401*c0c79a3fStz204579		$jniParameterList .= ",\n    jintArray\t$id";
402*c0c79a3fStz204579		$specParameterList .= ", jintArray";
403*c0c79a3fStz204579		$needCleanupTarget = 1;
404*c0c79a3fStz204579	    } elsif ($type eq 'ADT_UINT64STAR') { # long array
405*c0c79a3fStz204579	        $needLocaleDefined = 1;
406*c0c79a3fStz204579	        $jniStorageList .= <<EOF;
407*c0c79a3fStz204579	/* $id */
408*c0c79a3fStz204579	length = (*env)->GetArrayLength(env, $id);
409*c0c79a3fStz204579	$p_event =
410*c0c79a3fStz204579	    (long *)malloc(length * sizeof (long long));
411*c0c79a3fStz204579	if ($p_event == NULL) {
412*c0c79a3fStz204579		locale = I18N_SETUP;
413*c0c79a3fStz204579		local_throw(env, except_class,
414*c0c79a3fStz204579		    $noMemory);
415*c0c79a3fStz204579		(void) setlocale(LC_MESSAGES, locale);
416*c0c79a3fStz204579		goto cleanup;
417*c0c79a3fStz204579	}
418*c0c79a3fStz204579	(*env)->GetLongArrayRegion(env, $id, 0, length,
419*c0c79a3fStz204579	    $p_event);
420*c0c79a3fStz204579EOF
421*c0c79a3fStz204579		$jniFreeList .= "\n\tif ($p_event != NULL)\n" .
422*c0c79a3fStz204579		    "\t\tfree($p_event);\n";
423*c0c79a3fStz204579		unless ($haveLengthDef) {
424*c0c79a3fStz204579		    $haveLengthDef = 1;
425*c0c79a3fStz204579		    $jniDefine .= "\tint\t\t\tlength;\n";
426*c0c79a3fStz204579		}
427*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    long[]\t$id";
428*c0c79a3fStz204579		$jniParameterList .= ",\n    jlongArray\t$id";
429*c0c79a3fStz204579		$specParameterList .= ", jlongArray";
430*c0c79a3fStz204579		$needCleanupTarget = 1;
431*c0c79a3fStz204579	    } elsif ($type eq 'ADT_CHAR') { # string in Java, char in C
432*c0c79a3fStz204579		$jniStorageList .= <<EOF;
433*c0c79a3fStz204579
434*c0c79a3fStz204579	/* $id */
435*c0c79a3fStz204579	c = (char *)(*env)->GetStringUTFChars(env, $id, NULL);
436*c0c79a3fStz204579	if (c == NULL)
437*c0c79a3fStz204579		goto cleanup; /* exception thrown */
438*c0c79a3fStz204579	$p_event = *c;
439*c0c79a3fStz204579	(*env)->ReleaseStringUTFChars(env, $id, c);
440*c0c79a3fStz204579EOF
441*c0c79a3fStz204579		# no need to free anything
442*c0c79a3fStz204579		unless ($haveCDef) {
443*c0c79a3fStz204579		    $haveCDef = 1;
444*c0c79a3fStz204579		    $jniDefine .= "\tchar\t\t\t*c\n";
445*c0c79a3fStz204579		}
446*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    String\t$id";
447*c0c79a3fStz204579		$jniParameterList .= ",\n    jstring\t$id";
448*c0c79a3fStz204579		$specParameterList .= ", jstring";
449*c0c79a3fStz204579	    } elsif ($type eq 'ADT_CHARSTAR') {
450*c0c79a3fStz204579	        $needLocaleDefined = 1;
451*c0c79a3fStz204579		$jniStorageList .= <<EOF;
452*c0c79a3fStz204579	/* $id */
453*c0c79a3fStz204579	if ($id != NULL) {
454*c0c79a3fStz204579		string = (char *)(*env)->GetStringUTFChars(
455*c0c79a3fStz204579		    env, $id, NULL);
456*c0c79a3fStz204579		if (string == NULL)
457*c0c79a3fStz204579			goto cleanup; /* exception thrown */
458*c0c79a3fStz204579		$p_event = strdup(string);
459*c0c79a3fStz204579		(*env)->ReleaseStringUTFChars(env, $id, string);
460*c0c79a3fStz204579		if ($p_event == NULL) {
461*c0c79a3fStz204579			locale = I18N_SETUP;
462*c0c79a3fStz204579			local_throw(env, except_class,
463*c0c79a3fStz204579			    $noMemory);
464*c0c79a3fStz204579			(void) setlocale(LC_MESSAGES, locale);
465*c0c79a3fStz204579			goto cleanup;
466*c0c79a3fStz204579		}
467*c0c79a3fStz204579	}
468*c0c79a3fStz204579EOF
469*c0c79a3fStz204579		$jniFreeList .= "\n\tif ($p_event != NULL)\n" .
470*c0c79a3fStz204579		    "\t\tfree($p_event);\n";
471*c0c79a3fStz204579		unless ($haveStringDef) {
472*c0c79a3fStz204579		    $haveStringDef = 1;
473*c0c79a3fStz204579		    $jniDefine .= "\tchar\t\t\t*string;\n";
474*c0c79a3fStz204579		}
475*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    String\t$id";
476*c0c79a3fStz204579		$jniParameterList .= ",\n    jstring\t$id";
477*c0c79a3fStz204579		$specParameterList .= ", jstring";
478*c0c79a3fStz204579		$needCleanupTarget = 1;
479*c0c79a3fStz204579	    } elsif ($type eq 'ADT_CHAR2STAR') { # array of string
480*c0c79a3fStz204579	        $needLocaleDefined = 1;
481*c0c79a3fStz204579		$jniStorageList .= <<EOF;
482*c0c79a3fStz204579	/* $id */
483*c0c79a3fStz204579	length = (*env)->GetArrayLength(env, $id);
484*c0c79a3fStz204579	$p_event = (char **)malloc(length
485*c0c79a3fStz204579	    * sizeof (char *));
486*c0c79a3fStz204579	if ($p_event == NULL) {
487*c0c79a3fStz204579		locale = I18N_SETUP;
488*c0c79a3fStz204579		local_throw(env, except_class,
489*c0c79a3fStz204579		    $noMemory);
490*c0c79a3fStz204579		(void) setlocale(LC_MESSAGES, locale);
491*c0c79a3fStz204579		goto cleanup;
492*c0c79a3fStz204579	}
493*c0c79a3fStz204579	p = $p_event;
494*c0c79a3fStz204579	for (i = 0; i < length; i++) {
495*c0c79a3fStz204579		jString = (*env)->GetObjectArrayElement(env, $id, i);
496*c0c79a3fStz204579		string = (char *)(*env)->GetStringUTFChars(
497*c0c79a3fStz204579		    env, jString, NULL);
498*c0c79a3fStz204579		if (string == NULL)
499*c0c79a3fStz204579			goto cleanup; /* exception thrown */
500*c0c79a3fStz204579		*p = strdup(string);
501*c0c79a3fStz204579		(*env)->ReleaseStringUTFChars(env, jString, string);
502*c0c79a3fStz204579		if (*p == NULL) {
503*c0c79a3fStz204579			locale = I18N_SETUP;
504*c0c79a3fStz204579			local_throw(env, except_class,
505*c0c79a3fStz204579			    $noMemory);
506*c0c79a3fStz204579			(void) setlocale(LC_MESSAGES, locale);
507*c0c79a3fStz204579			while (p >= $p_event)
508*c0c79a3fStz204579				free(*p--);
509*c0c79a3fStz204579			goto cleanup;
510*c0c79a3fStz204579		}
511*c0c79a3fStz204579		p++;
512*c0c79a3fStz204579	}
513*c0c79a3fStz204579EOF
514*c0c79a3fStz204579		$jniFreeList .=
515*c0c79a3fStz204579		    "\n\tif ($p_event != NULL)\n" .
516*c0c79a3fStz204579		    "\t\tfree($p_event);\n";
517*c0c79a3fStz204579		unless ($haveStringArrayDef) {
518*c0c79a3fStz204579		    unless ($haveStringDef) {
519*c0c79a3fStz204579			$haveStringDef = 1;
520*c0c79a3fStz204579			$jniDefine .= <<EOF;
521*c0c79a3fStz204579	char			*string;
522*c0c79a3fStz204579EOF
523*c0c79a3fStz204579		    }
524*c0c79a3fStz204579		    unless ($haveLengthDef) {
525*c0c79a3fStz204579			$haveLengthDef = 1;
526*c0c79a3fStz204579			$jniDefine .= <<EOF;
527*c0c79a3fStz204579	int			length;
528*c0c79a3fStz204579EOF
529*c0c79a3fStz204579		    }
530*c0c79a3fStz204579		    $haveStringArrayDef = 1;
531*c0c79a3fStz204579		    $jniDefine .= <<EOF;
532*c0c79a3fStz204579	int			i;
533*c0c79a3fStz204579	char			**p;
534*c0c79a3fStz204579	jstring			jString;
535*c0c79a3fStz204579EOF
536*c0c79a3fStz204579		}
537*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    String[]\t$id";
538*c0c79a3fStz204579		$jniParameterList .= ",\n    jstring\t$id";
539*c0c79a3fStz204579		$specParameterList .= ", jstring";
540*c0c79a3fStz204579		$needCleanupTarget = 1;
541*c0c79a3fStz204579	      } elsif ($type eq 'ADT_TERMIDSTAR') {
542*c0c79a3fStz204579	        $needLocaleDefined = 1;
543*c0c79a3fStz204579
544*c0c79a3fStz204579	        $jniStorageList .= <<EOF;
545*c0c79a3fStz204579	/* $id */
546*c0c79a3fStz204579	hostname$cntTermidDef = (char *)(*env)->GetStringUTFChars(env, $id, NULL);
547*c0c79a3fStz204579
548*c0c79a3fStz204579	if (adt_load_hostname((const char *)hostname$cntTermidDef, &termid$cntTermidDef)) {
549*c0c79a3fStz204579		local_throw(env, except_class,
550*c0c79a3fStz204579			gettext("hostname lookup failed"));
551*c0c79a3fStz204579	}
552*c0c79a3fStz204579	$p_event = termid$cntTermidDef;
553*c0c79a3fStz204579
554*c0c79a3fStz204579	(*env)->ReleaseStringUTFChars(env, $id, hostname$cntTermidDef);
555*c0c79a3fStz204579EOF
556*c0c79a3fStz204579
557*c0c79a3fStz204579		$jniFreeList .= "\n\tif (hostname$cntTermidDef != NULL)\n" .
558*c0c79a3fStz204579		    "\t\tfree(hostname$cntTermidDef);\n";
559*c0c79a3fStz204579		$jniFreeList .= "\n\tif (termid$cntTermidDef != NULL)\n" .
560*c0c79a3fStz204579		    "\t\tfree(termid$cntTermidDef);\n";
561*c0c79a3fStz204579
562*c0c79a3fStz204579		$jniDefine .= "\tchar\t\t\t*hostname$cntTermidDef;\n";
563*c0c79a3fStz204579		$jniDefine .= "\tadt_termid_t\t\t*termid$cntTermidDef;\n"; #djdj
564*c0c79a3fStz204579
565*c0c79a3fStz204579		$cntTermidDef++;
566*c0c79a3fStz204579
567*c0c79a3fStz204579		my ($nativeParameter, $jniParameter) = @{$java_jni{$type}};
568*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    $nativeParameter\t$id";
569*c0c79a3fStz204579		$jniParameterList .= ",\n    $jniParameter\t$id";
570*c0c79a3fStz204579		$specParameterList .= ", $jniParameter";
571*c0c79a3fStz204579		$needCleanupTarget = 1;
572*c0c79a3fStz204579	    } else {  # all others are primitive types
573*c0c79a3fStz204579		$jniStorageList .= "\n\t$p_event = $id;\n";
574*c0c79a3fStz204579		my ($nativeParameter, $jniParameter) = @{$java_jni{$type}};
575*c0c79a3fStz204579		$nativeParameter = "$nativeParameter\t"
576*c0c79a3fStz204579		    if length $nativeParameter < 4;  # why?
577*c0c79a3fStz204579		$nativeParameterList .= ",\n\t    $nativeParameter\t$id";
578*c0c79a3fStz204579		$jniParameterList .= ",\n    $jniParameter\t$id";
579*c0c79a3fStz204579		$specParameterList .= ", $jniParameter";
580*c0c79a3fStz204579	    }
581*c0c79a3fStz204579	}
582*c0c79a3fStz204579	if ($needLocaleDefined) {
583*c0c79a3fStz204579		$jniDefine .= <<EOF
584*c0c79a3fStz204579	char			*locale;
585*c0c79a3fStz204579EOF
586*c0c79a3fStz204579	}
587*c0c79a3fStz204579	my $genericOverride = '';
588*c0c79a3fStz204579	my $idParameter = $eventId;
589*c0c79a3fStz204579	$idParameter =~ s/AUE_/ADT_/;
590*c0c79a3fStz204579	if ($eventType eq 'generic') {
591*c0c79a3fStz204579	    $genericOverride = ', jint eventId';
592*c0c79a3fStz204579	    $idParameter = 'eventId';
593*c0c79a3fStz204579	}
594*c0c79a3fStz204579	$jniFreeList = "\tcleanup:\n" . $jniFreeList if $needCleanupTarget;
595*c0c79a3fStz204579
596*c0c79a3fStz204579	print Cfile qq{/* ARGSUSED */
597*c0c79a3fStz204579JNIEXPORT void JNICALL
598*c0c79a3fStz204579$jniPutEvent(
599*c0c79a3fStz204579    JNIEnv	*env,
600*c0c79a3fStz204579    jobject	self,
601*c0c79a3fStz204579    jbyteArray	jsession$genericOverride,
602*c0c79a3fStz204579    jint	status,
603*c0c79a3fStz204579    jint	ret_val$jniParameterList)
604*c0c79a3fStz204579{
605*c0c79a3fStz204579	$jniDefine
606*c0c79a3fStz204579	(void) j2c_pointer(env, jsession, (char **)&session);
607*c0c79a3fStz204579
608*c0c79a3fStz204579	event = $jniADTalloc(session, $idParameter);
609*c0c79a3fStz204579
610*c0c79a3fStz204579$jniStorageList
611*c0c79a3fStz204579	(void) adt_put_event((adt_event_data_t *)event, status, ret_val);
612*c0c79a3fStz204579
613*c0c79a3fStz204579$jniFreeList
614*c0c79a3fStz204579	adt_free_event((adt_event_data_t *)event);
615*c0c79a3fStz204579}
616*c0c79a3fStz204579};
617*c0c79a3fStz204579	print MapFile qq{
618*c0c79a3fStz204579	$jniPutEvent; };
619*c0c79a3fStz204579	my $overrideParameter = '';
620*c0c79a3fStz204579	if ($eventType eq 'generic') {
621*c0c79a3fStz204579	    $overrideParameter = 'int eventId,';
622*c0c79a3fStz204579	    my @allowed = @$allowedIds;
623*c0c79a3fStz204579	    if (@allowed) {
624*c0c79a3fStz204579		my $i;
625*c0c79a3fStz204579		if ($validSfile) {
626*c0c79a3fStz204579		    print Sfile "\t// Allowed values for eventId in putEvent:\n";
627*c0c79a3fStz204579		    for ($i = 0; $i <= $#allowed; $i++) {
628*c0c79a3fStz204579			my $idNo = $externalIdNo{$allowed[$i]};
629*c0c79a3fStz204579			$allowed[$i] =~ s/AUE_/ADT_/;
630*c0c79a3fStz204579			print Sfile "\tstatic final int $allowed[$i] = ",
631*c0c79a3fStz204579			     "$idNo;\n";
632*c0c79a3fStz204579		    }
633*c0c79a3fStz204579		    print Sfile "\n";
634*c0c79a3fStz204579		}
635*c0c79a3fStz204579	    } else {
636*c0c79a3fStz204579		print STDERR "Generic event with no allowed instances: $eventId\n";
637*c0c79a3fStz204579	    }
638*c0c79a3fStz204579	}
639*c0c79a3fStz204579	if ($validSfile) {
640*c0c79a3fStz204579	    print Sfile <<EOF;
641*c0c79a3fStz204579	private native void $javaPutEvent(byte[]session, $overrideParameter
642*c0c79a3fStz204579	    int status, int ret_val$nativeParameterList);
643*c0c79a3fStz204579
644*c0c79a3fStz204579	public AuditEvent_$root(AuditSession session)
645*c0c79a3fStz204579		throws Exception
646*c0c79a3fStz204579	{
647*c0c79a3fStz204579		super(session);
648*c0c79a3fStz204579	}
649*c0c79a3fStz204579
650*c0c79a3fStz204579EOF
651*c0c79a3fStz204579	    my $javaParameterList = '';
652*c0c79a3fStz204579	    foreach $ref2 (@entries) {
653*c0c79a3fStz204579		my ($id, $type, $format, $jComment, $required) = @$ref2;
654*c0c79a3fStz204579
655*c0c79a3fStz204579		# generate java native method prototypes
656*c0c79a3fStz204579		# and the corresponding C method implementation
657*c0c79a3fStz204579
658*c0c79a3fStz204579		my $javaMethodName = "$id";
659*c0c79a3fStz204579		my $javaStorageName = $javaMethodName . '_val';
660*c0c79a3fStz204579		my $jniMethodName = $root . $id;
661*c0c79a3fStz204579		my $storage;
662*c0c79a3fStz204579		my $enumUsage = '';
663*c0c79a3fStz204579		my $jParam = @{$java_jni{$type}}[0];
664*c0c79a3fStz204579		my $comment = '';
665*c0c79a3fStz204579		if ($required) {
666*c0c79a3fStz204579		    if ($format ne 'NULL') {
667*c0c79a3fStz204579			$comment = "\t// (required) formatted:  $format";
668*c0c79a3fStz204579		    } else {
669*c0c79a3fStz204579			$comment = "\t// required";
670*c0c79a3fStz204579		    }
671*c0c79a3fStz204579		} else {
672*c0c79a3fStz204579		    if ($format ne 'NULL') {
673*c0c79a3fStz204579			$comment = "\t// (optional) formatted:  $format";
674*c0c79a3fStz204579		    } else {
675*c0c79a3fStz204579			$comment = "\t// optional";
676*c0c79a3fStz204579		    }
677*c0c79a3fStz204579		}
678*c0c79a3fStz204579		if (($type eq 'ADT_UINT32STAR') ||
679*c0c79a3fStz204579		    ($type eq 'ADT_UIDSTAR') ||
680*c0c79a3fStz204579		    ($type eq 'ADT_GIDSTAR')) { # int array
681*c0c79a3fStz204579		    $storage = "int[] $javaStorageName" . ($required ?
682*c0c79a3fStz204579							   ' = {}' : '');
683*c0c79a3fStz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
684*c0c79a3fStz204579		} elsif ($type eq 'ADT_UINT64STAR') { # long array
685*c0c79a3fStz204579		    $storage = "long[] $javaStorageName" . ($required ?
686*c0c79a3fStz204579							    ' = {}' : '');
687*c0c79a3fStz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
688*c0c79a3fStz204579		} elsif (($type eq 'ADT_CHARSTAR') ||
689*c0c79a3fStz204579			 ($type eq 'ADT_CHAR')) { # string
690*c0c79a3fStz204579		    $storage = "String $javaStorageName" . ($required ?
691*c0c79a3fStz204579							    ' = ""' : '');
692*c0c79a3fStz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
693*c0c79a3fStz204579		} elsif ($type eq 'ADT_CHAR2STAR') { # array of string
694*c0c79a3fStz204579		    $storage = "String[] $javaStorageName" . ($required ?
695*c0c79a3fStz204579							      ' = {}' : '');
696*c0c79a3fStz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
697*c0c79a3fStz204579		} elsif ($type eq 'ADT_TERMIDSTAR') { # array of string
698*c0c79a3fStz204579		    $storage = "String $javaStorageName" . ($required ?
699*c0c79a3fStz204579							    ' = ""' : '');
700*c0c79a3fStz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
701*c0c79a3fStz204579		} else {  # all others are primitive types
702*c0c79a3fStz204579		    $storage = "$jParam $javaStorageName = 0";
703*c0c79a3fStz204579		    $javaParameterList .= ",\n\t\t\t    $javaStorageName";
704*c0c79a3fStz204579		    $enumUsage = "\n\t// See $jComment in AuditEvent.java for valid values"
705*c0c79a3fStz204579			if $jComment;
706*c0c79a3fStz204579		}
707*c0c79a3fStz204579		print Sfile <<EOF;
708*c0c79a3fStz204579$enumUsage
709*c0c79a3fStz204579	private $storage;$comment
710*c0c79a3fStz204579	public void $javaMethodName($jParam setTo)
711*c0c79a3fStz204579	{
712*c0c79a3fStz204579		$javaStorageName = setTo;
713*c0c79a3fStz204579	}
714*c0c79a3fStz204579EOF
715*c0c79a3fStz204579	    }	# end foreach (@entries)
716*c0c79a3fStz204579	    if ($eventType eq 'generic') {
717*c0c79a3fStz204579		print Sfile <<EOF;
718*c0c79a3fStz204579
719*c0c79a3fStz204579	public void putEvent(int status, int ret_val, int eventId)
720*c0c79a3fStz204579	{
721*c0c79a3fStz204579		byte[]	session = super.sh.getSession();
722*c0c79a3fStz204579
723*c0c79a3fStz204579		if ((super.sh.AuditIsOn) && (super.sh.ValidSession))
724*c0c79a3fStz204579			$javaPutEvent(session, eventId,
725*c0c79a3fStz204579			    status, ret_val$javaParameterList);
726*c0c79a3fStz204579	}
727*c0c79a3fStz204579}
728*c0c79a3fStz204579EOF
729*c0c79a3fStz204579	    } else {
730*c0c79a3fStz204579		print Sfile <<EOF;
731*c0c79a3fStz204579
732*c0c79a3fStz204579	public void putEvent(int status, int ret_val)
733*c0c79a3fStz204579	{
734*c0c79a3fStz204579		byte[]	session = super.sh.getSession();
735*c0c79a3fStz204579
736*c0c79a3fStz204579		if ((super.sh.AuditIsOn) && (super.sh.ValidSession))
737*c0c79a3fStz204579			$javaPutEvent(session, status, ret_val$javaParameterList);
738*c0c79a3fStz204579	}
739*c0c79a3fStz204579}
740*c0c79a3fStz204579EOF
741*c0c79a3fStz204579	    }
742*c0c79a3fStz204579	    close Sfile;
743*c0c79a3fStz204579	}	# end if ($validSfile);
744*c0c79a3fStz204579    }
745*c0c79a3fStz204579
746*c0c79a3fStz204579    # write trailers
747*c0c79a3fStz204579    print Jfile <<EOF;
748*c0c79a3fStz204579
749*c0c79a3fStz204579}
750*c0c79a3fStz204579EOF
751*c0c79a3fStz204579    print MapFile <<EOF;
752*c0c79a3fStz204579
753*c0c79a3fStz204579    local:
754*c0c79a3fStz204579	*;
755*c0c79a3fStz204579};
756*c0c79a3fStz204579EOF
757*c0c79a3fStz204579    close Cfile;
758*c0c79a3fStz204579    close Jfile;
759*c0c79a3fStz204579    close MapFile;
760*c0c79a3fStz204579}
761*c0c79a3fStz204579
762*c0c79a3fStz204579sub generateTableC {
763*c0c79a3fStz204579    my $event = shift;
764*c0c79a3fStz204579    my $eventId = shift;
765*c0c79a3fStz204579    my $eventType = shift;
766*c0c79a3fStz204579    my $eventHeader = shift;
767*c0c79a3fStz204579    my $omit = shift;
768*c0c79a3fStz204579
769*c0c79a3fStz204579    my %tokenType = (
770*c0c79a3fStz204579		  'acl'			=> 'AUT_ACL',
771*c0c79a3fStz204579		  'arbitrary'		=> 'AUT_ARBITRARY',
772*c0c79a3fStz204579		  'arg'			=> 'AUT_ARG',
773*c0c79a3fStz204579		  'attr'		=> 'AUT_ATTR',
774*c0c79a3fStz204579		  'command'		=> 'AUT_CMD',
775*c0c79a3fStz204579		  'command_1'		=> 'ADT_CMD_ALT',	# dummy token id
776*c0c79a3fStz204579		  'date'		=> 'AUT_TEXT',
777*c0c79a3fStz204579		  'exec_args'   	=> 'AUT_EXEC_ARGS',
778*c0c79a3fStz204579		  'exec_env'    	=> 'AUT_EXEC_ENV',
779*c0c79a3fStz204579		  'exit'        	=> 'AUT_EXIT',
780*c0c79a3fStz204579		  'file'        	=> 'AUT_FILE',
781*c0c79a3fStz204579		  'fmri'        	=> 'AUT_FMRI',
782*c0c79a3fStz204579		  'groups'      	=> 'AUT_GROUPS',
783*c0c79a3fStz204579	#	  'header'      	=> 'AUT_HEADER',	# not used
784*c0c79a3fStz204579		  'in_addr'     	=> 'AUT_IN_ADDR',
785*c0c79a3fStz204579		  'tid'          	=> 'AUT_TID',
786*c0c79a3fStz204579		  'ipc'         	=> 'AUT_IPC',
787*c0c79a3fStz204579		  'ipc_perm'    	=> 'AUT_IPC_PERM',
788*c0c79a3fStz204579		  'iport'		=> 'AUT_IPORT',
789*c0c79a3fStz204579		  'label'		=> 'AUT_LABEL',
790*c0c79a3fStz204579		  'newgroups'   	=> 'AUT_NEWGROUPS',
791*c0c79a3fStz204579		  'opaque'      	=> 'AUT_OPAQUE',
792*c0c79a3fStz204579		  'path'        	=> 'AUT_PATH',
793*c0c79a3fStz204579		  'path_list'		=> '-AUT_PATH',		# dummy token id
794*c0c79a3fStz204579		  'process'     	=> 'AUT_PROCESS',
795*c0c79a3fStz204579		  'priv_effective'	=> 'ADT_AUT_PRIV_E',	# dummy token id
796*c0c79a3fStz204579		  'priv_limit'		=> 'ADT_AUT_PRIV_L', 	# dummy token id
797*c0c79a3fStz204579		  'priv_inherit'	=> 'ADT_AUT_PRIV_I',	# dummy token id
798*c0c79a3fStz204579		  'return'      	=> 'AUT_RETURN',
799*c0c79a3fStz204579		  'seq'         	=> 'AUT_SEQ',
800*c0c79a3fStz204579		  'socket'      	=> 'AUT_SOCKET',
801*c0c79a3fStz204579		  'socket-inet' 	=> 'AUT_SOCKET_INET',
802*c0c79a3fStz204579		  'subject'     	=> 'AUT_SUBJECT',
803*c0c79a3fStz204579		  'text'        	=> 'AUT_TEXT',
804*c0c79a3fStz204579	#	  'trailer'     	=> 'AUT_TRAILER',	# not used
805*c0c79a3fStz204579		  'uauth'		=> 'AUT_UAUTH',
806*c0c79a3fStz204579		  'zonename'		=> 'AUT_ZONENAME'
807*c0c79a3fStz204579		 );
808*c0c79a3fStz204579
809*c0c79a3fStz204579    my @xlateEntryList = ();
810*c0c79a3fStz204579    my @jniEntryList = ();
811*c0c79a3fStz204579
812*c0c79a3fStz204579    my $external = $event->getExternal();
813*c0c79a3fStz204579    my $internal = $event->getInternal();
814*c0c79a3fStz204579
815*c0c79a3fStz204579    unless ($external) {
816*c0c79a3fStz204579	print STDERR "No external object captured for event $eventId\n";
817*c0c79a3fStz204579	return;
818*c0c79a3fStz204579    }
819*c0c79a3fStz204579    unless ($internal) {
820*c0c79a3fStz204579	print STDERR "No internal object captured for event $eventId\n";
821*c0c79a3fStz204579	return;
822*c0c79a3fStz204579    }
823*c0c79a3fStz204579    my @entryRef = $internal->getEntries();
824*c0c79a3fStz204579    my $entryRef;
825*c0c79a3fStz204579    my @tokenOrder = ();
826*c0c79a3fStz204579    my $firstTokenIndex = 0; # djdj not used yet, djdj BUG!
827*c0c79a3fStz204579    			     # needs to be used by translate table
828*c0c79a3fStz204579
829*c0c79a3fStz204579    if ($internal->isReorder()) { # prescan the entry list to get the token order
830*c0c79a3fStz204579      my @inputOrder;
831*c0c79a3fStz204579      foreach $entryRef (@entryRef) {
832*c0c79a3fStz204579	my ($intEntry, $entry) = @$entryRef;
833*c0c79a3fStz204579	push (@inputOrder, $intEntry->getAttr('order'));
834*c0c79a3fStz204579      }
835*c0c79a3fStz204579
836*c0c79a3fStz204579      my $i; # walk down the inputOrder list once
837*c0c79a3fStz204579      my $k = 1; # discover next in line
838*c0c79a3fStz204579      my $l = 0; # who should point to next in line
839*c0c79a3fStz204579      for ($i = 0; $i <= $#inputOrder; $i++) {
840*c0c79a3fStz204579	my $j;
841*c0c79a3fStz204579	for ($j = 0; $j <= $#inputOrder; $j++) {
842*c0c79a3fStz204579	  if ($k == $inputOrder[$j]) {
843*c0c79a3fStz204579	    if ($k == 1) {
844*c0c79a3fStz204579	        $firstTokenIndex = $j;
845*c0c79a3fStz204579	    } else {
846*c0c79a3fStz204579	        $tokenOrder[$l] = "&(selfReference[$j])";
847*c0c79a3fStz204579	    }
848*c0c79a3fStz204579	    $l = $j;
849*c0c79a3fStz204579	    last;
850*c0c79a3fStz204579	  }
851*c0c79a3fStz204579	}
852*c0c79a3fStz204579	$k++;
853*c0c79a3fStz204579      }
854*c0c79a3fStz204579      $tokenOrder[$l] = 'NULL';
855*c0c79a3fStz204579    }
856*c0c79a3fStz204579    else { # default order -- input order same as output
857*c0c79a3fStz204579      my $i;
858*c0c79a3fStz204579      my $j;
859*c0c79a3fStz204579      for ($i = 0; $i < $#entryRef; $i++) {
860*c0c79a3fStz204579	my $j = $i + 1;
861*c0c79a3fStz204579	$tokenOrder[$i] = "&(selfReference[$j])";
862*c0c79a3fStz204579      }
863*c0c79a3fStz204579      $tokenOrder[$#entryRef] = 'NULL';
864*c0c79a3fStz204579    }
865*c0c79a3fStz204579
866*c0c79a3fStz204579    my $sequence = 0;
867*c0c79a3fStz204579    foreach $entryRef (@entryRef) {
868*c0c79a3fStz204579      my ($intEntry, $entry) = @$entryRef;
869*c0c79a3fStz204579      my $entryId = $entry->getAttr('id');
870*c0c79a3fStz204579
871*c0c79a3fStz204579      my ($extEntry, $unusedEntry, $tokenId) =
872*c0c79a3fStz204579	$external->getEntry($entryId);
873*c0c79a3fStz204579      my $opt = $extEntry->getAttr('opt');
874*c0c79a3fStz204579
875*c0c79a3fStz204579      if ($opt eq 'none') {
876*c0c79a3fStz204579	if (defined ($doc->getToken($tokenId))) {
877*c0c79a3fStz204579	  if (defined ($tokenType{$tokenId})) {
878*c0c79a3fStz204579	    $tokenId = $tokenType{$tokenId};
879*c0c79a3fStz204579	  }
880*c0c79a3fStz204579	  else {
881*c0c79a3fStz204579	    print STDERR "token id $tokenId not implemented\n";
882*c0c79a3fStz204579	  }
883*c0c79a3fStz204579	}
884*c0c79a3fStz204579	else {
885*c0c79a3fStz204579	  print STDERR "token = $tokenId is undefined\n";
886*c0c79a3fStz204579	  $tokenId = 'error';
887*c0c79a3fStz204579	}
888*c0c79a3fStz204579	my ($xlate, $jni) =
889*c0c79a3fStz204579	  formatTableEntry ('', $tokenId, $eventId, '', 0, 0, $tokenOrder[$sequence],
890*c0c79a3fStz204579			    'NULL', '');
891*c0c79a3fStz204579	push (@xlateEntryList, $xlate);
892*c0c79a3fStz204579	push (@jniEntryList, @$jni);
893*c0c79a3fStz204579      }
894*c0c79a3fStz204579      else {
895*c0c79a3fStz204579	my $dataType = $extEntry->getAttr('type');
896*c0c79a3fStz204579	$dataType =~ s/\s+//g;   # remove blanks (char * => char*)
897*c0c79a3fStz204579
898*c0c79a3fStz204579	my $enumGroup = '';
899*c0c79a3fStz204579	if ($dataType =~ /^msg/i) {
900*c0c79a3fStz204579	    $enumGroup = $dataType;
901*c0c79a3fStz204579	    $enumGroup =~ s/^msg\s*//i;
902*c0c79a3fStz204579	    $enumGroup = 'adt_' . $enumGroup;
903*c0c79a3fStz204579	}
904*c0c79a3fStz204579	my $required = ($opt eq 'required') ? 1 : 0;
905*c0c79a3fStz204579	my $tsol = 0;
906*c0c79a3fStz204579	my $tokenId = $intEntry->getAttr('token');
907*c0c79a3fStz204579	my $token;
908*c0c79a3fStz204579	my $tokenName;
909*c0c79a3fStz204579	my $tokenFormat = $intEntry->getAttr('format');
910*c0c79a3fStz204579	if (defined ($tokenFormat)) {
911*c0c79a3fStz204579	  $tokenFormat = "\"$tokenFormat\"";
912*c0c79a3fStz204579	}
913*c0c79a3fStz204579	else {
914*c0c79a3fStz204579	  $tokenFormat = 'NULL';
915*c0c79a3fStz204579	}
916*c0c79a3fStz204579
917*c0c79a3fStz204579	if (defined ($token = $doc->getToken($tokenId))) {
918*c0c79a3fStz204579	  $tsol = (lc $token->getUsage() eq 'tsol') ? 1 : 0;
919*c0c79a3fStz204579	  if (defined ($tokenType{$tokenId})) {
920*c0c79a3fStz204579	    $tokenName = $tokenType{$tokenId};
921*c0c79a3fStz204579	  }
922*c0c79a3fStz204579	  else {
923*c0c79a3fStz204579	    print STDERR "token id $tokenId not implemented\n";
924*c0c79a3fStz204579	  }
925*c0c79a3fStz204579	}
926*c0c79a3fStz204579	else {
927*c0c79a3fStz204579	  print STDERR
928*c0c79a3fStz204579	    "$tokenId is an unimplemented token ($entryId in $eventId)\n";
929*c0c79a3fStz204579	  $tokenName = 'AUT_TEXT';
930*c0c79a3fStz204579	}
931*c0c79a3fStz204579	my ($xlate, $jni) =
932*c0c79a3fStz204579	  formatTableEntry($entryId, $tokenName, $eventId, $dataType, $required,
933*c0c79a3fStz204579			   $tsol, $tokenOrder[$sequence], $tokenFormat,
934*c0c79a3fStz204579			   $enumGroup, (uc $omit eq 'JNI'));
935*c0c79a3fStz204579	push (@xlateEntryList, $xlate);
936*c0c79a3fStz204579	push (@jniEntryList, @$jni);
937*c0c79a3fStz204579      }
938*c0c79a3fStz204579      $sequence++;
939*c0c79a3fStz204579    }
940*c0c79a3fStz204579    $jniEventTable{$eventId} = [\@jniEntryList, $eventType,
941*c0c79a3fStz204579				$external->getAllowedTypes(), $eventHeader]
942*c0c79a3fStz204579	unless (uc $omit eq 'JNI') || ($omit eq 'always');
943*c0c79a3fStz204579}
944*c0c79a3fStz204579
945*c0c79a3fStz204579sub formatTableEntry {
946*c0c79a3fStz204579    my ($id, $token, $eventId, $type, $required, $tsol, $sequence, $format, $enumGroup,
947*c0c79a3fStz204579	$omitJNI) = @_;
948*c0c79a3fStz204579
949*c0c79a3fStz204579
950*c0c79a3fStz204579    # does this map belong in the xml source?  (at least the defaults?)
951*c0c79a3fStz204579    # fill in the default value only if it is other than zero.
952*c0c79a3fStz204579    #		      base type		    adt name,	default value
953*c0c79a3fStz204579    my %entryDef = ( 'au_asid_t'       	=> ['ADT_UINT32',	''],
954*c0c79a3fStz204579		     'uint_t'		=> ['ADT_UINT32',      	''],
955*c0c79a3fStz204579		     'int'		=> ['ADT_INT',		''],
956*c0c79a3fStz204579		     'int32_t'		=> ['ADT_INT32',	''],
957*c0c79a3fStz204579		     'uid_t'		=> ['ADT_UID',		'AU_NOAUDITID'],
958*c0c79a3fStz204579		     'gid_t'		=> ['ADT_GID',		'AU_NOAUDITID'],
959*c0c79a3fStz204579		     'uid_t*'		=> ['ADT_UIDSTAR',	''],
960*c0c79a3fStz204579		     'gid_t*'		=> ['ADT_GIDSTAR',	''],
961*c0c79a3fStz204579		     'char'		=> ['ADT_CHAR',		''],
962*c0c79a3fStz204579		     'char*'		=> ['ADT_CHARSTAR',	''],
963*c0c79a3fStz204579		     'char**'		=> ['ADT_CHAR2STAR',	''],
964*c0c79a3fStz204579		     'long'		=> ['ADT_LONG',		''],
965*c0c79a3fStz204579		     'pid_t'		=> ['ADT_PID',		''],
966*c0c79a3fStz204579		     'priv_set_t*'	=> ['ADT_PRIVSTAR',	''],
967*c0c79a3fStz204579		     'ulong_t'		=> ['ADT_ULONG',	''],
968*c0c79a3fStz204579		     'uint16_t',	=> ['ADT_UINT16',	''],
969*c0c79a3fStz204579		     'uint32_t'		=> ['ADT_UINT32',	''],
970*c0c79a3fStz204579		     'uint32_t*'	=> ['ADT_UINT32STAR',	''],
971*c0c79a3fStz204579		     'uint32_t[]'	=> ['ADT_UINT32ARRAY',  ''],
972*c0c79a3fStz204579		     'uint64_t'		=> ['ADT_UINT64',	''],
973*c0c79a3fStz204579		     'uint64_t*'	=> ['ADT_UINT64STAR',	''],
974*c0c79a3fStz204579		     'm_label_t*'	=> ['ADT_MLABELSTAR',	''],
975*c0c79a3fStz204579		    );
976*c0c79a3fStz204579    my $xlateLabel = $uniLabel.$xlateUniLabelInc;
977*c0c79a3fStz204579    my $xlateLabelInc = 0;
978*c0c79a3fStz204579    my $xlateLine = '';
979*c0c79a3fStz204579    my @jniLine = ();
980*c0c79a3fStz204579
981*c0c79a3fStz204579	# the list handling should be a simple loop with a loop of one
982*c0c79a3fStz204579        # falling out naturally.
983*c0c79a3fStz204579
984*c0c79a3fStz204579    unless ($type =~ /,/) {	# if list, then generate sequence of entries
985*c0c79a3fStz204579      my $dataType;
986*c0c79a3fStz204579      my $dataSize;
987*c0c79a3fStz204579      my $xlateLabelRef = '';
988*c0c79a3fStz204579
989*c0c79a3fStz204579      my $arraySize = '';
990*c0c79a3fStz204579      $arraySize = $1 if ($type =~ s/\[(\d+)\]/[]/);
991*c0c79a3fStz204579
992*c0c79a3fStz204579      my $entryType = ${$entryDef{$type}}[0];
993*c0c79a3fStz204579
994*c0c79a3fStz204579      my @xlateType = ();	# for adt_xlate.c
995*c0c79a3fStz204579      my $typeCount = 1;
996*c0c79a3fStz204579
997*c0c79a3fStz204579      if ($entryType) {
998*c0c79a3fStz204579	$dataType = $entryType;
999*c0c79a3fStz204579	$type =~ s/([^*]+)\s*(\*+)/$1 $2/;
1000*c0c79a3fStz204579	$type =~ s/\[\]//;
1001*c0c79a3fStz204579	$dataSize = "sizeof ($type)";
1002*c0c79a3fStz204579	if ($arraySize) {
1003*c0c79a3fStz204579		$dataSize = "$arraySize * " . $dataSize;
1004*c0c79a3fStz204579	}
1005*c0c79a3fStz204579	$xlateLine = "{{$dataType, $dataSize}}";
1006*c0c79a3fStz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
1007*c0c79a3fStz204579      } elsif ($type eq '') {
1008*c0c79a3fStz204579	  $xlateLabelRef = 'NULL';
1009*c0c79a3fStz204579      } elsif ($type =~ /^msg/i) {
1010*c0c79a3fStz204579	$type =~ s/^msg//i;
1011*c0c79a3fStz204579	$dataType = 'ADT_MSG';
1012*c0c79a3fStz204579	my $dataEnum = 'ADT_LIST_' . uc $type;
1013*c0c79a3fStz204579	$xlateLine = "{{$dataType, $dataEnum}}";
1014*c0c79a3fStz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
1015*c0c79a3fStz204579      } elsif ($type =~ /time_t/i) {
1016*c0c79a3fStz204579	$dataType = 'ADT_DATE';
1017*c0c79a3fStz204579	$dataSize = "sizeof (time_t)";
1018*c0c79a3fStz204579	$xlateLine = "{{$dataType, $dataSize}}";
1019*c0c79a3fStz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
1020*c0c79a3fStz204579      } elsif ($type =~ /termid/i) {
1021*c0c79a3fStz204579	$dataType = 'ADT_TERMIDSTAR';
1022*c0c79a3fStz204579	$dataSize = "sizeof (au_tid_addr_t *)";
1023*c0c79a3fStz204579	$xlateLine = "{{$dataType, $dataSize}}";
1024*c0c79a3fStz204579	push (@jniLine, [$id, $dataType, $format, $enumGroup, $required]);
1025*c0c79a3fStz204579      } elsif ($omitJNI) {
1026*c0c79a3fStz204579	$xlateLabelRef = 'NULL';
1027*c0c79a3fStz204579      } else {
1028*c0c79a3fStz204579	print STDERR "$type is not an implemented data type\n";
1029*c0c79a3fStz204579	$xlateLabelRef = 'NULL';
1030*c0c79a3fStz204579      }
1031*c0c79a3fStz204579      $xlateLabelRef = '&' . $xlateLabel . '[0]'
1032*c0c79a3fStz204579	unless $xlateLabelRef eq 'NULL';
1033*c0c79a3fStz204579
1034*c0c79a3fStz204579      # "EOL" is where a comma should go unless end of list
1035*c0c79a3fStz204579      $xlateLine = "{$token,\t1,\t$xlateLabelRef,\t$sequence,\n" .
1036*c0c79a3fStz204579	  "\t\t0,\t$required,\t$tsol,\t$format}EOL";
1037*c0c79a3fStz204579
1038*c0c79a3fStz204579    } else {	# is a list
1039*c0c79a3fStz204579      my @type = split(/,/, $type);
1040*c0c79a3fStz204579      my @arraySize = ();
1041*c0c79a3fStz204579      my @id   = split(/,/, $id);
1042*c0c79a3fStz204579      my @jniId  = @id;
1043*c0c79a3fStz204579      my $dataType;
1044*c0c79a3fStz204579      my $typeCount = ($#type + 1);
1045*c0c79a3fStz204579      my @xlateType = ();
1046*c0c79a3fStz204579      my @default = ();
1047*c0c79a3fStz204579
1048*c0c79a3fStz204579      foreach my $dtype (@type) {
1049*c0c79a3fStz204579	my $jniId = shift @jniId;
1050*c0c79a3fStz204579	my $id = shift @id;
1051*c0c79a3fStz204579	my $arraySize = '';
1052*c0c79a3fStz204579	$arraySize = $1 if ($dtype =~ s/\[(\d+)\]/[]/);
1053*c0c79a3fStz204579
1054*c0c79a3fStz204579	my $entryType = ${$entryDef{$dtype}}[0];
1055*c0c79a3fStz204579	if ($entryType) {
1056*c0c79a3fStz204579	  my $type = $dtype;
1057*c0c79a3fStz204579	  $type =~ s/([^*]+)\s*(\*+)/$1 $2/;
1058*c0c79a3fStz204579	  $type =~ s/\[\]//;
1059*c0c79a3fStz204579
1060*c0c79a3fStz204579	  my $sizeString = "sizeof";
1061*c0c79a3fStz204579	  $sizeString = "$arraySize * " . $sizeString if $arraySize;
1062*c0c79a3fStz204579	  push (@xlateType, "\{$entryType, $sizeString ($type)\}");
1063*c0c79a3fStz204579	  push (@jniLine, [$jniId, $entryType, $format, $enumGroup, $required]);
1064*c0c79a3fStz204579	} elsif ($type =~ /^msg/i) {
1065*c0c79a3fStz204579	  $type =~ s/^msg//i;
1066*c0c79a3fStz204579	  $dataType = 'ADT_MSG';
1067*c0c79a3fStz204579	  my $dataEnum = 'ADT_LIST_' . uc $type;
1068*c0c79a3fStz204579	  push (@xlateType, "\{$dataType, $dataEnum\}};");
1069*c0c79a3fStz204579	  push (@jniLine, [$jniId, $dataType, $format, $enumGroup, $required]);
1070*c0c79a3fStz204579	} elsif ($type =~ /time_t/i) {
1071*c0c79a3fStz204579	  $dataType = 'ADT_DATE';
1072*c0c79a3fStz204579	  push (@xlateType, "\{$entryType, sizeof ($type)\}");
1073*c0c79a3fStz204579	  push (@jniLine, [$jniId, $entryType, $format, $enumGroup, $required]);
1074*c0c79a3fStz204579	} elsif ($type =~ /termid/i) {
1075*c0c79a3fStz204579	  $dataType = 'ADT_TERMIDSTAR';
1076*c0c79a3fStz204579	  push (@xlateType, "\{$dataType, sizeof (au_tid_addr_t *)\}");
1077*c0c79a3fStz204579	  push (@jniLine, [$jniId, $dataType, $format, $enumGroup, $required]);
1078*c0c79a3fStz204579	} elsif ($omitJNI) {
1079*c0c79a3fStz204579	  # nothing to do.
1080*c0c79a3fStz204579	} else {
1081*c0c79a3fStz204579	  print STDERR "$dtype is not an implemented data type\n";
1082*c0c79a3fStz204579	}
1083*c0c79a3fStz204579	if (${$entryDef{$dtype}}[1]) {
1084*c0c79a3fStz204579	  push (@default, $id, ${$entryDef{$dtype}}[1]);
1085*c0c79a3fStz204579	}
1086*c0c79a3fStz204579      }
1087*c0c79a3fStz204579      my $xlateArray = "\[$typeCount\] =\t{" . join(",\n\t\t\t\t", @xlateType) . "};";
1088*c0c79a3fStz204579
1089*c0c79a3fStz204579      $xlateLine =
1090*c0c79a3fStz204579	"{$token,\t$typeCount,\t&$xlateLabel\[0\],\t$sequence,\n" .
1091*c0c79a3fStz204579        "\t\t0,\t$required,\t$tsol,\t$format}EOL";
1092*c0c79a3fStz204579    }
1093*c0c79a3fStz204579    $xlateUniLabelInc++ if $xlateLabelInc;
1094*c0c79a3fStz204579    return ($xlateLine, \@jniLine);
1095*c0c79a3fStz204579}
1096*c0c79a3fStz204579
1097*c0c79a3fStz204579sub generateMsgLists {
1098*c0c79a3fStz204579    my $textList = shift;
1099*c0c79a3fStz204579
1100*c0c79a3fStz204579    my $textName = $textList->getId();
1101*c0c79a3fStz204579    my $header = $textList->getHeader();
1102*c0c79a3fStz204579    my $start = $textList->getMsgStart();
1103*c0c79a3fStz204579    my $public = $textList->getMsgPublic();
1104*c0c79a3fStz204579    my $deprecated = $textList->getDeprecated();
1105*c0c79a3fStz204579
1106*c0c79a3fStz204579    print "$textName starts at $start\n" if $debug;
1107*c0c79a3fStz204579
1108*c0c79a3fStz204579    my $entry;
1109*c0c79a3fStz204579    my @entry;
1110*c0c79a3fStz204579    while ($entry = $textList->getNextMsg()) {
1111*c0c79a3fStz204579        if ($debug) {
1112*c0c79a3fStz204579	    my ($id, $text) = split(/\s*::\s*/, $entry);
1113*c0c79a3fStz204579	    print "   $id = $text\n";
1114*c0c79a3fStz204579	}
1115*c0c79a3fStz204579	unshift (@entry, $entry);
1116*c0c79a3fStz204579    }
1117*c0c79a3fStz204579    $msg_list{$textName} =
1118*c0c79a3fStz204579	[\@entry, [$header, $start, $public, $deprecated]];
1119*c0c79a3fStz204579}
1120*c0c79a3fStz204579sub readAuditEventFile {
1121*c0c79a3fStz204579    my $eventListFile = shift;
1122*c0c79a3fStz204579
1123*c0c79a3fStz204579  open(Event, $eventListFile)
1124*c0c79a3fStz204579    or die "can't open $eventListFile: $!\n";
1125*c0c79a3fStz204579  while(<Event>) {
1126*c0c79a3fStz204579    next if /^\s*#/;
1127*c0c79a3fStz204579    next if /^\s*$/;
1128*c0c79a3fStz204579    my ($value, $name) = split(/\s*:\s*/);
1129*c0c79a3fStz204579    next if $value < 6000;
1130*c0c79a3fStz204579    $eventCode{$name} = $value;
1131*c0c79a3fStz204579  }
1132*c0c79a3fStz204579  close Event;
1133*c0c79a3fStz204579}
1134*c0c79a3fStz204579
1135