auditxml revision f72effdea24d97a107b04e4b041cf5081dae0ee9
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# CDDL HEADER START
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# The contents of this file are subject to the terms of the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Common Development and Distribution License (the "License").
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# You may not use this file except in compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# See the License for the specific language governing permissions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# When distributing Covered Code, include this CDDL HEADER in each
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# If applicable, add the following below this CDDL HEADER, with the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# fields enclosed by brackets "[]" replaced with your own identifying
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# information: Portions Copyright [yyyy] [name of copyright owner]
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# CDDL HEADER END
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Use is subject to license terms.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# ident "%Z%%M% %I% %E% SMI"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# auditxml [-d] <xml input file>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# auditxml takes the audit record description (.xml file) and
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden# generates the files needed for the C audit api.
f48118365a7f4f1240516dbe66e47b24a896ff16Craig McDonnellour $debug = 0; # normal use is to set via the file being parsed.
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden # <debug set="on"/> or <debug set="off"/> or <debug/>
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden # if the set attribute is omitted, debug state is toggled
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden # Override with appDebug, but toggle won't do what you
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Maddenmy $appDebug = 0; # used after return from "new auditxml";
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil MaddenDO NOT EDIT. This file is auto generated by the Solaris Audit
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden# trim leading/trailing newlines
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# where everything comes from and where it goes:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostermy $doc = new auditxml ($ARGV[0]); # input XML file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addHeader($eventHeader) if defined ($eventHeader);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster generateAPIFile($event, $eventId, $eventType, $eventHeader, $idNo)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster generateTableC($event, $eventId, $eventType, $eventHeader, $omit);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster generateMsgLists($textList); # enum -> text mappings
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print STDERR "can't open output file ($file): $!\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $notice =~ s/\n/\n * /gs;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $notice =~ s/\s+\n/\n/gs;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include <bsm/libbsm.h>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include <adt_xlate.h>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include <libintl.h>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "/* Internal data type definitions */\n\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "\n/* External event structure to internal event structure */\n\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster foreach my $eventId (sort keys %xlateEventTable) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($ref1, $eventType, $firstToken, $eventHeader) =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "static struct entry $structName\[$count\] = {\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "static struct translation X_$externalRoot = {\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "\t0,\n"; # tx_offsetsCalculated = 0
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "\t&XX_$externalRoot\[$firstToken\],\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print STDERR "expected entry for $eventId but none found\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "struct translation *xlate_table[$count] = {\n";
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonadt_preload(au_event_t event_id, adt_event_data_t *event_data)
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington switch (event_id) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster event_data->$lcid.$fieldName = $default;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/* message lists */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($listRef, $headref) = @{$msg_list{$listName}};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($header, $start, $public, $deprecated) = @$headref;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster push (@listName, [$listName, $listLength - 1, $start, $public]);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "/* Deprecated message list */\n" if ($deprecated);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "static char *msg_$listName\[$listLength] = {\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($id, $text) = split(/\s*::\s*/, $listValue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Cfile "\nstruct msg_text adt_msg_text[", $#listName + 1,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $notice =~ s/\n/\n * /gs;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $notice =~ s/\s+\n/\n/gs;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifndef $adt_event_n
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define $adt_event_n
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include <bsm/$include>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifdef __cplusplus
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * adt_put_event() status values. Positive values are for kernel-generated
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * failure, -1 for user-space. For ADT_SUCCESS, the adt_put_event() return_val
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is not used; the convention is to set it to ADT_SUCCESS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define ADT_SUCCESS 0
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define ADT_FAILURE -1
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($listRef, $headref) = @{$msg_list{$listName}};
f48118365a7f4f1240516dbe66e47b24a896ff16Craig McDonnell my ($header, $start, $public, $deprecated) = @$headref;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Hfile "/* Deprecated message list */\n" if $deprecated;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Hfile "#define\tADT_$shortName\t$start\n" if $start;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($id, $text) = split(/\s*::\s*/, $listValue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $text = "(no token will be generated)" unless $text;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my $line = "\tADT_$shortName"."_$id$start\t/* ";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster 1 while $eline =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
f48118365a7f4f1240516dbe66e47b24a896ff16Craig McDonnell if ((length($eline) > 77) && ($line =~ /\t\t/)) {
f48118365a7f4f1240516dbe66e47b24a896ff16Craig McDonnell # strip off double tab so that comment can be longer
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $line =~ s/\t\t/\t/;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # shorten eline; don't mind where the spaces are removed, it is
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (length($eline) > 77) { # 80 - length(" */")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # here we use negative length in substr to leave off from the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $line .= substr($text, 0, 74 - length($eline));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # generate defines for ADT_* external event names
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($header, $idNo) = @{$eventExtra{$eventId}};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print STDERR "missing header selection for $eventId\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my $l = length($eventId) + 8; # label plus preceding #define\t
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster $l = 1 if $l < 1;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print STDERR "missing id number for $eventId\n" unless $idNo;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster my ($header, $idNo) = @{$eventExtra{$eventId}};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print STDERR "$eventId is missing the header assignment\n";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print Hfile "\nstruct $dataId {\t/* $externalId */\n";
$entry =~ s/termid/adt_termid_t/;
$outputState[$header] = 0;
$outputState[$header] = 1;
my $elementName = $eventId;
$elementName =~ s/^AUE_/adt_/;
$elementName =~ s/_t$//;
my $event = shift;
my $eventId = shift;
my $eventType = shift;
my $eventHeader = shift;
my $omit = shift;
my $entryRef;
my @inputOrder;
$firstTokenIndex = $j;
last;
my $sequence = 0;
$enumGroup =~ s/^msg\s*//i;
my $tsol = 0;
my $token;
my $tokenName;
print STDERR
$sequence++;
my $xlateLabelInc = 0;
my $dataType;
my $dataSize;
my $entryType = ${$entryDef{$type}}[0];
my $typeCount = 1;
$type =~ s/\[\]//;
$xlateLabelInc = 1;
@list = @{$xlateDefault{$eventId}};
$xlateDefault{$eventId} = \@list;
my $dataType;
my $entryType = ${$entryDef{$dtype}}[0];
$type =~ s/\[\]//;
$xlateLabelInc = 1;
@list = @{$xlateDefault{$eventId}};
$xlateDefault{$eventId} = \@list;
my $event = shift;
my $eventId = shift;
my $eventType = shift;
my $eventHeader = shift;
my $idNo = shift;
print STDERR
$#id = $#type;
$#type = $#id;
$eventExtra{$eventId} = [$eventHeader, $idNo];
my $textList = shift;
my $entry;
my @entry;
[\@entry, [$header, $start, $public, $deprecated]];
my $header_index = shift;
# $header = 0 is a special case; it is for adt_event.h
# $header > 0 creates adt_event_N.h, where N = $header
my $header;
$HfileName[$header] = $tmp[$#tmp];
my @Hfile = @_;
my $header;