ErrorHandling.pm 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package Dpkg::ErrorHandling;
  2. use Dpkg;
  3. use Dpkg::Gettext;
  4. use base qw(Exporter);
  5. our @EXPORT_OK = qw(warning warnerror error failure unknown syserr internerr
  6. subprocerr usageerr report $warnable_error $quiet_warnings);
  7. our $warnable_error = 1;
  8. our $quiet_warnings = 0;
  9. sub report(@)
  10. {
  11. my ($type, $msg) = (shift, shift);
  12. $msg = sprintf($msg, @_) if (@_);
  13. return "$progname: $type: $msg\n";
  14. }
  15. sub warning($;@)
  16. {
  17. warn report(_g("warning"), @_) if (!$quiet_warnings);
  18. }
  19. sub warnerror(@)
  20. {
  21. if ($warnable_error) {
  22. warning(@_);
  23. } else {
  24. error(@_);
  25. }
  26. }
  27. sub failure($;@)
  28. {
  29. die report(_g("failure"), @_);
  30. }
  31. sub syserr($;@)
  32. {
  33. my $msg = shift;
  34. die report(_g("failure"), "$msg: $!", @_);
  35. }
  36. sub error($;@)
  37. {
  38. die report(_g("error"), @_);
  39. }
  40. sub internerr($;@)
  41. {
  42. die report(_g("internal error"), @_);
  43. }
  44. sub unknown($)
  45. {
  46. # XXX: implicit argument
  47. my $field = $_;
  48. warning(_g("unknown information field '%s' in input data in %s"),
  49. $field, $_[0]);
  50. }
  51. sub subprocerr(@)
  52. {
  53. my ($p) = (shift);
  54. $p = sprintf($p, @_) if (@_);
  55. require POSIX;
  56. if (POSIX::WIFEXITED($?)) {
  57. failure(_g("%s gave error exit status %s"), $p, POSIX::WEXITSTATUS($?));
  58. } elsif (POSIX::WIFSIGNALED($?)) {
  59. failure(_g("%s died from signal %s"), $p, POSIX::WTERMSIG($?));
  60. } else {
  61. failure(_g("%s failed with unknown exit code %d"), $p, $?);
  62. }
  63. }
  64. sub usageerr(@)
  65. {
  66. my ($msg) = (shift);
  67. $msg = sprintf($msg, @_) if (@_);
  68. warn "$progname: $msg\n\n";
  69. # XXX: access to main namespace
  70. main::usage();
  71. exit(2);
  72. }
  73. 1;