summaryrefslogtreecommitdiff
path: root/usr.sbin/pkg_add/OpenBSD/State.pm
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/pkg_add/OpenBSD/State.pm')
-rw-r--r--usr.sbin/pkg_add/OpenBSD/State.pm140
1 files changed, 133 insertions, 7 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/State.pm b/usr.sbin/pkg_add/OpenBSD/State.pm
index 08b385d6678..3539378bb83 100644
--- a/usr.sbin/pkg_add/OpenBSD/State.pm
+++ b/usr.sbin/pkg_add/OpenBSD/State.pm
@@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
-# $OpenBSD: State.pm,v 1.2 2010/06/09 11:57:21 espie Exp $
+# $OpenBSD: State.pm,v 1.3 2010/06/15 08:26:39 espie Exp $
#
# Copyright (c) 2007-2010 Marc Espie <espie@openbsd.org>
#
@@ -70,36 +70,54 @@ sub f
return $_;
}
-sub fatal
+sub _fatal
{
my $self = shift;
# implementation note: to print "fatal errors" elsewhere,
# the way is to eval { croak @_}; and decide what to do with $@.
- croak "Fatal error: ", $self->f(@_), "\n";
+ croak "Fatal error: ", @_, "\n";
+}
+
+sub fatal
+{
+ my $self = shift;
+ $self->_fatal($self->f(@_));
+}
+
+sub _print
+{
+ my $self = shift;
+ print @_;
+}
+
+sub _errprint
+{
+ my $self = shift;
+ print STDERR @_;
}
sub print
{
my $self = shift;
- print $self->f(@_);
+ $self->_print($self->f(@_));
}
sub say
{
my $self = shift;
- print $self->f(@_), "\n";
+ $self-_print($self->f(@_), "\n");
}
sub errprint
{
my $self = shift;
- print STDERR $self->f(@_);
+ $self->_errprint($self->f(@_));
}
sub errsay
{
my $self = shift;
- print STDERR $self->f(@_), "\n";
+ $self->_errprint($self->f(@_), "\n");
}
sub do_options
@@ -112,4 +130,112 @@ sub do_options
bless sub { $state->usage("#1", $_)}, "OpenBSD::Error::catchall");
}
+my @signal_name = ();
+sub fillup_names
+{
+ {
+ # XXX force autoload
+ package verylocal;
+
+ require POSIX;
+ POSIX->import(qw(signal_h));
+ }
+
+ for my $sym (keys %POSIX::) {
+ next unless $sym =~ /^SIG([A-Z].*)/;
+ $signal_name[eval "&POSIX::$sym()"] = $1;
+ }
+ # extra BSD signals
+ $signal_name[5] = 'TRAP';
+ $signal_name[7] = 'IOT';
+ $signal_name[10] = 'BUS';
+ $signal_name[12] = 'SYS';
+ $signal_name[16] = 'URG';
+ $signal_name[23] = 'IO';
+ $signal_name[24] = 'XCPU';
+ $signal_name[25] = 'XFSZ';
+ $signal_name[26] = 'VTALRM';
+ $signal_name[27] = 'PROF';
+ $signal_name[28] = 'WINCH';
+ $signal_name[29] = 'INFO';
+}
+
+sub find_signal
+{
+ my $number = shift;
+
+ if (@signal_name == 0) {
+ fillup_names();
+ }
+
+ return $signal_name[$number] || $number;
+}
+
+sub child_error
+{
+ my $self = shift;
+ my $error = $?;
+
+ my $extra = "";
+
+ if ($error & 128) {
+ $extra = $self->f(" (core dumped)");
+ }
+ if ($error & 127) {
+ return $self->f("killed by signal #1#2",
+ find_signal($error & 127), $extra);
+ } else {
+ return $self->f("exit(#1)#2", ($error >> 8), $extra);
+ }
+}
+
+sub system
+{
+ my $self = shift;
+ my $r = CORE::system(@_);
+ if ($r != 0) {
+ $self->say("system(#1) failed: #2",
+ join(", ", @_), $self->child_error);
+ }
+ return $r;
+}
+
+sub copy_file
+{
+ my $self = shift;
+ require File::Copy;
+
+ my $r = File::Copy::copy(@_);
+ if (!$r) {
+ $self->say("copy(#1) failed: #2", join(',', @_), $!);
+ }
+ return $r;
+}
+
+sub unlink
+{
+ my $self = shift;
+ my $verbose = shift;
+ my $r = unlink @_;
+ if ($r != @_) {
+ $self->say("rm #1 failed: removed only #2 targets, #3",
+ join(' ', @_), $r, $1);
+ } elsif ($verbose) {
+ $self->say("rm #1", join(' ', @_));
+ }
+ return $r;
+}
+
+sub copy
+{
+ my $self = shift;
+ require File::Copy;
+
+ my $r = File::Copy::copy(@_);
+ if (!$r) {
+ $self->say("copy(#1) failed: #2", join(',', @_), $!);
+ }
+ return $r;
+}
+
1;