xref: /openbsd-src/usr.sbin/pkg_add/OpenBSD/Log.pm (revision 9acbf608f1e1b3977edf18bee2d16e28a430ad2a)
15f05097cSespie# ex:ts=8 sw=4:
2*9acbf608Stb# $OpenBSD: Log.pm,v 1.11 2024/10/01 18:48:29 tb Exp $
35f05097cSespie#
45f05097cSespie# Copyright (c) 2007-2010 Marc Espie <espie@openbsd.org>
55f05097cSespie#
65f05097cSespie# Permission to use, copy, modify, and distribute this software for any
75f05097cSespie# purpose with or without fee is hereby granted, provided that the above
85f05097cSespie# copyright notice and this permission notice appear in all copies.
95f05097cSespie#
105f05097cSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
115f05097cSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
125f05097cSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
135f05097cSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
145f05097cSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
155f05097cSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
165f05097cSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
175f05097cSespie#
185f05097cSespie
19039cbdaaSespieuse v5.36;
205f05097cSespie
215f05097cSespiepackage OpenBSD::Log;
225f05097cSespie
23039cbdaaSespiesub new($class, $printer)
245f05097cSespie{
255f05097cSespie	bless { p => $printer }, $class;
265f05097cSespie}
275f05097cSespie
28039cbdaaSespiesub set_context($self, $context)
295f05097cSespie{
305f05097cSespie	$self->{context} = $context;
31dd8c23f4Sespie}
32dd8c23f4Sespie
33039cbdaaSespiesub messages($self)
34dd8c23f4Sespie{
35ca90cc5cSespie	$self->{context} //= "???";
36dd8c23f4Sespie	return $self->{messages}{$self->{context}} //= [];
37dd8c23f4Sespie}
38dd8c23f4Sespie
39039cbdaaSespiesub errmessages($self)
40dd8c23f4Sespie{
41ca90cc5cSespie	$self->{context} //= "???";
42dd8c23f4Sespie	return $self->{errmessages}{$self->{context}} //= [];
435f05097cSespie}
445f05097cSespie
45039cbdaaSespiesub f($self, @p)
465f05097cSespie{
47039cbdaaSespie	$self->{p}->f(@p);
485f05097cSespie}
495f05097cSespie
50039cbdaaSespiesub print($self, @p)
515f05097cSespie{
52039cbdaaSespie	push(@{$self->messages}, $self->f(@p));
535f05097cSespie}
545f05097cSespie
55039cbdaaSespiesub say($self, @p)
565f05097cSespie{
57039cbdaaSespie	push(@{$self->messages}, $self->f(@p)."\n");
585f05097cSespie}
595f05097cSespie
60039cbdaaSespiesub errprint($self, @p)
615f05097cSespie{
62039cbdaaSespie	push(@{$self->errmessages}, $self->f(@p));
635f05097cSespie}
645f05097cSespie
65039cbdaaSespiesub errsay($self, @p)
665f05097cSespie{
67039cbdaaSespie	push(@{$self->errmessages}, $self->f(@p)."\n");
685f05097cSespie}
695f05097cSespie
70039cbdaaSespiesub specialsort(@p)
719dd4eb06Sespie{
72039cbdaaSespie	return ((sort grep { /^\-/ } @p), (sort grep { /^\+/} @p),
73039cbdaaSespie	    (sort grep { !/^[\-+]/ } @p));
749dd4eb06Sespie}
759dd4eb06Sespie
76039cbdaaSespiesub dump($self)
775f05097cSespie{
789dd4eb06Sespie	for my $ctxt (specialsort keys %{$self->{errmessages}}) {
79dd8c23f4Sespie		my $msgs = $self->{errmessages}{$ctxt};
805f05097cSespie		if (@$msgs > 0) {
815f05097cSespie			$self->{p}->errsay("--- #1 -------------------", $ctxt);
825f05097cSespie			$self->{p}->_errprint(@$msgs);
835f05097cSespie		}
845f05097cSespie	}
855f05097cSespie	$self->{errmessages} = {};
869dd4eb06Sespie	for my $ctxt (specialsort keys %{$self->{messages}}) {
87dd8c23f4Sespie		my $msgs = $self->{messages}{$ctxt};
885f05097cSespie		if (@$msgs > 0) {
895f05097cSespie			$self->{p}->say("--- #1 -------------------", $ctxt);
905f05097cSespie			$self->{p}->_print(@$msgs);
915f05097cSespie		}
925f05097cSespie	}
935f05097cSespie	$self->{messages} = {};
945f05097cSespie}
955f05097cSespie
96039cbdaaSespiesub fatal($self, @p)
975f05097cSespie{
985f05097cSespie	if (defined $self->{context}) {
99039cbdaaSespie		$self->{p}->_fatal($self->{context}, ":", $self->f(@p));
1005f05097cSespie	}
1015f05097cSespie
102039cbdaaSespie	$self->{p}->_fatal($self->f(@p));
1035f05097cSespie}
1045f05097cSespie
105039cbdaaSespiesub system($self, @p)
1065f05097cSespie{
107*9acbf608Stb	my ($todo, $todo2);
108*9acbf608Stb	if (ref $p[0] eq 'CODE') {
109*9acbf608Stb		$todo = shift @p;
110*9acbf608Stb	} else {
111*9acbf608Stb		$todo = sub() {};
112*9acbf608Stb	}
113*9acbf608Stb	if (ref $p[0] eq 'CODE') {
114*9acbf608Stb		$todo2 = shift @p;
115*9acbf608Stb	} else {
116*9acbf608Stb		$todo2 = sub() {};
117*9acbf608Stb	}
118*9acbf608Stb	my $child_pid = open(my $grab, "-|");
119*9acbf608Stb	if (!defined $child_pid) {
120*9acbf608Stb		$self->{p}->say("system(#1) was not run: #2 #3",
121*9acbf608Stb		    join(", ", @p), $!, $self->{p}->child_error);
122*9acbf608Stb	}
123*9acbf608Stb	if ($child_pid) {
124*9acbf608Stb		&$todo2();
1255f05097cSespie		while (<$grab>) {
1265f05097cSespie			$self->{p}->_print($_);
1275f05097cSespie		}
1285f05097cSespie		if (!close $grab) {
1295f05097cSespie			$self->{p}->say("system(#1) failed: #2 #3",
130039cbdaaSespie			    join(", ", @p), $!,
1315f05097cSespie			    $self->{p}->child_error);
1325f05097cSespie		}
1335f05097cSespie		return $?;
1345f05097cSespie	} else {
135*9acbf608Stb		$DB::inhibit_exit = 0;
136*9acbf608Stb		&$todo();
137*9acbf608Stb		exec {$p[0]} (@p) or exit 1;
1385f05097cSespie	}
1395f05097cSespie}
1405f05097cSespie
1415f05097cSespie1;
142