11.1Schristos#!/usr/local/bin/perl
21.1Schristos#
31.4Sis#	$NetBSD: trrt2netbsd,v 1.4 1999/06/16 20:47:57 is Exp $
41.1Schristos#
51.1Schristos#  Perl script to convert a standard distribution directory for traceroute into
61.1Schristos#	a NetBSD source tree.
71.1Schristos#
81.1Schristos#  This is done as a script so that as each distribution is released,
91.1Schristos#	only changes from the previous one need to be dealt with as
101.1Schristos#	modifications to this script and related files.  This should
111.1Schristos#	reduce the cost of updating from a new release of traceroute by an
121.1Schristos#	order of magnitude (or more?)
131.1Schristos#
141.1Schristos#  This script requires two environment variables set:
151.1Schristos#	SRCDIR - traceroute source directory
161.1Schristos#	TARGETDIR - name of the high level directory to make
171.1Schristos#
181.1Schristos#  Written by Christos Zoulas Oct 2nd, 1997 for traceroute-1.4a5
191.1Schristos#
201.1Schristos
211.1Schristos$version = "1.4a5";
221.1Schristos
231.1Schristos# definitions ...
241.1Schristos
251.1Schristos@subdirs = ("usr.sbin/traceroute");
261.1Schristos
271.1Schristos@trrtf = ("ifaddrlist.c", "savestr.c", "traceroute.c");
281.1Schristos
291.1Schristos@trrthf = ("gnuc.h", "ifaddrlist.h", "savestr.h");
301.1Schristos
311.1Schristos@trrtmf = ("traceroute.8");
321.1Schristos@trrtdf = ("CHANGES", "README");
331.1Schristos@trrtaf = ("mean.awk", "median.awk");
341.1Schristos
351.1Schristos
361.1Schristos# sed edit list: file, sed-program
371.1Schristos%sedlist = ();
381.1Schristos
391.1Schristos#
401.1Schristos# Utility Subroutines
411.1Schristos#
421.1Schristos
431.1Schristossub makedir {
441.1Schristos    system("mkdir -p @_");
451.1Schristos}
461.1Schristos
471.1Schristos# &fixrcs (fromfile, tofile);
481.1Schristossub fixrcs
491.1Schristos{
501.1Schristos    my ($f, $t) = @_;
511.1Schristos    my @keywords = ("Author", "Date", "Header", "Id", "Locker", "Log",
521.1Schristos		    "Name", "RCSfile", "Revision", "Source", "State");
531.1Schristos    my $state = 0;
541.1Schristos    my $hdr = 0;
551.1Schristos
561.1Schristos    open(IFILE, "<$f") || die "Cannot open $f";
571.1Schristos    open(OFILE, ">$t") || die "Cannot create $t";
581.1Schristos
591.1Schristos    if ($t =~ /.*\.[0-9]/) {
601.1Schristos	print OFILE '.\\" $', 'NetBSD',  '$', "\n.\\\"", "\n";
611.1Schristos    }
621.1Schristos    elsif ($t =~ /.*\.[ch]/) {
631.1Schristos	print OFILE "/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
641.1Schristos    }
651.1Schristos    elsif ($t =~ /.*\.[yl]/) {
661.1Schristos	$hdr = 1;
671.1Schristos    }
681.1Schristos    else {
691.1Schristos	print OFILE '$', 'NetBSD', '$', "\n";
701.1Schristos    }
711.1Schristos    while (<IFILE>) {
721.1Schristos	if ($hdr == 1) {
731.1Schristos	    if (/%{/) {
741.1Schristos		print OFILE "%{\n/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
751.1Schristos		$hdr = 0;
761.1Schristos		next;
771.1Schristos	    }
781.1Schristos	}
791.1Schristos	if ($state == 2) {
801.1Schristos	    if (/#endif/) {
811.1Schristos		print OFILE "#else\n__RCSID(", '"$', 'NetBSD', '$"',
821.1Schristos		    ");\n#endif\n";
831.1Schristos		$state = 0;
841.1Schristos	    }
851.1Schristos	}
861.1Schristos	if ($state == 1) {
871.1Schristos	    print OFILE "#if 0\n";
881.1Schristos	    $state = 2;
891.1Schristos	}
901.1Schristos	if (/#ifndef lint/) {
911.1Schristos	    print OFILE "#include <sys/cdefs.h>\n";
921.1Schristos	    $state = 1;
931.1Schristos	}
941.1Schristos	foreach $key (@keywords) {
951.1Schristos	    s/\$$key\$/$key/g;
961.1Schristos	    s/\$$key:(.*)\$/$key:$1/g;
971.1Schristos	}
981.1Schristos	print OFILE $_;
991.1Schristos    }
1001.1Schristos    close(IFILE) || die "closing input file";
1011.1Schristos    close(OFILE) || die "closing output file";
1021.1Schristos}
1031.1Schristos
1041.1Schristos# &copyfiles (fromdir, todir, list of files);
1051.1Schristossub copyfiles {
1061.1Schristos    local ($fdir, $tdir, @list) = @_;
1071.1Schristos    local ($f);
1081.1Schristos
1091.1Schristos    foreach $f (@list) {
1101.1Schristos	print "  $fdir/$f --> $tdir/$f\n";
1111.1Schristos	&fixrcs("$fdir/$f", "$tdir/$f");
1121.1Schristos    }
1131.1Schristos}
1141.1Schristos
1151.1Schristos# &copyfile (fromfile, tofile);
1161.1Schristossub copyfile {
1171.1Schristos    local ($f, $t) = @_;
1181.1Schristos
1191.1Schristos    print "  $f --> $t\n";
1201.1Schristos    system ("cp $f $t");
1211.1Schristos}
1221.1Schristos
1231.1Schristossub uniq {
1241.1Schristos    local (@inlist) = @_;
1251.1Schristos    local (@outlist);
1261.1Schristos
1271.1Schristos    @outlist = ($inlist[0]);
1281.1Schristos    for ( $i=1; $i < @inlist; $i++ ) {
1291.1Schristos	if ($inlist[$i] ne $inlist[$i-1]) {
1301.1Schristos	    push (@outlist, $inlist[$i]);
1311.1Schristos	}
1321.1Schristos    }
1331.1Schristos
1341.1Schristos    @outlist;
1351.1Schristos}
1361.1Schristos
1371.1Schristossub dumpsrcs {
1381.1Schristos    local (@names) = @_;
1391.1Schristos    local ($count);
1401.1Schristos
1411.1Schristos    $count = 0;
1421.1Schristos    while ($f = pop(@names)) {
1431.1Schristos        print ODATA "$f ";
1441.1Schristos	if ($count == 5 && @names > 0) {
1451.1Schristos	    print ODATA "\\\n";
1461.1Schristos	    $count = 0;
1471.1Schristos	} else {
1481.1Schristos	    $count += 1;
1491.1Schristos	}
1501.1Schristos    }
1511.1Schristos    if ($count != 0) {
1521.1Schristos	print ODATA "\n";
1531.1Schristos    }
1541.1Schristos}
1551.1Schristos
1561.1Schristos#
1571.4Sis# Main program.
1581.1Schristos# 
1591.1Schristos
1601.1Schristos$srcdir = $ENV{'SRCDIR'};
1611.1Schristos$targetdir = $ENV{'TARGETDIR'};
1621.1Schristos$incdirs = "-I. -I$srcdir/config -I$srcdir";
1631.1Schristos
1641.1Schristosif (!$srcdir | !targetdir) {
1651.1Schristos    die "You must define the environment variables SRCDIR and TARGETDIR.\n"
1661.1Schristos} 
1671.1Schristosprint "Making the NetBSD directory tree.\n";
1681.1Schristosforeach $f (@subdirs) { 
1691.1Schristos    print "   -->$f\n";
1701.1Schristos    makedir ("$targetdir/$f");
1711.1Schristos}
1721.1Schristos
1731.1Schristosprint "Populating the usr.sbin/traceroute directory.\n";
1741.1Schristos&copyfiles ("$srcdir", "$targetdir/usr.sbin/traceroute", @trrtf, @trrthf, @trrtdf,
1751.1Schristos	    @trrtmf, @trrtaf);
1761.1Schristos
1771.1Schristos#
1781.1Schristos# Build makefiles
1791.1Schristos#
1801.1Schristos
1811.1Schristos$first = "True";
1821.1Schristoswhile ($line = <DATA>) {
1831.1Schristos    chop ($line);
1841.1Schristos    if (substr($line,0,2) eq "%%") {
1851.1Schristos	@cmd = split (/ /,$line);
1861.1Schristos	if ($cmd[1] eq "file") {
1871.1Schristos	    print "Building $targetdir/$cmd[2]\n";
1881.1Schristos	    if ($first eq "") {
1891.1Schristos		close (ODATA);
1901.1Schristos	    } else {
1911.1Schristos		$first = "";
1921.1Schristos	    }
1931.1Schristos	    open (ODATA, ">$targetdir/$cmd[2]") ||
1941.1Schristos		die "Could not create $targetdir/$cmd[2]";
1951.1Schristos	} elsif ($cmd[1] eq "awks") {
1961.1Schristos	    print "  Defining AWKS\n";
1971.1Schristos	    if ($first) {
1981.1Schristos		die "Data file must start with a %% file!";
1991.1Schristos	    }
2001.1Schristos	    print ODATA "AWKS=\t";
2011.1Schristos	    &dumpsrcs (@trrtaf);
2021.1Schristos	} elsif ($cmd[1] eq "srcs") {
2031.1Schristos	    print "  Defining SRCS\n";
2041.1Schristos	    if ($first) {
2051.1Schristos		die "Data file must start with a %% file!";
2061.1Schristos	    }
2071.1Schristos	    print ODATA "SRCS=\t";
2081.1Schristos	    &dumpsrcs (@trrtf);
2091.1Schristos	} elsif ($cmd[1] eq "man") {
2101.1Schristos	    print "  Defining MAN\n";
2111.1Schristos	    if ($first) {
2121.1Schristos		die "Data file must start with a %% file!";
2131.1Schristos	    }
2141.1Schristos	    print ODATA "MAN=\t";
2151.1Schristos	    &dumpsrcs (@trrtmf);
2161.1Schristos	} elsif ($cmd[1] eq "version") {
2171.1Schristos	    print "  Defining VERSION\n";
2181.1Schristos	    print ODATA "char version[] = \"$version\";";
2191.1Schristos	} elsif ($cmd[1] eq "NetBSD") {
2201.1Schristos	    if ($first) {
2211.1Schristos		die "Data section must start with a %% file!";
2221.1Schristos	    }
2231.1Schristos	    print ODATA "$cmd[2]	\$"."NetBSD".": \$	$cmd[3]\n";
2241.1Schristos	}
2251.1Schristos    } else {
2261.1Schristos	if ($first) {
2271.1Schristos	    die "Data file must start with a %% file!";
2281.1Schristos	}
2291.1Schristos	print ODATA "$line\n";
2301.1Schristos    }
2311.1Schristos}    
2321.1Schristosclose (ODATA);
2331.1Schristos
2341.1Schristos#
2351.1Schristos# Sed transformations of files
2361.1Schristos#
2371.1Schristosforeach $n (keys(%sedlist)) {
2381.1Schristos    print "Modifying $n\n";
2391.1Schristos    system ("cd $targetdir; sed $sedlist{$n} $n > tmp;  mv -f tmp $n");
2401.1Schristos}
2411.1Schristos
2421.1Schristos#
2431.1Schristos# end of the script
2441.1Schristos#
2451.1Schristos
2461.1Schristos# what follows is the data for makefiles and other special files
2471.1Schristos# that need to be created.
2481.1Schristos
2491.1Schristos__END__
2501.1Schristos%% file usr.sbin/traceroute/Makefile
2511.1Schristos%% NetBSD #
2521.1Schristos
2531.1SchristosWARNS?=	1
2541.1SchristosPROG=	traceroute
2551.1Schristos%% man
2561.1Schristos
2571.2SlukemCPPFLAGS+=-DHAVE_MALLOC_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SOCKIO_H=1
2581.2SlukemCPPFLAGS+=-DHAVE_STRERROR=1 -DHAVE_SETLINEBUF=1 -DHAVE_SOCKADDR_SA_LEN=1 
2591.3SchristosCPPFLAGS+=-DHAVE_RAW_OPTIONS=1
2601.1Schristos
2611.1SchristosBINOWN= root
2621.1SchristosBINMODE=4555
2631.1Schristos
2641.1Schristos%% srcs
2651.1SchristosSRCS+= version.c
2661.1Schristos
2671.1Schristos%% awks 
2681.1Schristos
2691.1Schristos.include <bsd.prog.mk>
2701.1Schristos%% file usr.sbin/traceroute/version.c
2711.1Schristos%% NetBSD /* */
2721.1Schristos%% version
273