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