1# ex:ts=8 sw=4: 2# $OpenBSD: Check.pm,v 1.2 2005/03/05 11:02:35 espie Exp $ 3# Copyright (c) 2000-2004 Marc Espie <espie@openbsd.org> 4# 5# Permission to use, copy, modify, and distribute this software for any 6# purpose with or without fee is hereby granted, provided that the above 7# copyright notice and this permission notice appear in all copies. 8# 9# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 17use strict; 18use warnings; 19package OpenBSD::Makewhatis::Check; 20 21sub found($$) 22{ 23 my ($pattern, $filename) = @_; 24 my @candidates = glob $pattern; 25 if (@candidates > 0) { 26 # quick check of inode, dev number 27 my ($dev_cmp, $inode_cmp) = (stat $filename)[0,1]; 28 for my $f (@candidates) { 29 my ($dev, $inode) = (stat $f)[0, 1]; 30 if ($dev == $dev_cmp && $inode == $inode_cmp) { 31 return 1; 32 } 33 } 34 # slow check with File::Compare 35 require File::Compare; 36 37 for my $f (@candidates) { 38 if (File::Compare::compare($f, $filename) == 0) { 39 return 1; 40 } 41 } 42 } 43 return 0; 44} 45# verify_subject($subject, $filename): 46# 47# reparse the subject we're about to add, and check whether it makes 48# sense, e.g., is there a man page around. 49sub verify_subject($$) 50{ 51 local $_ = shift; 52 my $filename = shift; 53 if (m/\s*(.*?)\s*\((.*?)\)\s-\s/) { 54 my $man = $1; 55 my $section = $2; 56 my @mans = split(/\s*,\s*|\s+/, $man); 57 my $base = $filename; 58 if ($base =~ m|/|) { 59 $base =~ s,/[^/]*$,,; 60 } else { 61 $base = '.'; 62 } 63 my @notfound = (); 64 for my $func (@mans) { 65 my $i = $func; 66 next if found("$base/$i.*", $filename); 67 # try harder 68 $i =~ s/\(\)//; 69 $i =~ s/\-//g; 70 $i =~ s,^etc/,,; 71 next if found("$base/$i.*", $filename); 72 # and harder... 73 $i =~ tr/[A-Z]/[a-z]/; 74 next if found("$base/$i.*", $filename); 75 push(@notfound, $func); 76 } 77 if (@notfound > 0) { 78 print STDERR "Couldn't find ", join(', ', @notfound), 79 " in $filename:\n$_\n" 80 } 81 } 82} 83 841; 85