doc/share/pgpkeys/keyring.pl

83 lines
1.3 KiB
Perl
Raw Normal View History

#!/usr/bin/perl -w
#
# $FreeBSD$
#
use strict;
use Fcntl;
use Getopt::Std;
use vars qw(%KEYS);
sub add_file($);
sub add_dir($);
sub add_dir($) {
my $dn = shift;
local *DIR;
my $ent;
$dn =~ s|/+|/|g;
$dn =~ s|^(.+)/$|$1|;
opendir(DIR, $dn)
or die("$dn: opendir(): $!\n");
while ($ent = readdir(DIR)) {
next if ($ent eq "." || $ent eq "..");
add_file("$dn/$ent");
}
closedir(DIR);
}
sub add_file($) {
my $fn = shift;
local *FILE;
my $line;
my $key;
if (-d $fn) {
return add_dir($fn);
}
sysopen(FILE, $fn, O_RDONLY)
or die("$fn: open(): $!\n");
while (<FILE>) {
if (m'-----BEGIN PGP PUBLIC KEY BLOCK-----$') {
$key = $_;
} elsif (m'^-----END PGP PUBLIC KEY BLOCK-----') {
$key .= $_;
chomp($key);
$KEYS{$key}++
if defined($key);
$key = undef;
} elsif (defined($key)) {
$key .= $_;
}
}
}
sub usage() {
print(STDERR "Usage: keyring [-o outfile] [dir|file] ...\n");
}
MAIN:{
my %opts;
getopts('o:', \%opts)
or usage();
if ($opts{'o'}) {
sysopen(STDOUT, $opts{'o'}, O_RDWR|O_CREAT|O_TRUNC)
or die("$opts{'o'}: open(): $!\n");
}
if (!@ARGV) {
add_dir(".");
} else {
while (@ARGV) {
add_file(shift(@ARGV));
}
}
print(join("\n", sort(keys(%KEYS))));
}