diff --git a/mmdebstrap b/mmdebstrap index 0e9fb0a..afe0743 100755 --- a/mmdebstrap +++ b/mmdebstrap @@ -1953,7 +1953,7 @@ sub run_setup() { # since we do not know the dpkg version inside the chroot at this # point, we can only omit it in chrootless mode if ($options->{mode} ne 'chrootless' - or scalar @{ $options->{dpkgopts} } > 0) { + or length $options->{dpkgopts} > 0) { push @directories, '/etc/dpkg/dpkg.cfg.d/'; } # if dpkg and apt operate from the outside we need some more @@ -2083,26 +2083,11 @@ sub run_setup() { close $fh; } - if (scalar @{ $options->{aptopts} } > 0 + if (length $options->{aptopts} > 0 and (!-e "$options->{root}/etc/apt/apt.conf.d/99mmdebstrap")) { open my $fh, '>', "$options->{root}/etc/apt/apt.conf.d/99mmdebstrap" or error "cannot open /etc/apt/apt.conf.d/99mmdebstrap: $!"; - foreach my $opt (@{ $options->{aptopts} }) { - if (-r $opt) { - # flush handle because copy() uses syswrite() which bypasses - # buffered IO - $fh->flush(); - copy $opt, $fh or error "cannot copy $opt: $!"; - } else { - print $fh $opt; - if ($opt !~ /;$/) { - print $fh ';'; - } - if ($opt !~ /\n$/) { - print $fh "\n"; - } - } - } + print $fh $options->{aptopts}; close $fh; if ($verbosity_level >= 3) { debug "content of /etc/apt/apt.conf.d/99mmdebstrap:"; @@ -2110,7 +2095,7 @@ sub run_setup() { } } - if (scalar @{ $options->{dpkgopts} } > 0 + if (length $options->{dpkgopts} > 0 and (!-e "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap")) { # FIXME: in chrootless mode, dpkg will only read the configuration # from the host -- see #808203 @@ -2120,19 +2105,7 @@ sub run_setup() { } open my $fh, '>', "$options->{root}/etc/dpkg/dpkg.cfg.d/99mmdebstrap" or error "cannot open /etc/dpkg/dpkg.cfg.d/99mmdebstrap: $!"; - foreach my $opt (@{ $options->{dpkgopts} }) { - if (-r $opt) { - # flush handle because copy() uses syswrite() which bypasses - # buffered IO - $fh->flush(); - copy $opt, $fh or error "cannot copy $opt: $!"; - } else { - print $fh $opt; - if ($opt !~ /\n$/) { - print $fh "\n"; - } - } - } + print $fh $options->{dpkgopts}; close $fh; if ($verbosity_level >= 3) { debug "content of /etc/dpkg/dpkg.cfg.d/99mmdebstrap:"; @@ -4520,8 +4493,8 @@ sub main() { architectures => [$hostarch], mode => 'auto', format => 'auto', - dpkgopts => [], - aptopts => [], + dpkgopts => '', + aptopts => '', apttrusted => $apttrusted, apttrustedparts => $apttrustedparts, noop => [], @@ -4588,9 +4561,44 @@ sub main() { }, 'architectures=s@' => \$options->{architectures}, 'mode=s' => \$options->{mode}, - 'dpkgopt=s@' => \$options->{dpkgopts}, - 'aptopt=s@' => \$options->{aptopts}, - 'keyring=s' => sub { + 'dpkgopt=s' => sub { + my ($opt_name, $opt_value) = @_; + if (-r $opt_value) { + open my $fh, '<', $opt_value + or error "failed to open $opt_value: $!"; + $options->{dpkgopts} .= do { local $/; <$fh> }; + if ($options->{dpkgopts} !~ /\n$/) { + print $fh "\n"; + } + close $fh; + } else { + $options->{dpkgopts} .= $opt_value; + if ($opt_value !~ /\n$/) { + $options->{dpkgopts} .= "\n"; + } + } + }, + 'aptopt=s' => sub { + my ($opt_name, $opt_value) = @_; + if (-r $opt_value) { + open my $fh, '<', $opt_value + or error "failed to open $opt_value: $!"; + $options->{aptopts} .= do { local $/; <$fh> }; + if ($options->{aptopts} !~ /\n$/) { + print $fh "\n"; + } + close $fh; + } else { + $options->{aptopts} .= $opt_value; + if ($opt_value !~ /;$/) { + $options->{aptopts} .= ';'; + } + if ($opt_value !~ /\n$/) { + $options->{aptopts} .= "\n"; + } + } + }, + 'keyring=s' => sub { my ($opt_name, $opt_value) = @_; if ($opt_value =~ /"/) { error "--keyring: apt cannot handle paths with double quotes:"