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