Home | History | Annotate | Line # | Download | only in traceroute
      1  1.1  christos #!/usr/local/bin/perl
      2  1.1  christos #
      3  1.4        is #	$NetBSD: trrt2netbsd,v 1.4 1999/06/16 20:47:57 is Exp $
      4  1.1  christos #
      5  1.1  christos #  Perl script to convert a standard distribution directory for traceroute into
      6  1.1  christos #	a NetBSD source tree.
      7  1.1  christos #
      8  1.1  christos #  This is done as a script so that as each distribution is released,
      9  1.1  christos #	only changes from the previous one need to be dealt with as
     10  1.1  christos #	modifications to this script and related files.  This should
     11  1.1  christos #	reduce the cost of updating from a new release of traceroute by an
     12  1.1  christos #	order of magnitude (or more?)
     13  1.1  christos #
     14  1.1  christos #  This script requires two environment variables set:
     15  1.1  christos #	SRCDIR - traceroute source directory
     16  1.1  christos #	TARGETDIR - name of the high level directory to make
     17  1.1  christos #
     18  1.1  christos #  Written by Christos Zoulas Oct 2nd, 1997 for traceroute-1.4a5
     19  1.1  christos #
     20  1.1  christos 
     21  1.1  christos $version = "1.4a5";
     22  1.1  christos 
     23  1.1  christos # definitions ...
     24  1.1  christos 
     25  1.1  christos @subdirs = ("usr.sbin/traceroute");
     26  1.1  christos 
     27  1.1  christos @trrtf = ("ifaddrlist.c", "savestr.c", "traceroute.c");
     28  1.1  christos 
     29  1.1  christos @trrthf = ("gnuc.h", "ifaddrlist.h", "savestr.h");
     30  1.1  christos 
     31  1.1  christos @trrtmf = ("traceroute.8");
     32  1.1  christos @trrtdf = ("CHANGES", "README");
     33  1.1  christos @trrtaf = ("mean.awk", "median.awk");
     34  1.1  christos 
     35  1.1  christos 
     36  1.1  christos # sed edit list: file, sed-program
     37  1.1  christos %sedlist = ();
     38  1.1  christos 
     39  1.1  christos #
     40  1.1  christos # Utility Subroutines
     41  1.1  christos #
     42  1.1  christos 
     43  1.1  christos sub makedir {
     44  1.1  christos     system("mkdir -p @_");
     45  1.1  christos }
     46  1.1  christos 
     47  1.1  christos # &fixrcs (fromfile, tofile);
     48  1.1  christos sub fixrcs
     49  1.1  christos {
     50  1.1  christos     my ($f, $t) = @_;
     51  1.1  christos     my @keywords = ("Author", "Date", "Header", "Id", "Locker", "Log",
     52  1.1  christos 		    "Name", "RCSfile", "Revision", "Source", "State");
     53  1.1  christos     my $state = 0;
     54  1.1  christos     my $hdr = 0;
     55  1.1  christos 
     56  1.1  christos     open(IFILE, "<$f") || die "Cannot open $f";
     57  1.1  christos     open(OFILE, ">$t") || die "Cannot create $t";
     58  1.1  christos 
     59  1.1  christos     if ($t =~ /.*\.[0-9]/) {
     60  1.1  christos 	print OFILE '.\\" $', 'NetBSD',  '$', "\n.\\\"", "\n";
     61  1.1  christos     }
     62  1.1  christos     elsif ($t =~ /.*\.[ch]/) {
     63  1.1  christos 	print OFILE "/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
     64  1.1  christos     }
     65  1.1  christos     elsif ($t =~ /.*\.[yl]/) {
     66  1.1  christos 	$hdr = 1;
     67  1.1  christos     }
     68  1.1  christos     else {
     69  1.1  christos 	print OFILE '$', 'NetBSD', '$', "\n";
     70  1.1  christos     }
     71  1.1  christos     while (<IFILE>) {
     72  1.1  christos 	if ($hdr == 1) {
     73  1.1  christos 	    if (/%{/) {
     74  1.1  christos 		print OFILE "%{\n/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
     75  1.1  christos 		$hdr = 0;
     76  1.1  christos 		next;
     77  1.1  christos 	    }
     78  1.1  christos 	}
     79  1.1  christos 	if ($state == 2) {
     80  1.1  christos 	    if (/#endif/) {
     81  1.1  christos 		print OFILE "#else\n__RCSID(", '"$', 'NetBSD', '$"',
     82  1.1  christos 		    ");\n#endif\n";
     83  1.1  christos 		$state = 0;
     84  1.1  christos 	    }
     85  1.1  christos 	}
     86  1.1  christos 	if ($state == 1) {
     87  1.1  christos 	    print OFILE "#if 0\n";
     88  1.1  christos 	    $state = 2;
     89  1.1  christos 	}
     90  1.1  christos 	if (/#ifndef lint/) {
     91  1.1  christos 	    print OFILE "#include <sys/cdefs.h>\n";
     92  1.1  christos 	    $state = 1;
     93  1.1  christos 	}
     94  1.1  christos 	foreach $key (@keywords) {
     95  1.1  christos 	    s/\$$key\$/$key/g;
     96  1.1  christos 	    s/\$$key:(.*)\$/$key:$1/g;
     97  1.1  christos 	}
     98  1.1  christos 	print OFILE $_;
     99  1.1  christos     }
    100  1.1  christos     close(IFILE) || die "closing input file";
    101  1.1  christos     close(OFILE) || die "closing output file";
    102  1.1  christos }
    103  1.1  christos 
    104  1.1  christos # &copyfiles (fromdir, todir, list of files);
    105  1.1  christos sub copyfiles {
    106  1.1  christos     local ($fdir, $tdir, @list) = @_;
    107  1.1  christos     local ($f);
    108  1.1  christos 
    109  1.1  christos     foreach $f (@list) {
    110  1.1  christos 	print "  $fdir/$f --> $tdir/$f\n";
    111  1.1  christos 	&fixrcs("$fdir/$f", "$tdir/$f");
    112  1.1  christos     }
    113  1.1  christos }
    114  1.1  christos 
    115  1.1  christos # &copyfile (fromfile, tofile);
    116  1.1  christos sub copyfile {
    117  1.1  christos     local ($f, $t) = @_;
    118  1.1  christos 
    119  1.1  christos     print "  $f --> $t\n";
    120  1.1  christos     system ("cp $f $t");
    121  1.1  christos }
    122  1.1  christos 
    123  1.1  christos sub uniq {
    124  1.1  christos     local (@inlist) = @_;
    125  1.1  christos     local (@outlist);
    126  1.1  christos 
    127  1.1  christos     @outlist = ($inlist[0]);
    128  1.1  christos     for ( $i=1; $i < @inlist; $i++ ) {
    129  1.1  christos 	if ($inlist[$i] ne $inlist[$i-1]) {
    130  1.1  christos 	    push (@outlist, $inlist[$i]);
    131  1.1  christos 	}
    132  1.1  christos     }
    133  1.1  christos 
    134  1.1  christos     @outlist;
    135  1.1  christos }
    136  1.1  christos 
    137  1.1  christos sub dumpsrcs {
    138  1.1  christos     local (@names) = @_;
    139  1.1  christos     local ($count);
    140  1.1  christos 
    141  1.1  christos     $count = 0;
    142  1.1  christos     while ($f = pop(@names)) {
    143  1.1  christos         print ODATA "$f ";
    144  1.1  christos 	if ($count == 5 && @names > 0) {
    145  1.1  christos 	    print ODATA "\\\n";
    146  1.1  christos 	    $count = 0;
    147  1.1  christos 	} else {
    148  1.1  christos 	    $count += 1;
    149  1.1  christos 	}
    150  1.1  christos     }
    151  1.1  christos     if ($count != 0) {
    152  1.1  christos 	print ODATA "\n";
    153  1.1  christos     }
    154  1.1  christos }
    155  1.1  christos 
    156  1.1  christos #
    157  1.4        is # Main program.
    158  1.1  christos # 
    159  1.1  christos 
    160  1.1  christos $srcdir = $ENV{'SRCDIR'};
    161  1.1  christos $targetdir = $ENV{'TARGETDIR'};
    162  1.1  christos $incdirs = "-I. -I$srcdir/config -I$srcdir";
    163  1.1  christos 
    164  1.1  christos if (!$srcdir | !targetdir) {
    165  1.1  christos     die "You must define the environment variables SRCDIR and TARGETDIR.\n"
    166  1.1  christos } 
    167  1.1  christos print "Making the NetBSD directory tree.\n";
    168  1.1  christos foreach $f (@subdirs) { 
    169  1.1  christos     print "   -->$f\n";
    170  1.1  christos     makedir ("$targetdir/$f");
    171  1.1  christos }
    172  1.1  christos 
    173  1.1  christos print "Populating the usr.sbin/traceroute directory.\n";
    174  1.1  christos &copyfiles ("$srcdir", "$targetdir/usr.sbin/traceroute", @trrtf, @trrthf, @trrtdf,
    175  1.1  christos 	    @trrtmf, @trrtaf);
    176  1.1  christos 
    177  1.1  christos #
    178  1.1  christos # Build makefiles
    179  1.1  christos #
    180  1.1  christos 
    181  1.1  christos $first = "True";
    182  1.1  christos while ($line = <DATA>) {
    183  1.1  christos     chop ($line);
    184  1.1  christos     if (substr($line,0,2) eq "%%") {
    185  1.1  christos 	@cmd = split (/ /,$line);
    186  1.1  christos 	if ($cmd[1] eq "file") {
    187  1.1  christos 	    print "Building $targetdir/$cmd[2]\n";
    188  1.1  christos 	    if ($first eq "") {
    189  1.1  christos 		close (ODATA);
    190  1.1  christos 	    } else {
    191  1.1  christos 		$first = "";
    192  1.1  christos 	    }
    193  1.1  christos 	    open (ODATA, ">$targetdir/$cmd[2]") ||
    194  1.1  christos 		die "Could not create $targetdir/$cmd[2]";
    195  1.1  christos 	} elsif ($cmd[1] eq "awks") {
    196  1.1  christos 	    print "  Defining AWKS\n";
    197  1.1  christos 	    if ($first) {
    198  1.1  christos 		die "Data file must start with a %% file!";
    199  1.1  christos 	    }
    200  1.1  christos 	    print ODATA "AWKS=\t";
    201  1.1  christos 	    &dumpsrcs (@trrtaf);
    202  1.1  christos 	} elsif ($cmd[1] eq "srcs") {
    203  1.1  christos 	    print "  Defining SRCS\n";
    204  1.1  christos 	    if ($first) {
    205  1.1  christos 		die "Data file must start with a %% file!";
    206  1.1  christos 	    }
    207  1.1  christos 	    print ODATA "SRCS=\t";
    208  1.1  christos 	    &dumpsrcs (@trrtf);
    209  1.1  christos 	} elsif ($cmd[1] eq "man") {
    210  1.1  christos 	    print "  Defining MAN\n";
    211  1.1  christos 	    if ($first) {
    212  1.1  christos 		die "Data file must start with a %% file!";
    213  1.1  christos 	    }
    214  1.1  christos 	    print ODATA "MAN=\t";
    215  1.1  christos 	    &dumpsrcs (@trrtmf);
    216  1.1  christos 	} elsif ($cmd[1] eq "version") {
    217  1.1  christos 	    print "  Defining VERSION\n";
    218  1.1  christos 	    print ODATA "char version[] = \"$version\";";
    219  1.1  christos 	} elsif ($cmd[1] eq "NetBSD") {
    220  1.1  christos 	    if ($first) {
    221  1.1  christos 		die "Data section must start with a %% file!";
    222  1.1  christos 	    }
    223  1.1  christos 	    print ODATA "$cmd[2]	\$"."NetBSD".": \$	$cmd[3]\n";
    224  1.1  christos 	}
    225  1.1  christos     } else {
    226  1.1  christos 	if ($first) {
    227  1.1  christos 	    die "Data file must start with a %% file!";
    228  1.1  christos 	}
    229  1.1  christos 	print ODATA "$line\n";
    230  1.1  christos     }
    231  1.1  christos }    
    232  1.1  christos close (ODATA);
    233  1.1  christos 
    234  1.1  christos #
    235  1.1  christos # Sed transformations of files
    236  1.1  christos #
    237  1.1  christos foreach $n (keys(%sedlist)) {
    238  1.1  christos     print "Modifying $n\n";
    239  1.1  christos     system ("cd $targetdir; sed $sedlist{$n} $n > tmp;  mv -f tmp $n");
    240  1.1  christos }
    241  1.1  christos 
    242  1.1  christos #
    243  1.1  christos # end of the script
    244  1.1  christos #
    245  1.1  christos 
    246  1.1  christos # what follows is the data for makefiles and other special files
    247  1.1  christos # that need to be created.
    248  1.1  christos 
    249  1.1  christos __END__
    250  1.1  christos %% file usr.sbin/traceroute/Makefile
    251  1.1  christos %% NetBSD #
    252  1.1  christos 
    253  1.1  christos WARNS?=	1
    254  1.1  christos PROG=	traceroute
    255  1.1  christos %% man
    256  1.1  christos 
    257  1.2     lukem CPPFLAGS+=-DHAVE_MALLOC_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SOCKIO_H=1
    258  1.2     lukem CPPFLAGS+=-DHAVE_STRERROR=1 -DHAVE_SETLINEBUF=1 -DHAVE_SOCKADDR_SA_LEN=1 
    259  1.3  christos CPPFLAGS+=-DHAVE_RAW_OPTIONS=1
    260  1.1  christos 
    261  1.1  christos BINOWN= root
    262  1.1  christos BINMODE=4555
    263  1.1  christos 
    264  1.1  christos %% srcs
    265  1.1  christos SRCS+= version.c
    266  1.1  christos 
    267  1.1  christos %% awks 
    268  1.1  christos 
    269  1.1  christos .include <bsd.prog.mk>
    270  1.1  christos %% file usr.sbin/traceroute/version.c
    271  1.1  christos %% NetBSD /* */
    272  1.1  christos %% version
    273