deviced: Remove build warnings and do not use thread unsafey functions 01/44301/2
authorJiyoung Yun <jy910.yun@samsung.com>
Tue, 21 Jul 2015 01:10:07 +0000 (10:10 +0900)
committerJiyoung Yun <jy910.yun@samsung.com>
Tue, 21 Jul 2015 11:18:24 +0000 (20:18 +0900)
Thread unsafety functions:
readdir, strerror
Keep the kernel's checkpatch.pl guideline.
Remove build warnings and unused codes.

Change-Id: I79d2442d77531c6ff9e4c6decc862019e7b3e4a4
Signed-off-by: Jiyoung Yun <jy910.yun@samsung.com>
51 files changed:
LICENSE [moved from LICENSE.Apache-2.0 with 100% similarity]
NOTICE
checkpatch.pl [new file with mode: 0755]
packaging/deviced.spec
src/bs/bs.c [deleted file]
src/control/control.c
src/core/common.c
src/core/common.h
src/core/config-parser.c
src/core/device-idler.c
src/core/device-notifier.c
src/core/edbus-handler.c
src/core/execute.c
src/core/launch.c
src/core/launch.h
src/core/log.c
src/core/sig-handler.c
src/core/udev.c
src/core/udev.h
src/devicectl/devicectl.c
src/devicectl/usb.c
src/display/setting.h
src/extcon/earjack.c
src/extcon/extcon.c
src/extcon/hdmi.c
src/fsck-msdos/CMakeLists.txt
src/fsck-msdos/LICENSE.BSD-1.0 [moved from src/newfs-msdos/LICENSE with 100% similarity]
src/gpio/buzzer.c [deleted file]
src/gpio/gpio.c [deleted file]
src/gpio/gpio.h [deleted file]
src/gpio/hall.c [deleted file]
src/gpio/sim.c [deleted file]
src/haptic/external.c
src/haptic/haptic.c
src/haptic/standard.c
src/led/ir.c
src/led/noti.c
src/led/touch-key.c
src/newfs-msdos/CMakeLists.txt
src/newfs-msdos/LICENSE.BSD-2-Clause [moved from src/fsck-msdos/LICENSE with 100% similarity]
src/proc/cpu-info.c
src/proc/pmon-handler.c [deleted file]
src/proc/proc-handler.c
src/proc/proc-handler.h
src/restarter/CMakeLists.txt
src/restarter/restart.c
src/shared/dbus.c
src/telephony/telephony.c
src/time/time-handler.c
src/usb/usb-default.c
src/usbhost/usb-host.c

similarity index 100%
rename from LICENSE.Apache-2.0
rename to LICENSE
diff --git a/NOTICE b/NOTICE
index dc3f273..bcd833b 100644 (file)
--- a/NOTICE
+++ b/NOTICE
@@ -1,4 +1,4 @@
 Copyright (c) The Android Open Source Project
 Copyright (c) Samsung Electronics Co., Ltd. All rights reserved.
 Except as noted, this software is licensed under Apache License, Version 2.
-Please, see the LICENSE.Apache-2.0 file for Apache License terms and conditions.
+Please, see the LICENSE file for Apache License terms and conditions.
diff --git a/checkpatch.pl b/checkpatch.pl
new file mode 100755 (executable)
index 0000000..ec217ad
--- /dev/null
@@ -0,0 +1,3753 @@
+#!/usr/bin/perl -w
+# (c) 2001, Dave Jones. (the file handling bit)
+# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
+# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
+# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
+# Licensed under the terms of the GNU GPL License version 2
+
+use strict;
+
+my $P = $0;
+$P =~ s@.*/@@g;
+
+my $V = '0.32';
+
+use Getopt::Long qw(:config no_auto_abbrev);
+
+my $nocheck = 0;
+my $quiet = 0;
+my $tree = 1;
+my $chk_signoff = 1;
+my $chk_patch = 1;
+my $tst_only;
+my $emacs = 0;
+my $terse = 0;
+my $file = 0;
+my $check = 0;
+my $summary = 1;
+my $mailback = 0;
+my $summary_file = 0;
+my $show_types = 0;
+my $root;
+my %debug;
+my %ignore_type = ();
+my @ignore = ();
+my $help = 0;
+my $configuration_file = ".checkpatch.conf";
+my $max_line_length = 80;
+
+sub help {
+       my ($exitcode) = @_;
+
+       print << "EOM";
+Usage: $P [OPTION]... [FILE]...
+Version: $V
+
+Options:
+  -q, --quiet                quiet
+  --no-tree                  run without a kernel tree
+  --no-signoff               do not check for 'Signed-off-by' line
+  --patch                    treat FILE as patchfile (default)
+  --emacs                    emacs compile window format
+  --terse                    one line per report
+  -f, --file                 treat FILE as regular source file
+  --subjective, --strict     enable more subjective tests
+  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
+  --max-line-length=n        set the maximum line length, if exceeded, warn
+  --show-types               show the message "types" in the output
+  --root=PATH                PATH to the kernel tree root
+  --no-summary               suppress the per-file summary
+  --mailback                 only produce a report in case of warnings/errors
+  --summary-file             include the filename in summary
+  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
+                             'values', 'possible', 'type', and 'attr' (default
+                             is all off)
+  --test-only=WORD           report only warnings/errors containing WORD
+                             literally
+  -h, --help, --version      display this help and exit
+
+When FILE is - read standard input.
+EOM
+
+       exit($exitcode);
+}
+
+my $conf = which_conf($configuration_file);
+if (-f $conf) {
+       my @conf_args;
+       open(my $conffile, '<', "$conf")
+           or warn "$P: Can't find a readable $configuration_file file $!\n";
+
+       while (<$conffile>) {
+               my $line = $_;
+
+               $line =~ s/\s*\n?$//g;
+               $line =~ s/^\s*//g;
+               $line =~ s/\s+/ /g;
+
+               next if ($line =~ m/^\s*#/);
+               next if ($line =~ m/^\s*$/);
+
+               my @words = split(" ", $line);
+               foreach my $word (@words) {
+                       last if ($word =~ m/^#/);
+                       push (@conf_args, $word);
+               }
+       }
+       close($conffile);
+       unshift(@ARGV, @conf_args) if @conf_args;
+}
+
+GetOptions(
+       'q|quiet+'      => \$quiet,
+       'tree!'         => \$tree,
+       'signoff!'      => \$chk_signoff,
+       'patch!'        => \$chk_patch,
+       'emacs!'        => \$emacs,
+       'terse!'        => \$terse,
+       'f|file!'       => \$file,
+       'subjective!'   => \$check,
+       'strict!'       => \$check,
+       'ignore=s'      => \@ignore,
+       'show-types!'   => \$show_types,
+       'max-line-length=i' => \$max_line_length,
+       'root=s'        => \$root,
+       'summary!'      => \$summary,
+       'mailback!'     => \$mailback,
+       'summary-file!' => \$summary_file,
+
+       'debug=s'       => \%debug,
+       'test-only=s'   => \$tst_only,
+       'h|help'        => \$help,
+       'version'       => \$help
+) or help(1);
+
+help(0) if ($help);
+
+my $exit = 0;
+
+if ($#ARGV < 0) {
+       print "$P: no input files\n";
+       exit(1);
+}
+
+@ignore = split(/,/, join(',',@ignore));
+foreach my $word (@ignore) {
+       $word =~ s/\s*\n?$//g;
+       $word =~ s/^\s*//g;
+       $word =~ s/\s+/ /g;
+       $word =~ tr/[a-z]/[A-Z]/;
+
+       next if ($word =~ m/^\s*#/);
+       next if ($word =~ m/^\s*$/);
+
+       $ignore_type{$word}++;
+}
+
+my $dbg_values = 0;
+my $dbg_possible = 0;
+my $dbg_type = 0;
+my $dbg_attr = 0;
+for my $key (keys %debug) {
+       ## no critic
+       eval "\${dbg_$key} = '$debug{$key}';";
+       die "$@" if ($@);
+}
+
+my $rpt_cleaners = 0;
+
+if ($terse) {
+       $emacs = 1;
+       $quiet++;
+}
+
+if ($tree) {
+       if (defined $root) {
+               if (!top_of_kernel_tree($root)) {
+                       die "$P: $root: --root does not point at a valid tree\n";
+               }
+       } else {
+               if (top_of_kernel_tree('.')) {
+                       $root = '.';
+               } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
+                                               top_of_kernel_tree($1)) {
+                       $root = $1;
+               }
+       }
+
+       if (!defined $root) {
+               print "Must be run from the top-level dir. of a kernel tree\n";
+               exit(2);
+       }
+}
+
+my $emitted_corrupt = 0;
+
+our $Ident     = qr{
+                       [A-Za-z_][A-Za-z\d_]*
+                       (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
+               }x;
+our $Storage   = qr{extern|static|asmlinkage};
+our $Sparse    = qr{
+                       __user|
+                       __kernel|
+                       __force|
+                       __iomem|
+                       __must_check|
+                       __init_refok|
+                       __kprobes|
+                       __ref|
+                       __rcu
+               }x;
+
+# Notes to $Attribute:
+# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
+our $Attribute = qr{
+                       const|
+                       __percpu|
+                       __nocast|
+                       __safe|
+                       __bitwise__|
+                       __packed__|
+                       __packed2__|
+                       __naked|
+                       __maybe_unused|
+                       __always_unused|
+                       __noreturn|
+                       __used|
+                       __cold|
+                       __noclone|
+                       __deprecated|
+                       __read_mostly|
+                       __kprobes|
+                       __(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
+                       ____cacheline_aligned|
+                       ____cacheline_aligned_in_smp|
+                       ____cacheline_internodealigned_in_smp|
+                       __weak
+                 }x;
+our $Modifier;
+our $Inline    = qr{inline|__always_inline|noinline};
+our $Member    = qr{->$Ident|\.$Ident|\[[^]]*\]};
+our $Lval      = qr{$Ident(?:$Member)*};
+
+our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
+our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
+our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
+our $Float     = qr{$Float_hex|$Float_dec|$Float_int};
+our $Constant  = qr{$Float|(?i)(?:0x[0-9a-f]+|[0-9]+)[ul]*};
+our $Assignment        = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
+our $Compare    = qr{<=|>=|==|!=|<|>};
+our $Operators = qr{
+                       <=|>=|==|!=|
+                       =>|->|<<|>>|<|>|!|~|
+                       &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
+                 }x;
+
+our $NonptrType;
+our $Type;
+our $Declare;
+
+our $NON_ASCII_UTF8    = qr{
+       [\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
+       |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
+       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
+       |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
+       |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
+       | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
+       |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
+}x;
+
+our $UTF8      = qr{
+       [\x09\x0A\x0D\x20-\x7E]              # ASCII
+       | $NON_ASCII_UTF8
+}x;
+
+our $typeTypedefs = qr{(?x:
+       (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
+       atomic_t
+)};
+
+our $logFunctions = qr{(?x:
+       printk(?:_ratelimited|_once|)|
+       [a-z0-9]+_(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
+       WARN(?:_RATELIMIT|_ONCE|)|
+       panic|
+       MODULE_[A-Z_]+
+)};
+
+our $signature_tags = qr{(?xi:
+       Signed-off-by:|
+       Acked-by:|
+       Tested-by:|
+       Reviewed-by:|
+       Reported-by:|
+       Suggested-by:|
+       To:|
+       Cc:
+)};
+
+our @typeList = (
+       qr{void},
+       qr{(?:unsigned\s+)?char},
+       qr{(?:unsigned\s+)?short},
+       qr{(?:unsigned\s+)?int},
+       qr{(?:unsigned\s+)?long},
+       qr{(?:unsigned\s+)?long\s+int},
+       qr{(?:unsigned\s+)?long\s+long},
+       qr{(?:unsigned\s+)?long\s+long\s+int},
+       qr{unsigned},
+       qr{float},
+       qr{double},
+       qr{bool},
+       qr{struct\s+$Ident},
+       qr{union\s+$Ident},
+       qr{enum\s+$Ident},
+       qr{${Ident}_t},
+       qr{${Ident}_handler},
+       qr{${Ident}_handler_fn},
+);
+our @modifierList = (
+       qr{fastcall},
+);
+
+our $allowed_asm_includes = qr{(?x:
+       irq|
+       memory
+)};
+# memory.h: ARM has a custom one
+
+sub build_types {
+       my $mods = "(?x:  \n" . join("|\n  ", @modifierList) . "\n)";
+       my $all = "(?x:  \n" . join("|\n  ", @typeList) . "\n)";
+       $Modifier       = qr{(?:$Attribute|$Sparse|$mods)};
+       $NonptrType     = qr{
+                       (?:$Modifier\s+|const\s+)*
+                       (?:
+                               (?:typeof|__typeof__)\s*\([^\)]*\)|
+                               (?:$typeTypedefs\b)|
+                               (?:${all}\b)
+                       )
+                       (?:\s+$Modifier|\s+const)*
+                 }x;
+       $Type   = qr{
+                       $NonptrType
+                       (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?
+                       (?:\s+$Inline|\s+$Modifier)*
+                 }x;
+       $Declare        = qr{(?:$Storage\s+)?$Type};
+}
+build_types();
+
+
+our $Typecast  = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
+
+# Using $balanced_parens, $LvalOrFunc, or $FuncArg
+# requires at least perl version v5.10.0
+# Any use must be runtime checked with $^V
+
+our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
+our $LvalOrFunc        = qr{($Lval)\s*($balanced_parens{0,1})\s*};
+our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
+
+sub deparenthesize {
+       my ($string) = @_;
+       return "" if (!defined($string));
+       $string =~ s@^\s*\(\s*@@g;
+       $string =~ s@\s*\)\s*$@@g;
+       $string =~ s@\s+@ @g;
+       return $string;
+}
+
+$chk_signoff = 0 if ($file);
+
+my @rawlines = ();
+my @lines = ();
+my $vname;
+for my $filename (@ARGV) {
+       my $FILE;
+       if ($file) {
+               open($FILE, '-|', "diff -u /dev/null $filename") ||
+                       die "$P: $filename: diff failed - $!\n";
+       } elsif ($filename eq '-') {
+               open($FILE, '<&STDIN');
+       } else {
+               open($FILE, '<', "$filename") ||
+                       die "$P: $filename: open failed - $!\n";
+       }
+       if ($filename eq '-') {
+               $vname = 'Your patch';
+       } else {
+               $vname = $filename;
+       }
+       while (<$FILE>) {
+               chomp;
+               push(@rawlines, $_);
+       }
+       close($FILE);
+       if (!process($filename)) {
+               $exit = 1;
+       }
+       @rawlines = ();
+       @lines = ();
+}
+
+exit($exit);
+
+sub top_of_kernel_tree {
+       my ($root) = @_;
+
+       my @tree_check = (
+               "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
+               "README", "Documentation", "arch", "include", "drivers",
+               "fs", "init", "ipc", "kernel", "lib", "scripts",
+       );
+
+       foreach my $check (@tree_check) {
+               if (! -e $root . '/' . $check) {
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+sub parse_email {
+       my ($formatted_email) = @_;
+
+       my $name = "";
+       my $address = "";
+       my $comment = "";
+
+       if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
+               $name = $1;
+               $address = $2;
+               $comment = $3 if defined $3;
+       } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
+               $address = $1;
+               $comment = $2 if defined $2;
+       } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
+               $address = $1;
+               $comment = $2 if defined $2;
+               $formatted_email =~ s/$address.*$//;
+               $name = $formatted_email;
+               $name =~ s/^\s+|\s+$//g;
+               $name =~ s/^\"|\"$//g;
+               # If there's a name left after stripping spaces and
+               # leading quotes, and the address doesn't have both
+               # leading and trailing angle brackets, the address
+               # is invalid. ie:
+               #   "joe smith joe@smith.com" bad
+               #   "joe smith <joe@smith.com" bad
+               if ($name ne "" && $address !~ /^<[^>]+>$/) {
+                       $name = "";
+                       $address = "";
+                       $comment = "";
+               }
+       }
+
+       $name =~ s/^\s+|\s+$//g;
+       $name =~ s/^\"|\"$//g;
+       $address =~ s/^\s+|\s+$//g;
+       $address =~ s/^\<|\>$//g;
+
+       if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
+               $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
+               $name = "\"$name\"";
+       }
+
+       return ($name, $address, $comment);
+}
+
+sub format_email {
+       my ($name, $address) = @_;
+
+       my $formatted_email;
+
+       $name =~ s/^\s+|\s+$//g;
+       $name =~ s/^\"|\"$//g;
+       $address =~ s/^\s+|\s+$//g;
+
+       if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
+               $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
+               $name = "\"$name\"";
+       }
+
+       if ("$name" eq "") {
+               $formatted_email = "$address";
+       } else {
+               $formatted_email = "$name <$address>";
+       }
+
+       return $formatted_email;
+}
+
+sub which_conf {
+       my ($conf) = @_;
+
+       foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
+               if (-e "$path/$conf") {
+                       return "$path/$conf";
+               }
+       }
+
+       return "";
+}
+
+sub expand_tabs {
+       my ($str) = @_;
+
+       my $res = '';
+       my $n = 0;
+       for my $c (split(//, $str)) {
+               if ($c eq "\t") {
+                       $res .= ' ';
+                       $n++;
+                       for (; ($n % 8) != 0; $n++) {
+                               $res .= ' ';
+                       }
+                       next;
+               }
+               $res .= $c;
+               $n++;
+       }
+
+       return $res;
+}
+sub copy_spacing {
+       (my $res = shift) =~ tr/\t/ /c;
+       return $res;
+}
+
+sub line_stats {
+       my ($line) = @_;
+
+       # Drop the diff line leader and expand tabs
+       $line =~ s/^.//;
+       $line = expand_tabs($line);
+
+       # Pick the indent from the front of the line.
+       my ($white) = ($line =~ /^(\s*)/);
+
+       return (length($line), length($white));
+}
+
+my $sanitise_quote = '';
+
+sub sanitise_line_reset {
+       my ($in_comment) = @_;
+
+       if ($in_comment) {
+               $sanitise_quote = '*/';
+       } else {
+               $sanitise_quote = '';
+       }
+}
+sub sanitise_line {
+       my ($line) = @_;
+
+       my $res = '';
+       my $l = '';
+
+       my $qlen = 0;
+       my $off = 0;
+       my $c;
+
+       # Always copy over the diff marker.
+       $res = substr($line, 0, 1);
+
+       for ($off = 1; $off < length($line); $off++) {
+               $c = substr($line, $off, 1);
+
+               # Comments we are wacking completly including the begin
+               # and end, all to $;.
+               if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
+                       $sanitise_quote = '*/';
+
+                       substr($res, $off, 2, "$;$;");
+                       $off++;
+                       next;
+               }
+               if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
+                       $sanitise_quote = '';
+                       substr($res, $off, 2, "$;$;");
+                       $off++;
+                       next;
+               }
+               if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
+                       $sanitise_quote = '//';
+
+                       substr($res, $off, 2, $sanitise_quote);
+                       $off++;
+                       next;
+               }
+
+               # A \ in a string means ignore the next character.
+               if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
+                   $c eq "\\") {
+                       substr($res, $off, 2, 'XX');
+                       $off++;
+                       next;
+               }
+               # Regular quotes.
+               if ($c eq "'" || $c eq '"') {
+                       if ($sanitise_quote eq '') {
+                               $sanitise_quote = $c;
+
+                               substr($res, $off, 1, $c);
+                               next;
+                       } elsif ($sanitise_quote eq $c) {
+                               $sanitise_quote = '';
+                       }
+               }
+
+               #print "c<$c> SQ<$sanitise_quote>\n";
+               if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
+                       substr($res, $off, 1, $;);
+               } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
+                       substr($res, $off, 1, $;);
+               } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
+                       substr($res, $off, 1, 'X');
+               } else {
+                       substr($res, $off, 1, $c);
+               }
+       }
+
+       if ($sanitise_quote eq '//') {
+               $sanitise_quote = '';
+       }
+
+       # The pathname on a #include may be surrounded by '<' and '>'.
+       if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
+               my $clean = 'X' x length($1);
+               $res =~ s@\<.*\>@<$clean>@;
+
+       # The whole of a #error is a string.
+       } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
+               my $clean = 'X' x length($1);
+               $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
+       }
+
+       return $res;
+}
+
+sub get_quoted_string {
+       my ($line, $rawline) = @_;
+
+       return "" if ($line !~ m/(\"[X]+\")/g);
+       return substr($rawline, $-[0], $+[0] - $-[0]);
+}
+
+sub ctx_statement_block {
+       my ($linenr, $remain, $off) = @_;
+       my $line = $linenr - 1;
+       my $blk = '';
+       my $soff = $off;
+       my $coff = $off - 1;
+       my $coff_set = 0;
+
+       my $loff = 0;
+
+       my $type = '';
+       my $level = 0;
+       my @stack = ();
+       my $p;
+       my $c;
+       my $len = 0;
+
+       my $remainder;
+       while (1) {
+               @stack = (['', 0]) if ($#stack == -1);
+
+               #warn "CSB: blk<$blk> remain<$remain>\n";
+               # If we are about to drop off the end, pull in more
+               # context.
+               if ($off >= $len) {
+                       for (; $remain > 0; $line++) {
+                               last if (!defined $lines[$line]);
+                               next if ($lines[$line] =~ /^-/);
+                               $remain--;
+                               $loff = $len;
+                               $blk .= $lines[$line] . "\n";
+                               $len = length($blk);
+                               $line++;
+                               last;
+                       }
+                       # Bail if there is no further context.
+                       #warn "CSB: blk<$blk> off<$off> len<$len>\n";
+                       if ($off >= $len) {
+                               last;
+                       }
+                       if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
+                               $level++;
+                               $type = '#';
+                       }
+               }
+               $p = $c;
+               $c = substr($blk, $off, 1);
+               $remainder = substr($blk, $off);
+
+               #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
+
+               # Handle nested #if/#else.
+               if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
+                       push(@stack, [ $type, $level ]);
+               } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
+                       ($type, $level) = @{$stack[$#stack - 1]};
+               } elsif ($remainder =~ /^#\s*endif\b/) {
+                       ($type, $level) = @{pop(@stack)};
+               }
+
+               # Statement ends at the ';' or a close '}' at the
+               # outermost level.
+               if ($level == 0 && $c eq ';') {
+                       last;
+               }
+
+               # An else is really a conditional as long as its not else if
+               if ($level == 0 && $coff_set == 0 &&
+                               (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
+                               $remainder =~ /^(else)(?:\s|{)/ &&
+                               $remainder !~ /^else\s+if\b/) {
+                       $coff = $off + length($1) - 1;
+                       $coff_set = 1;
+                       #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
+                       #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
+               }
+
+               if (($type eq '' || $type eq '(') && $c eq '(') {
+                       $level++;
+                       $type = '(';
+               }
+               if ($type eq '(' && $c eq ')') {
+                       $level--;
+                       $type = ($level != 0)? '(' : '';
+
+                       if ($level == 0 && $coff < $soff) {
+                               $coff = $off;
+                               $coff_set = 1;
+                               #warn "CSB: mark coff<$coff>\n";
+                       }
+               }
+               if (($type eq '' || $type eq '{') && $c eq '{') {
+                       $level++;
+                       $type = '{';
+               }
+               if ($type eq '{' && $c eq '}') {
+                       $level--;
+                       $type = ($level != 0)? '{' : '';
+
+                       if ($level == 0) {
+                               if (substr($blk, $off + 1, 1) eq ';') {
+                                       $off++;
+                               }
+                               last;
+                       }
+               }
+               # Preprocessor commands end at the newline unless escaped.
+               if ($type eq '#' && $c eq "\n" && $p ne "\\") {
+                       $level--;
+                       $type = '';
+                       $off++;
+                       last;
+               }
+               $off++;
+       }
+       # We are truly at the end, so shuffle to the next line.
+       if ($off == $len) {
+               $loff = $len + 1;
+               $line++;
+               $remain--;
+       }
+
+       my $statement = substr($blk, $soff, $off - $soff + 1);
+       my $condition = substr($blk, $soff, $coff - $soff + 1);
+
+       #warn "STATEMENT<$statement>\n";
+       #warn "CONDITION<$condition>\n";
+
+       #print "coff<$coff> soff<$off> loff<$loff>\n";
+
+       return ($statement, $condition,
+                       $line, $remain + 1, $off - $loff + 1, $level);
+}
+
+sub statement_lines {
+       my ($stmt) = @_;
+
+       # Strip the diff line prefixes and rip blank lines at start and end.
+       $stmt =~ s/(^|\n)./$1/g;
+       $stmt =~ s/^\s*//;
+       $stmt =~ s/\s*$//;
+
+       my @stmt_lines = ($stmt =~ /\n/g);
+
+       return $#stmt_lines + 2;
+}
+
+sub statement_rawlines {
+       my ($stmt) = @_;
+
+       my @stmt_lines = ($stmt =~ /\n/g);
+
+       return $#stmt_lines + 2;
+}
+
+sub statement_block_size {
+       my ($stmt) = @_;
+
+       $stmt =~ s/(^|\n)./$1/g;
+       $stmt =~ s/^\s*{//;
+       $stmt =~ s/}\s*$//;
+       $stmt =~ s/^\s*//;
+       $stmt =~ s/\s*$//;
+
+       my @stmt_lines = ($stmt =~ /\n/g);
+       my @stmt_statements = ($stmt =~ /;/g);
+
+       my $stmt_lines = $#stmt_lines + 2;
+       my $stmt_statements = $#stmt_statements + 1;
+
+       if ($stmt_lines > $stmt_statements) {
+               return $stmt_lines;
+       } else {
+               return $stmt_statements;
+       }
+}
+
+sub ctx_statement_full {
+       my ($linenr, $remain, $off) = @_;
+       my ($statement, $condition, $level);
+
+       my (@chunks);
+
+       # Grab the first conditional/block pair.
+       ($statement, $condition, $linenr, $remain, $off, $level) =
+                               ctx_statement_block($linenr, $remain, $off);
+       #print "F: c<$condition> s<$statement> remain<$remain>\n";
+       push(@chunks, [ $condition, $statement ]);
+       if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
+               return ($level, $linenr, @chunks);
+       }
+
+       # Pull in the following conditional/block pairs and see if they
+       # could continue the statement.
+       for (;;) {
+               ($statement, $condition, $linenr, $remain, $off, $level) =
+                               ctx_statement_block($linenr, $remain, $off);
+               #print "C: c<$condition> s<$statement> remain<$remain>\n";
+               last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
+               #print "C: push\n";
+               push(@chunks, [ $condition, $statement ]);
+       }
+
+       return ($level, $linenr, @chunks);
+}
+
+sub ctx_block_get {
+       my ($linenr, $remain, $outer, $open, $close, $off) = @_;
+       my $line;
+       my $start = $linenr - 1;
+       my $blk = '';
+       my @o;
+       my @c;
+       my @res = ();
+
+       my $level = 0;
+       my @stack = ($level);
+       for ($line = $start; $remain > 0; $line++) {
+               next if ($rawlines[$line] =~ /^-/);
+               $remain--;
+
+               $blk .= $rawlines[$line];
+
+               # Handle nested #if/#else.
+               if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
+                       push(@stack, $level);
+               } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
+                       $level = $stack[$#stack - 1];
+               } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
+                       $level = pop(@stack);
+               }
+
+               foreach my $c (split(//, $lines[$line])) {
+                       ##print "C<$c>L<$level><$open$close>O<$off>\n";
+                       if ($off > 0) {
+                               $off--;
+                               next;
+                       }
+
+                       if ($c eq $close && $level > 0) {
+                               $level--;
+                               last if ($level == 0);
+                       } elsif ($c eq $open) {
+                               $level++;
+                       }
+               }
+
+               if (!$outer || $level <= 1) {
+                       push(@res, $rawlines[$line]);
+               }
+
+               last if ($level == 0);
+       }
+
+       return ($level, @res);
+}
+sub ctx_block_outer {
+       my ($linenr, $remain) = @_;
+
+       my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
+       return @r;
+}
+sub ctx_block {
+       my ($linenr, $remain) = @_;
+
+       my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
+       return @r;
+}
+sub ctx_statement {
+       my ($linenr, $remain, $off) = @_;
+
+       my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
+       return @r;
+}
+sub ctx_block_level {
+       my ($linenr, $remain) = @_;
+
+       return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
+}
+sub ctx_statement_level {
+       my ($linenr, $remain, $off) = @_;
+
+       return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
+}
+
+sub ctx_locate_comment {
+       my ($first_line, $end_line) = @_;
+
+       # Catch a comment on the end of the line itself.
+       my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
+       return $current_comment if (defined $current_comment);
+
+       # Look through the context and try and figure out if there is a
+       # comment.
+       my $in_comment = 0;
+       $current_comment = '';
+       for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
+               my $line = $rawlines[$linenr - 1];
+               #warn "           $line\n";
+               if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
+                       $in_comment = 1;
+               }
+               if ($line =~ m@/\*@) {
+                       $in_comment = 1;
+               }
+               if (!$in_comment && $current_comment ne '') {
+                       $current_comment = '';
+               }
+               $current_comment .= $line . "\n" if ($in_comment);
+               if ($line =~ m@\*/@) {
+                       $in_comment = 0;
+               }
+       }
+
+       chomp($current_comment);
+       return($current_comment);
+}
+sub ctx_has_comment {
+       my ($first_line, $end_line) = @_;
+       my $cmt = ctx_locate_comment($first_line, $end_line);
+
+       ##print "LINE: $rawlines[$end_line - 1 ]\n";
+       ##print "CMMT: $cmt\n";
+
+       return ($cmt ne '');
+}
+
+sub raw_line {
+       my ($linenr, $cnt) = @_;
+
+       my $offset = $linenr - 1;
+       $cnt++;
+
+       my $line;
+       while ($cnt) {
+               $line = $rawlines[$offset++];
+               next if (defined($line) && $line =~ /^-/);
+               $cnt--;
+       }
+
+       return $line;
+}
+
+sub cat_vet {
+       my ($vet) = @_;
+       my ($res, $coded);
+
+       $res = '';
+       while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
+               $res .= $1;
+               if ($2 ne '') {
+                       $coded = sprintf("^%c", unpack('C', $2) + 64);
+                       $res .= $coded;
+               }
+       }
+       $res =~ s/$/\$/;
+
+       return $res;
+}
+
+my $av_preprocessor = 0;
+my $av_pending;
+my @av_paren_type;
+my $av_pend_colon;
+
+sub annotate_reset {
+       $av_preprocessor = 0;
+       $av_pending = '_';
+       @av_paren_type = ('E');
+       $av_pend_colon = 'O';
+}
+
+sub annotate_values {
+       my ($stream, $type) = @_;
+
+       my $res;
+       my $var = '_' x length($stream);
+       my $cur = $stream;
+
+       print "$stream\n" if ($dbg_values > 1);
+
+       while (length($cur)) {
+               @av_paren_type = ('E') if ($#av_paren_type < 0);
+               print " <" . join('', @av_paren_type) .
+                               "> <$type> <$av_pending>" if ($dbg_values > 1);
+               if ($cur =~ /^(\s+)/o) {
+                       print "WS($1)\n" if ($dbg_values > 1);
+                       if ($1 =~ /\n/ && $av_preprocessor) {
+                               $type = pop(@av_paren_type);
+                               $av_preprocessor = 0;
+                       }
+
+               } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
+                       print "CAST($1)\n" if ($dbg_values > 1);
+                       push(@av_paren_type, $type);
+                       $type = 'c';
+
+               } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
+                       print "DECLARE($1)\n" if ($dbg_values > 1);
+                       $type = 'T';
+
+               } elsif ($cur =~ /^($Modifier)\s*/) {
+                       print "MODIFIER($1)\n" if ($dbg_values > 1);
+                       $type = 'T';
+
+               } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
+                       print "DEFINE($1,$2)\n" if ($dbg_values > 1);
+                       $av_preprocessor = 1;
+                       push(@av_paren_type, $type);
+                       if ($2 ne '') {
+                               $av_pending = 'N';
+                       }
+                       $type = 'E';
+
+               } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
+                       print "UNDEF($1)\n" if ($dbg_values > 1);
+                       $av_preprocessor = 1;
+                       push(@av_paren_type, $type);
+
+               } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
+                       print "PRE_START($1)\n" if ($dbg_values > 1);
+                       $av_preprocessor = 1;
+
+                       push(@av_paren_type, $type);
+                       push(@av_paren_type, $type);
+                       $type = 'E';
+
+               } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
+                       print "PRE_RESTART($1)\n" if ($dbg_values > 1);
+                       $av_preprocessor = 1;
+
+                       push(@av_paren_type, $av_paren_type[$#av_paren_type]);
+
+                       $type = 'E';
+
+               } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
+                       print "PRE_END($1)\n" if ($dbg_values > 1);
+
+                       $av_preprocessor = 1;
+
+                       # Assume all arms of the conditional end as this
+                       # one does, and continue as if the #endif was not here.
+                       pop(@av_paren_type);
+                       push(@av_paren_type, $type);
+                       $type = 'E';
+
+               } elsif ($cur =~ /^(\\\n)/o) {
+                       print "PRECONT($1)\n" if ($dbg_values > 1);
+
+               } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
+                       print "ATTR($1)\n" if ($dbg_values > 1);
+                       $av_pending = $type;
+                       $type = 'N';
+
+               } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
+                       print "SIZEOF($1)\n" if ($dbg_values > 1);
+                       if (defined $2) {
+                               $av_pending = 'V';
+                       }
+                       $type = 'N';
+
+               } elsif ($cur =~ /^(if|while|for)\b/o) {
+                       print "COND($1)\n" if ($dbg_values > 1);
+                       $av_pending = 'E';
+                       $type = 'N';
+
+               } elsif ($cur =~/^(case)/o) {
+                       print "CASE($1)\n" if ($dbg_values > 1);
+                       $av_pend_colon = 'C';
+                       $type = 'N';
+
+               } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
+                       print "KEYWORD($1)\n" if ($dbg_values > 1);
+                       $type = 'N';
+
+               } elsif ($cur =~ /^(\()/o) {
+                       print "PAREN('$1')\n" if ($dbg_values > 1);
+                       push(@av_paren_type, $av_pending);
+                       $av_pending = '_';
+                       $type = 'N';
+
+               } elsif ($cur =~ /^(\))/o) {
+                       my $new_type = pop(@av_paren_type);
+                       if ($new_type ne '_') {
+                               $type = $new_type;
+                               print "PAREN('$1') -> $type\n"
+                                                       if ($dbg_values > 1);
+                       } else {
+                               print "PAREN('$1')\n" if ($dbg_values > 1);
+                       }
+
+               } elsif ($cur =~ /^($Ident)\s*\(/o) {
+                       print "FUNC($1)\n" if ($dbg_values > 1);
+                       $type = 'V';
+                       $av_pending = 'V';
+
+               } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
+                       if (defined $2 && $type eq 'C' || $type eq 'T') {
+                               $av_pend_colon = 'B';
+                       } elsif ($type eq 'E') {
+                               $av_pend_colon = 'L';
+                       }
+                       print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
+                       $type = 'V';
+
+               } elsif ($cur =~ /^($Ident|$Constant)/o) {
+                       print "IDENT($1)\n" if ($dbg_values > 1);
+                       $type = 'V';
+
+               } elsif ($cur =~ /^($Assignment)/o) {
+                       print "ASSIGN($1)\n" if ($dbg_values > 1);
+                       $type = 'N';
+
+               } elsif ($cur =~/^(;|{|})/) {
+                       print "END($1)\n" if ($dbg_values > 1);
+                       $type = 'E';
+                       $av_pend_colon = 'O';
+
+               } elsif ($cur =~/^(,)/) {
+                       print "COMMA($1)\n" if ($dbg_values > 1);
+                       $type = 'C';
+
+               } elsif ($cur =~ /^(\?)/o) {
+                       print "QUESTION($1)\n" if ($dbg_values > 1);
+                       $type = 'N';
+
+               } elsif ($cur =~ /^(:)/o) {
+                       print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
+
+                       substr($var, length($res), 1, $av_pend_colon);
+                       if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
+                               $type = 'E';
+                       } else {
+                               $type = 'N';
+                       }
+                       $av_pend_colon = 'O';
+
+               } elsif ($cur =~ /^(\[)/o) {
+                       print "CLOSE($1)\n" if ($dbg_values > 1);
+                       $type = 'N';
+
+               } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
+                       my $variant;
+
+                       print "OPV($1)\n" if ($dbg_values > 1);
+                       if ($type eq 'V') {
+                               $variant = 'B';
+                       } else {
+                               $variant = 'U';
+                       }
+
+                       substr($var, length($res), 1, $variant);
+                       $type = 'N';
+
+               } elsif ($cur =~ /^($Operators)/o) {
+                       print "OP($1)\n" if ($dbg_values > 1);
+                       if ($1 ne '++' && $1 ne '--') {
+                               $type = 'N';
+                       }
+
+               } elsif ($cur =~ /(^.)/o) {
+                       print "C($1)\n" if ($dbg_values > 1);
+               }
+               if (defined $1) {
+                       $cur = substr($cur, length($1));
+                       $res .= $type x length($1);
+               }
+       }
+
+       return ($res, $var);
+}
+
+sub possible {
+       my ($possible, $line) = @_;
+       my $notPermitted = qr{(?:
+               ^(?:
+                       $Modifier|
+                       $Storage|
+                       $Type|
+                       DEFINE_\S+
+               )$|
+               ^(?:
+                       goto|
+                       return|
+                       case|
+                       else|
+                       asm|__asm__|
+                       do|
+                       \#|
+                       \#\#|
+               )(?:\s|$)|
+               ^(?:typedef|struct|enum)\b
+           )}x;
+       warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
+       if ($possible !~ $notPermitted) {
+               # Check for modifiers.
+               $possible =~ s/\s*$Storage\s*//g;
+               $possible =~ s/\s*$Sparse\s*//g;
+               if ($possible =~ /^\s*$/) {
+
+               } elsif ($possible =~ /\s/) {
+                       $possible =~ s/\s*$Type\s*//g;
+                       for my $modifier (split(' ', $possible)) {
+                               if ($modifier !~ $notPermitted) {
+                                       warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
+                                       push(@modifierList, $modifier);
+                               }
+                       }
+
+               } else {
+                       warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
+                       push(@typeList, $possible);
+               }
+               build_types();
+       } else {
+               warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
+       }
+}
+
+my $prefix = '';
+
+sub show_type {
+       return !defined $ignore_type{$_[0]};
+}
+
+sub report {
+       if (!show_type($_[1]) ||
+           (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
+               return 0;
+       }
+       my $line;
+       if ($show_types) {
+               $line = "$prefix$_[0]:$_[1]: $_[2]\n";
+       } else {
+               $line = "$prefix$_[0]: $_[2]\n";
+       }
+       $line = (split('\n', $line))[0] . "\n" if ($terse);
+
+       push(our @report, $line);
+
+       return 1;
+}
+sub report_dump {
+       our @report;
+}
+
+sub ERROR {
+       if (report("ERROR", $_[0], $_[1])) {
+               our $clean = 0;
+               our $cnt_error++;
+       }
+}
+sub WARN {
+       if (report("WARNING", $_[0], $_[1])) {
+               our $clean = 0;
+               our $cnt_warn++;
+       }
+}
+sub CHK {
+       if ($check && report("CHECK", $_[0], $_[1])) {
+               our $clean = 0;
+               our $cnt_chk++;
+       }
+}
+
+sub check_absolute_file {
+       my ($absolute, $herecurr) = @_;
+       my $file = $absolute;
+
+       ##print "absolute<$absolute>\n";
+
+       # See if any suffix of this path is a path within the tree.
+       while ($file =~ s@^[^/]*/@@) {
+               if (-f "$root/$file") {
+                       ##print "file<$file>\n";
+                       last;
+               }
+       }
+       if (! -f _)  {
+               return 0;
+       }
+
+       # It is, so see if the prefix is acceptable.
+       my $prefix = $absolute;
+       substr($prefix, -length($file)) = '';
+
+       ##print "prefix<$prefix>\n";
+       if ($prefix ne ".../") {
+               WARN("USE_RELATIVE_PATH",
+                    "use relative pathname instead of absolute in changelog text\n" . $herecurr);
+       }
+}
+
+sub pos_last_openparen {
+       my ($line) = @_;
+
+       my $pos = 0;
+
+       my $opens = $line =~ tr/\(/\(/;
+       my $closes = $line =~ tr/\)/\)/;
+
+       my $last_openparen = 0;
+
+       if (($opens == 0) || ($closes >= $opens)) {
+               return -1;
+       }
+
+       my $len = length($line);
+
+       for ($pos = 0; $pos < $len; $pos++) {
+               my $string = substr($line, $pos);
+               if ($string =~ /^($FuncArg|$balanced_parens)/) {
+                       $pos += length($1) - 1;
+               } elsif (substr($line, $pos, 1) eq '(') {
+                       $last_openparen = $pos;
+               } elsif (index($string, '(') == -1) {
+                       last;
+               }
+       }
+
+       return $last_openparen + 1;
+}
+
+sub process {
+       my $filename = shift;
+
+       my $linenr=0;
+       my $prevline="";
+       my $prevrawline="";
+       my $stashline="";
+       my $stashrawline="";
+
+       my $length;
+       my $indent;
+       my $previndent=0;
+       my $stashindent=0;
+
+       our $clean = 1;
+       my $signoff = 0;
+       my $is_patch = 0;
+
+       my $in_header_lines = 1;
+       my $in_commit_log = 0;          #Scanning lines before patch
+
+       my $non_utf8_charset = 0;
+
+       our @report = ();
+       our $cnt_lines = 0;
+       our $cnt_error = 0;
+       our $cnt_warn = 0;
+       our $cnt_chk = 0;
+
+       # Trace the real file/line as we go.
+       my $realfile = '';
+       my $realline = 0;
+       my $realcnt = 0;
+       my $here = '';
+       my $in_comment = 0;
+       my $comment_edge = 0;
+       my $first_line = 0;
+       my $p1_prefix = '';
+
+       my $prev_values = 'E';
+
+       # suppression flags
+       my %suppress_ifbraces;
+       my %suppress_whiletrailers;
+       my %suppress_export;
+       my $suppress_statement = 0;
+
+       my %camelcase = ();
+
+       # Pre-scan the patch sanitizing the lines.
+       # Pre-scan the patch looking for any __setup documentation.
+       #
+       my @setup_docs = ();
+       my $setup_docs = 0;
+
+       sanitise_line_reset();
+       my $line;
+       foreach my $rawline (@rawlines) {
+               $linenr++;
+               $line = $rawline;
+
+               if ($rawline=~/^\+\+\+\s+(\S+)/) {
+                       $setup_docs = 0;
+                       if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
+                               $setup_docs = 1;
+                       }
+                       #next;
+               }
+               if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
+                       $realline=$1-1;
+                       if (defined $2) {
+                               $realcnt=$3+1;
+                       } else {
+                               $realcnt=1+1;
+                       }
+                       $in_comment = 0;
+
+                       # Guestimate if this is a continuing comment.  Run
+                       # the context looking for a comment "edge".  If this
+                       # edge is a close comment then we must be in a comment
+                       # at context start.
+                       my $edge;
+                       my $cnt = $realcnt;
+                       for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
+                               next if (defined $rawlines[$ln - 1] &&
+                                        $rawlines[$ln - 1] =~ /^-/);
+                               $cnt--;
+                               #print "RAW<$rawlines[$ln - 1]>\n";
+                               last if (!defined $rawlines[$ln - 1]);
+                               if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
+                                   $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
+                                       ($edge) = $1;
+                                       last;
+                               }
+                       }
+                       if (defined $edge && $edge eq '*/') {
+                               $in_comment = 1;
+                       }
+
+                       # Guestimate if this is a continuing comment.  If this
+                       # is the start of a diff block and this line starts
+                       # ' *' then it is very likely a comment.
+                       if (!defined $edge &&
+                           $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
+                       {
+                               $in_comment = 1;
+                       }
+
+                       ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
+                       sanitise_line_reset($in_comment);
+
+               } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
+                       # Standardise the strings and chars within the input to
+                       # simplify matching -- only bother with positive lines.
+                       $line = sanitise_line($rawline);
+               }
+               push(@lines, $line);
+
+               if ($realcnt > 1) {
+                       $realcnt-- if ($line =~ /^(?:\+| |$)/);
+               } else {
+                       $realcnt = 0;
+               }
+
+               #print "==>$rawline\n";
+               #print "-->$line\n";
+
+               if ($setup_docs && $line =~ /^\+/) {
+                       push(@setup_docs, $line);
+               }
+       }
+
+       $prefix = '';
+
+       $realcnt = 0;
+       $linenr = 0;
+       foreach my $line (@lines) {
+               $linenr++;
+
+               my $rawline = $rawlines[$linenr - 1];
+
+#extract the line range in the file after the patch is applied
+               if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
+                       $is_patch = 1;
+                       $first_line = $linenr + 1;
+                       $realline=$1-1;
+                       if (defined $2) {
+                               $realcnt=$3+1;
+                       } else {
+                               $realcnt=1+1;
+                       }
+                       annotate_reset();
+                       $prev_values = 'E';
+
+                       %suppress_ifbraces = ();
+                       %suppress_whiletrailers = ();
+                       %suppress_export = ();
+                       $suppress_statement = 0;
+                       next;
+
+# track the line number as we move through the hunk, note that
+# new versions of GNU diff omit the leading space on completely
+# blank context lines so we need to count that too.
+               } elsif ($line =~ /^( |\+|$)/) {
+                       $realline++;
+                       $realcnt-- if ($realcnt != 0);
+
+                       # Measure the line length and indent.
+                       ($length, $indent) = line_stats($rawline);
+
+                       # Track the previous line.
+                       ($prevline, $stashline) = ($stashline, $line);
+                       ($previndent, $stashindent) = ($stashindent, $indent);
+                       ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
+
+                       #warn "line<$line>\n";
+
+               } elsif ($realcnt == 1) {
+                       $realcnt--;
+               }
+
+               my $hunk_line = ($realcnt != 0);
+
+#make up the handle for any error we report on this line
+               $prefix = "$filename:$realline: " if ($emacs && $file);
+               $prefix = "$filename:$linenr: " if ($emacs && !$file);
+
+               $here = "#$linenr: " if (!$file);
+               $here = "#$realline: " if ($file);
+
+               # extract the filename as it passes
+               if ($line =~ /^diff --git.*?(\S+)$/) {
+                       $realfile = $1;
+                       $realfile =~ s@^([^/]*)/@@;
+                       $in_commit_log = 0;
+               } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
+                       $realfile = $1;
+                       $realfile =~ s@^([^/]*)/@@;
+                       $in_commit_log = 0;
+
+                       $p1_prefix = $1;
+                       if (!$file && $tree && $p1_prefix ne '' &&
+                           -e "$root/$p1_prefix") {
+                               WARN("PATCH_PREFIX",
+                                    "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
+                       }
+
+                       if ($realfile =~ m@^include/asm/@) {
+                               ERROR("MODIFIED_INCLUDE_ASM",
+                                     "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
+                       }
+                       next;
+               }
+
+               $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
+
+               my $hereline = "$here\n$rawline\n";
+               my $herecurr = "$here\n$rawline\n";
+               my $hereprev = "$here\n$prevrawline\n$rawline\n";
+
+               $cnt_lines++ if ($realcnt != 0);
+
+# Check for incorrect file permissions
+               if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
+                       my $permhere = $here . "FILE: $realfile\n";
+                       if ($realfile !~ m@scripts/@ &&
+                           $realfile !~ /\.(py|pl|awk|sh)$/) {
+                               ERROR("EXECUTE_PERMISSIONS",
+                                     "do not set execute permissions for source files\n" . $permhere);
+                       }
+               }
+
+# Check the patch for a signoff:
+               if ($line =~ /^\s*signed-off-by:/i) {
+                       $signoff++;
+                       $in_commit_log = 0;
+               }
+
+# Check signature styles
+               if (!$in_header_lines &&
+                   $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
+                       my $space_before = $1;
+                       my $sign_off = $2;
+                       my $space_after = $3;
+                       my $email = $4;
+                       my $ucfirst_sign_off = ucfirst(lc($sign_off));
+
+                       if ($sign_off !~ /$signature_tags/) {
+                               WARN("BAD_SIGN_OFF",
+                                    "Non-standard signature: $sign_off\n" . $herecurr);
+                       }
+                       if (defined $space_before && $space_before ne "") {
+                               WARN("BAD_SIGN_OFF",
+                                    "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr);
+                       }
+                       if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
+                               WARN("BAD_SIGN_OFF",
+                                    "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr);
+                       }
+                       if (!defined $space_after || $space_after ne " ") {
+                               WARN("BAD_SIGN_OFF",
+                                    "Use a single space after $ucfirst_sign_off\n" . $herecurr);
+                       }
+
+                       my ($email_name, $email_address, $comment) = parse_email($email);
+                       my $suggested_email = format_email(($email_name, $email_address));
+                       if ($suggested_email eq "") {
+                               ERROR("BAD_SIGN_OFF",
+                                     "Unrecognized email address: '$email'\n" . $herecurr);
+                       } else {
+                               my $dequoted = $suggested_email;
+                               $dequoted =~ s/^"//;
+                               $dequoted =~ s/" </ </;
+                               # Don't force email to have quotes
+                               # Allow just an angle bracketed address
+                               if ("$dequoted$comment" ne $email &&
+                                   "<$email_address>$comment" ne $email &&
+                                   "$suggested_email$comment" ne $email) {
+                                       WARN("BAD_SIGN_OFF",
+                                            "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
+                               }
+                       }
+               }
+
+# Check for wrappage within a valid hunk of the file
+               if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
+                       ERROR("CORRUPTED_PATCH",
+                             "patch seems to be corrupt (line wrapped?)\n" .
+                               $herecurr) if (!$emitted_corrupt++);
+               }
+
+# Check for absolute kernel paths.
+               if ($tree) {
+                       while ($line =~ m{(?:^|\s)(/\S*)}g) {
+                               my $file = $1;
+
+                               if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
+                                   check_absolute_file($1, $herecurr)) {
+                                       #
+                               } else {
+                                       check_absolute_file($file, $herecurr);
+                               }
+                       }
+               }
+
+# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
+               if (($realfile =~ /^$/ || $line =~ /^\+/) &&
+                   $rawline !~ m/^$UTF8*$/) {
+                       my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
+
+                       my $blank = copy_spacing($rawline);
+                       my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
+                       my $hereptr = "$hereline$ptr\n";
+
+                       CHK("INVALID_UTF8",
+                           "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
+               }
+
+# Check if it's the start of a commit log
+# (not a header line and we haven't seen the patch filename)
+               if ($in_header_lines && $realfile =~ /^$/ &&
+                   $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
+                       $in_header_lines = 0;
+                       $in_commit_log = 1;
+               }
+
+# Check if there is UTF-8 in a commit log when a mail header has explicitly
+# declined it, i.e defined some charset where it is missing.
+               if ($in_header_lines &&
+                   $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
+                   $1 !~ /utf-8/i) {
+                       $non_utf8_charset = 1;
+               }
+
+               if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
+                   $rawline =~ /$NON_ASCII_UTF8/) {
+                       WARN("UTF8_BEFORE_PATCH",
+                           "8-bit UTF-8 used in possible commit log\n" . $herecurr);
+               }
+
+# ignore non-hunk lines and lines being removed
+               next if (!$hunk_line || $line =~ /^-/);
+
+#trailing whitespace
+               if ($line =~ /^\+.*\015/) {
+                       my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+                       ERROR("DOS_LINE_ENDINGS",
+                             "DOS line endings\n" . $herevet);
+
+               } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
+                       my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+                       ERROR("TRAILING_WHITESPACE",
+                             "trailing whitespace\n" . $herevet);
+                       $rpt_cleaners = 1;
+               }
+
+# check for Kconfig help text having a real description
+# Only applies when adding the entry originally, after that we do not have
+# sufficient context to determine whether it is indeed long enough.
+               if ($realfile =~ /Kconfig/ &&
+                   $line =~ /.\s*config\s+/) {
+                       my $length = 0;
+                       my $cnt = $realcnt;
+                       my $ln = $linenr + 1;
+                       my $f;
+                       my $is_start = 0;
+                       my $is_end = 0;
+                       for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
+                               $f = $lines[$ln - 1];
+                               $cnt-- if ($lines[$ln - 1] !~ /^-/);
+                               $is_end = $lines[$ln - 1] =~ /^\+/;
+
+                               next if ($f =~ /^-/);
+
+                               if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
+                                       $is_start = 1;
+                               } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
+                                       $length = -1;
+                               }
+
+                               $f =~ s/^.//;
+                               $f =~ s/#.*//;
+                               $f =~ s/^\s+//;
+                               next if ($f =~ /^$/);
+                               if ($f =~ /^\s*config\s/) {
+                                       $is_end = 1;
+                                       last;
+                               }
+                               $length++;
+                       }
+                       WARN("CONFIG_DESCRIPTION",
+                            "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
+                       #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
+               }
+
+# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
+               if ($realfile =~ /Kconfig/ &&
+                   $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
+                       WARN("CONFIG_EXPERIMENTAL",
+                            "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
+               }
+
+               if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
+                   ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
+                       my $flag = $1;
+                       my $replacement = {
+                               'EXTRA_AFLAGS' =>   'asflags-y',
+                               'EXTRA_CFLAGS' =>   'ccflags-y',
+                               'EXTRA_CPPFLAGS' => 'cppflags-y',
+                               'EXTRA_LDFLAGS' =>  'ldflags-y',
+                       };
+
+                       WARN("DEPRECATED_VARIABLE",
+                            "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
+               }
+
+# check we are in a valid source file if not then ignore this hunk
+               next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
+
+               if ($nocheck)
+               {
+#line length limit
+               if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
+                   $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
+                   !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
+                   $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
+                   $length > $max_line_length)
+               {
+                       WARN("LONG_LINE",
+                            "line over $max_line_length characters\n" . $herecurr);
+               }
+               }
+
+# Check for user-visible strings broken across lines, which breaks the ability
+# to grep for the string.  Limited to strings used as parameters (those
+# following an open parenthesis), which almost completely eliminates false
+# positives, as well as warning only once per parameter rather than once per
+# line of the string.  Make an exception when the previous string ends in a
+# newline (multiple lines in one string constant) or \n\t (common in inline
+# assembly to indent the instruction on the following line).
+               if ($line =~ /^\+\s*"/ &&
+                   $prevline =~ /"\s*$/ &&
+                   $prevline =~ /\(/ &&
+                   $prevrawline !~ /\\n(?:\\t)*"\s*$/) {
+                       WARN("SPLIT_STRING",
+                            "quoted string split across lines\n" . $hereprev);
+               }
+
+# check for spaces before a quoted newline
+               if ($rawline =~ /^.*\".*\s\\n/) {
+                       WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
+                            "unnecessary whitespace before a quoted newline\n" . $herecurr);
+               }
+
+# check for adding lines without a newline.
+               if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
+                       WARN("MISSING_EOF_NEWLINE",
+                            "adding a line without newline at end of file\n" . $herecurr);
+               }
+
+# Blackfin: use hi/lo macros
+               if ($realfile =~ m@arch/blackfin/.*\.S$@) {
+                       if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
+                               my $herevet = "$here\n" . cat_vet($line) . "\n";
+                               ERROR("LO_MACRO",
+                                     "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
+                       }
+                       if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
+                               my $herevet = "$here\n" . cat_vet($line) . "\n";
+                               ERROR("HI_MACRO",
+                                     "use the HI() macro, not (... >> 16)\n" . $herevet);
+                       }
+               }
+
+# check we are in a valid source file C or perl if not then ignore this hunk
+               next if ($realfile !~ /\.(h|c|pl)$/);
+
+# at the beginning of a line any tabs must come first and anything
+# more than 8 must use tabs.
+               if ($rawline =~ /^\+\s* \t\s*\S/ ||
+                   $rawline =~ /^\+\s*        \s*/) {
+                       my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+                       ERROR("CODE_INDENT",
+                             "code indent should use tabs where possible\n" . $herevet);
+                       $rpt_cleaners = 1;
+               }
+
+# check for space before tabs.
+               if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
+                       my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+                       WARN("SPACE_BEFORE_TAB",
+                            "please, no space before tabs\n" . $herevet);
+               }
+
+# check for && or || at the start of a line
+               if ($rawline =~ /^\+\s*(&&|\|\|)/) {
+                       CHK("LOGICAL_CONTINUATIONS",
+                           "Logical continuations should be on the previous line\n" . $hereprev);
+               }
+
+# check multi-line statement indentation matches previous line
+               if ($^V && $^V ge 5.10.0 &&
+                   $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
+                       $prevline =~ /^\+(\t*)(.*)$/;
+                       my $oldindent = $1;
+                       my $rest = $2;
+
+                       my $pos = pos_last_openparen($rest);
+                       if ($pos >= 0) {
+                               $line =~ /^(\+| )([ \t]*)/;
+                               my $newindent = $2;
+
+                               my $goodtabindent = $oldindent .
+                                       "\t" x ($pos / 8) .
+                                       " "  x ($pos % 8);
+                               my $goodspaceindent = $oldindent . " "  x $pos;
+
+                               if ($newindent ne $goodtabindent &&
+                                   $newindent ne $goodspaceindent) {
+                                       CHK("PARENTHESIS_ALIGNMENT",
+                                           "Alignment should match open parenthesis\n" . $hereprev);
+                               }
+                       }
+               }
+
+               if ($line =~ /^\+.*\*[ \t]*\)[ \t]+/) {
+                       CHK("SPACING",
+                           "No space is necessary after a cast\n" . $hereprev);
+               }
+
+               if ($realfile =~ m@^(drivers/net/|net/)@ &&
+                   $rawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
+                   $prevrawline =~ /^\+[ \t]*$/) {
+                       WARN("NETWORKING_BLOCK_COMMENT_STYLE",
+                            "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
+               }
+
+               if ($realfile =~ m@^(drivers/net/|net/)@ &&
+                   $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&       #trailing */
+                   $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&      #inline /*...*/
+                   $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&       #trailing **/
+                   $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {    #non blank */
+                       WARN("NETWORKING_BLOCK_COMMENT_STYLE",
+                            "networking block comments put the trailing */ on a separate line\n" . $herecurr);
+               }
+
+# check for spaces at the beginning of a line.
+# Exceptions:
+#  1) within comments
+#  2) indented preprocessor commands
+#  3) hanging labels
+               if ($nocheck) {
+               if ($rawline =~ /^\+ / && $line !~ /\+ *(?:$;|#|$Ident:)/)  {
+                       my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+                       WARN("LEADING_SPACE",
+                            "please, no spaces at the start of a line\n" . $herevet);
+               }
+               }
+
+# check we are in a valid C source file if not then ignore this hunk
+               next if ($realfile !~ /\.(h|c)$/);
+
+# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
+               if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
+                       WARN("CONFIG_EXPERIMENTAL",
+                            "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
+               }
+
+# check for RCS/CVS revision markers
+               if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
+                       WARN("CVS_KEYWORD",
+                            "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
+               }
+
+# Blackfin: don't use __builtin_bfin_[cs]sync
+               if ($line =~ /__builtin_bfin_csync/) {
+                       my $herevet = "$here\n" . cat_vet($line) . "\n";
+                       ERROR("CSYNC",
+                             "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
+               }
+               if ($line =~ /__builtin_bfin_ssync/) {
+                       my $herevet = "$here\n" . cat_vet($line) . "\n";
+                       ERROR("SSYNC",
+                             "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
+               }
+
+# check for old HOTPLUG __dev<foo> section markings
+               if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
+                       WARN("HOTPLUG_SECTION",
+                            "Using $1 is unnecessary\n" . $herecurr);
+               }
+
+# Check for potential 'bare' types
+               my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
+                   $realline_next);
+#print "LINE<$line>\n";
+               if ($linenr >= $suppress_statement &&
+                   $realcnt && $line =~ /.\s*\S/) {
+                       ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
+                               ctx_statement_block($linenr, $realcnt, 0);
+                       $stat =~ s/\n./\n /g;
+                       $cond =~ s/\n./\n /g;
+
+#print "linenr<$linenr> <$stat>\n";
+                       # If this statement has no statement boundaries within
+                       # it there is no point in retrying a statement scan
+                       # until we hit end of it.
+                       my $frag = $stat; $frag =~ s/;+\s*$//;
+                       if ($frag !~ /(?:{|;)/) {
+#print "skip<$line_nr_next>\n";
+                               $suppress_statement = $line_nr_next;
+                       }
+
+                       # Find the real next line.
+                       $realline_next = $line_nr_next;
+                       if (defined $realline_next &&
+                           (!defined $lines[$realline_next - 1] ||
+                            substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
+                               $realline_next++;
+                       }
+
+                       my $s = $stat;
+                       $s =~ s/{.*$//s;
+
+                       # Ignore goto labels.
+                       if ($s =~ /$Ident:\*$/s) {
+
+                       # Ignore functions being called
+                       } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
+
+                       } elsif ($s =~ /^.\s*else\b/s) {
+
+                       # declarations always start with types
+                       } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
+                               my $type = $1;
+                               $type =~ s/\s+/ /g;
+                               possible($type, "A:" . $s);
+
+                       # definitions in global scope can only start with types
+                       } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
+                               possible($1, "B:" . $s);
+                       }
+
+                       # any (foo ... *) is a pointer cast, and foo is a type
+                       while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
+                               possible($1, "C:" . $s);
+                       }
+
+                       # Check for any sort of function declaration.
+                       # int foo(something bar, other baz);
+                       # void (*store_gdt)(x86_descr_ptr *);
+                       if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
+                               my ($name_len) = length($1);
+
+                               my $ctx = $s;
+                               substr($ctx, 0, $name_len + 1, '');
+                               $ctx =~ s/\)[^\)]*$//;
+
+                               for my $arg (split(/\s*,\s*/, $ctx)) {
+                                       if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
+
+                                               possible($1, "D:" . $s);
+                                       }
+                               }
+                       }
+
+               }
+
+#
+# Checks which may be anchored in the context.
+#
+
+# Check for switch () and associated case and default
+# statements should be at the same indent.
+               if ($line=~/\bswitch\s*\(.*\)/) {
+                       my $err = '';
+                       my $sep = '';
+                       my @ctx = ctx_block_outer($linenr, $realcnt);
+                       shift(@ctx);
+                       for my $ctx (@ctx) {
+                               my ($clen, $cindent) = line_stats($ctx);
+                               if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
+                                                       $indent != $cindent) {
+                                       $err .= "$sep$ctx\n";
+                                       $sep = '';
+                               } else {
+                                       $sep = "[...]\n";
+                               }
+                       }
+                       if ($err ne '') {
+                               ERROR("SWITCH_CASE_INDENT_LEVEL",
+                                     "switch and case should be at the same indent\n$hereline$err");
+                       }
+               }
+
+# if/while/etc brace do not go on next line, unless defining a do while loop,
+# or if that brace on the next line is for something else
+               if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
+                       my $pre_ctx = "$1$2";
+
+                       my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
+
+                       if ($nocheck) {
+                       if ($line =~ /^\+\t{6,}/) {
+                               WARN("DEEP_INDENTATION",
+                                    "Too many leading tabs - consider code refactoring\n" . $herecurr);
+                       }
+                       }
+
+                       my $ctx_cnt = $realcnt - $#ctx - 1;
+                       my $ctx = join("\n", @ctx);
+
+                       my $ctx_ln = $linenr;
+                       my $ctx_skip = $realcnt;
+
+                       while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
+                                       defined $lines[$ctx_ln - 1] &&
+                                       $lines[$ctx_ln - 1] =~ /^-/)) {
+                               ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
+                               $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
+                               $ctx_ln++;
+                       }
+
+                       #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
+                       #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
+
+                       if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
+                               ERROR("OPEN_BRACE",
+                                     "that open brace { should be on the previous line\n" .
+                                       "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
+                       }
+                       if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
+                           $ctx =~ /\)\s*\;\s*$/ &&
+                           defined $lines[$ctx_ln - 1])
+                       {
+                               my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
+                               if ($nindent > $indent) {
+                                       WARN("TRAILING_SEMICOLON",
+                                            "trailing semicolon indicates no statements, indent implies otherwise\n" .
+                                               "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
+                               }
+                       }
+               }
+
+# Check relative indent for conditionals and blocks.
+               if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
+                       ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
+                               ctx_statement_block($linenr, $realcnt, 0)
+                                       if (!defined $stat);
+                       my ($s, $c) = ($stat, $cond);
+
+                       substr($s, 0, length($c), '');
+
+                       # Make sure we remove the line prefixes as we have
+                       # none on the first line, and are going to readd them
+                       # where necessary.
+                       $s =~ s/\n./\n/gs;
+
+                       # Find out how long the conditional actually is.
+                       my @newlines = ($c =~ /\n/gs);
+                       my $cond_lines = 1 + $#newlines;
+
+                       # We want to check the first line inside the block
+                       # starting at the end of the conditional, so remove:
+                       #  1) any blank line termination
+                       #  2) any opening brace { on end of the line
+                       #  3) any do (...) {
+                       my $continuation = 0;
+                       my $check = 0;
+                       $s =~ s/^.*\bdo\b//;
+                       $s =~ s/^\s*{//;
+                       if ($s =~ s/^\s*\\//) {
+                               $continuation = 1;
+                       }
+                       if ($s =~ s/^\s*?\n//) {
+                               $check = 1;
+                               $cond_lines++;
+                       }
+
+                       # Also ignore a loop construct at the end of a
+                       # preprocessor statement.
+                       if (($prevline =~ /^.\s*#\s*define\s/ ||
+                           $prevline =~ /\\\s*$/) && $continuation == 0) {
+                               $check = 0;
+                       }
+
+                       my $cond_ptr = -1;
+                       $continuation = 0;
+                       while ($cond_ptr != $cond_lines) {
+                               $cond_ptr = $cond_lines;
+
+                               # If we see an #else/#elif then the code
+                               # is not linear.
+                               if ($s =~ /^\s*\#\s*(?:else|elif)/) {
+                                       $check = 0;
+                               }
+
+                               # Ignore:
+                               #  1) blank lines, they should be at 0,
+                               #  2) preprocessor lines, and
+                               #  3) labels.
+                               if ($continuation ||
+                                   $s =~ /^\s*?\n/ ||
+                                   $s =~ /^\s*#\s*?/ ||
+                                   $s =~ /^\s*$Ident\s*:/) {
+                                       $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
+                                       if ($s =~ s/^.*?\n//) {
+                                               $cond_lines++;
+                                       }
+                               }
+                       }
+
+                       my (undef, $sindent) = line_stats("+" . $s);
+                       my $stat_real = raw_line($linenr, $cond_lines);
+
+                       # Check if either of these lines are modified, else
+                       # this is not this patch's fault.
+                       if (!defined($stat_real) ||
+                           $stat !~ /^\+/ && $stat_real !~ /^\+/) {
+                               $check = 0;
+                       }
+                       if (defined($stat_real) && $cond_lines > 1) {
+                               $stat_real = "[...]\n$stat_real";
+                       }
+
+                       #print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
+
+                       if ($check && (($sindent % 8) != 0 ||
+                           ($sindent <= $indent && $s ne ''))) {
+                               WARN("SUSPECT_CODE_INDENT",
+                                    "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
+                       }
+               }
+
+               # Track the 'values' across context and added lines.
+               my $opline = $line; $opline =~ s/^./ /;
+               my ($curr_values, $curr_vars) =
+                               annotate_values($opline . "\n", $prev_values);
+               $curr_values = $prev_values . $curr_values;
+               if ($dbg_values) {
+                       my $outline = $opline; $outline =~ s/\t/ /g;
+                       print "$linenr > .$outline\n";
+                       print "$linenr > $curr_values\n";
+                       print "$linenr >  $curr_vars\n";
+               }
+               $prev_values = substr($curr_values, -1);
+
+#ignore lines not being added
+               if ($line=~/^[^\+]/) {next;}
+
+# TEST: allow direct testing of the type matcher.
+               if ($dbg_type) {
+                       if ($line =~ /^.\s*$Declare\s*$/) {
+                               ERROR("TEST_TYPE",
+                                     "TEST: is type\n" . $herecurr);
+                       } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
+                               ERROR("TEST_NOT_TYPE",
+                                     "TEST: is not type ($1 is)\n". $herecurr);
+                       }
+                       next;
+               }
+# TEST: allow direct testing of the attribute matcher.
+               if ($dbg_attr) {
+                       if ($line =~ /^.\s*$Modifier\s*$/) {
+                               ERROR("TEST_ATTR",
+                                     "TEST: is attr\n" . $herecurr);
+                       } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
+                               ERROR("TEST_NOT_ATTR",
+                                     "TEST: is not attr ($1 is)\n". $herecurr);
+                       }
+                       next;
+               }
+
+# check for initialisation to aggregates open brace on the next line
+               if ($line =~ /^.\s*{/ &&
+                   $prevline =~ /(?:^|[^=])=\s*$/) {
+                       ERROR("OPEN_BRACE",
+                             "that open brace { should be on the previous line\n" . $hereprev);
+               }
+
+#
+# Checks which are anchored on the added line.
+#
+
+# check for malformed paths in #include statements (uses RAW line)
+               if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
+                       my $path = $1;
+                       if ($path =~ m{//}) {
+                               ERROR("MALFORMED_INCLUDE",
+                                     "malformed #include filename\n" . $herecurr);
+                       }
+                       if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
+                               ERROR("UAPI_INCLUDE",
+                                     "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
+                       }
+               }
+
+# no C99 // comments
+               if ($line =~ m{//}) {
+                       ERROR("C99_COMMENTS",
+                             "do not use C99 // comments\n" . $herecurr);
+               }
+               # Remove C99 comments.
+               $line =~ s@//.*@@;
+               $opline =~ s@//.*@@;
+
+# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
+# the whole statement.
+#print "APW <$lines[$realline_next - 1]>\n";
+               if (defined $realline_next &&
+                   exists $lines[$realline_next - 1] &&
+                   !defined $suppress_export{$realline_next} &&
+                   ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
+                    $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
+                       # Handle definitions which produce identifiers with
+                       # a prefix:
+                       #   XXX(foo);
+                       #   EXPORT_SYMBOL(something_foo);
+                       my $name = $1;
+                       if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
+                           $name =~ /^${Ident}_$2/) {
+#print "FOO C name<$name>\n";
+                               $suppress_export{$realline_next} = 1;
+
+                       } elsif ($stat !~ /(?:
+                               \n.}\s*$|
+                               ^.DEFINE_$Ident\(\Q$name\E\)|
+                               ^.DECLARE_$Ident\(\Q$name\E\)|
+                               ^.LIST_HEAD\(\Q$name\E\)|
+                               ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
+                               \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
+                           )/x) {
+#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
+                               $suppress_export{$realline_next} = 2;
+                       } else {
+                               $suppress_export{$realline_next} = 1;
+                       }
+               }
+               if (!defined $suppress_export{$linenr} &&
+                   $prevline =~ /^.\s*$/ &&
+                   ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
+                    $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
+#print "FOO B <$lines[$linenr - 1]>\n";
+                       $suppress_export{$linenr} = 2;
+               }
+               if (defined $suppress_export{$linenr} &&
+                   $suppress_export{$linenr} == 2) {
+                       WARN("EXPORT_SYMBOL",
+                            "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
+               }
+
+# check for global initialisers.
+               if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
+                       ERROR("GLOBAL_INITIALISERS",
+                             "do not initialise globals to 0 or NULL\n" .
+                               $herecurr);
+               }
+# check for static initialisers.
+               if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
+                       ERROR("INITIALISED_STATIC",
+                             "do not initialise statics to 0 or NULL\n" .
+                               $herecurr);
+               }
+
+# check for static const char * arrays.
+               if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
+                       WARN("STATIC_CONST_CHAR_ARRAY",
+                            "static const char * array should probably be static const char * const\n" .
+                               $herecurr);
+               }
+
+# check for static char foo[] = "bar" declarations.
+               if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
+                       WARN("STATIC_CONST_CHAR_ARRAY",
+                            "static char array declaration should probably be static const char\n" .
+                               $herecurr);
+               }
+
+# check for declarations of struct pci_device_id
+               if ($line =~ /\bstruct\s+pci_device_id\s+\w+\s*\[\s*\]\s*\=\s*\{/) {
+                       WARN("DEFINE_PCI_DEVICE_TABLE",
+                            "Use DEFINE_PCI_DEVICE_TABLE for struct pci_device_id\n" . $herecurr);
+               }
+
+# check for new typedefs, only function parameters and sparse annotations
+# make sense.
+               if ($line =~ /\btypedef\s/ &&
+                   $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
+                   $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
+                   $line !~ /\b$typeTypedefs\b/ &&
+                   $line !~ /\b__bitwise(?:__|)\b/) {
+                       WARN("NEW_TYPEDEFS",
+                            "do not add new typedefs\n" . $herecurr);
+               }
+
+# * goes on variable not on type
+               # (char*[ const])
+               while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
+                       #print "AA<$1>\n";
+                       my ($from, $to) = ($2, $2);
+
+                       # Should start with a space.
+                       $to =~ s/^(\S)/ $1/;
+                       # Should not end with a space.
+                       $to =~ s/\s+$//;
+                       # '*'s should not have spaces between.
+                       while ($to =~ s/\*\s+\*/\*\*/) {
+                       }
+
+                       #print "from<$from> to<$to>\n";
+                       if ($from ne $to) {
+                               ERROR("POINTER_LOCATION",
+                                     "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr);
+                       }
+               }
+               while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
+                       #print "BB<$1>\n";
+                       my ($from, $to, $ident) = ($2, $2, $3);
+
+                       # Should start with a space.
+                       $to =~ s/^(\S)/ $1/;
+                       # Should not end with a space.
+                       $to =~ s/\s+$//;
+                       # '*'s should not have spaces between.
+                       while ($to =~ s/\*\s+\*/\*\*/) {
+                       }
+                       # Modifiers should have spaces.
+                       $to =~ s/(\b$Modifier$)/$1 /;
+
+                       #print "from<$from> to<$to> ident<$ident>\n";
+                       if ($from ne $to && $ident !~ /^$Modifier$/) {
+                               ERROR("POINTER_LOCATION",
+                                     "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr);
+                       }
+               }
+
+# # no BUG() or BUG_ON()
+#              if ($line =~ /\b(BUG|BUG_ON)\b/) {
+#                      print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
+#                      print "$herecurr";
+#                      $clean = 0;
+#              }
+
+               if ($line =~ /\bLINUX_VERSION_CODE\b/) {
+                       WARN("LINUX_VERSION_CODE",
+                            "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
+               }
+
+# check for uses of printk_ratelimit
+               if ($line =~ /\bprintk_ratelimit\s*\(/) {
+                       WARN("PRINTK_RATELIMITED",
+"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
+               }
+
+# printk should use KERN_* levels.  Note that follow on printk's on the
+# same line do not need a level, so we use the current block context
+# to try and find and validate the current printk.  In summary the current
+# printk includes all preceding printk's which have no newline on the end.
+# we assume the first bad printk is the one to report.
+               if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
+                       my $ok = 0;
+                       for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
+                               #print "CHECK<$lines[$ln - 1]\n";
+                               # we have a preceding printk if it ends
+                               # with "\n" ignore it, else it is to blame
+                               if ($lines[$ln - 1] =~ m{\bprintk\(}) {
+                                       if ($rawlines[$ln - 1] !~ m{\\n"}) {
+                                               $ok = 1;
+                                       }
+                                       last;
+                               }
+                       }
+                       if ($ok == 0) {
+                               WARN("PRINTK_WITHOUT_KERN_LEVEL",
+                                    "printk() should include KERN_ facility level\n" . $herecurr);
+                       }
+               }
+
+               if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
+                       my $orig = $1;
+                       my $level = lc($orig);
+                       $level = "warn" if ($level eq "warning");
+                       my $level2 = $level;
+                       $level2 = "dbg" if ($level eq "debug");
+                       WARN("PREFER_PR_LEVEL",
+                            "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
+               }
+
+               if ($line =~ /\bpr_warning\s*\(/) {
+                       WARN("PREFER_PR_LEVEL",
+                            "Prefer pr_warn(... to pr_warning(...\n" . $herecurr);
+               }
+
+               if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
+                       my $orig = $1;
+                       my $level = lc($orig);
+                       $level = "warn" if ($level eq "warning");
+                       $level = "dbg" if ($level eq "debug");
+                       WARN("PREFER_DEV_LEVEL",
+                            "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
+               }
+
+# function brace can't be on same line, except for #defines of do while,
+# or if closed on same line
+               if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
+                   !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
+                       ERROR("OPEN_BRACE",
+                             "open brace '{' following function declarations go on the next line\n" . $herecurr);
+               }
+
+# open braces for enum, union and struct go on the same line.
+               if ($line =~ /^.\s*{/ &&
+                   $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
+                       ERROR("OPEN_BRACE",
+                             "open brace '{' following $1 go on the same line\n" . $hereprev);
+               }
+
+# missing space after union, struct or enum definition
+               if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?(?:\s+$Ident)?[=\{]/) {
+                   WARN("SPACING",
+                        "missing space after $1 definition\n" . $herecurr);
+               }
+
+               if ($nocheck) {
+# check for spacing round square brackets; allowed:
+#  1. with a type on the left -- int [] a;
+#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
+#  3. inside a curly brace -- = { [0...10] = 5 }
+               while ($line =~ /(.*?\s)\[/g) {
+                       my ($where, $prefix) = ($-[1], $1);
+                       if ($prefix !~ /$Type\s+$/ &&
+                           ($where != 0 || $prefix !~ /^.\s+$/) &&
+                           $prefix !~ /[{,]\s+$/) {
+                               ERROR("BRACKET_SPACE",
+                                     "space prohibited before open square bracket '['\n" . $herecurr);
+                       }
+               }
+               }
+
+# check for spaces between functions and their parentheses.
+               while ($line =~ /($Ident)\s+\(/g) {
+                       my $name = $1;
+                       my $ctx_before = substr($line, 0, $-[1]);
+                       my $ctx = "$ctx_before$name";
+
+                       # Ignore those directives where spaces _are_ permitted.
+                       if ($name =~ /^(?:
+                               if|for|while|switch|return|case|
+                               volatile|__volatile__|
+                               __attribute__|format|__extension__|
+                               asm|__asm__)$/x)
+                       {
+
+                       # cpp #define statements have non-optional spaces, ie
+                       # if there is a space between the name and the open
+                       # parenthesis it is simply not a parameter group.
+                       } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
+
+                       # cpp #elif statement condition may start with a (
+                       } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
+
+                       # If this whole things ends with a type its most
+                       # likely a typedef for a function.
+                       } elsif ($ctx =~ /$Type$/) {
+
+                       } else {
+                               WARN("SPACING",
+                                    "space prohibited between function name and open parenthesis '('\n" . $herecurr);
+                       }
+               }
+
+# check for whitespace before a non-naked semicolon
+               if ($line =~ /^\+.*\S\s+;/) {
+                       WARN("SPACING",
+                            "space prohibited before semicolon\n" . $herecurr);
+               }
+
+# Check operator spacing.
+               if (!($line=~/\#\s*include/)) {
+                       my $ops = qr{
+                               <<=|>>=|<=|>=|==|!=|
+                               \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
+                               =>|->|<<|>>|<|>|=|!|~|
+                               &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
+                               \?|:
+                       }x;
+                       my @elements = split(/($ops|;)/, $opline);
+                       my $off = 0;
+
+                       my $blank = copy_spacing($opline);
+
+                       for (my $n = 0; $n < $#elements; $n += 2) {
+                               $off += length($elements[$n]);
+
+                               # Pick up the preceding and succeeding characters.
+                               my $ca = substr($opline, 0, $off);
+                               my $cc = '';
+                               if (length($opline) >= ($off + length($elements[$n + 1]))) {
+                                       $cc = substr($opline, $off + length($elements[$n + 1]));
+                               }
+                               my $cb = "$ca$;$cc";
+
+                               my $a = '';
+                               $a = 'V' if ($elements[$n] ne '');
+                               $a = 'W' if ($elements[$n] =~ /\s$/);
+                               $a = 'C' if ($elements[$n] =~ /$;$/);
+                               $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
+                               $a = 'O' if ($elements[$n] eq '');
+                               $a = 'E' if ($ca =~ /^\s*$/);
+
+                               my $op = $elements[$n + 1];
+
+                               my $c = '';
+                               if (defined $elements[$n + 2]) {
+                                       $c = 'V' if ($elements[$n + 2] ne '');
+                                       $c = 'W' if ($elements[$n + 2] =~ /^\s/);
+                                       $c = 'C' if ($elements[$n + 2] =~ /^$;/);
+                                       $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
+                                       $c = 'O' if ($elements[$n + 2] eq '');
+                                       $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
+                               } else {
+                                       $c = 'E';
+                               }
+
+                               my $ctx = "${a}x${c}";
+
+                               my $at = "(ctx:$ctx)";
+
+                               my $ptr = substr($blank, 0, $off) . "^";
+                               my $hereptr = "$hereline$ptr\n";
+
+                               # Pull out the value of this operator.
+                               my $op_type = substr($curr_values, $off + 1, 1);
+
+                               # Get the full operator variant.
+                               my $opv = $op . substr($curr_vars, $off, 1);
+
+                               # Ignore operators passed as parameters.
+                               if ($op_type ne 'V' &&
+                                   $ca =~ /\s$/ && $cc =~ /^\s*,/) {
+
+#                              # Ignore comments
+#                              } elsif ($op =~ /^$;+$/) {
+
+                               # ; should have either the end of line or a space or \ after it
+                               } elsif ($op eq ';') {
+                                       if ($ctx !~ /.x[WEBC]/ &&
+                                           $cc !~ /^\\/ && $cc !~ /^;/) {
+                                               ERROR("SPACING",
+                                                     "space required after that '$op' $at\n" . $hereptr);
+                                       }
+
+                               # // is a comment
+                               } elsif ($op eq '//') {
+
+                               # No spaces for:
+                               #   ->
+                               #   :   when part of a bitfield
+                               } elsif ($op eq '->' || $opv eq ':B') {
+                                       if ($ctx =~ /Wx.|.xW/) {
+                                               ERROR("SPACING",
+                                                     "spaces prohibited around that '$op' $at\n" . $hereptr);
+                                       }
+
+                               # , must have a space on the right.
+                               } elsif ($op eq ',') {
+                                       if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
+                                               ERROR("SPACING",
+                                                     "space required after that '$op' $at\n" . $hereptr);
+                                       }
+
+                               # '*' as part of a type definition -- reported already.
+                               } elsif ($opv eq '*_') {
+                                       #warn "'*' is part of type\n";
+
+                               # unary operators should have a space before and
+                               # none after.  May be left adjacent to another
+                               # unary operator, or a cast
+                               } elsif ($op eq '!' || $op eq '~' ||
+                                        $opv eq '*U' || $opv eq '-U' ||
+                                        $opv eq '&U' || $opv eq '&&U') {
+                                       if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
+                                               ERROR("SPACING",
+                                                     "space required before that '$op' $at\n" . $hereptr);
+                                       }
+                                       if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
+                                               # A unary '*' may be const
+
+                                       } elsif ($ctx =~ /.xW/) {
+                                               ERROR("SPACING",
+                                                     "space prohibited after that '$op' $at\n" . $hereptr);
+                                       }
+
+                               # unary ++ and unary -- are allowed no space on one side.
+                               } elsif ($op eq '++' or $op eq '--') {
+                                       if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
+                                               ERROR("SPACING",
+                                                     "space required one side of that '$op' $at\n" . $hereptr);
+                                       }
+                                       if ($ctx =~ /Wx[BE]/ ||
+                                           ($ctx =~ /Wx./ && $cc =~ /^;/)) {
+                                               ERROR("SPACING",
+                                                     "space prohibited before that '$op' $at\n" . $hereptr);
+                                       }
+                                       if ($ctx =~ /ExW/) {
+                                               ERROR("SPACING",
+                                                     "space prohibited after that '$op' $at\n" . $hereptr);
+                                       }
+
+
+                               # << and >> may either have or not have spaces both sides
+                               } elsif ($op eq '<<' or $op eq '>>' or
+                                        $op eq '&' or $op eq '^' or $op eq '|' or
+                                        $op eq '+' or $op eq '-' or
+                                        $op eq '*' or $op eq '/' or
+                                        $op eq '%')
+                               {
+                                       if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
+                                               ERROR("SPACING",
+                                                     "need consistent spacing around '$op' $at\n" .
+                                                       $hereptr);
+                                       }
+
+                               # A colon needs no spaces before when it is
+                               # terminating a case value or a label.
+                               } elsif ($opv eq ':C' || $opv eq ':L') {
+                                       if ($ctx =~ /Wx./) {
+                                               ERROR("SPACING",
+                                                     "space prohibited before that '$op' $at\n" . $hereptr);
+                                       }
+
+                               # All the others need spaces both sides.
+                               } elsif ($ctx !~ /[EWC]x[CWE]/) {
+                                       my $ok = 0;
+
+                                       # Ignore email addresses <foo@bar>
+                                       if (($op eq '<' &&
+                                            $cc =~ /^\S+\@\S+>/) ||
+                                           ($op eq '>' &&
+                                            $ca =~ /<\S+\@\S+$/))
+                                       {
+                                               $ok = 1;
+                                       }
+
+                                       # Ignore ?:
+                                       if (($opv eq ':O' && $ca =~ /\?$/) ||
+                                           ($op eq '?' && $cc =~ /^:/)) {
+                                               $ok = 1;
+                                       }
+
+                                       if ($ok == 0) {
+                                               ERROR("SPACING",
+                                                     "spaces required around that '$op' $at\n" . $hereptr);
+                                       }
+                               }
+                               $off += length($elements[$n + 1]);
+                       }
+               }
+
+# check for multiple assignments
+               if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
+                       CHK("MULTIPLE_ASSIGNMENTS",
+                           "multiple assignments should be avoided\n" . $herecurr);
+               }
+
+## # check for multiple declarations, allowing for a function declaration
+## # continuation.
+##             if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
+##                 $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
+##
+##                     # Remove any bracketed sections to ensure we do not
+##                     # falsly report the parameters of functions.
+##                     my $ln = $line;
+##                     while ($ln =~ s/\([^\(\)]*\)//g) {
+##                     }
+##                     if ($ln =~ /,/) {
+##                             WARN("MULTIPLE_DECLARATION",
+##                                  "declaring multiple variables together should be avoided\n" . $herecurr);
+##                     }
+##             }
+
+#need space before brace following if, while, etc
+               if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
+                   $line =~ /do{/) {
+                       ERROR("SPACING",
+                             "space required before the open brace '{'\n" . $herecurr);
+               }
+
+# closing brace should have a space following it when it has anything
+# on the line
+               if ($line =~ /}(?!(?:,|;|\)))\S/) {
+                       ERROR("SPACING",
+                             "space required after that close brace '}'\n" . $herecurr);
+               }
+
+# check spacing on square brackets
+               if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
+                       ERROR("SPACING",
+                             "space prohibited after that open square bracket '['\n" . $herecurr);
+               }
+               if ($line =~ /\s\]/) {
+                       ERROR("SPACING",
+                             "space prohibited before that close square bracket ']'\n" . $herecurr);
+               }
+
+# check spacing on parentheses
+               if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
+                   $line !~ /for\s*\(\s+;/) {
+                       ERROR("SPACING",
+                             "space prohibited after that open parenthesis '('\n" . $herecurr);
+               }
+               if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
+                   $line !~ /for\s*\(.*;\s+\)/ &&
+                   $line !~ /:\s+\)/) {
+                       ERROR("SPACING",
+                             "space prohibited before that close parenthesis ')'\n" . $herecurr);
+               }
+
+#goto labels aren't indented, allow a single space however
+               if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
+                  !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
+                       WARN("INDENTED_LABEL",
+                            "labels should not be indented\n" . $herecurr);
+               }
+
+# Return is not a function.
+               if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
+                       my $spacing = $1;
+                       my $value = $2;
+
+                       # Flatten any parentheses
+                       $value =~ s/\(/ \(/g;
+                       $value =~ s/\)/\) /g;
+                       while ($value =~ s/\[[^\[\]]*\]/1/ ||
+                              $value !~ /(?:$Ident|-?$Constant)\s*
+                                            $Compare\s*
+                                            (?:$Ident|-?$Constant)/x &&
+                              $value =~ s/\([^\(\)]*\)/1/) {
+                       }
+#print "value<$value>\n";
+                       if ($value =~ /^\s*(?:$Ident|-?$Constant)\s*$/) {
+                               ERROR("RETURN_PARENTHESES",
+                                     "return is not a function, parentheses are not required\n" . $herecurr);
+
+                       } elsif ($spacing !~ /\s+/) {
+                               ERROR("SPACING",
+                                     "space required before the open parenthesis '('\n" . $herecurr);
+                       }
+               }
+# Return of what appears to be an errno should normally be -'ve
+               if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
+                       my $name = $1;
+                       if ($name ne 'EOF' && $name ne 'ERROR') {
+                               WARN("USE_NEGATIVE_ERRNO",
+                                    "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
+                       }
+               }
+
+# Need a space before open parenthesis after if, while etc
+               if ($line=~/\b(if|while|for|switch)\(/) {
+                       ERROR("SPACING", "space required before the open parenthesis '('\n" . $herecurr);
+               }
+
+# Check for illegal assignment in if conditional -- and check for trailing
+# statements after the conditional.
+               if ($line =~ /do\s*(?!{)/) {
+                       ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
+                               ctx_statement_block($linenr, $realcnt, 0)
+                                       if (!defined $stat);
+                       my ($stat_next) = ctx_statement_block($line_nr_next,
+                                               $remain_next, $off_next);
+                       $stat_next =~ s/\n./\n /g;
+                       ##print "stat<$stat> stat_next<$stat_next>\n";
+
+                       if ($stat_next =~ /^\s*while\b/) {
+                               # If the statement carries leading newlines,
+                               # then count those as offsets.
+                               my ($whitespace) =
+                                       ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
+                               my $offset =
+                                       statement_rawlines($whitespace) - 1;
+
+                               $suppress_whiletrailers{$line_nr_next +
+                                                               $offset} = 1;
+                       }
+               }
+               if (!defined $suppress_whiletrailers{$linenr} &&
+                   $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
+                       my ($s, $c) = ($stat, $cond);
+
+                       if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
+                               ERROR("ASSIGN_IN_IF",
+                                     "do not use assignment in if condition\n" . $herecurr);
+                       }
+
+                       if ($nocheck) {
+                       # Find out what is on the end of the line after the
+                       # conditional.
+                       substr($s, 0, length($c), '');
+                       $s =~ s/\n.*//g;
+                       $s =~ s/$;//g;  # Remove any comments
+                       if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
+                           $c !~ /}\s*while\s*/)
+                       {
+                               # Find out how long the conditional actually is.
+                               my @newlines = ($c =~ /\n/gs);
+                               my $cond_lines = 1 + $#newlines;
+                               my $stat_real = '';
+
+                               $stat_real = raw_line($linenr, $cond_lines)
+                                                       . "\n" if ($cond_lines);
+                               if (defined($stat_real) && $cond_lines > 1) {
+                                       $stat_real = "[...]\n$stat_real";
+                               }
+
+                               ERROR("TRAILING_STATEMENTS",
+                                     "trailing statements should be on next line\n" . $herecurr . $stat_real);
+                       }
+                       }
+               }
+
+# Check for bitwise tests written as boolean
+               if ($line =~ /
+                       (?:
+                               (?:\[|\(|\&\&|\|\|)
+                               \s*0[xX][0-9]+\s*
+                               (?:\&\&|\|\|)
+                       |
+                               (?:\&\&|\|\|)
+                               \s*0[xX][0-9]+\s*
+                               (?:\&\&|\|\||\)|\])
+                       )/x)
+               {
+                       WARN("HEXADECIMAL_BOOLEAN_TEST",
+                            "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
+               }
+
+# if and else should not have general statements after it
+               if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
+                       my $s = $1;
+                       $s =~ s/$;//g;  # Remove any comments
+                       if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
+                               ERROR("TRAILING_STATEMENTS",
+                                     "trailing statements should be on next line\n" . $herecurr);
+                       }
+               }
+# if should not continue a brace
+               if ($line =~ /}\s*if\b/) {
+                       ERROR("TRAILING_STATEMENTS",
+                             "trailing statements should be on next line\n" .
+                               $herecurr);
+               }
+# case and default should not have general statements after them
+               if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
+                   $line !~ /\G(?:
+                       (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
+                       \s*return\s+
+                   )/xg)
+               {
+                       ERROR("TRAILING_STATEMENTS",
+                             "trailing statements should be on next line\n" . $herecurr);
+               }
+
+               # Check for }<nl>else {, these must be at the same
+               # indent level to be relevant to each other.
+               if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
+                                               $previndent == $indent) {
+                       ERROR("ELSE_AFTER_BRACE",
+                             "else should follow close brace '}'\n" . $hereprev);
+               }
+
+               if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
+                                               $previndent == $indent) {
+                       my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
+
+                       # Find out what is on the end of the line after the
+                       # conditional.
+                       substr($s, 0, length($c), '');
+                       $s =~ s/\n.*//g;
+
+                       if ($s =~ /^\s*;/) {
+                               ERROR("WHILE_AFTER_BRACE",
+                                     "while should follow close brace '}'\n" . $hereprev);
+                       }
+               }
+
+               if ($nocheck) {
+#CamelCase
+               while ($line =~ m{($Constant|$Lval)}g) {
+                       my $var = $1;
+                       if ($var !~ /$Constant/ &&
+                           $var =~ /[A-Z]\w*[a-z]|[a-z]\w*[A-Z]/ &&
+                           $var !~ /"^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
+                           !defined $camelcase{$var}) {
+                               $camelcase{$var} = 1;
+                               WARN("CAMELCASE",
+                                    "Avoid CamelCase: <$var>\n" . $herecurr);
+                       }
+               }
+               }
+
+#no spaces allowed after \ in define
+               if ($line=~/\#\s*define.*\\\s$/) {
+                       WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
+                            "Whitepspace after \\ makes next lines useless\n" . $herecurr);
+               }
+
+#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
+               if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
+                       my $file = "$1.h";
+                       my $checkfile = "include/linux/$file";
+                       if (-f "$root/$checkfile" &&
+                           $realfile ne $checkfile &&
+                           $1 !~ /$allowed_asm_includes/)
+                       {
+                               if ($realfile =~ m{^arch/}) {
+                                       CHK("ARCH_INCLUDE_LINUX",
+                                           "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
+                               } else {
+                                       WARN("INCLUDE_LINUX",
+                                            "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
+                               }
+                       }
+               }
+
+# multi-statement macros should be enclosed in a do while loop, grab the
+# first statement and ensure its the whole macro if its not enclosed
+# in a known good container
+               if ($realfile !~ m@/vmlinux.lds.h$@ &&
+                   $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
+                       my $ln = $linenr;
+                       my $cnt = $realcnt;
+                       my ($off, $dstat, $dcond, $rest);
+                       my $ctx = '';
+                       ($dstat, $dcond, $ln, $cnt, $off) =
+                               ctx_statement_block($linenr, $realcnt, 0);
+                       $ctx = $dstat;
+                       #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
+                       #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
+
+                       $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
+                       $dstat =~ s/$;//g;
+                       $dstat =~ s/\\\n.//g;
+                       $dstat =~ s/^\s*//s;
+                       $dstat =~ s/\s*$//s;
+
+                       # Flatten any parentheses and braces
+                       while ($dstat =~ s/\([^\(\)]*\)/1/ ||
+                              $dstat =~ s/\{[^\{\}]*\}/1/ ||
+                              $dstat =~ s/\[[^\[\]]*\]/1/)
+                       {
+                       }
+
+                       # Flatten any obvious string concatentation.
+                       while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
+                              $dstat =~ s/$Ident\s*("X*")/$1/)
+                       {
+                       }
+
+                       my $exceptions = qr{
+                               $Declare|
+                               module_param_named|
+                               MODULE_PARM_DESC|
+                               DECLARE_PER_CPU|
+                               DEFINE_PER_CPU|
+                               __typeof__\(|
+                               union|
+                               struct|
+                               \.$Ident\s*=\s*|
+                               ^\"|\"$
+                       }x;
+                       #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
+                       if ($dstat ne '' &&
+                           $dstat !~ /^(?:$Ident|-?$Constant),$/ &&                    # 10, // foo(),
+                           $dstat !~ /^(?:$Ident|-?$Constant);$/ &&                    # foo();
+                           $dstat !~ /^[!~-]?(?:$Ident|$Constant)$/ &&         # 10 // foo() // !foo // ~foo // -foo
+                           $dstat !~ /^'X'$/ &&                                        # character constants
+                           $dstat !~ /$exceptions/ &&
+                           $dstat !~ /^\.$Ident\s*=/ &&                                # .foo =
+                           $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&          # stringification #foo
+                           $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&       # do {...} while (...); // do {...} while (...)
+                           $dstat !~ /^for\s*$Constant$/ &&                            # for (...)
+                           $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&   # for (...) bar()
+                           $dstat !~ /^do\s*{/ &&                                      # do {...
+                           $dstat !~ /^\({/)                                           # ({...
+                       {
+                               $ctx =~ s/\n*$//;
+                               my $herectx = $here . "\n";
+                               my $cnt = statement_rawlines($ctx);
+
+                               for (my $n = 0; $n < $cnt; $n++) {
+                                       $herectx .= raw_line($linenr, $n) . "\n";
+                               }
+
+                               if ($dstat =~ /;/) {
+                                       ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
+                                             "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
+                               } else {
+                                       if ($nocheck) {
+                                       ERROR("COMPLEX_MACRO",
+                                             "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
+                                       }
+                               }
+                       }
+
+# check for line continuations outside of #defines, preprocessor #, and asm
+
+               } else {
+                       if ($prevline !~ /^..*\\$/ &&
+                           $line !~ /^\+\s*\#.*\\$/ &&         # preprocessor
+                           $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&   # asm
+                           $line =~ /^\+.*\\$/) {
+                               WARN("LINE_CONTINUATIONS",
+                                    "Avoid unnecessary line continuations\n" . $herecurr);
+                       }
+               }
+
+# do {} while (0) macro tests:
+# single-statement macros do not need to be enclosed in do while (0) loop,
+# macro should not end with a semicolon
+               if ($^V && $^V ge 5.10.0 &&
+                   $realfile !~ m@/vmlinux.lds.h$@ &&
+                   $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
+                       my $ln = $linenr;
+                       my $cnt = $realcnt;
+                       my ($off, $dstat, $dcond, $rest);
+                       my $ctx = '';
+                       ($dstat, $dcond, $ln, $cnt, $off) =
+                               ctx_statement_block($linenr, $realcnt, 0);
+                       $ctx = $dstat;
+
+                       $dstat =~ s/\\\n.//g;
+
+                       if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
+                               my $stmts = $2;
+                               my $semis = $3;
+
+                               $ctx =~ s/\n*$//;
+                               my $cnt = statement_rawlines($ctx);
+                               my $herectx = $here . "\n";
+
+                               for (my $n = 0; $n < $cnt; $n++) {
+                                       $herectx .= raw_line($linenr, $n) . "\n";
+                               }
+
+                               if (($stmts =~ tr/;/;/) == 1 &&
+                                   $stmts !~ /^\s*(if|while|for|switch)\b/) {
+                                       WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
+                                            "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
+                               }
+                               if (defined $semis && $semis ne "") {
+                                       WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
+                                            "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
+                               }
+                       }
+               }
+
+# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
+# all assignments may have only one of the following with an assignment:
+#      .
+#      ALIGN(...)
+#      VMLINUX_SYMBOL(...)
+               if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
+                       WARN("MISSING_VMLINUX_SYMBOL",
+                            "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
+               }
+
+# check for redundant bracing round if etc
+               if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
+                       my ($level, $endln, @chunks) =
+                               ctx_statement_full($linenr, $realcnt, 1);
+                       #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
+                       #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
+                       if ($#chunks > 0 && $level == 0) {
+                               my @allowed = ();
+                               my $allow = 0;
+                               my $seen = 0;
+                               my $herectx = $here . "\n";
+                               my $ln = $linenr - 1;
+                               for my $chunk (@chunks) {
+                                       my ($cond, $block) = @{$chunk};
+
+                                       # If the condition carries leading newlines, then count those as offsets.
+                                       my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
+                                       my $offset = statement_rawlines($whitespace) - 1;
+
+                                       $allowed[$allow] = 0;
+                                       #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
+
+                                       # We have looked at and allowed this specific line.
+                                       $suppress_ifbraces{$ln + $offset} = 1;
+
+                                       $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
+                                       $ln += statement_rawlines($block) - 1;
+
+                                       substr($block, 0, length($cond), '');
+
+                                       $seen++ if ($block =~ /^\s*{/);
+
+                                       #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
+                                       if (statement_lines($cond) > 1) {
+                                               #print "APW: ALLOWED: cond<$cond>\n";
+                                               $allowed[$allow] = 1;
+                                       }
+                                       if ($block =~/\b(?:if|for|while)\b/) {
+                                               #print "APW: ALLOWED: block<$block>\n";
+                                               $allowed[$allow] = 1;
+                                       }
+                                       if (statement_block_size($block) > 1) {
+                                               #print "APW: ALLOWED: lines block<$block>\n";
+                                               $allowed[$allow] = 1;
+                                       }
+                                       $allow++;
+                               }
+                               if ($seen) {
+                                       my $sum_allowed = 0;
+                                       foreach (@allowed) {
+                                               $sum_allowed += $_;
+                                       }
+                                       if ($sum_allowed == 0) {
+                                               if ($nocheck) {
+                                               WARN("BRACES",
+                                                    "braces {} are not necessary for any arm of this statement\n" . $herectx);
+                                               }
+                                       } elsif ($sum_allowed != $allow &&
+                                                $seen != $allow) {
+                                               CHK("BRACES",
+                                                   "braces {} should be used on all arms of this statement\n" . $herectx);
+                                       }
+                               }
+                       }
+               }
+               if ($nocheck) {
+               if (!defined $suppress_ifbraces{$linenr - 1} &&
+                                       $line =~ /\b(if|while|for|else)\b/) {
+                       my $allowed = 0;
+
+                       # Check the pre-context.
+                       if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
+                               #print "APW: ALLOWED: pre<$1>\n";
+                               $allowed = 1;
+                       }
+
+                       my ($level, $endln, @chunks) =
+                               ctx_statement_full($linenr, $realcnt, $-[0]);
+
+                       # Check the condition.
+                       my ($cond, $block) = @{$chunks[0]};
+                       #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
+                       if (defined $cond) {
+                               substr($block, 0, length($cond), '');
+                       }
+                       if (statement_lines($cond) > 1) {
+                               #print "APW: ALLOWED: cond<$cond>\n";
+                               $allowed = 1;
+                       }
+                       if ($block =~/\b(?:if|for|while)\b/) {
+                               #print "APW: ALLOWED: block<$block>\n";
+                               $allowed = 1;
+                       }
+                       if (statement_block_size($block) > 1) {
+                               #print "APW: ALLOWED: lines block<$block>\n";
+                               $allowed = 1;
+                       }
+                       # Check the post-context.
+                       if (defined $chunks[1]) {
+                               my ($cond, $block) = @{$chunks[1]};
+                               if (defined $cond) {
+                                       substr($block, 0, length($cond), '');
+                               }
+                               if ($block =~ /^\s*\{/) {
+                                       #print "APW: ALLOWED: chunk-1 block<$block>\n";
+                                       $allowed = 1;
+                               }
+                       }
+                       if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
+                               my $herectx = $here . "\n";
+                               my $cnt = statement_rawlines($block);
+
+                               for (my $n = 0; $n < $cnt; $n++) {
+                                       $herectx .= raw_line($linenr, $n) . "\n";
+                               }
+
+                               WARN("BRACES",
+                                    "braces {} are not necessary for single statement blocks\n" . $herectx);
+                       }
+               }
+               }
+
+# check for unnecessary blank lines around braces
+               if (($line =~ /^.\s*}\s*$/ && $prevline =~ /^.\s*$/)) {
+                       CHK("BRACES",
+                           "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
+               }
+               if (($line =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
+                       CHK("BRACES",
+                           "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
+               }
+
+# no volatiles please
+               my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
+               if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
+                       WARN("VOLATILE",
+                            "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
+               }
+
+# warn about #if 0
+               if ($line =~ /^.\s*\#\s*if\s+0\b/) {
+                       CHK("REDUNDANT_CODE",
+                           "if this code is redundant consider removing it\n" .
+                               $herecurr);
+               }
+
+# check for needless "if (<foo>) fn(<foo>)" uses
+               if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
+                       my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
+                       if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
+                               WARN('NEEDLESS_IF',
+                                    "$1(NULL) is safe this check is probably not required\n" . $hereprev);
+                       }
+               }
+
+# prefer usleep_range over udelay
+               if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
+                       # ignore udelay's < 10, however
+                       if (! ($1 < 10) ) {
+                               CHK("USLEEP_RANGE",
+                                   "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line);
+                       }
+               }
+
+# warn about unexpectedly long msleep's
+               if ($line =~ /\bmsleep\s*\((\d+)\);/) {
+                       if ($1 < 20) {
+                               WARN("MSLEEP",
+                                    "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line);
+                       }
+               }
+
+# warn about #ifdefs in C files
+#              if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
+#                      print "#ifdef in C files should be avoided\n";
+#                      print "$herecurr";
+#                      $clean = 0;
+#              }
+
+# warn about spacing in #ifdefs
+               if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
+                       ERROR("SPACING",
+                             "exactly one space required after that #$1\n" . $herecurr);
+               }
+
+# check for spinlock_t definitions without a comment.
+               if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
+                   $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
+                       my $which = $1;
+                       if (!ctx_has_comment($first_line, $linenr)) {
+                               CHK("UNCOMMENTED_DEFINITION",
+                                   "$1 definition without comment\n" . $herecurr);
+                       }
+               }
+# check for memory barriers without a comment.
+               if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
+                       if (!ctx_has_comment($first_line, $linenr)) {
+                               CHK("MEMORY_BARRIER",
+                                   "memory barrier without comment\n" . $herecurr);
+                       }
+               }
+# check of hardware specific defines
+               if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
+                       CHK("ARCH_DEFINES",
+                           "architecture specific defines should be avoided\n" .  $herecurr);
+               }
+
+# Check that the storage class is at the beginning of a declaration
+               if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
+                       WARN("STORAGE_CLASS",
+                            "storage class should be at the beginning of the declaration\n" . $herecurr)
+               }
+
+# check the location of the inline attribute, that it is between
+# storage class and type.
+               if ($line =~ /\b$Type\s+$Inline\b/ ||
+                   $line =~ /\b$Inline\s+$Storage\b/) {
+                       ERROR("INLINE_LOCATION",
+                             "inline keyword should sit between storage class and type\n" . $herecurr);
+               }
+
+# Check for __inline__ and __inline, prefer inline
+               if ($line =~ /\b(__inline__|__inline)\b/) {
+                       WARN("INLINE",
+                            "plain inline is preferred over $1\n" . $herecurr);
+               }
+
+# Check for __attribute__ packed, prefer __packed
+               if ($line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
+                       WARN("PREFER_PACKED",
+                            "__packed is preferred over __attribute__((packed))\n" . $herecurr);
+               }
+
+# Check for __attribute__ aligned, prefer __aligned
+               if ($line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
+                       WARN("PREFER_ALIGNED",
+                            "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
+               }
+
+# Check for __attribute__ format(printf, prefer __printf
+               if ($line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
+                       WARN("PREFER_PRINTF",
+                            "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr);
+               }
+
+# Check for __attribute__ format(scanf, prefer __scanf
+               if ($line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
+                       WARN("PREFER_SCANF",
+                            "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr);
+               }
+
+# check for sizeof(&)
+               if ($line =~ /\bsizeof\s*\(\s*\&/) {
+                       WARN("SIZEOF_ADDRESS",
+                            "sizeof(& should be avoided\n" . $herecurr);
+               }
+
+# check for sizeof without parenthesis
+               if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
+                       WARN("SIZEOF_PARENTHESIS",
+                            "sizeof $1 should be sizeof($1)\n" . $herecurr);
+               }
+
+# check for line continuations in quoted strings with odd counts of "
+               if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
+                       WARN("LINE_CONTINUATIONS",
+                            "Avoid line continuations in quoted strings\n" . $herecurr);
+               }
+
+# check for struct spinlock declarations
+               if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
+                       WARN("USE_SPINLOCK_T",
+                            "struct spinlock should be spinlock_t\n" . $herecurr);
+               }
+
+# check for seq_printf uses that could be seq_puts
+               if ($line =~ /\bseq_printf\s*\(/) {
+                       my $fmt = get_quoted_string($line, $rawline);
+                       if ($fmt !~ /[^\\]\%/) {
+                               WARN("PREFER_SEQ_PUTS",
+                                    "Prefer seq_puts to seq_printf\n" . $herecurr);
+                       }
+               }
+
+# Check for misused memsets
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
+
+                       my $ms_addr = $2;
+                       my $ms_val = $7;
+                       my $ms_size = $12;
+
+                       if ($ms_size =~ /^(0x|)0$/i) {
+                               ERROR("MEMSET",
+                                     "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
+                       } elsif ($ms_size =~ /^(0x|)1$/i) {
+                               WARN("MEMSET",
+                                    "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
+                       }
+               }
+
+# typecasts on min/max could be min_t/max_t
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
+                       if (defined $2 || defined $7) {
+                               my $call = $1;
+                               my $cast1 = deparenthesize($2);
+                               my $arg1 = $3;
+                               my $cast2 = deparenthesize($7);
+                               my $arg2 = $8;
+                               my $cast;
+
+                               if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
+                                       $cast = "$cast1 or $cast2";
+                               } elsif ($cast1 ne "") {
+                                       $cast = $cast1;
+                               } else {
+                                       $cast = $cast2;
+                               }
+                               WARN("MINMAX",
+                                    "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
+                       }
+               }
+
+# check usleep_range arguments
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
+                       my $min = $1;
+                       my $max = $7;
+                       if ($min eq $max) {
+                               WARN("USLEEP_RANGE",
+                                    "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
+                       } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
+                                $min > $max) {
+                               WARN("USLEEP_RANGE",
+                                    "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
+                       }
+               }
+
+# check for new externs in .c files.
+               if ($realfile =~ /\.c$/ && defined $stat &&
+                   $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
+               {
+                       my $function_name = $1;
+                       my $paren_space = $2;
+
+                       my $s = $stat;
+                       if (defined $cond) {
+                               substr($s, 0, length($cond), '');
+                       }
+                       if ($s =~ /^\s*;/ &&
+                           $function_name ne 'uninitialized_var')
+                       {
+                               WARN("AVOID_EXTERNS",
+                                    "externs should be avoided in .c files\n" .  $herecurr);
+                       }
+
+                       if ($paren_space =~ /\n/) {
+                               WARN("FUNCTION_ARGUMENTS",
+                                    "arguments for function declarations should follow identifier\n" . $herecurr);
+                       }
+
+               } elsif ($realfile =~ /\.c$/ && defined $stat &&
+                   $stat =~ /^.\s*extern\s+/)
+               {
+                       WARN("AVOID_EXTERNS",
+                            "externs should be avoided in .c files\n" .  $herecurr);
+               }
+
+# checks for new __setup's
+               if ($rawline =~ /\b__setup\("([^"]*)"/) {
+                       my $name = $1;
+
+                       if (!grep(/$name/, @setup_docs)) {
+                               CHK("UNDOCUMENTED_SETUP",
+                                   "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
+                       }
+               }
+
+# check for pointless casting of kmalloc return
+               if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
+                       WARN("UNNECESSARY_CASTS",
+                            "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
+               }
+
+# check for krealloc arg reuse
+               if ($^V && $^V ge 5.10.0 &&
+                   $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
+                       WARN("KREALLOC_ARG_REUSE",
+                            "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
+               }
+
+# check for alloc argument mismatch
+               if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
+                       WARN("ALLOC_ARRAY_ARGS",
+                            "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
+               }
+
+# check for multiple semicolons
+               if ($line =~ /;\s*;\s*$/) {
+                       WARN("ONE_SEMICOLON",
+                            "Statements terminations use 1 semicolon\n" . $herecurr);
+               }
+
+# check for switch/default statements without a break;
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
+                       my $ctx = '';
+                       my $herectx = $here . "\n";
+                       my $cnt = statement_rawlines($stat);
+                       for (my $n = 0; $n < $cnt; $n++) {
+                               $herectx .= raw_line($linenr, $n) . "\n";
+                       }
+                       WARN("DEFAULT_NO_BREAK",
+                            "switch default: should use break\n" . $herectx);
+               }
+
+# check for gcc specific __FUNCTION__
+               if ($line =~ /__FUNCTION__/) {
+                       WARN("USE_FUNC",
+                            "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr);
+               }
+
+# check for use of yield()
+               if ($line =~ /\byield\s*\(\s*\)/) {
+                       WARN("YIELD",
+                            "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
+               }
+
+# check for semaphores initialized locked
+               if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
+                       WARN("CONSIDER_COMPLETION",
+                            "consider using a completion\n" . $herecurr);
+               }
+
+# recommend kstrto* over simple_strto* and strict_strto*
+               if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
+                       WARN("CONSIDER_KSTRTO",
+                            "$1 is obsolete, use k$3 instead\n" . $herecurr);
+               }
+
+# check for __initcall(), use device_initcall() explicitly please
+               if ($line =~ /^.\s*__initcall\s*\(/) {
+                       WARN("USE_DEVICE_INITCALL",
+                            "please use device_initcall() instead of __initcall()\n" . $herecurr);
+               }
+
+# check for various ops structs, ensure they are const.
+               my $struct_ops = qr{acpi_dock_ops|
+                               address_space_operations|
+                               backlight_ops|
+                               block_device_operations|
+                               dentry_operations|
+                               dev_pm_ops|
+                               dma_map_ops|
+                               extent_io_ops|
+                               file_lock_operations|
+                               file_operations|
+                               hv_ops|
+                               ide_dma_ops|
+                               intel_dvo_dev_ops|
+                               item_operations|
+                               iwl_ops|
+                               kgdb_arch|
+                               kgdb_io|
+                               kset_uevent_ops|
+                               lock_manager_operations|
+                               microcode_ops|
+                               mtrr_ops|
+                               neigh_ops|
+                               nlmsvc_binding|
+                               pci_raw_ops|
+                               pipe_buf_operations|
+                               platform_hibernation_ops|
+                               platform_suspend_ops|
+                               proto_ops|
+                               rpc_pipe_ops|
+                               seq_operations|
+                               snd_ac97_build_ops|
+                               soc_pcmcia_socket_ops|
+                               stacktrace_ops|
+                               sysfs_ops|
+                               tty_operations|
+                               usb_mon_operations|
+                               wd_ops}x;
+               if ($line !~ /\bconst\b/ &&
+                   $line =~ /\bstruct\s+($struct_ops)\b/) {
+                       WARN("CONST_STRUCT",
+                            "struct $1 should normally be const\n" .
+                               $herecurr);
+               }
+
+# use of NR_CPUS is usually wrong
+# ignore definitions of NR_CPUS and usage to define arrays as likely right
+               if ($line =~ /\bNR_CPUS\b/ &&
+                   $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
+                   $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
+                   $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
+                   $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
+                   $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
+               {
+                       WARN("NR_CPUS",
+                            "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
+               }
+
+# check for %L{u,d,i} in strings
+               my $string;
+               while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
+                       $string = substr($rawline, $-[1], $+[1] - $-[1]);
+                       $string =~ s/%%/__/g;
+                       if ($string =~ /(?<!%)%L[udi]/) {
+                               WARN("PRINTF_L",
+                                    "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
+                               last;
+                       }
+               }
+
+# whine mightly about in_atomic
+               if ($line =~ /\bin_atomic\s*\(/) {
+                       if ($realfile =~ m@^drivers/@) {
+                               ERROR("IN_ATOMIC",
+                                     "do not use in_atomic in drivers\n" . $herecurr);
+                       } elsif ($realfile !~ m@^kernel/@) {
+                               WARN("IN_ATOMIC",
+                                    "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
+                       }
+               }
+
+# check for lockdep_set_novalidate_class
+               if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
+                   $line =~ /__lockdep_no_validate__\s*\)/ ) {
+                       if ($realfile !~ m@^kernel/lockdep@ &&
+                           $realfile !~ m@^include/linux/lockdep@ &&
+                           $realfile !~ m@^drivers/base/core@) {
+                               ERROR("LOCKDEP",
+                                     "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
+                       }
+               }
+
+               if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
+                   $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
+                       WARN("EXPORTED_WORLD_WRITABLE",
+                            "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
+               }
+       }
+
+       # If we have no input at all, then there is nothing to report on
+       # so just keep quiet.
+       if ($#rawlines == -1) {
+               exit(0);
+       }
+
+       # In mailback mode only produce a report in the negative, for
+       # things that appear to be patches.
+       if ($mailback && ($clean == 1 || !$is_patch)) {
+               exit(0);
+       }
+
+       # This is not a patch, and we are are in 'no-patch' mode so
+       # just keep quiet.
+       if (!$chk_patch && !$is_patch) {
+               exit(0);
+       }
+
+#      if (!$is_patch) {
+#              ERROR("NOT_UNIFIED_DIFF",
+#                    "Does not appear to be a unified-diff format patch\n");
+#      }
+       if ($is_patch && $chk_signoff && $signoff == 0) {
+               ERROR("MISSING_SIGN_OFF",
+                     "Missing Signed-off-by: line(s)\n");
+       }
+
+       print report_dump();
+       if ($summary && !($clean == 1 && $quiet == 1)) {
+               print "$filename " if ($summary_file);
+               print "total: $cnt_error errors, $cnt_warn warnings, " .
+                       (($check)? "$cnt_chk checks, " : "") .
+                       "$cnt_lines lines checked\n";
+               print "\n" if ($quiet == 0);
+       }
+
+       if ($quiet == 0) {
+
+               if ($^V lt 5.10.0) {
+                       print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
+                       print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
+               }
+
+               # If there were whitespace errors which cleanpatch can fix
+               # then suggest that.
+               if ($rpt_cleaners) {
+                       print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
+                       print "      scripts/cleanfile\n\n";
+                       $rpt_cleaners = 0;
+               }
+       }
+
+       if ($quiet == 0 && keys %ignore_type) {
+           print "NOTE: Ignored message types:";
+           foreach my $ignore (sort keys %ignore_type) {
+               print " $ignore";
+           }
+           print "\n\n";
+       }
+
+       if ($clean == 1 && $quiet == 0) {
+               print "$vname has no obvious style problems and is ready for submission.\n"
+       }
+       if ($clean == 0 && $quiet == 0) {
+               print << "EOM";
+$vname has style problems, please review.
+
+If any of these errors are false positives, please report
+them to the maintainer, see CHECKPATCH in MAINTAINERS.
+EOM
+       }
+
+       return $clean;
+}
index bad628a..a40a2ab 100644 (file)
@@ -313,7 +313,7 @@ systemctl daemon-reload
 
 %files -n deviced
 %manifest %{name}.manifest
-%license LICENSE.Apache-2.0
+%license LICENSE
 %config %{_sysconfdir}/dbus-1/system.d/deviced.conf
 %{_bindir}/deviced-pre.sh
 %{_bindir}/deviced
diff --git a/src/bs/bs.c b/src/bs/bs.c
deleted file mode 100644 (file)
index 590ba11..0000000
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * deviced
- *
- * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <sys/types.h>
-#include <grp.h>
-#include <dirent.h>
-#include <Ecore_File.h>
-#include "core/log.h"
-#include "core/launch.h"
-#include "core/devices.h"
-#include <tzplatform_config.h>
-
-#define PREDEF_DUMP_LOG         "dump_log"
-#define PREDEF_DELETE_DUMP      "delete_dump"
-
-#define CRASH_WORKER_MAX       3
-#define CRASH_PID_MAX 7
-#define CRASH_MODE_MAX 2
-#define CRASH_TIME_MAX 65
-#define CRASH_POPUP_ON 1
-#define CRASH_POPUP_OFF        0
-#define CRASH_CHECK_SIZE (512 * 1024)
-#define CRASH_CHECK_DISK_PATH   "/opt/usr"
-#define CRASH_LIMIT_NUM 5
-#define CRASH_ARG_NUM 6
-#define CRASH_DELIMITER "|"
-#define CRASH_VERIFY_MAX 5
-#define CRASH_PROCESSNAME_MAX NAME_MAX
-#define CRASH_EXEPATH_MAX NAME_MAX
-#define CRASH_ARG_MAX (CRASH_PROCESSNAME_MAX + CRASH_EXEPATH_MAX + CRASH_TIME_MAX + CRASH_PID_MAX + CRASH_MODE_MAX + CRASH_VERIFY_MAX)
-#define CRASH_NOTI_DIR         tzplatform_mkpath(TZ_SYS_SHARE, "crash")
-#define CRASH_NOTI_FILE                "curbs.log"
-#define CRASH_NOTI_PATH tzplatform_mkpath(TZ_SYS_SHARE, "crash/"CRASH_NOTI_FILE)
-#define CRASH_COREDUMP_PATH            tzplatform_mkpath(TZ_USER_SHARE, "crash/core")
-#define CRASH_DUMP_PATH                tzplatform_mkpath(TZ_USER_SHARE, "crash/dump")
-#define CRASH_INFO_PATH                tzplatform_mkpath(TZ_SYS_SHARE, "crash/info")
-#define CRASH_WORKER_PATH      "/usr/bin/crash-worker"
-#define CRASH_POPUP_PATH       tzplatform_mkpath(TZ_SYS_RO_APP, \
-               "org.tizen.crash-popup/bin/crash-popup")
-
-static int noti_fd;
-static int add_noti(void);
-struct crash_arg
-{
-       char crash_mode[CRASH_MODE_MAX];
-       char crash_processname[CRASH_PROCESSNAME_MAX];
-       char crash_timestr[CRASH_TIME_MAX];
-       char crash_pid[CRASH_PID_MAX];
-       char crash_exepath[CRASH_EXEPATH_MAX];
-       char crash_verify[CRASH_VERIFY_MAX];
-};
-
-static int is_running_process(pid_t pid)
-{
-       char buf[PATH_MAX + 1];
-       snprintf(buf, sizeof(buf), "/proc/%d", pid);
-       if (!access(buf, R_OK))
-               return 1;
-       return 0;
-}
-static int make_noti_file(const char *path, const char *file)
-{
-       int fd;
-       char buf[PATH_MAX];
-       gid_t group_id;
-       struct group *group_entry;
-       mode_t old_mask;
-
-       snprintf(buf, sizeof(buf), "%s/%s", path, file);        /* buf - full path to file */
-       if (access(buf, F_OK) == 0)                             /* if file exists then return -1 */
-               return -1;
-
-       /* save old mask and set new calling process's file mode creation mask */
-       old_mask = umask(0);
-
-       mkdir(path, 0775);              /* make directory, if exest then errno==EEXIST */
-       group_entry = getgrnam("crash");                /* need to find out group ID of "crash" group name */
-       if (group_entry == NULL) {
-               umask(old_mask);        /* restore old file mask */
-               return -1;
-       }
-       chown(path, 0, group_entry->gr_gid);                    /* chown root:crash */
-       if ((fd = open(buf, O_CREAT, 0666)) < 0) {      /* create crash file */
-               umask(old_mask);                        /* restore old file mask */
-               return -1;
-       }
-       fchown(fd, 0, group_entry->gr_gid);     /* chown root:crash */
-       close(fd);
-       umask(old_mask);                /* restore old file mask */
-
-       return 0;
-}
-static int make_coredump_dir(void)
-{
-       mode_t old_mask;
-       gid_t group_id;
-       struct group *group_entry;
-
-       if (access(CRASH_COREDUMP_PATH, F_OK) == 0)                             /* if file exists then return -1 */
-               return -1;
-
-       /* save old mask and set new calling process's file mode creation mask */
-       old_mask = umask(0);
-
-       mkdir(CRASH_COREDUMP_PATH, 0775);               /* make directory, if exest then errno==EEXIST */
-       group_entry = getgrnam("crash");                /* need to find out group ID of "crash" group name*/
-       if (group_entry == NULL) {
-               umask(old_mask);        /* restore old file mask */
-               return -1;
-       }
-       chown(CRASH_COREDUMP_PATH, 0, group_entry->gr_gid);                     /* chown root:crash */
-       umask(old_mask);                /* restore old file mask */
-
-       return 0;
-}
-static int make_info_dir(void)
-{
-       mode_t old_mask;
-       gid_t group_id;
-       struct group *group_entry;
-
-       if (access(CRASH_INFO_PATH, F_OK) == 0)                         /* if file exists then return -1 */
-               return -1;
-
-       /* save old mask and set new calling process's file mode creation mask */
-       old_mask = umask(0);
-
-       mkdir(CRASH_INFO_PATH, 0775);           /* make directory, if exest then errno==EEXIST */
-       group_entry = getgrnam("crash");                /* need to find out group ID of "crash" group name*/
-       if (group_entry == NULL) {
-               umask(old_mask);        /* restore old file mask */
-               return -1;
-       }
-       chown(CRASH_INFO_PATH, 0, group_entry->gr_gid);                 /* chown root:crash */
-       umask(old_mask);                /* restore old file mask */
-
-       return 0;
-}
-static int clean_coredump_dir(void)
-{
-       DIR *dir;
-       struct dirent *dp;
-       int dfd;
-       dir = opendir(CRASH_COREDUMP_PATH);
-       if (!dir) {
-               _E("opendir failed");
-               return 0;
-       }
-       dfd = dirfd(dir);
-       if (dfd < 0) return 0;
-       while ((dp = readdir(dir)) != NULL) {
-               const char *name = dp->d_name;
-               /* always skip "." and ".." */
-               if (name[0] == '.') {
-                       if (name[1] == 0) continue;
-                       if ((name[1] == '.') && (name[2] == 0)) continue;
-               }
-               if (unlinkat(dfd, name, 0) < 0) {
-                       _SE("FAIL: clean_coredump_dir (%s)", name);
-                       continue;
-               }
-       }
-       closedir(dir);
-       return 1;
-}
-static int clean_dump_dir(void)
-{
-       DIR *dir;
-       struct dirent *dp;
-       char dirname[PATH_MAX];
-
-       dir = opendir(CRASH_DUMP_PATH);
-       if (!dir) {
-               _E("opendir failed");
-               return 0;
-       }
-       while ((dp = readdir(dir)) != NULL) {
-               if (dp->d_type == DT_DIR) {
-                       const char *name = dp->d_name;
-                       /* always skip "." and ".." */
-                       if (name[0] == '.') {
-                               if (name[1] == 0) continue;
-                               if ((name[1] == '.') && (name[2] == 0)) continue;
-                       }
-                       snprintf(dirname, sizeof(dirname), "%s/%s", CRASH_DUMP_PATH, name);
-                       if (ecore_file_recursive_rm(dirname) == EINA_FALSE) {
-                               _SE("FAIL: clean_dump_dir (%s)", dirname);
-                               continue;
-                       }
-               }
-       }
-       closedir(dir);
-       return 1;
-}
-static int clean_info_dir(void)
-{
-       DIR *dir;
-       struct dirent *dp;
-       int dfd;
-       dir = opendir(CRASH_INFO_PATH);
-       if (!dir) {
-               _E("opendir failed");
-               return 0;
-       }
-       dfd = dirfd(dir);
-       if (dfd < 0) return 0;
-       while ((dp = readdir(dir)) != NULL) {
-               const char *name = dp->d_name;
-               /* always skip "." and ".." */
-               if (name[0] == '.') {
-                       if (name[1] == 0) continue;
-                       if ((name[1] == '.') && (name[2] == 0)) continue;
-               }
-               if (unlinkat(dfd, name, 0) < 0) {
-                       _E("FAIL: clean_info_dir (%s)",name);
-                       continue;
-               }
-       }
-       closedir(dir);
-       return 1;
-}
-static int crash_arg_parser(char *linebuffer, struct crash_arg *arg)
-{
-       char *ptr = NULL;
-       int verify_num = 0;
-       int verify_arg_num = 0;
-
-       if (linebuffer == NULL || arg == NULL) {
-               _E("crash_arg_parser input arguments is NULL");
-               return -1;
-       }
-       ptr = strtok(linebuffer, CRASH_DELIMITER);
-       if (ptr == NULL) {
-               _SE("can't strtok linebuffer ptr(%s)", ptr);
-               return -1;
-       }
-       snprintf(arg->crash_mode, CRASH_MODE_MAX, "%s",  ptr);
-       ptr = strtok(NULL, CRASH_DELIMITER);
-       if (ptr == NULL) {
-               _SE("can't strtok linebuffer ptr(%s)", ptr);
-               return -1;
-       }
-       snprintf(arg->crash_processname, CRASH_PROCESSNAME_MAX, "%s",  ptr);
-       ptr = strtok(NULL, CRASH_DELIMITER);
-       if (ptr == NULL) {
-               _SE("can't strtok linebuffer ptr(%s)", ptr);
-               return -1;
-       }
-       snprintf(arg->crash_timestr, CRASH_TIME_MAX, "%s", ptr);
-       ptr = strtok(NULL, CRASH_DELIMITER);
-       if (ptr == NULL) {
-               _SE("can't strtok linebuffer ptr(%s)", ptr);
-               return -1;
-       }
-       snprintf(arg->crash_pid, CRASH_PID_MAX, "%s", ptr);
-       ptr = strtok(NULL, CRASH_DELIMITER);
-       if (ptr == NULL) {
-               _SE("can't strtok linebuffer ptr(%s)", ptr);
-               return -1;
-       }
-       snprintf(arg->crash_exepath, CRASH_EXEPATH_MAX, "%s", ptr);
-       ptr = strtok(NULL, CRASH_DELIMITER);
-       if (ptr == NULL) {
-               _SE("can't strtok linebuffer ptr(%s)", ptr);
-               return -1;
-       }
-       snprintf(arg->crash_verify, CRASH_VERIFY_MAX, "%s", ptr);
-       verify_num = strlen(arg->crash_processname) + strlen(arg->crash_exepath);
-       verify_arg_num = atoi(arg->crash_verify);
-       _SD("vnum %d vanum %d", verify_num, verify_arg_num);
-       if (verify_num == verify_arg_num)
-               return 1;
-       else
-               return 0;
-}
-
-static void launch_crash_worker(const char *filename, int popup_on)
-{
-       static int popup_pid = 0;
-       FILE *fp;
-       int ret = -1;
-       int len, count;
-       char linebuffer[CRASH_ARG_MAX] = {0,};
-       char crash_worker_args[CRASH_ARG_MAX] = {0,};
-       struct crash_arg parsing_arg;
-       fp = fopen(filename, "r");
-       if (fp == NULL) {
-               return;
-       }
-       count = 0;
-       /* launch crash process */
-       while (fgets(linebuffer, CRASH_ARG_MAX, fp) != NULL) {
-               len = strlen(linebuffer);
-               if (!len || linebuffer[len - 1] != '\n') {
-                       _E("crash inoti msg  must be terminated with new line character\n");
-                       break;
-               }
-               /* change last caracter from \n to \0 */
-               linebuffer[strlen(linebuffer) - 1] = '\0';
-               if (crash_arg_parser(linebuffer, &parsing_arg) != 1)
-                       continue;
-               snprintf(crash_worker_args, sizeof(crash_worker_args), "%s %s %s %s %s",
-                               parsing_arg.crash_mode, parsing_arg.crash_processname,
-                               parsing_arg.crash_timestr, parsing_arg.crash_pid, parsing_arg.crash_exepath);
-               _SD("crash_worker args(%s)", crash_worker_args);
-               _SD("(%s%s%s)", parsing_arg.crash_mode,
-                               parsing_arg.crash_processname, parsing_arg.crash_timestr);
-               ret = ss_launch_evenif_exist (CRASH_WORKER_PATH, crash_worker_args);
-               if (ret > 0) {
-                       char buf[PATH_MAX];
-                       FILE *fpAdj;
-                       snprintf(buf, sizeof(buf), "/proc/%d/oom_adj", ret);
-                       fpAdj = fopen(buf, "w");
-                       if (fpAdj != NULL) {
-                               fprintf(fpAdj, "%d", (-17));
-                               fclose(fpAdj);
-                       }
-                       count++;
-                       if (CRASH_WORKER_MAX <= count)
-                               break;
-               }
-               if (popup_on) {
-                       if (!is_running_process(popup_pid))
-                               popup_pid = ss_launch_evenif_exist (CRASH_POPUP_PATH, parsing_arg.crash_processname);
-               }
-
-               if (popup_pid < 0) {
-                       _E("popup failed)\n");
-                       break;
-               }
-       }
-       fclose(fp);
-       if (ret != -1) {
-               fp = fopen(filename, "w");
-               if (fp == NULL) {
-                       return;
-               }
-               fclose(fp);
-       }
-       return;
-}
-
-static Ecore_File_Monitor *crash_file_monitor;
-
-static Ecore_File_Monitor_Cb __crash_file_cb(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path)
-{
-       switch (event) {
-       case ECORE_FILE_EVENT_DELETED_DIRECTORY:
-       case ECORE_FILE_EVENT_DELETED_SELF:
-               if (make_noti_file(CRASH_NOTI_DIR, CRASH_NOTI_FILE) < 0) {
-                       launch_crash_worker(path, CRASH_POPUP_ON);
-               }
-               break;
-       case ECORE_FILE_EVENT_MODIFIED:
-       default:
-               launch_crash_worker(path, CRASH_POPUP_ON);
-               break;
-       }
-       return NULL;
-}
-
-static int _get_file_count(const char *path)
-{
-       DIR *dir;
-       struct dirent *dp;
-       int count = 0;
-
-       dir = opendir(path);
-       if (!dir)
-               return 0;
-       while ((dp = readdir(dir)) != NULL) {
-               const char *name = dp->d_name;
-               /* always skip "." and ".." */
-               if (name[0] == '.') {
-                       if (name[1] == 0)
-                               continue;
-                       if ((name[1] == '.') && (name[2] == 0))
-                               continue;
-               }
-               count++;
-       }
-       closedir(dir);
-       return count;
-}
-
-/* check disk available size */
-static int _check_disk_available(void)
-{
-       struct statfs lstatfs;
-       int avail_size = 0;
-
-       if (statfs(CRASH_CHECK_DISK_PATH, &lstatfs) < 0)
-               return -1;
-       avail_size = (int)(lstatfs.f_bavail * (lstatfs.f_bsize/1024));
-       if (CRASH_CHECK_SIZE > avail_size)
-               return -1;
-       return 1;
-}
-
-static void bs_init(void *data)
-{
-       if (make_noti_file(CRASH_NOTI_DIR, CRASH_NOTI_FILE) < 0) {
-               _E("make_noti_file() failed");
-               launch_crash_worker(CRASH_NOTI_PATH, CRASH_POPUP_OFF);
-       }
-       if (make_info_dir() < 0) {
-               if (CRASH_LIMIT_NUM < _get_file_count(CRASH_INFO_PATH))
-                       clean_info_dir();
-       }
-       if (make_coredump_dir() < 0) {
-               if (CRASH_LIMIT_NUM < _get_file_count(CRASH_COREDUMP_PATH)
-                                       || _check_disk_available() < 0)
-                       clean_coredump_dir();
-       }
-       if (CRASH_LIMIT_NUM < _get_file_count(CRASH_DUMP_PATH))
-               clean_dump_dir();
-
-       if (ecore_file_init() == 0) {
-               _E("ecore_file_init() failed");
-               launch_crash_worker(CRASH_NOTI_PATH, CRASH_POPUP_OFF);
-       }
-       crash_file_monitor = ecore_file_monitor_add(CRASH_NOTI_PATH,(void *) __crash_file_cb, NULL);
-       if (!crash_file_monitor) {
-               _E("ecore_file_monitor_add() failed");
-               launch_crash_worker(CRASH_NOTI_PATH, CRASH_POPUP_OFF);
-               return;
-       }
-}
-
-static const struct device_ops bs_device_ops = {
-       .name     = "bs",
-       .init     = bs_init,
-};
-
-DEVICE_OPS_REGISTER(&bs_device_ops)
index de37c47..2dd7c41 100644 (file)
@@ -84,8 +84,6 @@ static int get_control_handler(int argc, char **argv)
        int i;
        int pid;
        int device;
-       bool enable;
-       int ret;
        const struct device_ops *dev_ops = NULL;
 
        _I("argc : %d", argc);
index 3ab0b19..0f89702 100644 (file)
 #include <errno.h>
 #include <poll.h>
 #include <mntent.h>
-#include "log.h"
 #include <notification.h>
 
-#define PERMANENT_DIR          "/tmp/permanent"
-#define VIP_DIR                        "/tmp/vip"
-#define BUFF_MAX 255
+#include "log.h"
+#include "common.h"
+
+#define PERMANENT_DIR   "/tmp/permanent"
+#define VIP_DIR         "/tmp/vip"
+#define BUFF_MAX        255
 
 /**
  * Opens "/proc/$pid/oom_score_adj" file for w/r;
  * Return: FILE pointer or NULL
  */
-FILE * open_proc_oom_score_adj_file(int pid, const char *mode)
+FILE *open_proc_oom_score_adj_file(int pid, const char *mode)
 {
-        char buf[32];
-        FILE *fp;
+       char buf[32];
+       FILE *fp;
 
        snprintf(buf, sizeof(buf), "/proc/%d/oom_score_adj", pid);
        fp = fopen(buf, mode);
@@ -57,6 +59,7 @@ FILE * open_proc_oom_score_adj_file(int pid, const char *mode)
 int get_exec_pid(const char *execpath)
 {
        DIR *dp;
+       struct dirent entry;
        struct dirent *dentry;
        int pid = -1, fd;
        int ret;
@@ -69,7 +72,11 @@ int get_exec_pid(const char *execpath)
                return -1;
        }
 
-       while ((dentry = readdir(dp)) != NULL) {
+       while (1) {
+               ret = readdir_r(dp, &entry, &dentry);
+               if (ret != 0 || dentry == NULL)
+                       break;
+
                if (!isdigit(dentry->d_name[0]))
                        continue;
 
@@ -113,6 +120,9 @@ int get_cmdline_name(pid_t pid, char *cmdline, size_t cmdline_size)
 
        ret = read(fd, buf, PATH_MAX);
        close(fd);
+       if (ret < 0)
+               return -1;
+
        buf[PATH_MAX] = '\0';
 
        filename = strrchr(buf, '/');
@@ -149,33 +159,37 @@ int is_vip(int pid)
 static int remove_dir_internal(int fd)
 {
        DIR *dir;
+       struct dirent entry;
        struct dirent *de;
        int subfd, ret = 0;
 
        dir = fdopendir(fd);
        if (!dir)
                return -1;
-       while ((de = readdir(dir))) {
+       while (1) {
+               ret = readdir_r(dir, &entry, &de);
+               if (ret != 0 || de == NULL)
+                       break;
                if (de->d_type == DT_DIR) {
                        if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, ".."))
                                continue;
                        subfd = openat(fd, de->d_name, O_RDONLY | O_DIRECTORY);
                        if (subfd < 0) {
-                               _SE("Couldn't openat %s: %s\n", de->d_name, strerror(errno));
+                               _SE("Couldn't openat %s: %d\n", de->d_name, errno);
                                ret = -1;
                                continue;
                        }
-                       if (remove_dir_internal(subfd)) {
+                       if (remove_dir_internal(subfd))
                                ret = -1;
-                       }
+
                        close(subfd);
                        if (unlinkat(fd, de->d_name, AT_REMOVEDIR) < 0) {
-                               _SE("Couldn't unlinkat %s: %s\n", de->d_name, strerror(errno));
+                               _SE("Couldn't unlinkat %s: %d\n", de->d_name, errno);
                                ret = -1;
                        }
                } else {
                        if (unlinkat(fd, de->d_name, 0) < 0) {
-                               _SE("Couldn't unlinkat %s: %s\n", de->d_name, strerror(errno));
+                               _SE("Couldn't unlinkat %s: %d\n", de->d_name, errno);
                                ret = -1;
                        }
                }
@@ -184,7 +198,7 @@ static int remove_dir_internal(int fd)
        return ret;
 }
 
-int remove_dir(char *path, int del_dir)
+int remove_dir(const char *path, int del_dir)
 {
        int fd, ret = 0;
 
@@ -192,7 +206,7 @@ int remove_dir(char *path, int del_dir)
                return -1;
        fd = open(path, O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC | O_NOFOLLOW);
        if (fd < 0) {
-               _SE("Couldn't opendir %s: %s\n", path, strerror(errno));
+               _SE("Couldn't opendir %s: %d\n", path, errno);
                return -errno;
        }
        ret = remove_dir_internal(fd);
@@ -200,7 +214,7 @@ int remove_dir(char *path, int del_dir)
 
        if (del_dir) {
                if (rmdir(path)) {
-                       _SE("Couldn't rmdir %s: %s\n", path, strerror(errno));
+                       _SE("Couldn't rmdir %s: %d\n", path, errno);
                        ret = -1;
                }
        }
@@ -316,7 +330,7 @@ int sys_set_str(char *fname, char *val)
        return r;
 }
 
-int terminate_process(const charpartition, bool force)
+int terminate_process(const char *partition, bool force)
 {
        const char *argv[7] = {"/sbin/fuser", "-m", "-k", "-S", NULL, NULL, NULL};
        int argc;
@@ -330,17 +344,20 @@ int terminate_process(const char* partition, bool force)
        return run_child(argc, argv);
 }
 
-int mount_check(const charpath)
+int mount_check(const char *path)
 {
        int ret = false;
-       struct mntentmnt;
-       const chartable = "/etc/mtab";
-       FILEfp;
+       struct mntent *mnt;
+       const char *table = "/etc/mtab";
+       FILE *fp;
 
        fp = setmntent(table, "r");
        if (!fp)
                return ret;
-       while (mnt=getmntent(fp)) {
+       while (1) {
+               mnt = getmntent(fp);
+               if (mnt == NULL)
+                       break;
                if (!strcmp(mnt->mnt_dir, path)) {
                        ret = true;
                        break;
index 0ade430..02439c8 100644 (file)
@@ -141,7 +141,7 @@ int remove_dir(const char *path, int del_dir);
 int sys_check_node(char *path);
 int sys_get_int(char *fname, int *val);
 int sys_set_int(char *fname, int val);
-int terminate_process(const charpartition, bool force);
+int terminate_process(const char *partition, bool force);
 int mount_check(const char* path);
 void print_time(const char *prefix);
 int manage_notification(char *title, char *content);
index b7e164b..3edf141 100644 (file)
@@ -43,7 +43,7 @@ static inline char *trim_str(char *s)
 }
 
 int config_parse(const char *file_name, int cb(struct parse_result *result,
-    void *user_data), void *user_data)
+                       void *user_data), void *user_data)
 {
        FILE *f = NULL;
        struct parse_result result;
index e2af9a0..e399bf2 100644 (file)
@@ -88,7 +88,7 @@ int add_idle_request(void (*func)(void *data), void *data)
 
        req = calloc(1, sizeof(struct device_request));
        if (!req) {
-               _E("fail to allocate request : %s", strerror(errno));
+               _E("fail to allocate request : %d", errno);
                return -errno;
        }
 
index 57610ec..ff066c0 100644 (file)
@@ -38,7 +38,7 @@ static Ecore_Idler *idl;
 int register_notifier(enum device_notifier_type status, int (*func)(void *data))
 {
        dd_list *n;
-       struct device_notifier *data, *notifier;
+       struct device_notifier *notifier;
 
        _I("%d, %x", status, func);
 
index b6003a1..9e0390a 100644 (file)
 
 #include <stdbool.h>
 #include <assert.h>
+
 #include "core/log.h"
 #include "core/edbus-handler.h"
 #include "core/common.h"
+#include "core/device-idler.h"
 #include "core/device-notifier.h"
 #include "core/list.h"
 
 #define EDBUS_INIT_RETRY_COUNT 5
 #define NAME_OWNER_CHANGED "NameOwnerChanged"
-#define NAME_OWNER_MATCH "type='signal',sender='org.freedesktop.DBus',\
-       path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',\
-       member='NameOwnerChanged',arg0='%s'"
+#define NAME_OWNER_MATCH "type='signal',sender='org.freedesktop.DBus',\
+       "path='/org/freedesktop/DBus',interface='org.freedesktop.DBus'," \
+       "member='NameOwnerChanged',arg0='%s'"
 
 /* -1 is a default timeout value, it's converted to 25*1000 internally. */
 #define DBUS_REPLY_TIMEOUT     (-1)
@@ -41,8 +43,8 @@ struct edbus_list {
 };
 
 static struct edbus_object {
-       const char *path;
-       const char *interface;
+       char *path;
+       char *interface;
        E_DBus_Object *obj;
        E_DBus_Interface *iface;
 } edbus_objects[] = {
@@ -52,11 +54,7 @@ static struct edbus_object {
        { DEVICED_PATH_STORAGE, DEVICED_INTERFACE_STORAGE, NULL, NULL },
        { DEVICED_PATH_PROCESS, DEVICED_INTERFACE_PROCESS, NULL, NULL },
        { DEVICED_PATH_KEY    , DEVICED_INTERFACE_KEY    , NULL, NULL },
-       { DEVICED_PATH_CPU    , DEVICED_INTERFACE_CPU    , NULL, NULL },
        { DEVICED_PATH_SYSNOTI, DEVICED_INTERFACE_SYSNOTI, NULL, NULL },
-       { DEVICED_PATH_USB    , DEVICED_INTERFACE_USB    , NULL, NULL },
-       { DEVICED_PATH_GPIO, DEVICED_INTERFACE_GPIO, NULL, NULL},
-       { DEVICED_PATH_HDMICEC, DEVICED_INTERFACE_HDMICEC, NULL, NULL},
        /* Add new object & interface here*/
 };
 
@@ -504,7 +502,6 @@ int register_edbus_watch(const char *sender,
        struct watch_func_info *finfo;
        dd_list *elem;
        bool isnew = false;
-       int ret;
 
        if (!sender || !func) {
                _E("invalid argument : sender(NULL) || func(NULL)");
@@ -588,7 +585,6 @@ int unregister_edbus_watch(const char *sender,
 
 static void unregister_edbus_watch_all(void)
 {
-       char match[256];
        dd_list *n, *next;
        struct watch_info *watch;
 
@@ -648,7 +644,7 @@ int register_edbus_interface_and_method(const char *path,
        if (!obj) {
                obj = malloc(sizeof(struct edbus_object));
                if (!obj) {
-                       _E("fail to allocate %s interface(%d)", path, ret);
+                       _E("fail to allocate %s interface", path);
                        return -ENOMEM;
                }
 
@@ -779,7 +775,7 @@ static void check_owner_list(void)
 {
        DBusError err;
        DBusMessage *msg;
-       DBusMessageIter array, iter, item, iter_val;
+       DBusMessageIter array, item;
        char *pa[1];
        char *name;
        char *entry;
index 303f6b7..1996c4d 100755 (executable)
@@ -19,7 +19,8 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
 #include <limits.h>
 #include <unistd.h>
 #include <signal.h>
@@ -42,7 +43,7 @@ static int parent(pid_t pid)
                else if (WIFSTOPPED(status))
                        _I("%d stopped by signal %d", pid, WSTOPSIG(status));
        } else
-               _I("%d waitpid() failed : %s", pid, strerror(errno));
+               _I("%d waitpid() failed : %d", pid, errno);
 
        return -EAGAIN;
 }
@@ -63,7 +64,7 @@ int run_child(int argc, const char *argv[])
 {
        pid_t pid;
        struct sigaction act, oldact;
-       int r;
+       int r = 0;
        FILE *fp;
 
        if (!argv)
@@ -71,7 +72,7 @@ int run_child(int argc, const char *argv[])
 
        fp = fopen(argv[0], "r");
        if (fp == NULL) {
-               _E("fail %s (%s)", argv[0], strerror(errno));
+               _E("fail %s (%d)", argv[0], errno);
                return -errno;
        }
        fclose(fp);
index 0f5a8d7..f481357 100644 (file)
@@ -55,7 +55,6 @@ static void prepare_exec(void)
 {
        int i;
        int maxfd;
-       FILE *fp;
 
        maxfd = getdtablesize();
        for (i = 3; i < maxfd; i++)
@@ -63,7 +62,6 @@ static void prepare_exec(void)
 
        for (i = 0; i < _NSIG; i++)
                signal(i, SIG_DFL);
-
 }
 
 static int parse_cmd(const char *cmdline, char **argv, int max_args)
@@ -89,32 +87,32 @@ static int parse_cmd(const char *cmdline, char **argv, int max_args)
                        escape = 0;
                } else {
                        switch (*p) {
-                               case '\\':
-                                       escape = 1;
-                                       break;
-                               case '"':
-                                       if (squote)
-                                               *bufp++ = *p;
-                                       else
-                                               dquote = !dquote;
-                                       break;
-                               case '\'':
-                                       if (dquote)
-                                               *bufp++ = *p;
-                                       else
-                                               squote = !squote;
-                                       break;
-                               case ' ':
-                                       if (!squote && !dquote) {
-                                               *bufp = '\0';
-                                               if (nargs < max_args)
-                                                       argv[nargs++] = strdup(buf);
-                                               bufp = buf;
-                                               break;
-                                       }
-                               default:
+                       case '\\':
+                               escape = 1;
+                               break;
+                       case '"':
+                               if (squote)
+                                       *bufp++ = *p;
+                               else
+                                       dquote = !dquote;
+                               break;
+                       case '\'':
+                               if (dquote)
                                        *bufp++ = *p;
+                               else
+                                       squote = !squote;
+                               break;
+                       case ' ':
+                               if (!squote && !dquote) {
+                                       *bufp = '\0';
+                                       if (nargs < max_args)
+                                               argv[nargs++] = strdup(buf);
+                                       bufp = buf;
                                        break;
+                               }
+                       default:
+                               *bufp++ = *p;
+                               break;
                        }
                }
                p++;
@@ -149,7 +147,7 @@ int launch_app_with_nice(const char *file, char *const argv[], pid_t *pid, int _
        _pid = fork();
 
        if (_pid == -1) {
-               _E("fork error: %s", strerror(errno));
+               _E("fork error: %d", errno);
                /* keep errno */
                return -1;
        }
@@ -166,12 +164,12 @@ int launch_app_with_nice(const char *file, char *const argv[], pid_t *pid, int _
        ret = nice(_nice);
 
        if (ret == -1 && errno != 0)
-               _E("nice error: %s", strerror(errno));
+               _E("nice error: %d", errno);
 
        ret = execvp(file, argv);
 
        /* If failed... */
-       _E("exec. error: %s", strerror(errno));
+       _E("exec. error: %s", errno);
        return -2;
 }
 
@@ -215,7 +213,8 @@ int launch_if_noexist(const char *execpath, const char *arg, ...)
                errno = EINVAL;
                return -1;
        }
-       if (pid = get_exec_pid(execpath) > 0)
+       pid = get_exec_pid(execpath);
+       if (pid > 0)
                return pid;
 
        va_start(argptr, arg);
@@ -238,7 +237,6 @@ int launch_if_noexist(const char *execpath, const char *arg, ...)
        }
 
        snprintf(buf, buf_size, "%s %s", execpath, arg);
-       //pid = launch_app_cmd_with_nice(buf, nice_value, flag);
        pid = launch_app_cmd_with_nice(buf, nice_value);
        if (pid == -2)
                exit(EXIT_FAILURE);
@@ -277,13 +275,11 @@ int launch_evenif_exist(const char *execpath, const char *arg, ...)
        buf_size = strlen(execpath) + strlen(arg) + 10;
        buf = malloc(buf_size);
        if (buf == NULL) {
-               // Do something for not enought memory error
                _E("Malloc failed");
                return -1;
        }
 
        snprintf(buf, buf_size, "%s %s", execpath, arg);
-       //pid = launch_app_cmd_with_nice(buf, nice_value, flag);
        pid = launch_app_cmd_with_nice(buf, nice_value);
        if (pid == -2)
                exit(EXIT_FAILURE);
@@ -307,7 +303,8 @@ int launch_after_kill_if_exist(const char *execpath, const char *arg, ...)
                return -1;
        }
 
-       if ((exist_pid = get_exec_pid(execpath)) > 0)
+       exist_pid = get_exec_pid(execpath);
+       if (exist_pid > 0)
                kill(exist_pid, SIGTERM);
 
        va_start(argptr, arg);
@@ -331,7 +328,6 @@ int launch_after_kill_if_exist(const char *execpath, const char *arg, ...)
        }
 
        snprintf(buf, buf_size, "%s %s", execpath, arg);
-       //pid = launch_app_cmd_with_nice(buf, nice_value, flag);
        pid = launch_app_cmd_with_nice(buf, nice_value);
        if (pid == -2)          /* It means that the 'execvp' return -1 */
                exit(EXIT_FAILURE);
index 495512c..bdd2304 100644 (file)
@@ -26,4 +26,6 @@ int launch_if_noexist(const char *execpath, const char *arg, ...);
 int launch_evenif_exist(const char *execpath, const char *arg, ...);
 int launch_after_kill_if_exist(const char *execpath, const char *arg, ...);
 
+int launch_app_cmd(const char *cmdline);
+
 #endif /* __LAUNCH_H__ */
index 04aa3da..86310cd 100644 (file)
@@ -21,9 +21,9 @@
 
 #ifdef DEBUG
 void __cyg_profile_func_enter(void *, void *)
-    __attribute__ ((no_instrument_function));
+       __attribute__ ((no_instrument_function));
 void __cyg_profile_func_exit(void *, void *)
-    __attribute__ ((no_instrument_function));
+       __attribute__ ((no_instrument_function));
 
 int g_trace_depth = -2;
 
index e0bc74a..17b0dfc 100644 (file)
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/wait.h>
-#include <vconf.h>
+
 #include "log.h"
-#include "edbus-handler.h"
-#include "display/poll.h"
 #include "devices.h"
 #include "common.h"
 
index 865710a..5bf4514 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * deviced
  *
- * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the License);
  * you may not use this file except in compliance with the License.
@@ -270,8 +270,6 @@ static int device_change_poweroff(void *data)
 
 static void udev_init(void *data)
 {
-       int ret;
-
        register_notifier(DEVICE_NOTIFIER_POWEROFF, device_change_poweroff);
 
        if (uevent_control_start(KERNEL, &kevent) != 0)
index 5a090ca..f6aa3f8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * deviced
  *
- * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the License);
  * you may not use this file except in compliance with the License.
 
 #include <libudev.h>
 
-#define UDEV_CHANGE            "change"
-#define UDEV_ADD               "add"
-#define UDEV_REMOVE            "remove"
+#define UDEV_CHANGE             "change"
+#define UDEV_ADD                "add"
+#define UDEV_REMOVE             "remove"
 
-#define UDEV_DEVPATH           "DEVPATH"
-#define UDEV_DEVTYPE           "DEVTYPE"
+#define UDEV_DEVPATH            "DEVPATH"
+#define UDEV_DEVTYPE            "DEVTYPE"
 
 /* battery device */
-#define POWER_SUBSYSTEM                "power_supply"
-#define POWER_PATH                     "/sys/class/power_supply/battery"
-#define POWER_SUPPLY_UEVENT POWER_PATH"/uevent"
-#define CAPACITY                       "POWER_SUPPLY_CAPACITY"
-#define CHARGE_FULL                    "POWER_SUPPLY_CHARGE_FULL"
-#define CHARGE_NOW                     "POWER_SUPPLY_CHARGE_NOW"
-#define CHARGE_HEALTH          "POWER_SUPPLY_HEALTH"
-#define CHARGE_PRESENT         "POWER_SUPPLY_PRESENT"
-#define CHARGE_NAME                    "POWER_SUPPLY_NAME"
-#define CHARGE_STATUS          "POWER_SUPPLY_STATUS"
-#define CHARGE_ONLINE          "POWER_SUPPLY_ONLINE"
+#define POWER_SUBSYSTEM         "power_supply"
+#define POWER_PATH              "/sys/class/power_supply/battery"
+#define POWER_SUPPLY_UEVENT     POWER_PATH"/uevent"
+#define CAPACITY                "POWER_SUPPLY_CAPACITY"
+#define CHARGE_FULL             "POWER_SUPPLY_CHARGE_FULL"
+#define CHARGE_NOW              "POWER_SUPPLY_CHARGE_NOW"
+#define CHARGE_HEALTH           "POWER_SUPPLY_HEALTH"
+#define CHARGE_PRESENT          "POWER_SUPPLY_PRESENT"
+#define CHARGE_NAME             "POWER_SUPPLY_NAME"
+#define CHARGE_STATUS           "POWER_SUPPLY_STATUS"
+#define CHARGE_ONLINE           "POWER_SUPPLY_ONLINE"
 
 /* extcon */
-#define EXTCON_SUBSYSTEM       "extcon"
+#define EXTCON_SUBSYSTEM        "extcon"
 
 /* usb */
 #define USB_SUBSYSTEM           "usb"
index 72dda40..e59724b 100644 (file)
@@ -84,7 +84,7 @@ static int stop_device(char **args)
        if (!args[1])
                return -EINVAL;
 
-       printf("start %s device!\n", args[1]);
+       printf("stop %s device!\n", args[1]);
 
        msg = dbus_method_sync_with_reply(DEVICED_BUS_NAME,
                    devices[arg_id].path, devices[arg_id].iface,
@@ -178,6 +178,8 @@ static int enable_device(char **args)
                return -EBADMSG;
 
        dbus_message_unref(msg);
+
+       return 0;
 }
 
 static int disable_device(char **args)
@@ -199,6 +201,8 @@ static int disable_device(char **args)
                return -EBADMSG;
 
        dbus_message_unref(msg);
+
+       return 0;
 }
 
 static const struct action {
index 4e0efa6..9c3403f 100644 (file)
@@ -104,7 +104,7 @@ static int set_usb_configuration(char *idproduct, char *fconf, char *sconf)
        usb_confs[3].value = fconf;
        usb_confs[4].value = sconf;
 
-       for (i = 0 ; i < ARRAY_SIZE(usb_confs) ; i++) {
+       for (i = 0; i < ARRAY_SIZE(usb_confs); i++) {
                ret = write_sysfs(usb_confs[i].path, usb_confs[i].value);
                if (ret < 0) {
                        printf("usb setting fails (%s), (%s)\n", usb_confs[i].path, usb_confs[i].value);
@@ -183,7 +183,6 @@ static int run_cmd(char *cmd)
 static int load_sdb(void)
 {
        int ret;
-       char *cmd[ARG_MAX];
 
        ret = set_usb_configuration("6860", "mtp", "mtp,acm,sdb");
        if (ret < 0)
index 93795be..0a6686f 100644 (file)
@@ -116,6 +116,8 @@ extern int get_charging_status(int *val);
  */
 extern int get_lowbatt_status(int *val);
 
+int get_lock_screen_state(void);
+
 /*
  * @}
  */
index d63c71d..4751370 100644 (file)
@@ -51,6 +51,8 @@ static int earjack_update(int status)
        earjack_send_broadcast(status);
        if (status != 0)
                pm_change_internal(getpid(), LCD_NORMAL);
+
+       return 0;
 }
 
 static struct extcon_ops earjack_extcon_ops = {
index 80ef738..50ef8d4 100755 (executable)
@@ -107,7 +107,6 @@ static int extcon_parsing_value(const char *value)
 {
        char *s, *p;
        char name[NAME_MAX];
-       struct extcon_ops *dev;
 
        if (!value)
                return -EINVAL;
@@ -160,7 +159,8 @@ static int extcon_load_uevent(struct parse_result *result, void *user_data)
 static int get_extcon_init_state(void)
 {
        DIR *dir;
-       struct dirent *entry;
+       struct dirent entry;
+       struct dirent *result;
        char node[BUF_MAX];
        int ret;
 
@@ -172,11 +172,11 @@ static int get_extcon_init_state(void)
        }
 
        ret = -ENOENT;
-       while ((entry = readdir(dir))) {
-               if (entry->d_name[0] == '.')
+       while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
+               if (result->d_name[0] == '.')
                        continue;
                snprintf(node, sizeof(node), "%s/%s/state",
-                               EXTCON_PATH, entry->d_name);
+                               EXTCON_PATH, result->d_name);
                _I("checking node (%s)", node);
                if (access(node, F_OK) != 0)
                        continue;
@@ -261,6 +261,17 @@ out:
        return make_reply_message(msg, ret);
 }
 
+static struct uevent_handler uh = {
+       .subsystem = EXTCON_SUBSYSTEM,
+       .uevent_func = uevent_extcon_handler,
+};
+
+static const struct edbus_method edbus_methods[] = {
+       { "GetStatus", "s",  "i", dbus_get_extcon_status },
+       { "enable",    "s", NULL, dbus_enable_device },  /* for devicectl */
+       { "disable",   "s", NULL, dbus_disable_device }, /* for devicectl */
+};
+
 static int extcon_probe(void *data)
 {
        /**
@@ -276,17 +287,6 @@ static int extcon_probe(void *data)
        return 0;
 }
 
-static struct uevent_handler uh = {
-       .subsystem = EXTCON_SUBSYSTEM,
-       .uevent_func = uevent_extcon_handler,
-};
-
-static const struct edbus_method edbus_methods[] = {
-       { "GetStatus", "s",  "i", dbus_get_extcon_status },
-       { "enable",    "s", NULL, dbus_enable_device },  /* for devicectl */
-       { "disable",   "s", NULL, dbus_disable_device }, /* for devicectl */
-};
-
 static void extcon_init(void *data)
 {
        int ret;
@@ -296,6 +296,7 @@ static void extcon_init(void *data)
        if (!extcon_list)
                return;
 
+       /* initialize extcon devices */
        DD_LIST_FOREACH(extcon_list, l, dev) {
                _I("[extcon] init (%s)", dev->name);
                if (dev->init)
@@ -312,6 +313,7 @@ static void extcon_init(void *data)
        if (ret < 0)
                _E("fail to init extcon nodes : %d", ret);
 
+       /* register extcon object first */
        ret = register_edbus_interface_and_method(DEVICED_PATH_EXTCON,
                        DEVICED_INTERFACE_EXTCON,
                        edbus_methods, ARRAY_SIZE(edbus_methods));
@@ -330,6 +332,7 @@ static void extcon_exit(void *data)
        if (ret < 0)
                _E("fail to unregister extcon uevent : %d", ret);
 
+       /* deinitialize extcon devices */
        DD_LIST_FOREACH(extcon_list, l, dev) {
                _I("[extcon] deinit (%s)", dev->name);
                if (dev->exit)
index daef069..9cdfb48 100644 (file)
@@ -49,9 +49,6 @@ static void hdmi_send_broadcast(int status)
 
 static int hdmi_update(int status)
 {
-       int val;
-       int ret;
-
        _I("jack - hdmi changed %d", status);
        pm_change_internal(getpid(), LCD_NORMAL);
        vconf_set_int(VCONFKEY_SYSMAN_HDMI, status);
@@ -68,7 +65,7 @@ static int hdmi_update(int status)
 static int display_changed(void *data)
 {
        enum state_t state;
-       int hdmi = 0;
+       int hdmi;
 
        if (!data)
                return 0;
@@ -79,7 +76,7 @@ static int display_changed(void *data)
 
        hdmi = hdmi_extcon_ops.status;
        if (hdmi == 0) {
-               pm_lock_internal(getpid(), LCD_DIM, STAY_CUR_STATE, 0);
+               pm_lock_internal(INTERNAL_LOCK_HDMI, LCD_DIM, STAY_CUR_STATE, 0);
                _I("hdmi is connected! dim lock is on.");
        }
        return 0;
index c116934..202f628 100644 (file)
@@ -20,19 +20,16 @@ ENDFOREACH(flag)
 SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions")
 
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
-MESSAGE("FLAGS: ${CMAKE_C_FLAGS}")
 
 ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
 ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"")
 IF( $ENV{ARCH} MATCHES "arm" )
        ADD_DEFINITIONS("-DTARGET")
 ENDIF()
-ADD_DEFINITIONS("-DSLP_DEBUG")
-ADD_DEFINITIONS("-DSLP_PROF")
 ADD_DEFINITIONS("-D_GNU_SOURCE")
 
 ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
 TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS})
 
 INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
-INSTALL(FILES LICENSE DESTINATION share/license RENAME ${PROJECT_NAME})
+INSTALL(FILES LICENSE.BSD-1.0 DESTINATION share/license RENAME ${PROJECT_NAME})
diff --git a/src/gpio/buzzer.c b/src/gpio/buzzer.c
deleted file mode 100644 (file)
index 27e5777..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * deviced
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-
-#include "core/common.h"
-#include "core/devices.h"
-#include "core/log.h"
-#include "gpio.h"
-
-#define GPIO_CHECK_PATH                "/sys/class/gpio/buzzer"
-#define GPIO_CHECK_STATUS      "/sys/class/gpio/buzzer/status"
-
-static int buzzer_init(void)
-{
-       static int type = GPIO_DEVICE_UNKNOWN;
-       int fd;
-
-       if (type != GPIO_DEVICE_UNKNOWN)
-               goto out;
-
-       fd = open(GPIO_CHECK_PATH, O_RDONLY);
-       if (fd == -1) {
-               _E("%s open error: %s", GPIO_CHECK_PATH, strerror(errno));
-               type = GPIO_DEVICE_NOT_EXIST;
-               goto out;
-       }
-       close(fd);
-       type = GPIO_DEVICE_EXIST;
-out:
-       return type;
-}
-
-static int buzzer_status(void)
-{
-       static int type = GPIO_DEVICE_UNKNOWN;
-       int val = GPIO_DEVICE_UNKNOWN;
-       int ret;
-       int fd;
-       char buf[2];
-
-       type = buzzer_init();
-       if (type != GPIO_DEVICE_EXIST)
-               goto out;
-
-       fd = open(GPIO_CHECK_STATUS, O_RDONLY);
-       if (fd == -1) {
-               _E("%s open error: %s", GPIO_CHECK_STATUS, strerror(errno));
-               goto out;
-       }
-
-       ret = read(fd, buf, 1);
-       close(fd);
-       if (ret != 1) {
-               _E("fail to get status %d", ret);
-               goto out;
-       }
-       buf[1] = '\0';
-       val = atoi(buf);
-       _I("device is (%d)", val);
-out:
-       return val;
-}
-
-static const struct gpio_device buzzer_gpio = {
-       .type   = GPIO_DEVICE_BUZZER,
-       .name   = "buzzer",
-       .init   = buzzer_init,
-       .status = buzzer_status,
-};
-
-static void __CONSTRUCTOR__ module_init(void)
-{
-       register_gpio_device(&buzzer_gpio);
-}
diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c
deleted file mode 100644 (file)
index 0e15528..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * deviced
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <stdbool.h>
-
-#include "core/log.h"
-#include "core/common.h"
-#include "core/devices.h"
-#include "core/edbus-handler.h"
-#include "core/list.h"
-#include "gpio.h"
-
-static dd_list *gpio_head;
-
-static const struct gpio_device default_gpio = {
-       .name = "default-gpio",
-};
-
-void register_gpio_device(const struct gpio_device *gpio)
-{
-       DD_LIST_APPEND(gpio_head, (void*)gpio);
-}
-
-void unregister_gpio_device(const struct gpio_device *gpio)
-{
-       DD_LIST_REMOVE(gpio_head, (void*)gpio);
-}
-
-int check_default_gpio_device(const struct gpio_device *gpio)
-{
-       return (gpio == &default_gpio);
-}
-
-const struct gpio_device *find_gpio_device(const char *name)
-{
-       dd_list *elem;
-       const struct gpio_device *gpio;
-
-       DD_LIST_FOREACH(gpio_head, elem, gpio) {
-               if (!strcmp(gpio->name, name))
-                       return gpio;
-       }
-
-       gpio = &default_gpio;
-       return gpio;
-}
-
-static DBusMessage *check_gpio_status(E_DBus_Object *obj, DBusMessage *msg)
-{
-       DBusMessageIter iter;
-       DBusMessage *reply;
-       const struct gpio_device *gpio;
-       char *name;
-       int ret;
-       int status = GPIO_DEVICE_UNKNOWN;
-
-       ret = dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name,
-                       DBUS_TYPE_INVALID);
-       if (!ret) {
-               status = -EBADMSG;
-               goto out;
-       }
-
-       gpio = find_gpio_device(name);
-       if (check_default_gpio_device(gpio))
-               goto out;
-       status = gpio->status();
-               _D("%s %d", name, status);
-out:
-       reply = dbus_message_new_method_return(msg);
-       dbus_message_iter_init_append(reply, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &status);
-       return reply;
-}
-
-static const struct edbus_method edbus_methods[] = {
-       { "GetStatus",          "s", "i", check_gpio_status },
-};
-
-static void gpio_init(void *data)
-{
-       struct gpio_device *gpio;
-       dd_list *elem;
-       int ret;
-
-       DD_LIST_FOREACH(gpio_head, elem, gpio) {
-               gpio->init();
-               gpio->status();
-       }
-
-       ret = register_edbus_method(DEVICED_PATH_GPIO, edbus_methods, ARRAY_SIZE(edbus_methods));
-       if (ret < 0)
-               _E("fail to init edbus method(%d)", ret);
-}
-
-const struct device_ops gpio_device_ops = {
-       .name     = "gpio",
-       .init     = gpio_init,
-};
-
-DEVICE_OPS_REGISTER(&gpio_device_ops)
diff --git a/src/gpio/gpio.h b/src/gpio/gpio.h
deleted file mode 100644 (file)
index 0dbe628..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * deviced
- *
- * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __GPIO_HANDLER_H__
-#define __GPIO_HANDLER_H__
-
-#include <errno.h>
-#include "core/common.h"
-
-#define GPIO_DEVICE_CLOSED     0
-#define GPIO_DEVICE_OPENED     1
-
-enum gpio_device_check_type {
-       GPIO_DEVICE_UNKNOWN = -1,
-       GPIO_DEVICE_NOT_EXIST = 0,
-       GPIO_DEVICE_EXIST = 1,
-};
-enum gpio_device_type {
-       GPIO_DEVICE_HALL = 0,
-       GPIO_DEVICE_BUZZER,
-       GPIO_DEVICE_SIM,
-};
-
-struct gpio_device {
-       enum gpio_device_type type;
-       const char *name;
-       int (*init) (void);
-       int (*status) (void);
-};
-
-void register_gpio_device(const struct gpio_device *gpio);
-void unregister_gpio_device(const struct gpio_device *gpio);
-const struct gpio_device *find_gpio_device(const char *name);
-int check_default_gpio_device(const struct gpio_device *dev);
-
-#define NOT_SUPPORT_GPIO(gpio) \
-       ((check_default_gpio_device(gpio))? 1 : 0)
-
-#define FIND_GPIO_INT(gpio, name) do { \
-       if (!gpio) gpio = find_gpio_device(name); if(check_default_gpio_device(gpio)) return -ENODEV; \
-} while(0)
-
-#define FIND_GPIO_VOID(gpio, name) do { \
-       if (!gpio) gpio = find_gpio_device(name); if(check_default_gpio_device(gpio)) return; \
-} while(0)
-
-
-#endif /* __GPIO_HANDLER_H__ */
diff --git a/src/gpio/hall.c b/src/gpio/hall.c
deleted file mode 100644 (file)
index 5f9f26d..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * deviced
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-
-#include "core/common.h"
-#include "core/devices.h"
-#include "core/log.h"
-#include "gpio.h"
-
-#define GPIO_CHECK_PATH                "/sys/class/flip/hall_ic"
-#define GPIO_CHECK_STATUS      "/sys/class/flip/hall_ic/cover_status"
-
-static int hall_init(void)
-{
-       static int type = GPIO_DEVICE_UNKNOWN;
-       int fd;
-
-       if (type != GPIO_DEVICE_UNKNOWN)
-               goto out;
-
-       fd = open(GPIO_CHECK_PATH, O_RDONLY);
-       if (fd == -1) {
-               _E("%s open error: %s", GPIO_CHECK_PATH, strerror(errno));
-               type = GPIO_DEVICE_NOT_EXIST;
-               goto out;
-       }
-       close(fd);
-       type = GPIO_DEVICE_EXIST;
-out:
-       return type;
-}
-
-static int hall_status(void)
-{
-       static int type = GPIO_DEVICE_UNKNOWN;
-       int val = GPIO_DEVICE_UNKNOWN;
-       int ret;
-       int fd;
-       char buf[2];
-
-       type = hall_init();
-       if (type != GPIO_DEVICE_EXIST)
-               goto out;
-
-       fd = open(GPIO_CHECK_STATUS, O_RDONLY);
-       if (fd == -1) {
-               _E("%s open error: %s", GPIO_CHECK_STATUS, strerror(errno));
-               goto out;
-       }
-
-       ret = read(fd, buf, 1);
-       close(fd);
-       if (ret != 1) {
-               _E("fail to get status %d", ret);
-               goto out;
-       }
-       buf[1] = '\0';
-       val = atoi(buf);
-       _I("device is (%d)", val);
-out:
-       return val;
-}
-
-static const struct gpio_device hall_gpio = {
-       .type   = GPIO_DEVICE_HALL,
-       .name   = "hall",
-       .init   = hall_init,
-       .status = hall_status,
-};
-
-static void __CONSTRUCTOR__ module_init(void)
-{
-       register_gpio_device(&hall_gpio);
-}
diff --git a/src/gpio/sim.c b/src/gpio/sim.c
deleted file mode 100644 (file)
index 69f0ee5..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * deviced
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-
-#include "core/common.h"
-#include "core/devices.h"
-#include "core/log.h"
-#include "gpio.h"
-
-#define GPIO_CHECK_PATH                "/sys/class/gpio/sim"
-#define GPIO_CHECK_STATUS      "/sys/class/gpio/sim/status"
-
-static int sim_init(void)
-{
-       static int type = GPIO_DEVICE_UNKNOWN;
-       int fd;
-
-       if (type != GPIO_DEVICE_UNKNOWN)
-               goto out;
-
-       fd = open(GPIO_CHECK_PATH, O_RDONLY);
-       if (fd == -1) {
-               _E("%s open error: %s", GPIO_CHECK_PATH, strerror(errno));
-               type = GPIO_DEVICE_NOT_EXIST;
-               goto out;
-       }
-       close(fd);
-       type = GPIO_DEVICE_EXIST;
-out:
-       return type;
-}
-
-static int sim_status(void)
-{
-       static int type = GPIO_DEVICE_UNKNOWN;
-       int val = GPIO_DEVICE_UNKNOWN;
-       int ret;
-       int fd;
-       char buf[2];
-
-       type = sim_init();
-       if (type != GPIO_DEVICE_EXIST)
-               goto out;
-
-       fd = open(GPIO_CHECK_STATUS, O_RDONLY);
-       if (fd == -1) {
-               _E("%s open error: %s", GPIO_CHECK_STATUS, strerror(errno));
-               goto out;
-       }
-
-       ret = read(fd, buf, 1);
-       close(fd);
-       if (ret != 1) {
-               _E("fail to get status %d", ret);
-               goto out;
-       }
-       buf[1] = '\0';
-       val = atoi(buf);
-       _I("device is (%d)", val);
-out:
-       return val;
-}
-
-static const struct gpio_device sim_gpio = {
-       .type   = GPIO_DEVICE_SIM,
-       .name   = "sim",
-       .init   = sim_init,
-       .status = sim_status,
-};
-
-static void __CONSTRUCTOR__ module_init(void)
-{
-       register_gpio_device(&sim_gpio);
-}
index 2482f59..e6ad743 100644 (file)
@@ -45,13 +45,13 @@ static bool is_valid(void)
 
        dlopen_handle = dlopen(HAPTIC_MODULE_PATH, RTLD_NOW);
        if (!dlopen_handle) {
-               _E("dlopen failed: %s", dlerror());
+               _E("dlopen failed");
                goto error;
        }
 
        get_haptic_plugin_interface = dlsym(dlopen_handle, "get_haptic_plugin_interface");
        if (!get_haptic_plugin_interface) {
-               _E("dlsym failed : %s", dlerror());
+               _E("dlsym failed");
                goto error;
        }
 
@@ -70,7 +70,7 @@ error:
                dlopen_handle = NULL;
        }
 
-       _E("Do not support external haptic device");
+       _I("Do not support external haptic device");
        return false;
 }
 
index b55bdbb..713fb01 100644 (file)
@@ -22,6 +22,7 @@
 #include <dlfcn.h>
 #include <assert.h>
 #include <vconf.h>
+#include <time.h>
 
 #include "core/log.h"
 #include "core/list.h"
@@ -89,12 +90,12 @@ static int remove_haptic_info(struct haptic_info *info);
 
 void add_haptic(const struct haptic_ops *ops)
 {
-       DD_LIST_APPEND(h_head, (void*)ops);
+       DD_LIST_APPEND(h_head, (void *)ops);
 }
 
 void remove_haptic(const struct haptic_ops *ops)
 {
-       DD_LIST_REMOVE(h_head, (void*)ops);
+       DD_LIST_REMOVE(h_head, (void *)ops);
 }
 
 static int haptic_module_load(void)
@@ -206,9 +207,6 @@ static struct haptic_info *add_haptic_info(const char *sender)
 
 static int remove_haptic_info(struct haptic_info *info)
 {
-       dd_list *n;
-       dd_list *next;
-
        assert(info);
 
        unregister_edbus_watch(info->sender, haptic_name_owner_changed);
@@ -545,7 +543,7 @@ static DBusMessage *edbus_save_binary(E_DBus_Object *obj, DBusMessage *msg)
        DBusMessageIter iter;
        DBusMessage *reply;
        unsigned char *data;
-       unsigned char *path;
+       char *path;
        int size, ret;
 
        if (!CHECK_VALID_OPS(h_ops, ret))
@@ -584,53 +582,6 @@ static DBusMessage *edbus_show_handle_list(E_DBus_Object *obj, DBusMessage *msg)
        return dbus_message_new_method_return(msg);
 }
 
-static unsigned char* convert_file_to_buffer(const char *file_name, int *size)
-{
-       FILE *pf;
-       long file_size;
-       unsigned char *pdata = NULL;
-
-       if (!file_name)
-               return NULL;
-
-       /* Get File Stream Pointer */
-       pf = fopen(file_name, "rb");
-       if (!pf) {
-               _E("fopen failed : %s", strerror(errno));
-               return NULL;
-       }
-
-       if (fseek(pf, 0, SEEK_END))
-               goto error;
-
-       file_size = ftell(pf);
-       if (fseek(pf, 0, SEEK_SET))
-               goto error;
-
-       if (file_size < 0)
-               goto error;
-
-       pdata = (unsigned char*)malloc(file_size);
-       if (!pdata)
-               goto error;
-
-       if (fread(pdata, 1, file_size, pf) != file_size)
-               goto err_free;
-
-       fclose(pf);
-       *size = file_size;
-       return pdata;
-
-err_free:
-       free(pdata);
-
-error:
-       fclose(pf);
-
-       _E("failed to convert file to buffer (%s)", strerror(errno));
-       return NULL;
-}
-
 static int haptic_internal_init(void)
 {
        int r;
@@ -649,8 +600,7 @@ static int haptic_internal_exit(void)
 
 static int haptic_hardkey_changed_cb(void *data)
 {
-       int size, level, status, e_handle, ret;
-       unsigned char *buf;
+       int level, status, e_handle, ret;
 
        if (!CHECK_VALID_OPS(h_ops, ret)) {
                ret = haptic_module_load();
@@ -691,6 +641,7 @@ static int haptic_hardkey_changed_cb(void *data)
 static int haptic_poweroff_cb(void *data)
 {
        int e_handle, ret;
+       struct timespec time = {0,};
 
        if (!CHECK_VALID_OPS(h_ops, ret)) {
                ret = haptic_module_load();
@@ -710,7 +661,8 @@ static int haptic_poweroff_cb(void *data)
        }
 
        /* sleep for vibration */
-       usleep(POWER_OFF_VIB_DURATION*1000);
+       time.tv_nsec = POWER_OFF_VIB_DURATION * NANO_SECOND_MULTIPLIER;
+       nanosleep(&time, NULL);
        return 0;
 }
 
@@ -729,10 +681,13 @@ static void sound_capturing_cb(keynode_t *key, void *data)
 
 static int parse_section(struct parse_result *result, void *user_data, int index)
 {
-       struct haptic_config *conf = (struct haptic_config*)user_data;
+       struct haptic_config *conf = (struct haptic_config *)user_data;
+
+       if (!result)
+               return 0;
 
-       assert(result);
-       assert(result->section && result->name && result->value);
+       if (!result->section || !result->name || !result->value)
+               return 0;
 
        if (MATCH(result->name, "level")) {
                conf->level = atoi(result->value);
@@ -752,10 +707,10 @@ static int parse_section(struct parse_result *result, void *user_data, int index
 
 static int haptic_load_config(struct parse_result *result, void *user_data)
 {
-       struct haptic_config *conf = (struct haptic_config*)user_data;
+       struct haptic_config *conf = (struct haptic_config *)user_data;
        char name[NAME_MAX];
        int ret;
-       static int index = 0;
+       static int index;
 
        if (!result)
                return 0;
index d6c7ad0..d9435be 100644 (file)
@@ -57,17 +57,6 @@ static int ff_fd;
 static dd_list *ff_list;
 static char ff_path[PATH_MAX];
 
-/* for debug */
-static void print_list(void)
-{
-       struct ff_info *temp;
-       dd_list *elem;
-       int i = 0;
-
-       DD_LIST_FOREACH(ff_list, elem, temp)
-               _D("[%d] %x", i++, temp);
-}
-
 static bool check_valid_handle(struct ff_info *info)
 {
        struct ff_info *temp;
@@ -444,7 +433,7 @@ static int get_device_state(int device_index, int *effect_state)
 {
        struct ff_info *info;
        dd_list *elem;
-       int n, status = false;
+       int status = false;
 
        if (!effect_state)
                return -EINVAL;
index e86f889..f668a44 100644 (file)
@@ -63,7 +63,7 @@ static void ir_init(void *data)
                        DEVICED_INTERFACE_LED,
                        edbus_methods, ARRAY_SIZE(edbus_methods));
        if (ret < 0)
-               _E("fail to init edbus method(%d)", ret);
+               _E("fail to init edbus interfce and method(%d)", ret);
 }
 
 static const struct device_ops irled_device_ops = {
index cc17dae..da9970b 100644 (file)
@@ -30,7 +30,7 @@ static int noti_h;
 
 int ongoing_show(void)
 {
-       int ret, ret_val;
+       int ret_val;
 
        if (noti_h > 0) {
                _D("already ongoing noti show : handle(%d)", noti_h);
@@ -52,7 +52,7 @@ int ongoing_clear(void)
 {
        char str_h[32];
        char *arr[1];
-       int ret, ret_val;
+       int ret_val;
 
        if (noti_h <= 0) {
                _D("already ongoing noti clear");
index 9e1df41..9f252b9 100644 (file)
@@ -26,6 +26,7 @@
 #include "core/devices.h"
 #include "core/device-notifier.h"
 #include "display/core.h"
+#include "display/setting.h"
 
 #define KEYBACKLIGHT_TIME_90            90     /* 1.5 second */
 #define KEYBACKLIGHT_TIME_360           360    /* 6 second */
index 67688c4..da9101e 100644 (file)
@@ -1,21 +1,13 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 PROJECT(newfs_msdos C)
 
-IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_ENGINEER_MODE")
-    OPTION(USE_ENGINEER_MODE "Use Engineer mode" ON)
-ENDIF()
-
 SET(SRCS
        newfs-msdos.c
        )
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
 
-IF(USE_ENGINEER_MODE)
-    SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions")
-ELSE()
-    SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer")
-ENDIF()
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions")
 
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
 
@@ -30,4 +22,4 @@ ADD_DEFINITIONS("-DTIZEN")
 ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
 
 INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
-INSTALL(FILES LICENSE DESTINATION share/license RENAME ${PROJECT_NAME})
+INSTALL(FILES LICENSE.BSD-2-Clause DESTINATION share/license RENAME ${PROJECT_NAME})
index ae69559..55669b3 100644 (file)
@@ -65,15 +65,16 @@ static int read_from_file(const char *path, char *buf, size_t size)
        return 0;
 }
 
-static int get_revision(char *rev)
+static int get_revision(char *rev, int len)
 {
        char buf[FILE_BUFF_MAX];
        char *tag;
        char *start, *ptr;
+       char *saveptr;
        long rev_num;
        const int radix = 16;
 
-       if (rev == NULL) {
+       if (rev == NULL || len <= 0) {
                _E("Invalid argument !\n");
                return -1;
        }
@@ -95,14 +96,18 @@ static int get_revision(char *rev)
                return -1;
        }
 
-       start ++;
-       ptr = strtok(start, END_DELIMITER);
+       start++;
+       ptr = strtok_r(start, END_DELIMITER, &saveptr);
+       if (!ptr) {
+               _E("fail to extract tokens");
+               return -1;
+       }
        ptr += strlen(ptr);
-       ptr -=2;
+       ptr -= 2;
 
        memset(rev, 0x00, REVISION_SIZE);
        rev_num = strtol(ptr, NULL, radix);
-       sprintf(rev, "%d", rev_num);
+       snprintf(rev, len, "%ld", rev_num);
 
        return 0;
 }
@@ -117,7 +122,7 @@ static DBusMessage *dbus_revision_handler(E_DBus_Object *obj, DBusMessage *msg)
 
        if (ret != NOT_INITIALIZED)
                goto out;
-       ret = get_revision(rev);
+       ret = get_revision(rev, sizeof(rev));
        if (ret == 0)
                ret = strtol(rev, &ptr, CONVERT_TYPE);
 out:
diff --git a/src/proc/pmon-handler.c b/src/proc/pmon-handler.c
deleted file mode 100644 (file)
index 6e993be..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * deviced
- *
- * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <fcntl.h>
-#include <assert.h>
-#include <limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <device-node.h>
-
-#include "core/log.h"
-#include "core/launch.h"
-#include "core/common.h"
-#include "core/devices.h"
-
-#define PMON_PERMANENT_DIR     "/tmp/permanent"
-
-static Ecore_Fd_Handler *pmon_efd = NULL;
-
-static int __pmon_start(void);
-static int __pmon_stop(int fd);
-static int replace_char(int size, char *t)
-{
-       while (size > 0) {
-               if (*t == 0)
-                       *t = ' ';
-               size--;
-               t++;
-       }
-       return 0;
-}
-
-static char *pmon_get_permanent_pname(int pid)
-{
-       int fd;
-       int ret;
-       char buf[PATH_MAX];
-       struct stat st;
-       char *cmdline = NULL;
-
-       snprintf(buf, sizeof(buf), "%s/%d", PMON_PERMANENT_DIR, pid);
-       fd = open(buf, O_RDONLY);
-       if (fd == -1) {
-               _E("file open error");
-               return NULL;
-       }
-
-       if (fstat(fd, &st) < 0) {
-               _E("fstat error");
-               close(fd);
-               return NULL;
-       }
-       _D("size = %d", (int)st.st_size);
-
-       cmdline = malloc(st.st_size + 1);
-       if (cmdline == NULL) {
-               _E("Not enough memory");
-               close(fd);
-               return NULL;
-       }
-       memset(cmdline, 0, st.st_size + 1);
-
-       ret = read(fd, cmdline, st.st_size);
-       if (ret >= 0 && ret < st.st_size) {
-               /* TODO - must change more smarter */
-               replace_char(st.st_size - 1, cmdline);
-       }
-       close(fd);
-
-       return cmdline;
-}
-
-static void print_pmon_state(unsigned int dead_pid)
-{
-       _D("[Process MON] %d killed", dead_pid);
-}
-
-static int pmon_process(int pid)
-{
-       char *cmdline;
-       int new_pid;
-       char old_file[PATH_MAX];
-       int fd;
-       int r;
-
-       if (is_vip(pid)) {
-               _I("=======================================");
-               _I("[Process MON] VIP process dead.");
-               _I("=======================================");
-       }
-       /* If there is NOT a .hibernation_start file, run following codes 
-        * On hibernation processing, just ignore relaunching */
-       else if (access("/tmp/.hibernation_start", R_OK) != 0) {
-               cmdline = pmon_get_permanent_pname(pid);
-               if (cmdline != NULL) {
-                       _I("[Process MON] %s relaunch", cmdline);
-                       new_pid = launch_evenif_exist(cmdline, "");
-                       free(cmdline);
-                       if (new_pid > 0) {
-                               /* TODO - set oom */
-                               char buf[PATH_MAX];
-                               char filepath[PATH_MAX];
-                               int cnt;
-
-                               if (access(PMON_PERMANENT_DIR, R_OK) < 0) {
-                                       _I("no predefined matrix dir = %s, so created", PMON_PERMANENT_DIR);
-                                       r = mkdir(PMON_PERMANENT_DIR, 0777);
-                                       if(r < 0) {
-                                               _E("Make Directory is failed");
-                                               return -1;
-                                       }
-                               }
-
-                               snprintf(filepath, sizeof(filepath), "%s/%d", PMON_PERMANENT_DIR, pid);
-                               fd = open(filepath, O_RDONLY);
-                               if (fd == -1) {
-                                       _E("Failed to open");
-                                       return -1;
-                               }
-                               cnt = read(fd, buf, PATH_MAX);
-                               close(fd);
-
-                               if (cnt <= 0) {
-                                       _E("Failed to read");
-                                       return -1;
-                               }
-
-                               snprintf(filepath, sizeof(filepath), "%s/%d", PMON_PERMANENT_DIR, new_pid);
-
-                               fd = open(filepath, O_CREAT | O_WRONLY, 0644);
-                               if (fd == -1) {
-                                       _E("Failed to open");
-                                       return -1;
-                               }
-                               if (write(fd, buf, cnt) == -1) {
-                                       _E("Failed to write");
-                                       close(fd);
-                                       return -1;
-                               }
-                               close(fd);
-                               if ( device_set_property(DEVICE_TYPE_PROCESS, PROP_PROCESS_MP_PNP, new_pid) < 0) {
-                                       _E("Write new pid failed");
-                               }
-                               _I("[Process MON] %d ", new_pid);
-
-                               FILE *fp;
-
-                               _I("[Process MON] OOMADJ_SET : pid %d, new_oomadj %d",
-                                    new_pid, (-17));
-
-                               fp = open_proc_oom_score_adj_file(new_pid, "w");
-                               if (fp == NULL)
-                                       return -1;
-                               fprintf(fp, "%d",0);
-                               fclose(fp);
-
-                               snprintf(old_file, sizeof(old_file), "%s/%d",
-                                        PMON_PERMANENT_DIR, pid);
-                               unlink(old_file);
-                       } else {
-                               _I("[Process MON] failed relaunching");
-                       }
-               }
-       }
-       return 0;
-}
-/*
-static unsigned int pmon_read(int fd)
-{
-       unsigned int pid;
-       read(fd, &pid, sizeof(pid));
-       return pid;
-}
-*/
-
-static Eina_Bool pmon_cb(void *data, Ecore_Fd_Handler * fd_handler)
-{
-       int fd;
-       int dead_pid;
-       char pid_str[PATH_MAX];
-       int ret;
-
-       if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) {
-               _E("ecore_main_fd_handler_active_get error , return");
-               goto out;
-       }
-
-       fd = ecore_main_fd_handler_fd_get(fd_handler);
-
-       if (fd < 0) {
-               _E("ecore_main_fd_handler_fd_get error , return");
-               goto out;
-       }
-
-       ret = read(fd, pid_str, PATH_MAX);
-
-       if (ret < 0 || ret >= PATH_MAX) {
-               __pmon_stop(fd);
-               _E("Reading DEAD_PID failed, restart ecore fd");
-               __pmon_start();
-               goto out;
-       }
-
-       pid_str[ret] = '\0';
-       dead_pid = strtoul(pid_str, NULL, 10);
-       print_pmon_state(dead_pid);
-       pmon_process(dead_pid);
-out:
-       return EINA_TRUE;
-}
-
-static int __pmon_start(void)
-{
-       int pmon_fd = -1;
-       char pmon_dev_node[PATH_MAX];
-       if (device_get_property(DEVICE_TYPE_PROCESS, PROP_PROCESS_NODE,
-               (int *)pmon_dev_node) < 0) {
-               _E("ss_pmon_init get dev node path failed");
-               return -1;
-       }
-
-       pmon_fd = open(pmon_dev_node, O_RDONLY);
-       if (pmon_fd < 0) {
-               _E("ss_pmon_init fd open failed");
-               return -1;
-       }
-       pmon_efd = ecore_main_fd_handler_add(pmon_fd, ECORE_FD_READ, pmon_cb, ad, NULL, NULL);
-       if (!pmon_efd) {
-               _E("error ecore_main_fd_handler_add");
-               return -1;
-       }
-       return 0;
-}
-static int __pmon_stop(int fd)
-{
-       if (pmon_efd) {
-               ecore_main_fd_handler_del(pmon_efd);
-               pmon_efd = NULL;
-       }
-       if (fd >=0) {
-               close(fd);
-               fd = -1;
-       }
-       return 0;
-}
-
-static void pmon_init(void *data)
-{
-       int ret = -1;
-
-       if (pmon_efd) {
-               ecore_main_fd_handler_del(pmon_efd);
-               pmon_efd = NULL;
-       }
-       if (__pmon_start() == -1) {
-               _E("fail pmon control fd init");
-       }
-}
-
-static const struct device_ops pmon_device_ops = {
-       .name     = "pmon",
-       .init     = pmon_init,
-};
-
-DEVICE_OPS_REGISTER(&pmon_device_ops)
index deeddba..dce0895 100644 (file)
@@ -80,8 +80,8 @@ struct siop_data {
        int rear;
 };
 
-static int siop = 0;
-static int mode = 0;
+static int siop;
+static int mode;
 static int siop_domain = SIOP_POSITIVE;
 
 enum siop_scenario {
@@ -89,16 +89,16 @@ enum siop_scenario {
        MODE_LCD = 1,
 };
 #ifdef NOUSE
-typedef struct _node {
+struct Node {
        pid_t pid;
-       struct _node *next;
-} Node;
+       struct Node *next;
+};
 
-static Node *head = NULL;
+static struct Node *head;
 
-static Node *find_node(pid_t pid)
+static struct Node *find_node(pid_t pid)
 {
-       Node *t = head;
+       struct Node *t = head;
 
        while (t != NULL) {
                if (t->pid == pid)
@@ -108,11 +108,11 @@ static Node *find_node(pid_t pid)
        return t;
 }
 
-static Node *add_node(pid_t pid)
+static struct Node *add_node(pid_t pid)
 {
-       Node *n;
+       struct Node *n;
 
-       n = (Node *) malloc(sizeof(Node));
+       n = (struct Node *) malloc(sizeof(struct Node));
        if (n == NULL) {
                _E("Not enough memory, add cond. fail");
                return NULL;
@@ -125,10 +125,10 @@ static Node *add_node(pid_t pid)
        return n;
 }
 
-static int del_node(Node *n)
+static int del_node(struct Node *n)
 {
-       Node *t;
-       Node *prev;
+       struct Node *t;
+       struct Node *prev;
 
        if (n == NULL)
                return 0;
@@ -160,10 +160,10 @@ static void siop_level_action(int level)
 {
        int val = SIOP_CTRL_LEVEL(level);
        static int old;
-       static int siop_level = 0;
-       static int rear_level = 0;
-       static int initialized = 0;
-       static int domain = 0;
+       static int siop_level;
+       static int rear_level;
+       static int initialized;
+       static int domain;
        char *arr[1];
        char str_level[32];
 
@@ -204,8 +204,6 @@ static int siop_changed(int argc, char **argv)
        int siop_level = 0;
        int rear_level = 0;
        int level;
-       int siop_disable;
-       int ret;
 
        if (argc != 2 || argv[0] == NULL) {
                _E("fail to check value");
@@ -222,7 +220,6 @@ static int siop_changed(int argc, char **argv)
                siop_domain = SIOP_POSITIVE;
        siop_level = siop_domain * level;
 
-check_rear:
        if (argv[1] == NULL)
                goto out;
 
@@ -252,7 +249,7 @@ static void memcg_move_group(int pid, int oom_score_adj)
 {
        char buf[100];
        FILE *f;
-       int ret, size;
+       int size;
        char exe_name[PATH_MAX];
 
        if (get_cmdline_name(pid, exe_name, PATH_MAX) != 0) {
@@ -271,9 +268,9 @@ static void memcg_move_group(int pid, int oom_score_adj)
        f = fopen(buf, "w");
        if (f == NULL)
                return;
-       size = sprintf(buf, "%d", pid);
+       size = snprintf(buf, sizeof(buf), "%d", pid);
        if (fwrite(buf, size, 1, f) != 1)
-               _E("fwrite cgroup tasks : %d\n", pid);;
+               _E("fwrite cgroup tasks : %d", pid);
        fclose(f);
 }
 
@@ -346,7 +343,9 @@ int set_oom_score_adj_action(int argc, char **argv)
 
        if (argc < 2)
                return -1;
-       if ((pid = atoi(argv[0])) < 0 || (new_oom_score_adj = atoi(argv[1])) <= -20)
+       pid = atoi(argv[0]);
+       new_oom_score_adj = atoi(argv[1]);
+       if (pid < 0 || new_oom_score_adj <= -20)
                return -1;
 
        _I("OOMADJ_SET : pid %d, new_oom_score_adj %d", pid, new_oom_score_adj);
@@ -371,10 +370,11 @@ int set_active_action(int argc, char **argv)
 
        if (argc < 1)
                return -1;
-       if ((pid = atoi(argv[0])) < 0)
+       pid = atoi(argv[0]);
+       if (pid < 0)
                return -1;
-
-       if (get_oom_score_adj(pid, &oom_score_adj) < 0)
+       ret = get_oom_score_adj(pid, &oom_score_adj);
+       if (ret < 0)
                return -1;
 
        switch (oom_score_adj) {
@@ -393,7 +393,7 @@ int set_active_action(int argc, char **argv)
                ret = set_oom_score_adj((pid_t) pid, OOMADJ_BACKGRD_LOCKED);
                break;
        default:
-               if(oom_score_adj > OOMADJ_BACKGRD_UNLOCKED) {
+               if (oom_score_adj > OOMADJ_BACKGRD_UNLOCKED) {
                        ret = set_oom_score_adj((pid_t) pid, OOMADJ_BACKGRD_LOCKED);
                } else {
                        _E("Unknown oom_score_adj value (%d) !", oom_score_adj);
@@ -412,10 +412,12 @@ int set_inactive_action(int argc, char **argv)
 
        if (argc < 1)
                return -1;
-       if ((pid = atoi(argv[0])) < 0)
+       pid = atoi(argv[0]);
+       if (pid < 0)
                return -1;
 
-       if (get_oom_score_adj(pid, &oom_score_adj) < 0)
+       ret = get_oom_score_adj(pid, &oom_score_adj);
+       if (ret < 0)
                return -1;
 
        switch (oom_score_adj) {
@@ -434,7 +436,7 @@ int set_inactive_action(int argc, char **argv)
                ret = set_oom_score_adj((pid_t) pid, OOMADJ_BACKGRD_UNLOCKED);
                break;
        default:
-               if(oom_score_adj > OOMADJ_BACKGRD_UNLOCKED) {
+               if (oom_score_adj > OOMADJ_BACKGRD_UNLOCKED) {
                        ret = 0;
                } else {
                        _E("Unknown oom_score_adj value (%d) !", oom_score_adj);
@@ -453,7 +455,8 @@ int set_process_action(int argc, char **argv)
 
        if (argc < 1)
                return -1;
-       if ((pid = atoi(argv[0])) < 0)
+       pid = atoi(argv[0]);
+       if (pid < 0)
                return -1;
 
        return ret;
@@ -466,7 +469,8 @@ int set_process_group_action(int argc, char **argv)
 
        if (argc != 2)
                return -1;
-       if ((pid = atoi(argv[0])) < 0)
+       pid = atoi(argv[0]);
+       if (pid < 0)
                return -1;
 
        if (strncmp(argv[1], PROCESS_VIP, strlen(PROCESS_VIP)) == 0)
@@ -477,45 +481,10 @@ int set_process_group_action(int argc, char **argv)
        if (ret == 0)
                _I("%s : pid %d", argv[1], pid);
        else
-               _E("fail to set %s : pid %d",argv[1], pid);
+               _E("fail to set %s : pid %d", argv[1], pid);
        return 0;
 }
 
-void check_siop_disable_process(int pid, char *default_name)
-{
-       int oom_score_adj;
-       char exe_name[PATH_MAX];
-       if (pid <= 0)
-               return;
-
-       if (get_oom_score_adj(pid, &oom_score_adj) < 0) {
-               _E("fail to get adj value of pid: %d (%d)", pid);
-               return;
-       }
-
-       if (get_cmdline_name(pid, exe_name, PATH_MAX) != 0) {
-               _E("fail to check cmdline: %d (%s)", pid, default_name);
-               return;
-       }
-
-       if (strncmp(exe_name, default_name, strlen(default_name)) != 0) {
-               return;
-       }
-
-       switch (oom_score_adj) {
-       case OOMADJ_FOREGRD_LOCKED:
-       case OOMADJ_FOREGRD_UNLOCKED:
-               siop_level_action(0);
-               vconf_set_int(VCONFKEY_INTERNAL_PRIVATE_SIOP_DISABLE, 1);
-               return;
-       case OOMADJ_BACKGRD_LOCKED:
-       case OOMADJ_BACKGRD_UNLOCKED:
-       case OOMADJ_SU:
-               vconf_set_int(VCONFKEY_INTERNAL_PRIVATE_SIOP_DISABLE, 0);
-       }
-       return;
-}
-
 static DBusMessage *dbus_proc_handler(E_DBus_Object *obj, DBusMessage *msg)
 {
        DBusError err;
@@ -725,11 +694,11 @@ static const struct edbus_method edbus_methods[] = {
 
 static int proc_booting_done(void *data)
 {
-       static int done = 0;
+       static int done;
 
        if (data == NULL)
                goto out;
-       done = *(int*)data;
+       done = *(int *)data;
        if (vconf_notify_key_changed(VCONFKEY_PM_STATE, (void *)siop_mode_lcd, NULL) < 0)
                _E("Vconf notify key chaneged failed: KEY(%s)", VCONFKEY_PM_STATE);
        siop_mode_lcd(NULL, NULL);
@@ -739,12 +708,10 @@ out:
 
 static int process_execute(void *data)
 {
-       struct siop_datakey_data = (struct siop_data *)data;
+       struct siop_data *key_data = (struct siop_data *)data;
        int siop_level = 0;
        int rear_level = 0;
        int level;
-       int siop_disable;
-       int ret;
        int booting_done;
 
        booting_done = proc_booting_done(NULL);
@@ -761,7 +728,6 @@ static int process_execute(void *data)
                siop_domain = SIOP_POSITIVE;
        siop_level = siop_domain * level;
 
-check_rear:
        level = key_data->rear;
        rear_level = level;
 
index 5eec8c8..1f352b3 100644 (file)
@@ -26,6 +26,5 @@
 
 int get_oom_score_adj(int pid, int *oom_score_adj);
 int set_oom_score_adj(int pid, int new_oom_score_adj);
-void check_siop_disable_process(int pid, char *default_name);
 int cur_siop_level(void);
 #endif /* __PROC_HANDLER_H__ */
index 1a42ebf..f125ba9 100644 (file)
@@ -13,15 +13,12 @@ ENDFOREACH(flag)
 SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions")
 
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
-MESSAGE("FLAGS: ${CMAKE_C_FLAGS}")
 
 ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
 ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"")
 IF( $ENV{ARCH} MATCHES "arm" )
        ADD_DEFINITIONS("-DTARGET")
 ENDIF()
-ADD_DEFINITIONS("-DSLP_DEBUG")
-ADD_DEFINITIONS("-DSLP_PROF")
 
 ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
 TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS})
index 550f469..12345b9 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: DongGi Jang <dg0402.jang@samsung.com>
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -17,7 +17,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
-*/ 
+*/
 
 
 #include <stdio.h>
@@ -27,8 +27,8 @@
 int main(int argc, char *argv[])
 {
        launch_evenif_exist("/etc/rc.d/rc.shutdown", "&");
-        sleep(1);
-        sync();
+       sleep(1);
+       sync();
        reboot(RB_AUTOBOOT);
-        return 0;
+       return 0;
 }
index 835a01a..54cef82 100644 (file)
@@ -48,10 +48,10 @@ int append_variant(DBusMessageIter *iter, const char *sig, char *param[])
        if (!sig || !param)
                return 0;
 
-       for (ch = (char*)sig, i = 0; *ch != '\0'; ++i, ++ch) {
+       for (ch = (char *)sig, i = 0; *ch != '\0'; ++i, ++ch) {
                switch (*ch) {
                case 'b':
-                       bool_type = (atoi(param[i])) ? TRUE:FALSE;
+                       bool_type = (atoi(param[i])) ? TRUE : FALSE;
                        dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &bool_type);
                        break;
                case 'i':
@@ -74,7 +74,7 @@ int append_variant(DBusMessageIter *iter, const char *sig, char *param[])
                        switch (*ch) {
                        case 'y':
                                dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &arr);
-                               byte = (struct dbus_byte*)param[i];
+                               byte = (struct dbus_byte *)param[i];
                                dbus_message_iter_append_fixed_array(&arr, DBUS_TYPE_BYTE, &(byte->data), byte->size);
                                dbus_message_iter_close_container(iter, &arr);
                                break;
index 464fae1..2e02e90 100644 (file)
@@ -41,8 +41,8 @@
 
 #define POWER_RESTART          5
 
-static TapiHandle *tapi_handle = NULL;
-static Ecore_Timer *poweroff_timer_id = NULL;
+static TapiHandle *tapi_handle;
+static Ecore_Timer *poweroff_timer_id;
 
 static Eina_Bool telephony_powerdown_ap_internal(void *data)
 {
@@ -71,7 +71,7 @@ static Eina_Bool telephony_restart_ap_by_force(void *data)
 
 static void powerdown_res_cb(TapiHandle *handle, int result, void *data, void *user_data)
 {
-       _D("poweroff command request : %d",result);
+       _D("poweroff command request : %d", result);
 }
 
 static Eina_Bool telephony_powerdown_ap_by_force(void *data)
@@ -92,7 +92,7 @@ static int telephony_start(enum device_flags flags)
                _I("already initialized");
                return 0;
        }
-       if (vconf_get_bool(VCONFKEY_TELEPHONY_READY,&ready) != 0 || ready != 1) {
+       if (vconf_get_bool(VCONFKEY_TELEPHONY_READY, &ready) != 0 || ready != 1) {
                _E("fail to get %s(%d)", VCONFKEY_TELEPHONY_READY, ready);
                return -EINVAL;
        }
@@ -179,7 +179,7 @@ static void telephony_exit(void *data)
 static void telephony_flight_mode_on(TapiHandle *handle, int result, void *data, void *user_data)
 {
        int ret;
-       int bCurFlightMode = 0;
+       bool bCurFlightMode;
 
        if (result != TAPI_POWER_FLIGHT_MODE_ENTER) {
                _E("flight mode enter failed %d", result);
@@ -196,7 +196,7 @@ static void telephony_flight_mode_on(TapiHandle *handle, int result, void *data,
 static void telephony_flight_mode_off(TapiHandle *handle, int result, void *data, void *user_data)
 {
        int ret;
-       int bCurFlightMode = 0;
+       bool bCurFlightMode;
 
        if (result != TAPI_POWER_FLIGHT_MODE_LEAVE) {
                _E("flight mode leave failed %d", result);
@@ -232,7 +232,7 @@ static int telephony_execute(void *data)
                                telephony_flight_mode_on, NULL);
        }
        if (err != TAPI_API_SUCCESS)
-               _E("FlightMode tel api action failed %d",err);
+               _E("FlightMode tel api action failed %d", err);
 
        return 0;
 }
index 17d5888..e0065a3 100644 (file)
 static const char default_rtc0[] = "/dev/rtc0";
 static const char default_rtc1[] = "/dev/rtc1";
 
-static const time_t default_time = 2147483645; // max(32bit) -3sec
-static Ecore_Fd_Handler *tfdh = NULL; // tfd change noti
+static const time_t default_time = 2147483645; /* max(32bit) -3sec */
+static Ecore_Fd_Handler *tfdh; /* tfd change noti */
 
-static Eina_Bool tfd_cb(void *data, Ecore_Fd_Handler * fd_handler);
+static Eina_Bool tfd_cb(void *data, Ecore_Fd_Handler *fd_handler);
 static int timerfd_check_stop(int fd);
 static int timerfd_check_start(void);
 
@@ -146,7 +146,6 @@ int handle_date(char *str)
 {
        long int tmp = 0;
        time_t timet = 0;
-       time_t before = 0;
 
        if (str == NULL)
                return -1;
@@ -211,23 +210,25 @@ static void time_changed_broadcast(void)
 static int timerfd_check_start(void)
 {
        int tfd;
+       int ret;
        struct itimerspec tmr;
 
-       if ((tfd = timerfd_create(CLOCK_REALTIME,TFD_NONBLOCK|TFD_CLOEXEC)) == -1) {
+       tfd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
+       if (tfd == -1) {
                _E("error timerfd_create() %d", errno);
                tfdh = NULL;
                return -1;
        }
 
-       tfdh = ecore_main_fd_handler_add(tfd,ECORE_FD_READ,tfd_cb,NULL,NULL,NULL);
+       tfdh = ecore_main_fd_handler_add(tfd, ECORE_FD_READ, tfd_cb, NULL, NULL, NULL);
        if (!tfdh) {
                _E("error ecore_main_fd_handler_add");
                return -1;
        }
        memset(&tmr, 0, sizeof(tmr));
        tmr.it_value.tv_sec = default_time;
-
-       if (timerfd_settime(tfd,TFD_TIMER_ABSTIME|TFD_TIMER_CANCELON_SET,&tmr,NULL) < 0) {
+       ret = timerfd_settime(tfd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCELON_SET, &tmr, NULL);
+       if (ret < 0) {
                _E("error timerfd_settime() %d", errno);
                return -1;
        }
@@ -240,30 +241,32 @@ static int timerfd_check_stop(int tfd)
                ecore_main_fd_handler_del(tfdh);
                tfdh = NULL;
        }
-       if (tfd >=0) {
+       if (tfd >= 0) {
                close(tfd);
                tfd = -1;
        }
        return 0;
 }
 
-static Eina_Bool tfd_cb(void *data, Ecore_Fd_Handler * fd_handler)
+static Eina_Bool tfd_cb(void *data, Ecore_Fd_Handler *fd_handler)
 {
        int tfd = -1;
        u_int64_t ticks;
        int ret = -1;
 
-       if (!ecore_main_fd_handler_active_get(fd_handler,ECORE_FD_READ)) {
+       ret = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ);
+       if (!ret) {
                _E("error ecore_main_fd_handler_get()");
                goto out;
        }
 
-       if((tfd = ecore_main_fd_handler_fd_get(fd_handler)) == -1) {
+       tfd = ecore_main_fd_handler_fd_get(fd_handler);
+       if (tfd == -1) {
                _E("error ecore_main_fd_handler_fd_get()");
                goto out;
        }
 
-       ret = read(tfd,&ticks,sizeof(ticks));
+       ret = read(tfd, &ticks, sizeof(ticks));
        if (ret < 0 && errno == ECANCELED) {
                vconf_set_int(VCONFKEY_SYSMAN_STIME, VCONFKEY_SYSMAN_STIME_CHANGED);
                time_changed_broadcast();
@@ -336,9 +339,10 @@ static int time_lcd_changed_cb(void *data)
        int tfd = -1;
 
        if (!data)
-               return 0;
+               goto out;
+
+       lcd_state = *(int *)data;
 
-       lcd_state = *(int*)data;
        if (lcd_state < S_LCDOFF)
                goto restart;
 
@@ -369,9 +373,8 @@ static void time_init(void *data)
        if (ret < 0)
                _E("fail to init edbus method(%d)", ret);
 
-       if (timerfd_check_start() == -1) {
+       if (timerfd_check_start() == -1)
                _E("fail system time change detector init");
-       }
        register_notifier(DEVICE_NOTIFIER_LCD, time_lcd_changed_cb);
 }
 
index 2154641..edc37fa 100644 (file)
@@ -102,8 +102,6 @@ static int load_setting_config(struct parse_result *result, void *user_data)
 
 static int load_base_config(struct parse_result *result, void *user_data)
 {
-       unsigned int len;
-
        if (!result)
                return -EINVAL;
 
index 201db1f..b4e9614 100644 (file)
@@ -148,7 +148,7 @@ static int add_usbhost_list(struct udev_device *dev, const char *devpath)
        /* allocate new usbhost device */
        usbhost = calloc(1, sizeof(struct usbhost_device));
        if (!usbhost) {
-               _E("fail to allocate usbhost memory : %s", strerror(errno));
+               _E("fail to allocate usbhost memory : %d", errno);
                return -errno;
        }