Net-DNS

 view release on metacpan or  search on metacpan

lib/Net/DNS/Resolver/os390.pm  view on Meta::CPAN

my $homedir = $ENV{HOME};
my $dotfile = '.resolv.conf';
my @dotfile = grep { -f $_ && -o $_ } map {"$_/$dotfile"} grep {$_} $homedir, '.';


my %option = (				## map MVS config option names
	NSPORTADDR	   => 'port',
	RESOLVERTIMEOUT	   => 'retrans',
	RESOLVERUDPRETRIES => 'retry',
	SORTLIST	   => 'sortlist',
	);


sub _init {
	my $defaults = shift->_defaults;
	my %stop;
	local $ENV{PATH} = join ':', grep {$_} qw(/bin /usr/bin), $path;

	foreach my $dataset ( Net::DNS::Resolver::Base::_untaint( grep {$_} @dataset ) ) {
		eval {
			local $_;
			my @nameserver;
			my @searchlist;

			my $handle = IO::File->new( qq[cat "$dataset" 2>/dev/null], '-|' )
					or die "$dataset: $!";	# "cat" able to read MVS datasets

			while (<$handle>) {
				s/[;#].*$//;			# strip comment
				s/^\s+//;			# strip leading white space
				next unless $_;			# skip empty line

				next if m/^\w+:/ && !m/^$sysname:/oi;
				s/^\w+:\s*//;			# discard qualifier


				m/^(NSINTERADDR|nameserver)/i && do {
					my ( $keyword, @ip ) = grep {defined} split;
					push @nameserver, @ip;
					next;
				};


				m/^(DOMAINORIGIN|domain)/i && do {
					my ( $keyword, @domain ) = grep {defined} split;
					$defaults->domain(@domain) unless $stop{domain}++;
					next;
				};


				m/^search/i && do {
					my ( $keyword, @domain ) = grep {defined} split;
					push @searchlist, @domain;
					next;
				};


				m/^option/i && do {
					my ( $keyword, @option ) = grep {defined} split;
					foreach (@option) {
						my ( $attribute, @value ) = split m/:/;
						$defaults->_option( $attribute, @value )
								unless $stop{$attribute}++;
					}
					next;
				};


				m/^RESOLVEVIA/i && do {
					my ( $keyword, $value ) = grep {defined} split;
					$defaults->_option( 'usevc', $value eq 'TCP' )
							unless $stop{usevc}++;
					next;
				};


				m/^\w+\s*/ && do {
					my ( $keyword, @value ) = grep {defined} split;
					my $attribute = $option{uc $keyword} || next;
					$defaults->_option( $attribute, @value )
							unless $stop{$attribute}++;
				};
			}

			close($handle);

			$defaults->nameserver(@nameserver) if @nameserver && !$stop{nameserver}++;
			$defaults->searchlist(@searchlist) if @searchlist && !$stop{search}++;
		};
		warn $@ if $@;
	}

	%$defaults = Net::DNS::Resolver::Base::_untaint(%$defaults);

	$defaults->_read_config_file($_) foreach @dotfile;

	$defaults->_read_env;
	return;
}


1;
__END__


=head1 SYNOPSIS

	use Net::DNS::Resolver;

=head1 DESCRIPTION

This class implements the OS specific portions of C<Net::DNS::Resolver>.

No user serviceable parts inside, see L<Net::DNS::Resolver>
for all your resolving needs.

=head1 COPYRIGHT

Copyright (c)2017 Dick Franks.

All rights reserved.



( run in 0.563 second using v1.01-cache-2.11-cpan-71847e10f99 )