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 =~ /\.[chsS]$/) {
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