| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
# Copyright © 2008-2010 Raphaël Hertzog |
|
2
|
|
|
|
|
|
|
# |
|
3
|
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify |
|
4
|
|
|
|
|
|
|
# it under the terms of the GNU General Public License as published by |
|
5
|
|
|
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or |
|
6
|
|
|
|
|
|
|
# (at your option) any later version. |
|
7
|
|
|
|
|
|
|
# |
|
8
|
|
|
|
|
|
|
# This program is distributed in the hope that it will be useful, |
|
9
|
|
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10
|
|
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
11
|
|
|
|
|
|
|
# GNU General Public License for more details. |
|
12
|
|
|
|
|
|
|
# |
|
13
|
|
|
|
|
|
|
# You should have received a copy of the GNU General Public License |
|
14
|
|
|
|
|
|
|
# along with this program. If not, see . |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
package Dpkg::Compression::Process; |
|
17
|
|
|
|
|
|
|
|
|
18
|
19
|
|
|
19
|
|
133
|
use strict; |
|
|
19
|
|
|
|
|
36
|
|
|
|
19
|
|
|
|
|
571
|
|
|
19
|
19
|
|
|
19
|
|
112
|
use warnings; |
|
|
19
|
|
|
|
|
39
|
|
|
|
19
|
|
|
|
|
890
|
|
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
our $VERSION = '1.00'; |
|
22
|
|
|
|
|
|
|
|
|
23
|
19
|
|
|
19
|
|
113
|
use Carp; |
|
|
19
|
|
|
|
|
58
|
|
|
|
19
|
|
|
|
|
1092
|
|
|
24
|
|
|
|
|
|
|
|
|
25
|
19
|
|
|
19
|
|
131
|
use Dpkg::Compression; |
|
|
19
|
|
|
|
|
36
|
|
|
|
19
|
|
|
|
|
2031
|
|
|
26
|
19
|
|
|
19
|
|
141
|
use Dpkg::ErrorHandling; |
|
|
19
|
|
|
|
|
37
|
|
|
|
19
|
|
|
|
|
1554
|
|
|
27
|
19
|
|
|
19
|
|
134
|
use Dpkg::Gettext; |
|
|
19
|
|
|
|
|
40
|
|
|
|
19
|
|
|
|
|
1150
|
|
|
28
|
19
|
|
|
19
|
|
5888
|
use Dpkg::IPC; |
|
|
19
|
|
|
|
|
50
|
|
|
|
19
|
|
|
|
|
15545
|
|
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=encoding utf8 |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
=head1 NAME |
|
33
|
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
Dpkg::Compression::Process - run compression/decompression processes |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
This module provides an object oriented interface to run and manage |
|
39
|
|
|
|
|
|
|
compression/decompression processes. |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
=head1 METHODS |
|
42
|
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=over 4 |
|
44
|
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
=item $proc = Dpkg::Compression::Process->new(%opts) |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
Create a new instance of the object. Supported options are "compression" |
|
48
|
|
|
|
|
|
|
and "compression_level" (see corresponding set_* functions). |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=cut |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub new { |
|
53
|
154
|
|
|
154
|
1
|
439
|
my ($this, %args) = @_; |
|
54
|
154
|
|
33
|
|
|
726
|
my $class = ref($this) || $this; |
|
55
|
154
|
|
|
|
|
331
|
my $self = {}; |
|
56
|
154
|
|
|
|
|
346
|
bless $self, $class; |
|
57
|
154
|
|
33
|
|
|
803
|
$self->set_compression($args{compression} || compression_get_default()); |
|
58
|
|
|
|
|
|
|
$self->set_compression_level($args{compression_level} || |
|
59
|
154
|
|
33
|
|
|
808
|
compression_get_default_level()); |
|
60
|
154
|
|
|
|
|
583
|
return $self; |
|
61
|
|
|
|
|
|
|
} |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
=item $proc->set_compression($comp) |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
Select the compression method to use. It errors out if the method is not |
|
66
|
|
|
|
|
|
|
supported according to C (of |
|
67
|
|
|
|
|
|
|
B). |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=cut |
|
70
|
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
sub set_compression { |
|
72
|
168
|
|
|
168
|
1
|
423
|
my ($self, $method) = @_; |
|
73
|
168
|
50
|
|
|
|
602
|
error(g_('%s is not a supported compression method'), $method) |
|
74
|
|
|
|
|
|
|
unless compression_is_supported($method); |
|
75
|
168
|
|
|
|
|
514
|
$self->{compression} = $method; |
|
76
|
|
|
|
|
|
|
} |
|
77
|
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
=item $proc->set_compression_level($level) |
|
79
|
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
Select the compression level to use. It errors out if the level is not |
|
81
|
|
|
|
|
|
|
valid according to C (of |
|
82
|
|
|
|
|
|
|
B). |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=cut |
|
85
|
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
sub set_compression_level { |
|
87
|
154
|
|
|
154
|
1
|
334
|
my ($self, $level) = @_; |
|
88
|
154
|
50
|
|
|
|
466
|
error(g_('%s is not a compression level'), $level) |
|
89
|
|
|
|
|
|
|
unless compression_is_valid_level($level); |
|
90
|
154
|
|
|
|
|
556
|
$self->{compression_level} = $level; |
|
91
|
|
|
|
|
|
|
} |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=item @exec = $proc->get_compress_cmdline() |
|
94
|
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
=item @exec = $proc->get_uncompress_cmdline() |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
Returns a list ready to be passed to C, its first element is the |
|
98
|
|
|
|
|
|
|
program name (either for compression or decompression) and the following |
|
99
|
|
|
|
|
|
|
elements are parameters for the program. |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
When executed the program acts as a filter between its standard input |
|
102
|
|
|
|
|
|
|
and its standard output. |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=cut |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
sub get_compress_cmdline { |
|
107
|
9
|
|
|
9
|
1
|
18
|
my $self = shift; |
|
108
|
9
|
|
|
|
|
13
|
my @prog = (@{compression_get_property($self->{compression}, 'comp_prog')}); |
|
|
9
|
|
|
|
|
36
|
|
|
109
|
9
|
|
|
|
|
35
|
my $level = '-' . $self->{compression_level}; |
|
110
|
|
|
|
|
|
|
$level = '--' . $self->{compression_level} |
|
111
|
9
|
50
|
|
|
|
69
|
if $self->{compression_level} !~ m/^[1-9]$/; |
|
112
|
9
|
|
|
|
|
36
|
push @prog, $level; |
|
113
|
9
|
|
|
|
|
31
|
return @prog; |
|
114
|
|
|
|
|
|
|
} |
|
115
|
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
sub get_uncompress_cmdline { |
|
117
|
5
|
|
|
5
|
1
|
10
|
my $self = shift; |
|
118
|
5
|
|
|
|
|
10
|
return (@{compression_get_property($self->{compression}, 'decomp_prog')}); |
|
|
5
|
|
|
|
|
23
|
|
|
119
|
|
|
|
|
|
|
} |
|
120
|
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
sub _sanity_check { |
|
122
|
14
|
|
|
14
|
|
88
|
my ($self, %opts) = @_; |
|
123
|
|
|
|
|
|
|
# Check for proper cleaning before new start |
|
124
|
|
|
|
|
|
|
error(g_('Dpkg::Compression::Process can only start one subprocess at a time')) |
|
125
|
14
|
50
|
|
|
|
56
|
if $self->{pid}; |
|
126
|
|
|
|
|
|
|
# Check options |
|
127
|
14
|
|
|
|
|
36
|
my $to = my $from = 0; |
|
128
|
14
|
|
|
|
|
73
|
foreach my $thing (qw(file handle string pipe)) { |
|
129
|
56
|
100
|
|
|
|
149
|
$to++ if $opts{"to_$thing"}; |
|
130
|
56
|
100
|
|
|
|
146
|
$from++ if $opts{"from_$thing"}; |
|
131
|
|
|
|
|
|
|
} |
|
132
|
14
|
50
|
|
|
|
54
|
croak 'exactly one to_* parameter is needed' if $to != 1; |
|
133
|
14
|
50
|
|
|
|
37
|
croak 'exactly one from_* parameter is needed' if $from != 1; |
|
134
|
14
|
|
|
|
|
37
|
return %opts; |
|
135
|
|
|
|
|
|
|
} |
|
136
|
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
=item $proc->compress(%opts) |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
Starts a compressor program. You must indicate where it will read its |
|
140
|
|
|
|
|
|
|
uncompressed data from and where it will write its compressed data to. |
|
141
|
|
|
|
|
|
|
This is accomplished by passing one parameter C and one parameter |
|
142
|
|
|
|
|
|
|
C as accepted by B. |
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
You must call C after having called this method to |
|
145
|
|
|
|
|
|
|
properly close the sub-process (and verify that it exited without error). |
|
146
|
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
=cut |
|
148
|
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
sub compress { |
|
150
|
9
|
|
|
9
|
1
|
96
|
my ($self, %opts) = @_; |
|
151
|
|
|
|
|
|
|
|
|
152
|
9
|
|
|
|
|
64
|
$self->_sanity_check(%opts); |
|
153
|
9
|
|
|
|
|
51
|
my @prog = $self->get_compress_cmdline(); |
|
154
|
9
|
|
|
|
|
54
|
$opts{exec} = \@prog; |
|
155
|
9
|
|
|
|
|
76
|
$self->{cmdline} = "@prog"; |
|
156
|
9
|
|
|
|
|
64
|
$self->{pid} = spawn(%opts); |
|
157
|
7
|
50
|
|
|
|
422
|
delete $self->{pid} if $opts{to_string}; # wait_child already done |
|
158
|
|
|
|
|
|
|
} |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=item $proc->uncompress(%opts) |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
Starts a decompressor program. You must indicate where it will read its |
|
163
|
|
|
|
|
|
|
compressed data from and where it will write its uncompressed data to. |
|
164
|
|
|
|
|
|
|
This is accomplished by passing one parameter C and one parameter |
|
165
|
|
|
|
|
|
|
C as accepted by B. |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
You must call C after having called this method to |
|
168
|
|
|
|
|
|
|
properly close the sub-process (and verify that it exited without error). |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
=cut |
|
171
|
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
sub uncompress { |
|
173
|
5
|
|
|
5
|
1
|
58
|
my ($self, %opts) = @_; |
|
174
|
|
|
|
|
|
|
|
|
175
|
5
|
|
|
|
|
75
|
$self->_sanity_check(%opts); |
|
176
|
5
|
|
|
|
|
23
|
my @prog = $self->get_uncompress_cmdline(); |
|
177
|
5
|
|
|
|
|
33
|
$opts{exec} = \@prog; |
|
178
|
5
|
|
|
|
|
23
|
$self->{cmdline} = "@prog"; |
|
179
|
5
|
|
|
|
|
56
|
$self->{pid} = spawn(%opts); |
|
180
|
3
|
50
|
|
|
|
203
|
delete $self->{pid} if $opts{to_string}; # wait_child already done |
|
181
|
|
|
|
|
|
|
} |
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
=item $proc->wait_end_process(%opts) |
|
184
|
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
Call B to wait until the sub-process has exited |
|
186
|
|
|
|
|
|
|
and verify its return code. Any given option will be forwarded to |
|
187
|
|
|
|
|
|
|
the C function. Most notably you can use the "nocheck" option |
|
188
|
|
|
|
|
|
|
to verify the return code yourself instead of letting C do |
|
189
|
|
|
|
|
|
|
it for you. |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
=cut |
|
192
|
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
sub wait_end_process { |
|
194
|
129
|
|
|
129
|
1
|
630
|
my ($self, %opts) = @_; |
|
195
|
129
|
|
66
|
|
|
999
|
$opts{cmdline} //= $self->{cmdline}; |
|
196
|
129
|
100
|
|
|
|
459
|
wait_child($self->{pid}, %opts) if $self->{pid}; |
|
197
|
129
|
|
|
|
|
271
|
delete $self->{pid}; |
|
198
|
129
|
|
|
|
|
421
|
delete $self->{cmdline}; |
|
199
|
|
|
|
|
|
|
} |
|
200
|
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
=back |
|
202
|
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
=head1 CHANGES |
|
204
|
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
=head2 Version 1.00 (dpkg 1.15.6) |
|
206
|
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
Mark the module as public. |
|
208
|
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
=cut |
|
210
|
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
1; |