1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/usr/bin/perl
use lib qw(../../perl-install /usr/lib/libDrakX);
use common;
use interactive;
sub busy_pids_and_files() {
my @pids = grep { $_ ne $$ && /^(\d+)$/ } all('/proc');
map {
my @l1 = grep {
$_ && !m!^(/proc/|/dev/|pipe:|socket:)!;
} map { readlink($_) } "/proc/$_/exe", glob_("/proc/$_/fd/*");
my @l2 = grep { $_ } map { (split)[5] } cat_("/proc/$_/maps");
if (my @l = grep { m!^/image(_boot)?/! } @l1, @l2) {
my ($cmdline) = cat_("/proc/$_/cmdline") =~ /([^\0]*)/;
my $exe = readlink("/proc/$_/exe");
{ pid => $_, cmdline => $cmdline, exe => $exe, files => [ sort(uniq(@l)) ] };
} else {
();
}
} @pids;
}
sub remove_simple_daemons {
my (@busy) = @_;
my @auto_killed = grep { $_->{cmdline} =~ m!\bkdesud$|^kdeinit: kded$! } @busy or return @busy;
kill 15, map { $_->{pid} } @auto_killed;
sleep 1;
#- return updated list
busy_pids_and_files();
}
my $in = interactive->vnew;
if (my @busy = remove_simple_daemons(busy_pids_and_files())) {
{ #- log it
open(my $LOG, '| sudo sh -c "cat > /dev/tty3"');
print $LOG '*' x 80, "\n";
print $LOG join("\n", "$_->{exe} ($_->{cmdline}) =>", map { " $_" } @{$_->{files}}) . "\n" foreach @busy;
print $LOG '*' x 80, "\n";
}
my @progs = map {
my $s = $_->{cmdline};
$s =~ s!/.*/!!;
$s =~ s!^kdeinit:\s+(\S+).*!$1!;
$s =~ s!\s+--.*!!;
$s;
} @busy;
my $choice = 'quit';
my @l = my %l = (
kill => N("Kill those programs"),
keep => N("Run with no CDROM support"),
quit => N("Quit"),
);
$in->ask_from_({ ok => undef,
title => N("Busy files"),
messages => N("You can't use another CDROM when the following programs are running:
%s", join(", ", uniq(sort @progs))) },
[ { type => 'list', val => \$choice, list => first(list2kv(@l)), format => sub { $l{$_[0]} } } ]);
if ($choice eq 'quit') {
$in->exit;
} elsif ($choice eq 'keep') {
exec 'totem' or $in->exit;
} else {
kill 15, map { $_->{pid} } @busy;
sleep 2;
kill 9, map { $_->{pid} } @busy;
}
}
my %file2loop = do {
my $_w = $in->wait_message('', N("Copying to memory to allow removing the CDROM"));
`GIVE_LOOP=1 mdk_move_loop to_memory always always_i18n totem` =~ /(.*?)=(.*)/g;
};
ugtk2::gtkset_mousecursor_normal(); #- for restoring a normal in any case
ugtk2::flush();
my $totem_pid = $$;
if (my $pid = fork()) {
$ENV{MDKMOVE} = $pid;
exec 'totem';
} else {
exec 'sudo', 'mdk_behind_totem',
'--boot-loop', $file2loop{'live_tree_boot.clp'},
'--main-loop', $file2loop{'live_tree.clp'},
'--totem-pid', $totem_pid;
}
|