#!/usr/bin/perl
# This file was preprocessed, do not edit!



use warnings;
use strict;

BEGIN {
	eval qq{
		use File::Path qw(make_path remove_tree);
		use FileHandle;
		use Debconf::Log qw(:all);
		use Debconf::Db;
		use Debconf::Template;
		use Debconf::Config;
		use Debconf::AutoSelect qw(:all);
		use Debconf::Gettext;
		use Debconf::Path;
	};
	if ($@) {
		print STDERR "debconf: Perl may be unconfigured ($@) -- aborting\n";
		exit 0;
	}
}

if (exists $ENV{DEBCONF_USE_CDEBCONF} and $ENV{DEBCONF_USE_CDEBCONF} ne '') {
    exec "/usr/lib/cdebconf/dpkg-preconfigure", @ARGV;
}

Debconf::Db->load;

my $apt=0;
Debconf::Config->getopt(
qq{Usage: dpkg-preconfigure [options] [debs]
       --apt			Apt mode.},
	"apt"			=> \$apt,
);

$|=1;

my @debs=@ARGV;
@ARGV=();

my $have_tty=1;

if ($apt) {
	while (<STDIN>) {
		chomp;
		push @debs, $_ if length $_;
	}

	exit unless @debs;

	$have_tty=0 unless open (STDIN, "<", "/dev/tty");
}
elsif (! @debs) {
	print STDERR sprintf("dpkg-preconfigure: ".gettext("must specify some debs to preconfigure")), "\n";
	exit(1);
}

if (! Debconf::Path::find("apt-extracttemplates")) {
	warn gettext("delaying package configuration, since apt-utils is not installed");
	exit;
}

my $frontend=make_frontend();

if (! $have_tty && $frontend->need_tty) {
	print STDERR sprintf("dpkg-preconfigure: ".gettext("unable to re-open stdin: %s"), $!)."\n";
	exit 0;
}

my $tempdir='/var/cache/debconf/tmp.ci';
remove_tree($tempdir, { safe => 1, keep_root => 1 });
make_path($tempdir);

my ($package, $version, $template, $config);
pipe(my $info_reader, my $info_writer) or die "debconf: pipe failed: $!";
my $pid = fork();
defined $pid or die "fork failed: $!";
unless ($pid) {
	close($info_reader);

	my $command_max=20000; # LINUX SPECIFIC!!
	my $static_len=length("apt-extracttemplates");
	my $len=$static_len;
	my @collect;
	my $progress=0;
	my $show_progress=($apt && @debs > 30 && -t STDERR);

	sub apt_extracttemplates {
		my $apt_extracttemplates_pid = fork();
		my $error;
		if (not defined $apt_extracttemplates_pid) {
			$error = $!;
		} elsif (not $apt_extracttemplates_pid) {
			open(STDOUT, ">&", $info_writer)
				or die "debconf: redirect stdout failed: $!";
			exec("apt-extracttemplates", "--tempdir", $tempdir, @collect)
				or die "debconf: exec apt-extracttemplates failed: $!";
		} else {
			my $child = waitpid($apt_extracttemplates_pid, 0);
			if ($child == -1) {
				$error = $!;
			} elsif ($?) {
				$error = $?;
			}
		}
		print STDERR sprintf("debconf: ".gettext("apt-extracttemplates failed: %s")."\n", $error) if defined $error;
		if ($show_progress) {
			$progress += @collect;
			printf "\r".gettext("Extracting templates from packages: %d%%"), $progress * 100 / @debs;
		}
		return;
	}

	if ($show_progress) {
		STDOUT->autoflush(1);
	}
	foreach my $deb (@debs) {
		$len += length($deb) + 1;
		if ($len < $command_max && @collect < 30) {
			push @collect, $deb;
		}
		else {
			apt_extracttemplates();
			@collect=($deb);
			$len=$static_len + length($deb) + 1;
		}
	}
	apt_extracttemplates();
	print "\n" if $show_progress;
	exit;
}
close($info_writer);
my @buffer=<$info_reader>;
if ($apt && @buffer) {
	print gettext("Preconfiguring packages ...\n");
}
foreach my $line (@buffer) {
	($package, $version, $template, $config)=split /\s/, $line;

	if (defined $template && length $template) {
		eval {
			Debconf::Template->load($template, $package)
		};
		unlink $template;
		if ($@) {
			print STDERR "$package ".sprintf(gettext("template parse error: %s"), $@)."\n";
			unlink $config;
			next;
		}
	}
}

foreach my $line (@buffer) {
	($package, $version, $template, $config)=split /\s/, $line;

	if (defined $config && length $config && -e $config) {
		debug user => sprintf("preconfiguring %s (%s)",$package,$version);
		chmod(0755, $config) or
			die sprintf(gettext("debconf: can't chmod: %s"), $!);
		$frontend->default_title($package);
		$frontend->info(undef);
		my $confmodule=make_confmodule($config, 'configure', $version);
		$confmodule->owner($package);
		1 while ($confmodule->communicate);
		if ($confmodule->exitcode > 0) {
			print STDERR sprintf(
				gettext("%s failed to preconfigure, with exit status %s"),
				$package, $confmodule->exitcode)."\n";
		}
		unlink $config;
	}
}

$frontend->shutdown;

Debconf::Db->save;

remove_tree($tempdir, { safe => 1, keep_root => 1 });

