2008-10-30 00:20:13 +03:00
#!/usr/bin/perl -w
2008-06-15 23:41:09 +04:00
#
# headers_check.pl execute a number of trivial consistency checks
#
# Usage: headers_check.pl dir [files...]
# dir: dir to look for included files
# arch: architecture
# files: list of files to check
#
# The script reads the supplied files line by line and:
#
# 1) for each include statement it checks if the
# included file actually exists.
# Only include files located in asm* and linux* are checked.
# The rest are assumed to be system include files.
#
2008-12-27 10:43:36 +03:00
# 2) It is checked that prototypes does not use "extern"
#
2008-12-27 21:52:20 +03:00
# 3) Check for leaked CONFIG_ symbols
2008-06-15 23:41:09 +04:00
use strict ;
my ( $ dir , $ arch , @ files ) = @ ARGV ;
my $ ret = 0 ;
my $ line ;
my $ lineno = 0 ;
my $ filename ;
foreach my $ file ( @ files ) {
2008-10-30 00:20:13 +03:00
local * FH ;
2008-06-15 23:41:09 +04:00
$ filename = $ file ;
2008-10-30 00:20:13 +03:00
open ( FH , "<$filename" ) or die "$filename: $!\n" ;
2008-06-15 23:41:09 +04:00
$ lineno = 0 ;
2008-10-30 00:20:13 +03:00
while ( $ line = <FH> ) {
2008-06-15 23:41:09 +04:00
$ lineno + + ;
2008-12-30 13:34:58 +03:00
& check_include ( ) ;
& check_asm_types ( ) ;
& check_sizetypes ( ) ;
& check_prototypes ( ) ;
& check_config ( ) ;
2008-06-15 23:41:09 +04:00
}
2008-10-30 00:20:13 +03:00
close FH ;
2008-06-15 23:41:09 +04:00
}
exit $ ret ;
sub check_include
{
if ( $ line =~ m/^\s*#\s*include\s+<((asm|linux).*)>/ ) {
my $ inc = $ 1 ;
my $ found ;
$ found = stat ( $ dir . "/" . $ inc ) ;
if ( ! $ found ) {
$ inc =~ s #asm/#asm-$arch/#;
$ found = stat ( $ dir . "/" . $ inc ) ;
}
if ( ! $ found ) {
printf STDERR "$filename:$lineno: included file '$inc' is not exported\n" ;
$ ret = 1 ;
}
}
}
2008-12-27 10:43:36 +03:00
sub check_prototypes
{
if ( $ line =~ m/^\s*extern\b/ ) {
printf STDERR "$filename:$lineno: extern's make no sense in userspace\n" ;
}
}
2008-12-27 21:52:20 +03:00
sub check_config
{
if ( $ line =~ m/[^a-zA-Z0-9_]+CONFIG_([a-zA-Z0-9]+)[^a-zA-Z0-9]/ ) {
printf STDERR "$filename:$lineno: leaks CONFIG_$1 to userspace where it is not valid\n" ;
}
}
2008-12-30 13:34:58 +03:00
my $ linux_asm_types ;
sub check_asm_types ()
{
2008-12-31 11:32:30 +03:00
if ( $ filename =~ /types.h|int-l64.h|int-ll64.h/o ) {
return ;
}
2008-12-30 13:34:58 +03:00
if ( $ lineno == 1 ) {
$ linux_asm_types = 0 ;
} elsif ( $ linux_asm_types >= 1 ) {
return ;
}
if ( $ line =~ m/^\s*#\s*include\s+<asm\/types.h>/ ) {
$ linux_asm_types = 1 ;
printf STDERR "$filename:$lineno: " .
"include of <linux/types.h> is preferred over <asm/types.h>\n"
# Warn until headers are all fixed
#$ret = 1;
}
}
my $ linux_types ;
sub check_sizetypes
{
2008-12-31 11:32:30 +03:00
if ( $ filename =~ /types.h|int-l64.h|int-ll64.h/o ) {
return ;
}
2008-12-30 13:34:58 +03:00
if ( $ lineno == 1 ) {
$ linux_types = 0 ;
} elsif ( $ linux_types >= 1 ) {
return ;
}
if ( $ line =~ m/^\s*#\s*include\s+<linux\/types.h>/ ) {
$ linux_types = 1 ;
return ;
}
if ( $ line =~ m/__[us](8|16|32|64)\b/ ) {
printf STDERR "$filename:$lineno: " .
"found __[us]{8,16,32,64} type " .
"without #include <linux/types.h>\n" ;
$ linux_types = 2 ;
# Warn until headers are all fixed
#$ret = 1;
}
}