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