Check that spans containing global symbols are never unmatched.
[ksplice.git] / ksplice-view.in
blob9af01b470d7661bf0b4a7c90027ae0e49a1f7f50
1 #!/usr/bin/perl
3 # Copyright (C) 2007-2008 Jeffrey Brian Arnold <jbarnold@mit.edu>
4 # Copyright (C) 2008 Anders Kaseorg <andersk@mit.edu>,
5 # Tim Abbott <tabbott@mit.edu>
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License, version 2.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
18 # 02110-1301, USA.
20 use strict;
21 use warnings;
22 use lib 'KSPLICE_DATA_DIR';
23 use Ksplice;
25 my ($kid, $mid, $module, $update, $file);
26 GetOptions(@common_options,
27 "id=s" => \$kid,
28 "file=s" => \$file) or pod2usage(1);
30 pod2usage(1) if($help || scalar(@ARGV) != 0);
31 my $actions = (defined $kid) + (defined $file);
32 pod2usage(1) if($actions > 1);
34 view_kid() if(defined $kid);
35 view_file() if(defined $file);
36 view_list() if($actions == 0);
38 exit(0);
40 sub view_kid {
41 $kid =~ s/^ksplice[_-]//;
42 $kid =~ s/[-_].*$//; # In case we got an mid instead
43 $update = "ksplice_$kid";
44 if(!update_loaded($kid)) {
45 print "Ksplice id $kid is not present in the kernel\n";
46 exit(0);
48 my $stage = get_stage($kid);
49 print "Ksplice id $kid is present in the kernel and is $stage.\n\n";
50 my $source_diff = get_patch($kid);
51 return if($source_diff eq "");
52 print "Here is the source code patch associated with this update:\n";
53 print $source_diff;
56 sub view_file {
57 my $tmpdir = tempdir('ksplice-tmp-XXXXXX', TMPDIR => 1, CLEANUP => 1);
58 copy($file, "$tmpdir/" . basename($file));
59 chdir($tmpdir);
60 my $ksplice = unpack_update($file);
61 open(PATCH, '<', "$ksplice/patch") or die $!;
62 local $/;
63 print <PATCH>;
64 close(PATCH);
67 sub view_list {
68 foreach(split(/\n/, runstr("lsmod"))) {
69 next unless my ($mid) = m/^ksplice_(\S*)\s/;
70 $module = "ksplice_$mid";
71 ($kid = $mid) =~ s/[-_].*$//;
72 next unless (-e "/sys/module/$module/ksplice/stage");
73 open STAGE, '<', "/sys/module/$module/ksplice/stage" or next;
74 print "$kid\n" if(<STAGE> eq "applied\n");
75 close STAGE;
77 if (-e "/sys/kernel/ksplice") {
78 chdir("/sys/kernel/ksplice");
79 foreach $update (glob("*")) {
80 ($kid = $update) =~ s/^ksplice_//;
81 print "$kid\n" if(get_stage($kid) eq "applied");
86 =head1 NAME
88 ksplice-view - View in-kernel or on-disk Ksplice kernel updates
90 =head1 SYNOPSIS
92 B<ksplice-view> [B<--id=>I<KSPLICE_ID> | B<--file=>I<UPDATE_TARBALL>]
94 =head1 DESCRIPTION
96 When called with no arguments, B<ksplice-view> lists the identification tags of
97 all of the Ksplice updates that are currently present in the running kernel.
99 B<ksplice-view> can report about a specific Ksplice update when given the
100 update's identification tag (if the update is in the kernel) or given the
101 update's tarball filename I<UPDATE_TARBALL> (if the update is on disk).
103 =head1 SEE ALSO
105 L<ksplice-create(8)>, L<ksplice-apply(8)>, L<ksplice-undo(8)>
107 =head1 BUGS
109 Please report bugs to <PACKAGE_BUGREPORT>.
111 =head1 COPYRIGHT
113 Copyright (C) 2007-2008 Jeffrey Brian Arnold <jbarnold@mit.edu>
115 Copyright (C) 2008 Anders Kaseorg <andersk@mit.edu>,
116 Tim Abbott <tabbott@mit.edu>
118 This is free software and documentation. You can redistribute and/or modify it
119 under the terms of the GNU General Public License, version 2.
121 =cut