← Index
NYTProf Performance Profile   « line view »
For /usr/sbin/pkg_info
  Run on Fri Aug 4 10:15:59 2017
Reported on Fri Aug 4 10:16:18 2017

Filename/usr/libdata/perl5/OpenBSD/PackageRepository.pm
StatementsExecuted 67941 statements in 11.8s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
96822111.4s11.4sOpenBSD::PackageRepository::HTTPorFTP::::CORE:readlineOpenBSD::PackageRepository::HTTPorFTP::CORE:readline (opcode)
111237ms11.7sOpenBSD::PackageRepository::HTTPorFTP::::get_http_listOpenBSD::PackageRepository::HTTPorFTP::get_http_list
96722165.5ms82.5msOpenBSD::PackageRepository::::add_to_list OpenBSD::PackageRepository::add_to_list
193392158.8ms58.8msOpenBSD::PackageRepository::HTTPorFTP::::CORE:matchOpenBSD::PackageRepository::HTTPorFTP::CORE:match (opcode)
969914117.0ms17.0msOpenBSD::PackageRepository::::CORE:match OpenBSD::PackageRepository::CORE:match (opcode)
9658118.00ms8.00msOpenBSD::PackageRepository::HTTPorFTP::::CORE:substOpenBSD::PackageRepository::HTTPorFTP::CORE:subst (opcode)
2112.43ms11.9sOpenBSD::PackageRepository::::stemlist OpenBSD::PackageRepository::stemlist
2112.41ms11.7sOpenBSD::PackageRepository::::available OpenBSD::PackageRepository::available
1111.77ms3.62msOpenBSD::PackageRepository::::BEGIN@30 OpenBSD::PackageRepository::BEGIN@30
1111.62ms1.62msOpenBSD::PackageRepository::Local::::CORE:open_dir OpenBSD::PackageRepository::Local::CORE:open_dir (opcode)
1111.56ms1.88msOpenBSD::PackageLocator::::BEGIN@24.12 OpenBSD::PackageLocator::BEGIN@24.12
1111.11ms1.11msOpenBSD::PackageRepository::HTTPorFTP::::CORE:openOpenBSD::PackageRepository::HTTPorFTP::CORE:open (opcode)
111326µs2.22msOpenBSD::PackageRepository::Local::::list OpenBSD::PackageRepository::Local::list
111189µs1.30msOpenBSD::PackageRepository::HTTPorFTP::::open_read_ftpOpenBSD::PackageRepository::HTTPorFTP::open_read_ftp
111158µs392µsOpenBSD::PackageRepository::::parse_problems OpenBSD::PackageRepository::parse_problems
2011111µs111µsOpenBSD::PackageRepository::Local::::CORE:ftfile OpenBSD::PackageRepository::Local::CORE:ftfile (opcode)
311102µs6.06msOpenBSD::PackageRepository::::parse OpenBSD::PackageRepository::parse
211175µs75µsOpenBSD::PackageRepository::Local::::CORE:readdir OpenBSD::PackageRepository::Local::CORE:readdir (opcode)
11173µs73µsOpenBSD::PackageRepository::HTTPorFTP::::CORE:closeOpenBSD::PackageRepository::HTTPorFTP::CORE:close (opcode)
11171µs11.7sOpenBSD::PackageRepository::HTTPorFTP::::listOpenBSD::PackageRepository::HTTPorFTP::list
11161µs61µsOpenBSD::PackageRepository::::CORE:unlink OpenBSD::PackageRepository::CORE:unlink (opcode)
11152µs5.47msOpenBSD::PackageRepository::Distant::::parse_url OpenBSD::PackageRepository::Distant::parse_url
11152µs58µsOpenBSD::PackageRepository::::__ANON__[:86] OpenBSD::PackageRepository::__ANON__[:86]
61147µs72µsOpenBSD::PackageRepository::::relative_url OpenBSD::PackageRepository::relative_url
11140µs5.61msOpenBSD::PackageRepository::::parse_fullurl OpenBSD::PackageRepository::parse_fullurl
22137µs141µsOpenBSD::PackageRepository::::unique OpenBSD::PackageRepository::unique
21136µs36µsOpenBSD::PackageRepository::::CORE:regcomp OpenBSD::PackageRepository::CORE:regcomp (opcode)
11136µs176µsOpenBSD::PackageRepository::Local::::parse_fullurl OpenBSD::PackageRepository::Local::parse_fullurl
11132µs42µsOpenBSD::PackageRepository::::make_room OpenBSD::PackageRepository::make_room
11128µs28µsOpenBSD::PackageRepository::HTTPorFTP::::CORE:waitpidOpenBSD::PackageRepository::HTTPorFTP::CORE:waitpid (opcode)
11126µs26µsOpenBSD::PackageRepository::::CORE:open OpenBSD::PackageRepository::CORE:open (opcode)
11122µs123µsOpenBSD::PackageRepository::HTTPorFTP::::close_read_ftpOpenBSD::PackageRepository::HTTPorFTP::close_read_ftp
41120µs20µsOpenBSD::PackageRepository::Distant::::baseurl OpenBSD::PackageRepository::Distant::baseurl
11117µs21µsOpenBSD::PackageLocator::::BEGIN@18.10 OpenBSD::PackageLocator::BEGIN@18.10
11116µs73µsOpenBSD::PackageRepository::::END OpenBSD::PackageRepository::END
21116µs16µsOpenBSD::PackageRepository::::CORE:substcont OpenBSD::PackageRepository::CORE:substcont (opcode)
11114µs11.7sOpenBSD::PackageRepository::HTTP::::obtain_list OpenBSD::PackageRepository::HTTP::obtain_list
52113µs13µsOpenBSD::PackageRepository::HTTP::::urlscheme OpenBSD::PackageRepository::HTTP::urlscheme
31113µs13µsOpenBSD::PackageRepository::::CORE:subst OpenBSD::PackageRepository::CORE:subst (opcode)
11112µs34µsOpenBSD::PackageRepository::::BEGIN@117 OpenBSD::PackageRepository::BEGIN@117
11112µs87µsOpenBSD::PackageRepository::Local::::BEGIN@454 OpenBSD::PackageRepository::Local::BEGIN@454
32111µs11µsOpenBSD::PackageRepository::::baseurl OpenBSD::PackageRepository::baseurl
11110µs11µsOpenBSD::PackageRepository::Local::::pkg_db OpenBSD::PackageRepository::Local::pkg_db
11110µs17µsOpenBSD::PackageLocator::::BEGIN@19.11 OpenBSD::PackageLocator::BEGIN@19.11
1119µs75µsOpenBSD::PackageRepository::::BEGIN@32 OpenBSD::PackageRepository::BEGIN@32
4118µs8µsOpenBSD::PackageRepository::::CORE:readline OpenBSD::PackageRepository::CORE:readline (opcode)
1117µs7µsOpenBSD::PackageRepository::HTTPorFTP::::openedOpenBSD::PackageRepository::HTTPorFTP::opened
1116µs6µsOpenBSD::PackageRepository::Local::::BEGIN@471 OpenBSD::PackageRepository::Local::BEGIN@471
1116µs6µsOpenBSD::PackageRepository::::BEGIN@31 OpenBSD::PackageRepository::BEGIN@31
2116µs6µsOpenBSD::PackageRepository::::cleanup OpenBSD::PackageRepository::cleanup
3216µs6µsOpenBSD::PackageRepository::Local::::urlscheme OpenBSD::PackageRepository::Local::urlscheme
1115µs5µsOpenBSD::PackageRepository::::BEGIN@33 OpenBSD::PackageRepository::BEGIN@33
1114µs4µsOpenBSD::PackageRepository::::CORE:close OpenBSD::PackageRepository::CORE:close (opcode)
2214µs4µsOpenBSD::PackageLocator::::CORE:subst OpenBSD::PackageLocator::CORE:subst (opcode)
1114µs4µsOpenBSD::PackageRepository::::can_be_empty OpenBSD::PackageRepository::can_be_empty
2213µs3µsOpenBSD::PackageRepository::HTTPorFTP::::maxcountOpenBSD::PackageRepository::HTTPorFTP::maxcount
1112µs2µsOpenBSD::PackageRepository::Distant::::CORE:match OpenBSD::PackageRepository::Distant::CORE:match (opcode)
1112µs2µsOpenBSD::PackageRepository::::file OpenBSD::PackageRepository::file (xsub)
1111µs1µsOpenBSD::PackageRepository::::http OpenBSD::PackageRepository::http (xsub)
111800ns800nsOpenBSD::PackageRepository::Local::::CORE:close OpenBSD::PackageRepository::Local::CORE:close (opcode)
0000s0sOpenBSD::PackageRepository::Distant::::__ANON__[:616] OpenBSD::PackageRepository::Distant::__ANON__[:616]
0000s0sOpenBSD::PackageRepository::Distant::::finish_and_close OpenBSD::PackageRepository::Distant::finish_and_close
0000s0sOpenBSD::PackageRepository::Distant::::open_pipe OpenBSD::PackageRepository::Distant::open_pipe
0000s0sOpenBSD::PackageRepository::Distant::::pkg_copy OpenBSD::PackageRepository::Distant::pkg_copy
0000s0sOpenBSD::PackageRepository::FTP::::_list OpenBSD::PackageRepository::FTP::_list
0000s0sOpenBSD::PackageRepository::FTP::::get_ftp_list OpenBSD::PackageRepository::FTP::get_ftp_list
0000s0sOpenBSD::PackageRepository::FTP::::obtain_list OpenBSD::PackageRepository::FTP::obtain_list
0000s0sOpenBSD::PackageRepository::FTP::::urlscheme OpenBSD::PackageRepository::FTP::urlscheme
0000s0sOpenBSD::PackageRepository::HTTPS::::urlscheme OpenBSD::PackageRepository::HTTPS::urlscheme
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::__ANON__[:876]OpenBSD::PackageRepository::HTTPorFTP::__ANON__[:876]
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::__ANON__[:886]OpenBSD::PackageRepository::HTTPorFTP::__ANON__[:886]
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::drop_privileges_and_setup_envOpenBSD::PackageRepository::HTTPorFTP::drop_privileges_and_setup_env
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::findOpenBSD::PackageRepository::HTTPorFTP::find
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::grabPlistOpenBSD::PackageRepository::HTTPorFTP::grabPlist
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::grab_objectOpenBSD::PackageRepository::HTTPorFTP::grab_object
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::should_haveOpenBSD::PackageRepository::HTTPorFTP::should_have
0000s0sOpenBSD::PackageRepository::HTTPorFTP::::try_until_successOpenBSD::PackageRepository::HTTPorFTP::try_until_success
0000s0sOpenBSD::PackageRepository::Local::::is_local_file OpenBSD::PackageRepository::Local::is_local_file
0000s0sOpenBSD::PackageRepository::Local::::maxcount OpenBSD::PackageRepository::Local::maxcount
0000s0sOpenBSD::PackageRepository::Local::::may_copy OpenBSD::PackageRepository::Local::may_copy
0000s0sOpenBSD::PackageRepository::Local::::may_exist OpenBSD::PackageRepository::Local::may_exist
0000s0sOpenBSD::PackageRepository::Local::::open_pipe OpenBSD::PackageRepository::Local::open_pipe
0000s0sOpenBSD::PackageRepository::Local::::opened OpenBSD::PackageRepository::Local::opened
0000s0sOpenBSD::PackageRepository::::__ANON__[:212] OpenBSD::PackageRepository::__ANON__[:212]
0000s0sOpenBSD::PackageRepository::::check_signed OpenBSD::PackageRepository::check_signed
0000s0sOpenBSD::PackageRepository::::close OpenBSD::PackageRepository::close
0000s0sOpenBSD::PackageRepository::::did_it_fork OpenBSD::PackageRepository::did_it_fork
0000s0sOpenBSD::PackageRepository::::dont_cleanup OpenBSD::PackageRepository::dont_cleanup
0000s0sOpenBSD::PackageRepository::::find OpenBSD::PackageRepository::find
0000s0sOpenBSD::PackageRepository::::grabPlist OpenBSD::PackageRepository::grabPlist
0000s0sOpenBSD::PackageRepository::::make_error_file OpenBSD::PackageRepository::make_error_file
0000s0sOpenBSD::PackageRepository::::may_exist OpenBSD::PackageRepository::may_exist
0000s0sOpenBSD::PackageRepository::::new OpenBSD::PackageRepository::new
0000s0sOpenBSD::PackageRepository::::open OpenBSD::PackageRepository::open
0000s0sOpenBSD::PackageRepository::::opened OpenBSD::PackageRepository::opened
0000s0sOpenBSD::PackageRepository::::signify_pipe OpenBSD::PackageRepository::signify_pipe
0000s0sOpenBSD::PackageRepository::::uncompress OpenBSD::PackageRepository::uncompress
0000s0sOpenBSD::PackageRepository::::wipe_info OpenBSD::PackageRepository::wipe_info
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1# ex:ts=8 sw=4:
2# $OpenBSD: PackageRepository.pm,v 1.146 2017/08/04 11:53:03 sthen Exp $
3#
4# Copyright (c) 2003-2010 Marc Espie <espie@openbsd.org>
5#
6# Permission to use, copy, modify, and distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18234µs225µs
# spent 21µs (17+4) within OpenBSD::PackageLocator::BEGIN@18.10 which was called: # once (17µs+4µs) by OpenBSD::PackageLocator::BEGIN@24 at line 18
use strict;
# spent 21µs making 1 call to OpenBSD::PackageLocator::BEGIN@18.10 # spent 4µs making 1 call to strict::import
19227µs224µs
# spent 17µs (10+7) within OpenBSD::PackageLocator::BEGIN@19.11 which was called: # once (10µs+7µs) by OpenBSD::PackageLocator::BEGIN@24 at line 19
use warnings;
# spent 17µs making 1 call to OpenBSD::PackageLocator::BEGIN@19.11 # spent 7µs making 1 call to warnings::import
20
21# XXX load extra class, grab match from Base class, and tweak inheritance
22# to get all methods.
23
242188µs11.88ms
# spent 1.88ms (1.56+311µs) within OpenBSD::PackageLocator::BEGIN@24.12 which was called: # once (1.56ms+311µs) by OpenBSD::PackageLocator::BEGIN@24 at line 24
use OpenBSD::PackageRepository::Installed;
# spent 1.88ms making 1 call to OpenBSD::PackageLocator::BEGIN@24.12
2511µs$OpenBSD::PackageRepository::Installed::ISA = qw(OpenBSD::PackageRepository);
26
27package OpenBSD::PackageRepository;
2817µsour @ISA=(qw(OpenBSD::PackageRepositoryBase));
29
302140µs13.62ms
# spent 3.62ms (1.77+1.85) within OpenBSD::PackageRepository::BEGIN@30 which was called: # once (1.77ms+1.85ms) by OpenBSD::PackageLocator::BEGIN@24 at line 30
use OpenBSD::PackageLocation;
# spent 3.62ms making 1 call to OpenBSD::PackageRepository::BEGIN@30
31225µs16µs
# spent 6µs within OpenBSD::PackageRepository::BEGIN@31 which was called: # once (6µs+0s) by OpenBSD::PackageLocator::BEGIN@24 at line 31
use OpenBSD::Paths;
# spent 6µs making 1 call to OpenBSD::PackageRepository::BEGIN@31
32227µs2141µs
# spent 75µs (9+66) within OpenBSD::PackageRepository::BEGIN@32 which was called: # once (9µs+66µs) by OpenBSD::PackageLocator::BEGIN@24 at line 32
use OpenBSD::Error;
# spent 75µs making 1 call to OpenBSD::PackageRepository::BEGIN@32 # spent 66µs making 1 call to Exporter::import
332395µs15µs
# spent 5µs within OpenBSD::PackageRepository::BEGIN@33 which was called: # once (5µs+0s) by OpenBSD::PackageLocator::BEGIN@24 at line 33
use OpenBSD::Temp;
# spent 5µs making 1 call to OpenBSD::PackageRepository::BEGIN@33
34
35sub make_error_file
36{
37 my ($self, $object) = @_;
38 $object->{errors} = OpenBSD::Temp->file;
39 if (!defined $object->{errors}) {
40 $self->{state}->fatal("#1 not writable",
41 $OpenBSD::Temp::tempbase);
42 }
43}
44
45sub baseurl
46
# spent 11µs within OpenBSD::PackageRepository::baseurl which was called 3 times, avg 4µs/call: # 2 times (5µs+0s) by OpenBSD::PackageRepository::relative_url at line 374, avg 3µs/call # once (6µs+0s) by OpenBSD::PackageRepository::Local::list at line 558
{
4732µs my $self = shift;
48
49312µs return $self->{path};
50}
51
52sub new
53{
54 my ($class, $baseurl, $state) = @_;
55 my $o = $class->parse(\$baseurl, $state);
56 if ($baseurl ne '') {
57 return undef;
58 }
59 return $o;
60}
61
62sub can_be_empty
63
# spent 4µs within OpenBSD::PackageRepository::can_be_empty which was called: # once (4µs+0s) by OpenBSD::PackageRepository::Local::parse_fullurl at line 486
{
641900ns my $self = shift;
6511µs $self->{empty_okay} = 1;
6614µs return $self;
67}
68
6911µsmy $cache = {};
70
71sub unique
72
# spent 141µs (37+104) within OpenBSD::PackageRepository::unique which was called 2 times, avg 70µs/call: # once (22µs+60µs) by OpenBSD::PackageRepository::parse_fullurl at line 98 # once (15µs+44µs) by OpenBSD::PackageRepository::Local::parse_fullurl at line 489
{
7322µs my ($class, $o) = @_;
7422µs return $o unless defined $o;
75215µs269µs if (defined $cache->{$o->url}) {
# spent 69µs making 2 calls to OpenBSD::PackageRepositoryBase::url, avg 34µs/call
76 return $cache->{$o->url};
77 }
7826µs235µs $cache->{$o->url} = $o;
# spent 35µs making 2 calls to OpenBSD::PackageRepositoryBase::url, avg 18µs/call
7927µs return $o;
80}
81
82
# spent 58µs (52+6) within OpenBSD::PackageRepository::__ANON__[/usr/libdata/perl5/OpenBSD/PackageRepository.pm:86] which was called: # once (52µs+6µs) by OpenBSD::PackageRepository::END at line 88
my $cleanup = sub {
83115µs for my $repo (values %$cache) {
84232µs26µs $repo->cleanup;
# spent 6µs making 2 calls to OpenBSD::PackageRepository::cleanup, avg 3µs/call
85 }
8613µs};
87
# spent 73µs (16+58) within OpenBSD::PackageRepository::END which was called: # once (16µs+58µs) by main::RUNTIME at line 0 of /usr/sbin/pkg_info
END {
88111µs158µs &$cleanup;
89}
90
9114µs15µsOpenBSD::Handler->register($cleanup);
# spent 5µs making 1 call to OpenBSD::Handler::register
92
93sub parse_fullurl
94
# spent 5.61ms (40µs+5.57) within OpenBSD::PackageRepository::parse_fullurl which was called: # once (40µs+5.57ms) by OpenBSD::PackageRepository::parse at line 126
{
9511µs my ($class, $r, $state) = @_;
96
9715µs121µs $class->strip_urlscheme($r) or return undef;
# spent 21µs making 1 call to OpenBSD::PackageRepositoryBase::strip_urlscheme
98134µs25.55ms return $class->unique($class->parse_url($r, $state));
# spent 5.47ms making 1 call to OpenBSD::PackageRepository::Distant::parse_url # spent 82µs making 1 call to OpenBSD::PackageRepository::unique
99}
100
101sub dont_cleanup
102{
103}
104
105sub ftp() { 'OpenBSD::PackageRepository::FTP' }
106sub http() { 'OpenBSD::PackageRepository::HTTP' }
107sub https() { 'OpenBSD::PackageRepository::HTTPS' }
108sub scp() { 'OpenBSD::PackageRepository::SCP' }
109sub file() { 'OpenBSD::PackageRepository::Local' }
110sub installed() { 'OpenBSD::PackageRepository::Installed' }
111
112sub parse
113
# spent 6.06ms (102µs+5.96) within OpenBSD::PackageRepository::parse which was called 3 times, avg 2.02ms/call: # 3 times (102µs+5.96ms) by OpenBSD::PackageLocator::add_default at line 50 of OpenBSD/PackageLocator.pm, avg 2.02ms/call
{
11433µs my ($class, $r, $state) = @_;
115
116 {
11751.93ms256µs
# spent 34µs (12+22) within OpenBSD::PackageRepository::BEGIN@117 which was called: # once (12µs+22µs) by OpenBSD::PackageLocator::BEGIN@24 at line 117
no warnings qw(uninitialized); # in case installpath is empty
# spent 34µs making 1 call to OpenBSD::PackageRepository::BEGIN@117 # spent 22µs making 1 call to warnings::unimport
118354µs6154µs $$r =~ s/^installpath(\:|$)/$state->installpath.$1/e;
# spent 126µs making 1 call to OpenBSD::Auto::__ANON__[OpenBSD/Error.pm:28] # spent 16µs making 2 calls to OpenBSD::PackageRepository::CORE:substcont, avg 8µs/call # spent 13µs making 3 calls to OpenBSD::PackageRepository::CORE:subst, avg 4µs/call
119 }
120
12135µs my $u = $$r;
12235µs return undef if $u eq '';
123
124
125
126247µs105.62ms if ($u =~ m/^ftp\:/io) {
# spent 5.61ms making 1 call to OpenBSD::PackageRepository::parse_fullurl # spent 8µs making 8 calls to OpenBSD::PackageRepository::CORE:match, avg 1µs/call # spent 1µs making 1 call to OpenBSD::PackageRepository::http
127 return $class->ftp->parse_fullurl($r, $state);
128 } elsif ($u =~ m/^http\:/io) {
129# require OpenBSD::PackageRepository::HTTP;
130
131 return $class->http->parse_fullurl($r, $state);
132 } elsif ($u =~ m/^https\:/io) {
133 return $class->https->parse_fullurl($r, $state);
134 } elsif ($u =~ m/^scp\:/io) {
135 return undef if $state->defines("NO_SCP");
136
137 require OpenBSD::PackageRepository::SCP;
138
139 return $class->scp->parse_fullurl($r, $state);
140 } elsif ($u =~ m/^file\:/io) {
141 return $class->file->parse_fullurl($r, $state);
142 } elsif ($u =~ m/^inst\:$/io) {
143 return $class->installed->parse_fullurl($r, $state);
144 } else {
14514µs1700ns if ($$r =~ m/^([a-z0-9][a-z0-9.]+\.[a-z0-9.]+)(\:|$)/
# spent 700ns making 1 call to OpenBSD::PackageRepository::CORE:match
146 && !-d $1) {
147 $$r =~ s//http:\/\/$1\/%m$2/;
148 return $class->http->parse_fullurl($r, $state);
149 }
150114µs2177µs return $class->file->parse_fullurl($r, $state);
# spent 176µs making 1 call to OpenBSD::PackageRepository::Local::parse_fullurl # spent 2µs making 1 call to OpenBSD::PackageRepository::file
151 }
152}
153
154sub available
155
# spent 11.7s (2.41ms+11.7) within OpenBSD::PackageRepository::available which was called 2 times, avg 5.87s/call: # 2 times (2.41ms+11.7s) by OpenBSD::PackageRepository::stemlist at line 166, avg 5.87s/call
{
15622µs my $self = shift;
157
15822.40ms211.7s return @{$self->list};
# spent 11.7s making 1 call to OpenBSD::PackageRepository::HTTPorFTP::list # spent 2.22ms making 1 call to OpenBSD::PackageRepository::Local::list
159}
160
161sub stemlist
162
# spent 11.9s (2.43ms+11.9) within OpenBSD::PackageRepository::stemlist which was called 2 times, avg 5.94s/call: # 2 times (2.43ms+11.9s) by OpenBSD::Search::PartialStem::match at line 166 of OpenBSD/Search.pm, avg 5.94s/call
{
16322µs my $self = shift;
16424µs if (!defined $self->{stemlist}) {
16522µs require OpenBSD::PackageName;
16622.02ms211.7s my @l = $self->available;
# spent 11.7s making 2 calls to OpenBSD::PackageRepository::available, avg 5.87s/call
16724µs if (@l == 0 && !$self->{empty_okay}) {
168 $self->{state}->errsay("#1: #2", $self->url,
169 $self->{no_such_dir} ? "no such dir" : "empty");
170 }
1712463µs2137ms $self->{stemlist} = OpenBSD::PackageName::avail2stems(@l);
# spent 137ms making 2 calls to OpenBSD::PackageName::avail2stems, avg 68.3ms/call
172 }
173214µs return $self->{stemlist};
174}
175
176sub wipe_info
177{
178 my ($self, $pkg) = @_;
179
180 require File::Path;
181
182 my $dir = $pkg->{dir};
183 if (defined $dir) {
184 OpenBSD::Error->rmtree($dir);
185 OpenBSD::Temp->reclaim($dir);
186 delete $pkg->{dir};
187 }
188}
189
190# by default, all objects may exist
191sub may_exist
192{
193 return 1;
194}
195
196# by default, we don't track opened files for this key
197
198sub opened
199{
200 undef;
201}
202
203# hint: 0 premature close, 1 real error. undef, normal !
204
205sub close
206{
207 my ($self, $object, $hint) = @_;
208 close($object->{fh}) if defined $object->{fh};
209 if (defined $object->{pid2}) {
210 local $SIG{ALRM} = sub {
211 kill HUP => $object->{pid2};
212 };
213 alarm(30);
214 waitpid($object->{pid2}, 0);
215 alarm(0);
216 }
217 $self->parse_problems($object->{errors}, $hint, $object)
218 if defined $object->{errors};
219 undef $object->{errors};
220 $object->deref;
221}
222
223sub make_room
224
# spent 42µs (32+10) within OpenBSD::PackageRepository::make_room which was called: # once (32µs+10µs) by OpenBSD::PackageRepository::HTTPorFTP::list at line 893
{
2251800ns my $self = shift;
226
227 # kill old files if too many
22817µs17µs my $already = $self->opened;
# spent 7µs making 1 call to OpenBSD::PackageRepository::HTTPorFTP::opened
22912µs if (defined $already) {
230 # gc old objects
23114µs12µs if (@$already >= $self->maxcount) {
232 @$already = grep { defined $_->{fh} } @$already;
233 }
23414µs12µs while (@$already >= $self->maxcount) {
235 my $o = shift @$already;
236 $self->close_now($o);
237 }
238 }
23917µs return $already;
240}
241
242# open method that tracks opened files per-host.
243sub open
244{
245 my ($self, $object) = @_;
246
247 return unless $self->may_exist($object->{name});
248
249 # kill old files if too many
250 my $already = $self->make_room;
251 local $SIG{'PIPE'} = 'DEFAULT';
252 my $fh = $self->open_pipe($object);
253 if (!defined $fh) {
254 return;
255 }
256 $object->{fh} = $fh;
257 if (defined $already) {
258 push @$already, $object;
259 }
260 return $fh;
261}
262
263sub find
264{
265 my ($repository, $name) = @_;
266 my $self = $repository->new_location($name);
267
268 if ($self->contents) {
269 return $self;
270 }
271}
272
273sub grabPlist
274{
275 my ($repository, $name, $code) = @_;
276 my $self = $repository->new_location($name);
277
278 return $self->grabPlist($code);
279}
280
281sub parse_problems
282
# spent 392µs (158+234) within OpenBSD::PackageRepository::parse_problems which was called: # once (158µs+234µs) by OpenBSD::PackageRepository::HTTPorFTP::list at line 900
{
28311µs my ($self, $filename, $hint, $object) = @_;
284137µs126µs CORE::open(my $fh, '<', $filename) or return;
# spent 26µs making 1 call to OpenBSD::PackageRepository::CORE:open
285
286110µs143µs my $baseurl = $self->url;
# spent 43µs making 1 call to OpenBSD::PackageRepositoryBase::url
2871800ns my $url = $baseurl;
28811µs if (defined $object) {
289 $url = $object->url;
290 }
2911900ns my $notyet = 1;
2921800ns my $broken = 0;
2931600ns my $signify_error = 0;
29414µs $self->{last_error} = 0;
295122µs48µs while(<$fh>) {
# spent 8µs making 4 calls to OpenBSD::PackageRepository::CORE:readline, avg 2µs/call
296314µs37µs next if m/^(?:200|220|221|226|229|230|227|250|331|500|150)[\s\-]/o;
# spent 7µs making 3 calls to OpenBSD::PackageRepository::CORE:match, avg 2µs/call
297314µs32µs next if m/^EPSV command not understood/o;
# spent 2µs making 3 calls to OpenBSD::PackageRepository::CORE:match, avg 700ns/call
298318µs39µs next if m/^Trying [\da-f\.\:]+\.\.\./o;
# spent 9µs making 3 calls to OpenBSD::PackageRepository::CORE:match, avg 3µs/call
299259µs438µs next if m/^Requesting \Q$baseurl\E/;
# spent 36µs making 2 calls to OpenBSD::PackageRepository::CORE:regcomp, avg 18µs/call # spent 2µs making 2 calls to OpenBSD::PackageRepository::CORE:match, avg 950ns/call
300113µs110µs next if m/^Remote system type is\s+/o;
# spent 10µs making 1 call to OpenBSD::PackageRepository::CORE:match
30116µs1900ns next if m/^Connected to\s+/o;
# spent 900ns making 1 call to OpenBSD::PackageRepository::CORE:match
30214µs1800ns next if m/^remote\:\s+/o;
# spent 800ns making 1 call to OpenBSD::PackageRepository::CORE:match
30314µs1900ns next if m/^Using binary mode to transfer files/o;
# spent 900ns making 1 call to OpenBSD::PackageRepository::CORE:match
30414µs1800ns next if m/^Retrieving\s+/o;
# spent 800ns making 1 call to OpenBSD::PackageRepository::CORE:match
30515µs11µs next if m/^Success?fully retrieved file/o;
# spent 1µs making 1 call to OpenBSD::PackageRepository::CORE:match
30616µs12µs next if m/^\d+\s+bytes\s+received\s+in/o;
# spent 2µs making 1 call to OpenBSD::PackageRepository::CORE:match
307 next if m/^ftp: connect to address.*: No route to host/o;
308 if (m/^ftp: Writing -: Broken pipe/o) {
309 $broken = 1;
310 next;
311 }
312 # http error
313 if (m/^ftp: Error retrieving file: 404/o) {
314 if (!defined $object) {
315 $self->{no_such_dir} = 1;
316 next;
317 } else {
318 $self->{lasterror} = 404;
319 }
320 # ignore errors for stable packages
321 next if $self->can_be_empty;
322 }
323
324 if (defined $hint && $hint == 0) {
325 next if m/^ftp: -: short write/o;
326 next if m/^ftp: local: -: Broken pipe/o;
327 next if m/^421\s+/o;
328 }
329 # not retrieving the file => always the same message
330 # so it's superfluous
331 next if m/^signify:/ && $self->{lasterror};
332 if ($notyet) {
333 $self->{state}->errprint("#1: ", $url);
334 if (defined $object) {
335 $object->{error_reported} = 1;
336 }
337 $notyet = 0;
338 }
339 if (m/^signify:/) {
340 $signify_error = 1;
341 s/.*unsigned .*archive.*/unsigned package (signify(1) doesn't see old-style signatures)/;
342 }
343 if (m/^421\s+/o ||
344 m/^ftp: connect: Connection timed out/o ||
345 m/^ftp: Can't connect or login to host/o) {
346 $self->{lasterror} = 421;
347 }
348 if (m/^550\s+/o) {
349 $self->{lasterror} = 550;
350 }
351 $self->{state}->errprint("#1", $_);
352 }
3531800ns if ($broken) {
354 unless ($signify_error || defined $hint && $hint == 0) {
355 $self->{state}->errprint('#1', "ftp: Broken pipe");
356 }
357 }
358113µs14µs CORE::close($fh);
# spent 4µs making 1 call to OpenBSD::PackageRepository::CORE:close
359120µs119µs OpenBSD::Temp->reclaim($filename);
# spent 19µs making 1 call to OpenBSD::Temp::reclaim
360184µs161µs unlink $filename;
# spent 61µs making 1 call to OpenBSD::PackageRepository::CORE:unlink
361}
362
363sub cleanup
364214µs
# spent 6µs within OpenBSD::PackageRepository::cleanup which was called 2 times, avg 3µs/call: # 2 times (6µs+0s) by OpenBSD::PackageRepository::__ANON__[/usr/libdata/perl5/OpenBSD/PackageRepository.pm:86] at line 84, avg 3µs/call
{
365 # nothing to do
366}
367
368sub relative_url
369
# spent 72µs (47+25) within OpenBSD::PackageRepository::relative_url which was called 6 times, avg 12µs/call: # 6 times (47µs+25µs) by OpenBSD::PackageRepositoryBase::url at line 122 of OpenBSD/PackageRepository/Installed.pm, avg 12µs/call
{
37065µs my ($self, $name) = @_;
37165µs if (defined $name) {
372 return $self->baseurl.$name.".tgz";
373 } else {
374637µs625µs return $self->baseurl;
# spent 20µs making 4 calls to OpenBSD::PackageRepository::Distant::baseurl, avg 5µs/call # spent 5µs making 2 calls to OpenBSD::PackageRepository::baseurl, avg 3µs/call
375 }
376}
377
378sub add_to_list
379
# spent 82.5ms (65.5+17.0) within OpenBSD::PackageRepository::add_to_list which was called 9672 times, avg 9µs/call: # 9658 times (65.4ms+17.0ms) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 919, avg 9µs/call # 14 times (66µs+16µs) by OpenBSD::PackageRepository::Local::list at line 562, avg 6µs/call
{
38096729.15ms my ($self, $list, $filename) = @_;
3819672114ms967217.0ms if ($filename =~ m/^(.*\-\d.*)\.tgz$/o) {
# spent 17.0ms making 9672 calls to OpenBSD::PackageRepository::CORE:match, avg 2µs/call
382 push(@$list, $1);
383 }
384}
385
386sub did_it_fork
387{
388 my ($self, $pid) = @_;
389 if (!defined $pid) {
390 $self->{state}->fatal("Cannot fork: #1", $!);
391 }
392 if ($pid == 0) {
393 delete $SIG{'WINCH'};
394 delete $SIG{'CONT'};
395 delete $SIG{'INFO'};
396 }
397}
398
399sub uncompress
400{
401 my $self = shift;
402 my $object = shift;
403 require IO::Uncompress::Gunzip;
404 my $fh = IO::Uncompress::Gunzip->new(@_, MultiStream => 1);
405 my $result = "";
406 if ($object->{is_signed}) {
407 my $h = $fh->getHeaderInfo;
408 if ($h) {
409 for my $line (split /\n/, $h->{Comment}) {
410 if ($line =~ m/^key=.*\/(.*)\.sec$/) {
411 $result .= "\@signer $1\n";
412 } elsif ($line =~ m/^date=(.*)$/) {
413 $result .= "\@digital-signature signify2:$1:external\n";
414 }
415 }
416 } else {
417 $fh->close;
418 return undef;
419 }
420 }
421 $object->{extra_content} = $result;
422 return $fh;
423}
424
425sub signify_pipe
426{
427 my $self = shift;
428 my $object = shift;
429 CORE::open STDERR, ">>", $object->{errors};
430 exec {OpenBSD::Paths->signify}
431 ("signify",
432 "-zV",
433 @_)
434 or $self->{state}->fatal("Can't run #1: #2",
435 OpenBSD::Paths->signify, $!);
436}
437
438sub check_signed
439{
440 my ($self, $object) = @_;
441 if ($object->{repository}{trusted}) {
442 return 0;
443 }
444 if ($self->{state}{signature_style} eq 'new') {
445 $object->{is_signed} = 1;
446 return 1;
447 } else {
448 return 0;
449 }
450}
451
452package OpenBSD::PackageRepository::Local;
45315µsour @ISA=qw(OpenBSD::PackageRepository);
454274µs2162µs
# spent 87µs (12+75) within OpenBSD::PackageRepository::Local::BEGIN@454 which was called: # once (12µs+75µs) by OpenBSD::PackageLocator::BEGIN@24 at line 454
use OpenBSD::Error;
# spent 87µs making 1 call to OpenBSD::PackageRepository::Local::BEGIN@454 # spent 75µs making 1 call to Exporter::import
455
456sub is_local_file
457{
458 return 1;
459}
460
461sub urlscheme
462
# spent 6µs within OpenBSD::PackageRepository::Local::urlscheme which was called 3 times, avg 2µs/call: # 2 times (4µs+0s) by OpenBSD::PackageRepositoryBase::url at line 122 of OpenBSD/PackageRepository/Installed.pm, avg 2µs/call # once (2µs+0s) by OpenBSD::PackageRepositoryBase::strip_urlscheme at line 100 of OpenBSD/PackageRepository/Installed.pm
{
463311µs return 'file';
464}
465
4661600nsmy $pkg_db;
467
468sub pkg_db
469
# spent 11µs (10+1) within OpenBSD::PackageRepository::Local::pkg_db which was called: # once (10µs+1µs) by OpenBSD::PackageRepository::Local::parse_fullurl at line 483
{
47011µs if (!defined $pkg_db) {
47122.72ms16µs
# spent 6µs within OpenBSD::PackageRepository::Local::BEGIN@471 which was called: # once (6µs+0s) by OpenBSD::PackageLocator::BEGIN@24 at line 471
use OpenBSD::Paths;
# spent 6µs making 1 call to OpenBSD::PackageRepository::Local::BEGIN@471
47218µs11µs $pkg_db = $ENV{"PKG_DBDIR"} || OpenBSD::Paths->pkgdb;
# spent 1µs making 1 call to OpenBSD::Paths::pkgdb
473 }
47414µs return $pkg_db;
475}
476
477sub parse_fullurl
478
# spent 176µs (36+139) within OpenBSD::PackageRepository::Local::parse_fullurl which was called: # once (36µs+139µs) by OpenBSD::PackageRepository::parse at line 150
{
4791800ns my ($class, $r, $state) = @_;
480
48116µs136µs my $ok = $class->strip_urlscheme($r);
# spent 36µs making 1 call to OpenBSD::PackageRepositoryBase::strip_urlscheme
48214µs130µs my $o = $class->parse_url($r, $state);
# spent 30µs making 1 call to OpenBSD::PackageRepositoryBase::parse_url
48316µs111µs if (!$ok && $o->{path} eq $class->pkg_db."/") {
# spent 11µs making 1 call to OpenBSD::PackageRepository::Local::pkg_db
484 return $class->installed->new(0, $state);
485 } else {
48614µs14µs if ($o->{path} eq './') {
# spent 4µs making 1 call to OpenBSD::PackageRepository::can_be_empty
487 $o->can_be_empty;
488 }
48917µs159µs return $class->unique($o);
# spent 59µs making 1 call to OpenBSD::PackageRepository::unique
490 }
491}
492
493# wrapper around copy, that sometimes does not copy
494sub may_copy
495{
496 my ($self, $object, $destdir) = @_;
497 my $src = $self->relative_url($object->{name});
498 require File::Spec;
499 my (undef, undef, $base) = File::Spec->splitpath($src);
500 my $dest = File::Spec->catfile($destdir, $base);
501 if (File::Spec->canonpath($dest) eq File::Spec->canonpath($src)) {
502 return;
503 }
504 if (-f $dest) {
505 my ($ddev, $dino) = (stat $dest)[0,1];
506 my ($sdev, $sino) = (stat $src)[0, 1];
507 if ($ddev == $sdev and $sino == $dino) {
508 return;
509 }
510 }
511 $self->{state}->copy_file($src, $destdir);
512}
513
514sub open_pipe
515{
516 my ($self, $object) = @_;
517 if (defined $ENV{'PKG_CACHE'}) {
518 $self->may_copy($object, $ENV{'PKG_CACHE'});
519 }
520 my $name = $self->relative_url($object->{name});
521 if ($self->check_signed($object)) {
522 $self->make_error_file($object);
523 my $pid = open(my $fh, "-|");
524 $self->did_it_fork($pid);
525 if ($pid) {
526 $object->{pid} = $pid;
527 return $self->uncompress($object, $fh);
528 } else {
529 $self->signify_pipe($object, "-x", $name);
530 }
531 } else {
532 return $self->uncompress($object, $name);
533 }
534}
535
536sub may_exist
537{
538 my ($self, $name) = @_;
539 return -r $self->relative_url($name);
540}
541
54211µsmy $local = [];
543
544sub opened
545{
546 return $local;
547}
548
549sub maxcount
550{
551 return 3;
552}
553
554sub list
555
# spent 2.22ms (326µs+1.90) within OpenBSD::PackageRepository::Local::list which was called: # once (326µs+1.90ms) by OpenBSD::PackageRepository::available at line 158
{
5561600ns my $self = shift;
55711µs my $l = [];
55815µs16µs my $dname = $self->baseurl;
# spent 6µs making 1 call to OpenBSD::PackageRepository::baseurl
55911.63ms11.62ms opendir(my $dir, $dname) or return $l;
# spent 1.62ms making 1 call to OpenBSD::PackageRepository::Local::CORE:open_dir
5601233µs2175µs while (my $e = readdir $dir) {
# spent 75µs making 21 calls to OpenBSD::PackageRepository::Local::CORE:readdir, avg 4µs/call
56120182µs20111µs next unless -f "$dname/$e";
# spent 111µs making 20 calls to OpenBSD::PackageRepository::Local::CORE:ftfile, avg 6µs/call
5621443µs1482µs $self->add_to_list($l, $e);
# spent 82µs making 14 calls to OpenBSD::PackageRepository::add_to_list, avg 6µs/call
563 }
56417µs1800ns close($dir);
# spent 800ns making 1 call to OpenBSD::PackageRepository::Local::CORE:close
565119µs return $l;
566}
567
568package OpenBSD::PackageRepository::Distant;
56913µsour @ISA=qw(OpenBSD::PackageRepository);
570
571sub baseurl
572
# spent 20µs within OpenBSD::PackageRepository::Distant::baseurl which was called 4 times, avg 5µs/call: # 4 times (20µs+0s) by OpenBSD::PackageRepository::relative_url at line 374, avg 5µs/call
{
57344µs my $self = shift;
574
575420µs return "//$self->{host}$self->{path}";
576}
577
578sub parse_url
579
# spent 5.47ms (52µs+5.42) within OpenBSD::PackageRepository::Distant::parse_url which was called: # once (52µs+5.42ms) by OpenBSD::PackageRepository::parse_fullurl at line 98
{
5801900ns my ($class, $r, $state) = @_;
581 # same heuristics as ftp(1):
582 # find host part, rest is parsed as a local url
58318µs12µs if (my ($host, $path) = $$r =~ m/^\/\/(.*?)(\/.*)$/) {
584
58511µs $$r = $path;
58614µs15.42ms my $o = $class->SUPER::parse_url($r, $state);
# spent 5.42ms making 1 call to OpenBSD::PackageRepositoryBase::parse_url
587129µs $o->{host} = $host;
58811µs if (defined $o->{release}) {
589 $o->can_be_empty;
590 $$r = $class->urlscheme."://$o->{host}$o->{release}:$$r";
591 }
592112µs return $o;
593 } else {
594 return undef;
595 }
596}
597
5981500nsmy $buffsize = 2 * 1024 * 1024;
599
600sub pkg_copy
601{
602 my ($self, $in, $object) = @_;
603
604 my $name = $object->{name};
605 my $dir = $object->{cache_dir};
606
607 my ($copy, $filename) = OpenBSD::Temp::permanent_file($dir, $name) or die "Can't write copy to cache";
608 chmod((0666 & ~umask), $filename);
609 $object->{tempname} = $filename;
610 my $handler = sub {
611 my ($sig) = @_;
612 unlink $filename;
613 close($in);
614 $SIG{$sig} = 'DEFAULT';
615 kill $sig, $$;
616 };
617
618 my $nonempty = 0;
619 my $error = 0;
620 {
621
622 local $SIG{'PIPE'} = $handler;
623 local $SIG{'INT'} = $handler;
624 local $SIG{'HUP'} = $handler;
625 local $SIG{'QUIT'} = $handler;
626 local $SIG{'KILL'} = $handler;
627 local $SIG{'TERM'} = $handler;
628
629 my ($buffer, $n);
630 # copy stuff over
631 do {
632 $n = sysread($in, $buffer, $buffsize);
633 if (!defined $n) {
634 $self->{state}->fatal("Error reading: #1", $!);
635 }
636 if ($n > 0) {
637 $nonempty = 1;
638 }
639 if (!$error) {
640 my $r = syswrite $copy, $buffer;
641 if (!defined $r || $r < $n) {
642 $error = 1;
643 }
644 }
645 syswrite STDOUT, $buffer;
646 } while ($n != 0);
647 close($copy);
648 }
649
650 if ($nonempty && !$error) {
651 rename $filename, "$dir/$name.tgz";
652 } else {
653 unlink $filename;
654 }
655 close($in);
656}
657
658sub open_pipe
659{
660 my ($self, $object) = @_;
661 $self->make_error_file($object);
662 my $d = $ENV{'PKG_CACHE'};
663 if (defined $d) {
664 $object->{cache_dir} = $d;
665 if (! -d -w $d) {
666 $self->{state}->fatal("bad PKG_CACHE directory #1", $d);
667 }
668 $object->{cache_dir} = $d;
669 }
670 $object->{parent} = $$;
671
672 my ($rdfh, $wrfh);
673
674 pipe($rdfh, $wrfh);
675 my $pid2 = fork();
676 $self->did_it_fork($pid2);
677 if ($pid2) {
678 $object->{pid2} = $pid2;
679 close($wrfh);
680 } else {
681 open STDERR, '>>', $object->{errors};
682 open(STDOUT, '>&', $wrfh);
683 close($rdfh);
684 close($wrfh);
685 if (defined $d) {
686 my $pid3 = open(my $in, "-|");
687 $self->did_it_fork($pid3);
688 if ($pid3) {
689 $self->dont_cleanup;
690 $self->pkg_copy($in, $object);
691 } else {
692 $self->grab_object($object);
693 }
694 } else {
695 $self->grab_object($object);
696 }
697 exit(0);
698 }
699
700 if ($self->check_signed($object)) {
701 my $pid = open(my $fh, "-|");
702 $self->did_it_fork($pid);
703 if ($pid) {
704 $object->{pid} = $pid;
705 close($rdfh);
706 } else {
707 open(STDIN, '<&', $rdfh) or
708 $self->{state}->fatal("Bad dup: #1", $!);
709 close($rdfh);
710 $self->signify_pipe($object);
711 }
712
713 return $self->uncompress($object, $fh);
714 } else {
715 return $self->uncompress($object, $rdfh);
716 }
717}
718
719sub finish_and_close
720{
721 my ($self, $object) = @_;
722 if (defined $object->{cache_dir}) {
723 while (defined $object->next) {
724 }
725 }
726 $self->SUPER::finish_and_close($object);
727}
728
729package OpenBSD::PackageRepository::HTTPorFTP;
73014µsour @ISA=qw(OpenBSD::PackageRepository::Distant);
731
73211µsour %distant = ();
733
734sub drop_privileges_and_setup_env
735{
736 my $self = shift;
737 my $user = '_pkgfetch';
738 if ($< == 0) {
739 # we can't cache anything, we happen after the fork,
740 # right before exec
741 if (my (undef, undef, $uid, $gid) = getpwnam($user)) {
742 $( = $gid;
743 $) = "$gid $gid";
744 $< = $uid;
745 $> = $uid;
746 } else {
747 $self->{state}->fatal("Couldn't change identity: can't find #1 user", $user);
748 }
749 } else {
750 ($user) = getpwuid($<);
751 }
752 # create sanitized env for ftp
753 my %newenv = (
754 HOME => '/var/empty',
755 USER => $user,
756 LOGNAME => $user,
757 SHELL => '/bin/sh',
758 LC_ALL => 'C', # especially, laundry error messages
759 PATH => '/bin:/usr/bin'
760 );
761
762 # copy selected stuff;
763 for my $k (qw(
764 TERM
765 FTPMODE
766 FTPSERVER
767 FTPSERVERPORT
768 ftp_proxy
769 http_proxy
770 http_cookies
771 ALL_PROXY
772 FTP_PROXY
773 HTTPS_PROXY
774 HTTP_PROXY
775 NO_PROXY)) {
776 if (exists $ENV{$k}) {
777 $newenv{$k} = $ENV{$k};
778 }
779 }
780 # don't forget to swap!
781 %ENV = %newenv;
782}
783
784
785sub grab_object
786{
787 my ($self, $object) = @_;
788 my ($ftp, @extra) = split(/\s+/, OpenBSD::Paths->ftp);
789 $self->drop_privileges_and_setup_env;
790 exec {$ftp}
791 $ftp,
792 @extra,
793 "-o",
794 "-", $self->url($object->{name})
795 or $self->{state}->fatal("Can't run #1: #2", OpenBSD::Paths->ftp, $!);
796}
797
798sub open_read_ftp
799
# spent 1.30ms (189µs+1.11) within OpenBSD::PackageRepository::HTTPorFTP::open_read_ftp which was called: # once (189µs+1.11ms) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 911
{
80011µs my ($self, $cmd, $errors) = @_;
80111.25ms11.11ms my $child_pid = open(my $fh, '-|');
# spent 1.11ms making 1 call to OpenBSD::PackageRepository::HTTPorFTP::CORE:open
80216µs if ($child_pid) {
80315µs $self->{pipe_pid} = $child_pid;
804163µs return $fh;
805 } else {
806 open STDERR, '>>', $errors if defined $errors;
807
808 $self->drop_privileges_and_setup_env;
809 exec($cmd)
810 or $self->{state}->fatal("Can't run #1: #2", $cmd, $!);
811 }
812}
813
814sub close_read_ftp
815
# spent 123µs (22+101) within OpenBSD::PackageRepository::HTTPorFTP::close_read_ftp which was called: # once (22µs+101µs) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 922
{
81611µs my ($self, $fh) = @_;
817184µs173µs close($fh);
818143µs128µs waitpid $self->{pipe_pid}, 0;
819}
820
821sub maxcount
822
# spent 3µs within OpenBSD::PackageRepository::HTTPorFTP::maxcount which was called 2 times, avg 2µs/call: # once (2µs+0s) by OpenBSD::PackageRepository::make_room at line 231 # once (2µs+0s) by OpenBSD::PackageRepository::make_room at line 234
{
823210µs return 1;
824}
825
826sub opened
827
# spent 7µs within OpenBSD::PackageRepository::HTTPorFTP::opened which was called: # once (7µs+0s) by OpenBSD::PackageRepository::make_room at line 228
{
82811µs my $self = $_[0];
82911µs my $k = $self->{host};
83012µs if (!defined $distant{$k}) {
831 $distant{$k} = [];
832 }
83318µs return $distant{$k};
834}
835
836sub should_have
837{
838 my ($self, $pkgname) = @_;
839 if (defined $self->{lasterror} && $self->{lasterror} == 421) {
840 return (defined $self->{list}) &&
841 grep { $_ eq $pkgname } @{$self->{list}};
842 } else {
843 return 0;
844 }
845}
846
847sub try_until_success
848{
849 my ($self, $pkgname, $code) = @_;
850
851 for (my $retry = 5; $retry <= 160; $retry *= 2) {
852 undef $self->{lasterror};
853 my $o = &$code;
854 if (defined $o) {
855 return $o;
856 }
857 if (defined $self->{lasterror} &&
858 ($self->{lasterror} == 550 || $self->{lasterror} == 404)) {
859 last;
860 }
861 if ($self->should_have($pkgname)) {
862 $self->errsay("Temporary error, sleeping #1 seconds",
863 $retry);
864 sleep($retry);
865 }
866 }
867 return undef;
868}
869
870sub find
871{
872 my ($self, $pkgname, @extra) = @_;
873
874 return $self->try_until_success($pkgname,
875 sub {
876 return $self->SUPER::find($pkgname, @extra); });
877
878}
879
880sub grabPlist
881{
882 my ($self, $pkgname, @extra) = @_;
883
884 return $self->try_until_success($pkgname,
885 sub {
886 return $self->SUPER::grabPlist($pkgname, @extra); });
887}
888
889sub list
890
# spent 11.7s (71µs+11.7) within OpenBSD::PackageRepository::HTTPorFTP::list which was called: # once (71µs+11.7s) by OpenBSD::PackageRepository::available at line 158
{
89111µs my ($self) = @_;
89212µs if (!defined $self->{list}) {
893116µs142µs $self->make_room;
# spent 42µs making 1 call to OpenBSD::PackageRepository::make_room
894110µs1234µs my $error = OpenBSD::Temp->file;
# spent 234µs making 1 call to OpenBSD::Temp::file
8951700ns if (!defined $error) {
896 $self->{state}->fatal("#1 not writable",
897 $OpenBSD::Temp::tempbase);
898 }
89918µs111.7s $self->{list} = $self->obtain_list($error);
# spent 11.7s making 1 call to OpenBSD::PackageRepository::HTTP::obtain_list
900112µs1392µs $self->parse_problems($error);
# spent 392µs making 1 call to OpenBSD::PackageRepository::parse_problems
901 }
90219µs return $self->{list};
903}
904
905sub get_http_list
906
# spent 11.7s (237ms+11.5) within OpenBSD::PackageRepository::HTTPorFTP::get_http_list which was called: # once (237ms+11.5s) by OpenBSD::PackageRepository::HTTP::obtain_list at line 937
{
9071700ns my ($self, $error) = @_;
908
90913µs122µs my $fullname = $self->url;
# spent 22µs making 1 call to OpenBSD::PackageRepositoryBase::url
91011µs my $l = [];
911129µs21.31ms my $fh = $self->open_read_ftp(OpenBSD::Paths->ftp." -o - $fullname",
# spent 1.30ms making 1 call to OpenBSD::PackageRepository::HTTPorFTP::open_read_ftp # spent 9µs making 1 call to OpenBSD::Paths::ftp
912 $error) or return;
913110.8s110.8s while(<$fh>) {
91496817.03ms chomp;
9159681657ms19362579ms for my $pkg (m/\<A[^>]*\s+HREF=\"(.*?\.tgz)\"/gio) {
# spent 528ms making 9681 calls to OpenBSD::PackageRepository::HTTPorFTP::CORE:readline, avg 54µs/call # spent 51.1ms making 9681 calls to OpenBSD::PackageRepository::HTTPorFTP::CORE:match, avg 5µs/call
916965849.5ms96587.70ms $pkg = $1 if $pkg =~ m|^.*/(.*)$|;
# spent 7.70ms making 9658 calls to OpenBSD::PackageRepository::HTTPorFTP::CORE:match, avg 797ns/call
917 # decode uri-encoding; from URI::Escape
918965835.5ms96588.00ms $pkg =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
# spent 8.00ms making 9658 calls to OpenBSD::PackageRepository::HTTPorFTP::CORE:subst, avg 828ns/call
919965841.7ms965882.4ms $self->add_to_list($l, $pkg);
# spent 82.4ms making 9658 calls to OpenBSD::PackageRepository::add_to_list, avg 9µs/call
920 }
921 }
922122µs1123µs $self->close_read_ftp($fh);
923113µs return $l;
924}
925
926package OpenBSD::PackageRepository::HTTP;
92714µsour @ISA=qw(OpenBSD::PackageRepository::HTTPorFTP);
928
929sub urlscheme
930
# spent 13µs within OpenBSD::PackageRepository::HTTP::urlscheme which was called 5 times, avg 3µs/call: # 4 times (11µs+0s) by OpenBSD::PackageRepositoryBase::url at line 122 of OpenBSD/PackageRepository/Installed.pm, avg 3µs/call # once (2µs+0s) by OpenBSD::PackageRepositoryBase::strip_urlscheme at line 100 of OpenBSD/PackageRepository/Installed.pm
{
931522µs return 'http';
932}
933
934sub obtain_list
935
# spent 11.7s (14µs+11.7) within OpenBSD::PackageRepository::HTTP::obtain_list which was called: # once (14µs+11.7s) by OpenBSD::PackageRepository::HTTPorFTP::list at line 899
{
93611µs my ($self, $error) = @_;
937114µs111.7s return $self->get_http_list($error);
938}
939
940package OpenBSD::PackageRepository::HTTPS;
94114µsour @ISA=qw(OpenBSD::PackageRepository::HTTP);
942
943sub urlscheme
944{
945 return 'https';
946}
947
948package OpenBSD::PackageRepository::FTP;
94914µsour @ISA=qw(OpenBSD::PackageRepository::HTTPorFTP);
950
951sub urlscheme
952{
953 return 'ftp';
954}
955
956sub _list
957{
958 my ($self, $cmd, $error) = @_;
959 my $l =[];
960 my $fh = $self->open_read_ftp($cmd, $error) or return;
961 while(<$fh>) {
962 chomp;
963 next if m/^\d\d\d\s+\S/;
964 if (m/No such file or directory|Failed to change directory/i) {
965 $self->{no_such_dir} = 1;
966 }
967 next unless m/^(?:\.\/)?(\S+\.tgz)\s*$/;
968 $self->add_to_list($l, $1);
969 }
970 $self->close_read_ftp($fh);
971 return $l;
972}
973
974sub get_ftp_list
975{
976 my ($self, $error) = @_;
977
978 my $fullname = $self->url;
979 return $self->_list("echo 'nlist'| ".OpenBSD::Paths->ftp
980 ." $fullname", $error);
981}
982
983sub obtain_list
984{
985 my ($self, $error) = @_;
986 if (defined $ENV{'ftp_proxy'} && $ENV{'ftp_proxy'} ne '') {
987 return $self->get_http_list($error);
988 } else {
989 return $self->get_ftp_list($error);
990 }
991}
992
99319µs1;
 
# spent 4µs within OpenBSD::PackageLocator::CORE:subst which was called 2 times, avg 2µs/call: # once (3µs+0s) by OpenBSD::PackageLocator::add_default at line 49 of OpenBSD/PackageLocator.pm # once (2µs+0s) by OpenBSD::PackageLocator::add_default at line 48 of OpenBSD/PackageLocator.pm
sub OpenBSD::PackageLocator::CORE:subst; # opcode
# spent 4µs within OpenBSD::PackageRepository::CORE:close which was called: # once (4µs+0s) by OpenBSD::PackageRepository::parse_problems at line 358
sub OpenBSD::PackageRepository::CORE:close; # opcode
# spent 17.0ms within OpenBSD::PackageRepository::CORE:match which was called 9699 times, avg 2µs/call: # 9672 times (17.0ms+0s) by OpenBSD::PackageRepository::add_to_list at line 381, avg 2µs/call # 8 times (8µs+0s) by OpenBSD::PackageRepository::parse at line 126, avg 1µs/call # 3 times (9µs+0s) by OpenBSD::PackageRepository::parse_problems at line 298, avg 3µs/call # 3 times (7µs+0s) by OpenBSD::PackageRepository::parse_problems at line 296, avg 2µs/call # 3 times (2µs+0s) by OpenBSD::PackageRepository::parse_problems at line 297, avg 700ns/call # 2 times (2µs+0s) by OpenBSD::PackageRepository::parse_problems at line 299, avg 950ns/call # once (10µs+0s) by OpenBSD::PackageRepository::parse_problems at line 300 # once (2µs+0s) by OpenBSD::PackageRepository::parse_problems at line 306 # once (1µs+0s) by OpenBSD::PackageRepository::parse_problems at line 305 # once (900ns+0s) by OpenBSD::PackageRepository::parse_problems at line 303 # once (900ns+0s) by OpenBSD::PackageRepository::parse_problems at line 301 # once (800ns+0s) by OpenBSD::PackageRepository::parse_problems at line 302 # once (800ns+0s) by OpenBSD::PackageRepository::parse_problems at line 304 # once (700ns+0s) by OpenBSD::PackageRepository::parse at line 145
sub OpenBSD::PackageRepository::CORE:match; # opcode
# spent 26µs within OpenBSD::PackageRepository::CORE:open which was called: # once (26µs+0s) by OpenBSD::PackageRepository::parse_problems at line 284
sub OpenBSD::PackageRepository::CORE:open; # opcode
# spent 8µs within OpenBSD::PackageRepository::CORE:readline which was called 4 times, avg 2µs/call: # 4 times (8µs+0s) by OpenBSD::PackageRepository::parse_problems at line 295, avg 2µs/call
sub OpenBSD::PackageRepository::CORE:readline; # opcode
# spent 36µs within OpenBSD::PackageRepository::CORE:regcomp which was called 2 times, avg 18µs/call: # 2 times (36µs+0s) by OpenBSD::PackageRepository::parse_problems at line 299, avg 18µs/call
sub OpenBSD::PackageRepository::CORE:regcomp; # opcode
# spent 13µs within OpenBSD::PackageRepository::CORE:subst which was called 3 times, avg 4µs/call: # 3 times (13µs+0s) by OpenBSD::PackageRepository::parse at line 118, avg 4µs/call
sub OpenBSD::PackageRepository::CORE:subst; # opcode
# spent 16µs within OpenBSD::PackageRepository::CORE:substcont which was called 2 times, avg 8µs/call: # 2 times (16µs+0s) by OpenBSD::PackageRepository::parse at line 118, avg 8µs/call
sub OpenBSD::PackageRepository::CORE:substcont; # opcode
# spent 61µs within OpenBSD::PackageRepository::CORE:unlink which was called: # once (61µs+0s) by OpenBSD::PackageRepository::parse_problems at line 360
sub OpenBSD::PackageRepository::CORE:unlink; # opcode
# spent 2µs within OpenBSD::PackageRepository::Distant::CORE:match which was called: # once (2µs+0s) by OpenBSD::PackageRepository::Distant::parse_url at line 583
sub OpenBSD::PackageRepository::Distant::CORE:match; # opcode
# spent 73µs within OpenBSD::PackageRepository::HTTPorFTP::CORE:close which was called: # once (73µs+0s) by OpenBSD::PackageRepository::HTTPorFTP::close_read_ftp at line 817
sub OpenBSD::PackageRepository::HTTPorFTP::CORE:close; # opcode
# spent 58.8ms within OpenBSD::PackageRepository::HTTPorFTP::CORE:match which was called 19339 times, avg 3µs/call: # 9681 times (51.1ms+0s) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 915, avg 5µs/call # 9658 times (7.70ms+0s) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 916, avg 797ns/call
sub OpenBSD::PackageRepository::HTTPorFTP::CORE:match; # opcode
# spent 1.11ms within OpenBSD::PackageRepository::HTTPorFTP::CORE:open which was called: # once (1.11ms+0s) by OpenBSD::PackageRepository::HTTPorFTP::open_read_ftp at line 801
sub OpenBSD::PackageRepository::HTTPorFTP::CORE:open; # opcode
# spent 11.4s within OpenBSD::PackageRepository::HTTPorFTP::CORE:readline which was called 9682 times, avg 1.17ms/call: # 9681 times (528ms+0s) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 915, avg 54µs/call # once (10.8s+0s) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 913
sub OpenBSD::PackageRepository::HTTPorFTP::CORE:readline; # opcode
# spent 8.00ms within OpenBSD::PackageRepository::HTTPorFTP::CORE:subst which was called 9658 times, avg 828ns/call: # 9658 times (8.00ms+0s) by OpenBSD::PackageRepository::HTTPorFTP::get_http_list at line 918, avg 828ns/call
sub OpenBSD::PackageRepository::HTTPorFTP::CORE:subst; # opcode
# spent 28µs within OpenBSD::PackageRepository::HTTPorFTP::CORE:waitpid which was called: # once (28µs+0s) by OpenBSD::PackageRepository::HTTPorFTP::close_read_ftp at line 818
sub OpenBSD::PackageRepository::HTTPorFTP::CORE:waitpid; # opcode
# spent 800ns within OpenBSD::PackageRepository::Local::CORE:close which was called: # once (800ns+0s) by OpenBSD::PackageRepository::Local::list at line 564
sub OpenBSD::PackageRepository::Local::CORE:close; # opcode
# spent 111µs within OpenBSD::PackageRepository::Local::CORE:ftfile which was called 20 times, avg 6µs/call: # 20 times (111µs+0s) by OpenBSD::PackageRepository::Local::list at line 561, avg 6µs/call
sub OpenBSD::PackageRepository::Local::CORE:ftfile; # opcode
# spent 1.62ms within OpenBSD::PackageRepository::Local::CORE:open_dir which was called: # once (1.62ms+0s) by OpenBSD::PackageRepository::Local::list at line 559
sub OpenBSD::PackageRepository::Local::CORE:open_dir; # opcode
# spent 75µs within OpenBSD::PackageRepository::Local::CORE:readdir which was called 21 times, avg 4µs/call: # 21 times (75µs+0s) by OpenBSD::PackageRepository::Local::list at line 560, avg 4µs/call
sub OpenBSD::PackageRepository::Local::CORE:readdir; # opcode
# spent 2µs within OpenBSD::PackageRepository::file which was called: # once (2µs+0s) by OpenBSD::PackageRepository::parse at line 150
sub OpenBSD::PackageRepository::file; # xsub
# spent 1µs within OpenBSD::PackageRepository::http which was called: # once (1µs+0s) by OpenBSD::PackageRepository::parse at line 126
sub OpenBSD::PackageRepository::http; # xsub