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 23use strict; 24use warnings; 25use File::Find; 26 27my %LICENSE = (); 28 29sub 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 90my @FILES; 91 92sub wanted { 93 my $path = $File::Find::name; 94 95 if (!-f $path) { 96 if ($path =~ /\.[chs]$/) { 97 push(@FILES, $path); 98 } 99 } 100 101} 102foreach $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 113foreach $a (@FILES) { 114 dofile($a); 115} 116 117foreach my $lic (sort 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} 126