NetBSD/lib/libpcap/pcap2netbsd

289 lines
6.2 KiB
Perl
Executable File

#!/usr/local/bin/perl
#
# $NetBSD: pcap2netbsd,v 1.6 2004/09/22 19:35:47 dyoung Exp $
#
# Perl script to convert a standard distribution directory for am-utils into
# a NetBSD source tree.
#
# This is done as a script so that as each distribution is released,
# only changes from the previous one need to be dealt with as
# modifications to this script and related files. This should
# reduce the cost of updating from a new release of xntp by an
# order of magnitude (or more?)
#
# This script requires two environment variables set:
# SRCDIR - libpcap source directory
# TARGETDIR - name of the high level directory to make
#
# Written by Christos Zoulas Oct 2nd, 1997 for libpcap-0.4a3
#
# Modified by David Young Sep 19th, 2004 for libpcap-0.8.3
#
$version = "0.8.3";
# definitions ...
@subdirs = ("lib/libpcap");
@libpcapf = ("bpf_dump.c", "bpf_image.c", "etherent.c", "fad-getad.c",
"gencode.c", "grammar.y", "inet.c", "nametoaddr.c", "optimize.c",
"pcap-bpf.c", "pcap.c", "savefile.c", "scanner.l");
@libpcaphf = ("pcap.h", "pcap-namedb.h");
@libpcapmf = ("pcap.3");
@libpcapdf = ("CHANGES", "README", "atmuni31.h", "llc.h", "pcap-bpf.h",
"pcap-int.h", "pcap-stdinc.h", "gencode.h", "ethertype.h",
"ppp.h", "sunatmpos.h");
# sed edit list: file, sed-program
%sedlist = (
"lib/libpcap/scanner.l", "'s/tokdefs.h/grammar.h/g'"
);
#
# Utility Subroutines
#
sub makedir {
system("mkdir -p @_");
}
# &fixrcs (fromfile, tofile);
sub fixrcs
{
my ($f, $t) = @_;
my @keywords = ("Author", "Date", "Header", "Id", "Locker", "Log",
"Name", "RCSfile", "Revision", "Source", "State");
my $state = 0;
my $hdr = 0;
open(IFILE, "<$f") || die "Cannot open $f";
open(OFILE, ">$t") || die "Cannot create $t";
if ($t =~ /.*\.[0-9]$/) {
print OFILE '.\\" $', 'NetBSD', '$', "\n.\\", "\n";
}
elsif ($t =~ /.*\.[ch]$/) {
print OFILE "/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
}
elsif ($t =~ /.*\.[yl]$/) {
$hdr = 1;
}
else {
print OFILE '$', 'NetBSD', '$', "\n";
}
while (<IFILE>) {
if ($hdr == 1) {
if (/%{/) {
print OFILE "%{\n/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
$hdr = 0;
next;
}
}
if ($state == 2) {
if (/#endif/) {
print OFILE "#else\n__RCSID(", '"$', 'NetBSD', '$"',
");\n#endif\n";
$state = 0;
}
}
if ($state == 1) {
print OFILE "#if 0\n";
$state = 2;
}
if (/#ifndef lint/) {
print OFILE "#include <sys/cdefs.h>\n";
$state = 1;
}
foreach $key (@keywords) {
s/\$$key\$/$key/g;
s/\$$key:(.*)\$/$key:$1/g;
}
print OFILE $_;
}
close(IFILE) || die "closing input file";
close(OFILE) || die "closing output file";
}
# &copyfiles (fromdir, todir, list of files);
sub copyfiles {
local ($fdir, $tdir, @list) = @_;
local ($f);
foreach $f (@list) {
print " $fdir/$f --> $tdir/$f\n";
&fixrcs("$fdir/$f", "$tdir/$f");
}
}
# &copyfile (fromfile, tofile);
sub copyfile {
local ($f, $t) = @_;
print " $f --> $t\n";
system ("cp $f $t");
}
sub uniq {
local (@inlist) = @_;
local (@outlist);
@outlist = ($inlist[0]);
for ( $i=1; $i < @inlist; $i++ ) {
if ($inlist[$i] ne $inlist[$i-1]) {
push (@outlist, $inlist[$i]);
}
}
@outlist;
}
sub dumpsrcs {
local (@names) = @_;
local ($count);
$count = 0;
while ($f = pop(@names)) {
print ODATA "$f ";
if ($count == 5 && @names > 0) {
print ODATA "\\\n";
$count = 0;
} else {
$count += 1;
}
}
if ($count != 0) {
print ODATA "\n";
}
}
#
# Main progarm.
#
$srcdir = $ENV{'SRCDIR'};
$targetdir = $ENV{'TARGETDIR'};
$incdirs = "-I. -I$srcdir/config -I$srcdir";
if (!$srcdir | !targetdir) {
die "You must define the environment variables SRCDIR and TARGETDIR.\n"
}
print "Making the NetBSD directory tree.\n";
foreach $f (@subdirs) {
print " -->$f\n";
makedir ("$targetdir/$f");
}
print "Populating the lib/libpcap directory.\n";
&copyfiles ("$srcdir", "$targetdir/lib/libpcap", @libpcapf, @libpcaphf, @libpcapdf, @libpcapmf);
#
# Build makefiles
#
$first = "True";
while ($line = <DATA>) {
chop ($line);
if (substr($line,0,2) eq "%%") {
@cmd = split (/ /,$line);
if ($cmd[1] eq "file") {
print "Building $targetdir/$cmd[2]\n";
if ($first eq "") {
close (ODATA);
} else {
$first = "";
}
open (ODATA, ">$targetdir/$cmd[2]") ||
die "Could not create $targetdir/$cmd[2]";
} elsif ($cmd[1] eq "srcs") {
print " Defining SRCS\n";
if ($first) {
die "Data file must start with a %% file!";
}
print ODATA "SRCS=\t";
&dumpsrcs (@libpcapf);
} elsif ($cmd[1] eq "incs") {
print " Defining INCS\n";
if ($first) {
die "Data file must start with a %% file!";
}
print ODATA "INCS=\t";
&dumpsrcs (@libpcaphf);
} elsif ($cmd[1] eq "man") {
print " Defining MAN\n";
if ($first) {
die "Data file must start with a %% file!";
}
print ODATA "MAN=\t";
&dumpsrcs (@libpcapmf);
} elsif ($cmd[1] eq "version") {
print " Defining VERSION\n";
print ODATA "char pcap_version[] = \"$version\";";
} elsif ($cmd[1] eq "NetBSD") {
if ($first) {
die "Data section must start with a %% file!";
}
print ODATA "$cmd[2] \$"."NetBSD".": \$ $cmd[3]\n";
}
} else {
if ($first) {
die "Data file must start with a %% file!";
}
print ODATA "$line\n";
}
}
close (ODATA);
#
# Sed transformations of files
#
foreach $n (keys(%sedlist)) {
print "Modifying $n\n";
system ("cd $targetdir; sed $sedlist{$n} $n > tmp; mv -f tmp $n");
}
#
# end of the script
#
# what follows is the data for makefiles and other special files
# that need to be created.
__END__
%% file lib/libpcap/Makefile
%% NetBSD #
LIB= pcap
%% man
LEX= flex
CFLAGS+=-I. -I${.CURDIR} -DYYBISON
CFLAGS+=-DHAVE_MALLOC_H=1 -DHAVE_SYS_IOCCOM_H=1 -DHAVE_SYS_SOCKIO_H=1
CFLAGS+=-DHAVE_ETHER_HOSTTON=1 -DHAVE_STRERROR=1 -DHAVE_SOCKADDR_SA_LEN=1
CFLAGS+=-DLBL_ALIGN=1
LFLAGS+=-olex.yy.c -Ppcap_
YFLAGS+=-ppcap_
YHEADER=1
%% srcs
SRCS+= bpf_filter.c version.c
.PATH: ${.CURDIR}/../../sys/net
%% incs
INCSDIR=/usr/include
scanner.c: grammar.h
.include <bsd.lib.mk>
%% file lib/libpcap/shlib_version
major=0
minor=0
%% file lib/libpcap/version.c
%% NetBSD /* */
%% version