1 #! /usr/perl5/bin/perl 2 # 3 # This file and its contents are supplied under the terms of the 4 # Common Development and Distribution License ("CDDL"), version 1.0. 5 # You may only use this file in accordance with the terms version 6 # 1.0 of the CDDL. 7 # 8 # A full copy of the text of the CDDL should have accompanied this 9 # source. A copy is of the CDDL is also available via the Internet 10 # at http://www.illumos.org/license/CDDL. 11 # 12 13 # 14 # Copyright 2010 Nexenta Systems, Inc. All rights reserved. 15 # Copyright 2016 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> 16 # 17 18 # 19 # This extracts all the BSD copyrights (excluding the CDDL licenses) 20 # for use in a THIRDPARTYLICENSE file. It tries hard to avoid duplicates. 21 # 22 23 use strict; 24 use warnings; 25 use File::Find; 26 27 my %LICENSE = (); 28 29 sub dofile 30 { 31 my $file = shift; 32 my $comment = 0; 33 my @license = (); 34 my @block = ();; 35 my $copyr = 0; 36 open(FILE, $file); 37 while (<FILE>) { 38 if (/^\/\*$/) { 39 $comment = 1; 40 $copyr = 0; 41 @block = (); 42 next; 43 } 44 if (!$comment) { 45 next; 46 } 47 # 48 # We don't want to know about CDDL files. They don't 49 # require an explicit THIRDPARTYLICENSE file. 50 # 51 if (/CDDL/) { 52 #print "$file is CDDL.\n"; 53 close(FILE); 54 return; 55 } 56 if (/Copyright/) { 57 $copyr = 1; 58 } 59 if (!/^ \*\//) { 60 push(@block, $_); 61 next; 62 } 63 # 64 # We have reached the end of the comment now. 65 # 66 $comment = 0; 67 68 # Check to see if we saw a copyright. 69 if (!$copyr) { 70 next; 71 } 72 my $line; 73 foreach $line (@block) { 74 chomp $line; 75 $line =~ s/^ \* //; 76 $line =~ s/^ \*//; 77 $line =~ s/^ \*$//; 78 push(@license, $line); 79 } 80 } 81 82 if ($#license > 0) { 83 my $lic = join "\n", @license; 84 push (@{$LICENSE{$lic}}, $file); 85 } 86 87 close(FILE); 88 } 89 90 my @FILES; 91 92 sub wanted { 93 my $path = $File::Find::name; 94 95 if (!-f $path) { 96 if ($path =~ /\.[chs]$/) { 97 push(@FILES, $path); 98 } 99 } 100 101 } 102 foreach $a (@ARGV) { 103 if (-d $a) { 104 find(\&wanted, $a); 105 } elsif (-f $a) { 106 push(@FILES, $a); 107 } 108 } 109 110 # sort files to get a stable ordering to aid wsdiff(1onbld) 111 @FILES = sort @FILES; 112 113 foreach $a (@FILES) { 114 dofile($a); 115 } 116 117 foreach my $lic (keys %LICENSE) { 118 my @files = @{$LICENSE{$lic}}; 119 print "\nThe following files from the C library:\n"; 120 foreach my $f (@files) { 121 print(" $f\n"); 122 } 123 print "are provided under the following terms:\n\n"; 124 print "$lic\n"; 125 }