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