use 5.010;
use strict;
use warnings;
+use File::Basename;
use IO::Socket::INET;
use Cwd;
use Carp;
-use parent 'Exporter';
-our @EXPORT_OK = qw(mailgroup dynamic_socket exim_binary);
+use Exporter;
+our @ISA = qw(Exporter);
+
+our @EXPORT_OK = qw(mailgroup dynamic_socket exim_binary flavour flavours);
our %EXPORT_TAGS = (
all => \@EXPORT_OK,
);
sub exim_binary {
# two simple cases, absolute path or relative path and executable
- return @_ if $_[0] =~ /^\//;
- return Cwd::abs_path(shift), @_ if -x $_[0];
+ if (@_) {
+ return @_ if $_[0] =~ /^\//;
+ return Cwd::abs_path(shift), @_ if -x $_[0];
+ }
# so we're still here, if the simple approach didn't help.
my $os = `$_/scripts/os-type`;
my $arch = `$_/scripts/arch-type`;
chomp($os, $arch);
+ ($ENV{build} ? "$_/build-$ENV{build}" : ()),
"$_/build-$os-$arch" . ($ENV{EXIM_BUILD_SUFFIX} ? ".$ENV{EXIM_BUILD_SUFFIX}" : '');
} @candidates;
return $binaries[0], @_;
}
+sub flavour {
+ my $etc = '/etc';
+
+ if (@_) {
+ croak "do not pass a directory, it's for testing only"
+ unless $ENV{HARNESS_ACTIVE};
+ $etc = shift;
+ }
+
+ if (open(my $f, '-|', 'openssl version')) {
+ <$f> =~ /1.1.1/ && return "openssl_1_1_1";
+ }
+
+ if (open(my $f, '<', "$etc/os-release")) {
+ local $_ = join '', <$f>;
+ my ($id) = /^ID="?(.*?)"?\s*$/m;
+ my $version = /^VERSION_ID="?(.*?)"?\s*$/m ? $1 : '';
+ return "$id$version";
+ }
+
+ if (open(my $f, '<', "$etc/debian_version")) {
+ chomp(local $_ = <$f>);
+ $_ = int $_;
+ return "debian$_";
+ }
+
+ undef;
+}
+
+sub flavours {
+ my %h = map { /\.(\S+)$/, 1 }
+ grep { !/\.orig$/ } glob('stdout/*.*'), glob('stderr/*.*'), glob('log/*.*');
+ return sort keys %h;
+}
1;
C<../scripts/os-type> and C<../os-arch>) and return the
the path to the binary and the unmodified I<@argv>.
+=item B<flavour>()
+
+Find a hint for the current flavour (Linux distro). It does so by checking
+typical files in the F</etc> directory.
+
+=item B<flavours>()
+
+Return a list of available flavours. It does so by scanning F<log/>, F<stdout/> and
+F<stderr/> for I<flavour> files (extensions after the numerical prefix.
+
=back
=cut