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