pkgsrc/sysutils/strace/patches/patch-av

189 lines
5.3 KiB
Text

$NetBSD: patch-av,v 1.4 2011/09/01 13:00:49 christos Exp $
--- /dev/null 2011-09-01 15:59:46.000000000 +0300
+++ syscalls.pl 2011-09-01 15:59:28.000000000 +0300
@@ -0,0 +1,184 @@
+#!/usr/pkg/bin/perl -w
+#
+# Copyright (c) 2000, Gaël Roualland <gael.roualland@iname.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# $Id: patch-av,v 1.4 2011/09/01 13:00:49 christos Exp $
+#/
+
+# Buils syscall.h and syscallent.h from:
+# - syscalls.cat containing lines of format: syscall catmask
+# - syscalls.print containing lines of format: syscall [printfunction]
+# if no printfunction is provided, sys_<call> is used.
+# - syscalls.master in the FreeBSD kernel source tree (/usr/src/sys/kern)
+
+use strict;
+use POSIX;
+
+use vars qw(%sysprint %syscat);
+
+sub usage() {
+ print STDERR
+ "usage: $0 syscalls.master [<syscalls.print>] [<syscalls.cat>]\n";
+ exit 1;
+}
+
+sub readprint ($) {
+ my($fprint) = @_;
+
+ open (PRINT, "< $fprint") || die "can't open $fprint: $!";
+ while(<PRINT>) {
+ chomp;
+ s/^\s*//;
+ s/\s+$//;
+ s/#.*$//;
+ my($sys, $func) = split(/\s+/);
+ if (defined($sys)) {
+ if (defined($func)) {
+ $sysprint{$sys} = $func;
+ } else {
+ $sysprint{$sys} = "sys_$sys";
+ }
+ }
+ }
+ close(PRINT);
+}
+
+sub readcat ($) {
+ my($fcat) = @_;
+
+ open (CAT, "< $fcat") || die "can't open $fcat: $!";
+ while(<CAT>) {
+ chomp;
+ s/^\s*//;
+ s/\s+$//;
+ s/#.*$//;
+ my($sys, $cat) = split(/\s+/);
+ $syscat{$sys} = $cat if (defined($sys) && defined($cat));
+ }
+ close(CAT);
+}
+
+
+usage if (!defined($ARGV[0]) || defined($ARGV[3]));
+
+%sysprint = ();
+readprint $ARGV[1] if defined $ARGV[1];
+
+%syscat = ();
+readcat $ARGV[2] if defined $ARGV[2];
+
+open(MASTER, "< $ARGV[0]") || die "can't open $ARGV[0]: $!";
+
+open(SYSCALL, "> syscall.h") || die "can't create syscall.h: $!";
+
+print SYSCALL "/*\n * Automatically generated by $0 on " . ctime(time()) . " */\n\n";
+print "/*\n * Automatically generated by $0 on " . ctime(time()) . " */\n\n";
+
+my $sysnum = 0;
+
+while (<MASTER>) {
+ chomp;
+ # join broken lines
+ while (/\\$/) {
+ my $line;
+ s/\\$//;
+ $line = <MASTER>;
+ chomp($line);
+ $_ = "$_$line";
+ }
+
+ if (/^(\d+)\s+(\w+)\s+\{\s*([^}]+)\s*\}([^}]*)$/ ||
+ /^(\d+)\s+(\w+)\s+\w+\s+\{\s*([^}]+)\s*\}([^}]*)$/) {
+ my($compat, $proto, $ext, $name, $nargs, @args, $pfunc, $cat, $num);
+ my(@fun, $xproto, $oldstyle);
+ $num = $1;
+ if ($2 eq 'OBSOL' || $2 eq 'UNIMPL') {
+ $sysnum++;
+ next;
+ }
+
+ if ($3 eq "MPSAFE") {
+ $proto = $4;
+ $ext = $5;
+ } else {
+ $proto = $3;
+ $ext = $4;
+ }
+
+ if ($num > $sysnum) { # syscall gap
+ while($sysnum < $num) {
+ print " { -1,\t0,\tprintargs,\t\"SYS_$sysnum\"\t}, /* $sysnum */\n";
+ $sysnum++;
+ }
+ } elsif ($num < $sysnum) {
+ next if ($num == $sysnum - 1); # perhaps #ifdef
+ warn "error in master file: syscall $num found, expecting $sysnum.";
+ next;
+ }
+
+ # int|sys||name(args);
+ @fun = split(/\|/, $proto);
+ $oldstyle = @fun;
+ if ($oldstyle == 1) {
+ $xproto = $proto;
+ } else {
+ $xproto = $fun[3];
+ }
+
+ if (($oldstyle == 1 && $xproto =~ /^[^\s]+\s+([^\s]+)\s*\(([^)]*)\);/)
+ || ($oldstyle != 1 && $xproto =~ /^(\w+)\(([^)]*)\); /)) {
+ my @args = split(/,/, $2);
+ $nargs = @args;
+ $name = $1;
+ if ($oldstyle == 1) {
+ $name = substr($name, 1) if (substr($name, 0, 1) eq "*");
+ $name = substr($name, 4);
+ } else {
+ $name = "__" . $name . $fun[2] if ($fun[2] ne "");
+ }
+ if (defined($sysprint{$name})) {
+ $pfunc = $sysprint{$name};
+ print SYSCALL "int $pfunc();\n";
+ } else {
+ $pfunc = "sys_$name";
+ print SYSCALL "#define $pfunc printargs\n";
+ }
+ if (defined($syscat{$name})) {
+ $cat = $syscat{$name};
+ } else {
+ $cat = "0";
+ }
+ print " { $nargs,\t$cat,\t$pfunc,\t\"$name\"\t}, /* $sysnum */\n";
+ $sysnum++;
+ } else {
+ warn "bad syscall specification for $sysnum: >$xproto<";
+ }
+ } else {
+ # warn "unregognized line $_";
+ }
+}
+close(MASTER);
+exit 0;