auparse/mk_audit_syscalls.pl (77 lines of code) (raw):
#!/usr/bin/env perl
# Copyright 2017 Elasticsearch Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
my $command = "mk_audit_syscalls.pl ". join(' ', @ARGV);
sub fmt {
my ($num, $name) = @_;
print "\t\t$num: \"$name\",\n";
}
my $base_url = "https://raw.githubusercontent.com/linux-audit/audit-userspace/v4.0.2/lib";
my @tables = (
"aarch64",
"arm",
"i386",
"ppc",
"s390",
"s390x",
"x86_64",
);
sub downloadTable {
my ($arch) = @_;
`curl -s -O ${base_url}/${arch}_table.h`;
}
sub readTable {
my ($file) = @_;
# Read syscall number to name mapping.
open(FILE, $file);
my %num_to_name;
while(<FILE>){
# Example: _S(14, "rt_sigprocmask")
if(/^_S\((\d+),\s+"(\w+)"/){
$num_to_name{$1} = $2;
}
}
close FILE;
return %num_to_name;
}
print <<EOF;
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// Code generated by $command - DO NOT EDIT.
package auparse
// AuditSyscalls is a mapping of arch names to tables of syscall numbers to names.
// For example, x86_64 -> 165 = "mount".
var AuditSyscalls = map[string]map[int]string{
EOF
foreach my $arch (sort @tables) {
downloadTable $arch;
my %num_to_name = readTable("${arch}_table.h");
print "\t\"${arch}\": map[int]string{\n";
foreach my $syscall (sort {$a <=> $b} keys %num_to_name) {
my $name = $num_to_name{$syscall};
fmt($syscall, $name);
}
print "\t},\n";
}
print <<EOF;
}
func init() {
// Add "aliases" to ppc for ppc64 and ppc64le. They share the same tables.
ppcTable, found := AuditSyscalls["ppc"]
if !found {
panic("missing ppc syscall table")
}
AuditSyscalls["ppc64"] = ppcTable
AuditSyscalls["ppc64le"] = ppcTable
}
EOF