package common; # $Id$

use MDK::Common;
use MDK::Common::System;
use diagnostics;
use strict;
use vars qw(@ISA @EXPORT $SECTORSIZE);

@ISA = qw(Exporter);
# no need to export ``_''
@EXPORT = qw($SECTORSIZE __ translate untranslate formatXiB removeXiBSuffix formatTime setVirtual makedev unmakedev salt internal_error);

# perl_checker: RE-EXPORT-ALL
push @EXPORT, @MDK::Common::EXPORT;


#-#####################################################################################
#- Globals
#-#####################################################################################
$SECTORSIZE      = 512;

#-#####################################################################################
#- Functions
#-#####################################################################################


sub _ {
    my $s = shift @_; my $t = translate($s);
    sprintf $t, @_;
}
sub __ { $_[0] }

sub salt {
    my ($nb) = @_;
    require devices;
    local *F;
    open F, devices::make("random") or die "missing random";
    my $s; read F, $s, $nb;
    local $_ = pack "b8" x $nb, unpack "b6" x $nb, $s;
    tr [\0-\x3f] [0-9a-zA-Z./];
    $_;
}

sub makedev { ($_[0] << 8) | $_[1] }
sub unmakedev { $_[0] >> 8, $_[0] & 0xff }

sub translate {
    my ($s) = @_;
    $s ? c::dgettext('libDrakX', $s) : '';
}

sub untranslate {
    my $s = shift || return;
    foreach (@_) { translate($_) eq $s and return $_ }
    die "untranslate failed";
}

BEGIN { undef *availableRamMB }
sub availableRamMB()  { 
    my $s = MDK::Common::System::availableRamMB();
    #- HACK HACK: if i810 and memsize
    require detect_devices;
    return $s - 1 if $s == 128 && grep { $_->{driver} =~ /i810/ } detect_devices::probeall();
    $s;
}

sub setVirtual {
    my $vt = '';
    local *C;
    sysopen C, "/dev/console", 2 or die "failed to open /dev/console: $!";
    ioctl(C, c::VT_GETSTATE(), $vt) or die "ioctl VT_GETSTATE failed";
    ioctl(C, c::VT_ACTIVATE(), $_[0]) or die "ioctl VT_ACTIVATE failed";
    ioctl(C, c::VT_WAITACTIVE(), $_[0]) or die "ioctl VT_WAITACTIVE failed";
    unpack "S", $vt;
}


sub removeXiBSuffix {
    local $_ = shift;

    /(\d+)\s*kB?$/i and return $1 * 1024;
    /(\d+)\s*MB?$/i and return $1 * 1024 * 1024;
    /(\d+)\s*GB?$/i and return $1 * 1024 * 1024 * 1024;
    /(\d+)\s*TB?$/i and return $1 * 1024 * 1024 * 1024 * 1024;
    $_;
}
sub formatXiB {
    my ($newnb, $newbase) = (@_, 1);
    my ($nb, $base);
    my $decr = sub { 
	($nb, $base) = ($newnb, $newbase);
	$base >= 1024 ? ($newbase = $base / 1024) : ($newnb = $nb / 1024);
    };
    foreach ('', _("KB"), _("MB"), _("GB")) {
	$decr->(); 
	if ($newnb < 1 && $newnb * $newbase < 1) {
	    my $v = $nb * $base;
	    my $s = $v < 10 && int(10 * $v - 10 * int($v));
	    return int($v) . ($s ? ".$s" : '') . $_;
	}
    }
    int($newnb * $newbase) . _("TB");
}

sub formatTime {
    my ($s, $m, $h) = gmtime($_[0]);
    if ($h) {
	sprintf "%02d:%02d", $h, $m;
    } elsif ($m > 1) {
	_("%d minutes", $m);
    } elsif ($m == 1) {
	_("1 minute");
    } else {
	_("%d seconds", $s);
    }
}

sub usingRamdisk { scalar(grep { /ram3/ } cat_("/proc/mounts")) }

sub expand_symlinks_but_simple {
    my ($f) = @_;
    my $link = readlink($f);
    my $f2 = expand_symlinks($f);
    if ($link && $link !~ m|/|) {
	# put back the last simple symlink
	$f2 =~ s|\Q$link\E$|basename($f)|e;
    }
    $f2
}

sub sync { &MDK::Common::System::sync }

# Group the list by n. Returns a reference of lists of length n
sub group_n_lm {
    my $n = shift;
    my @l;
    push @l, [ splice(@_, 0, $n) ] while (@_);
    @l
}

sub screenshot_dir__and_move {
    my ($dir1, $dir2) = ("$::o->{prefix}/root", '/tmp/stage2');
    if (-e $dir1) {
	if (-e "$dir2/DrakX-screenshots") {
	    cp_af("$dir2/DrakX-screenshots", $dir1);
	    rm_rf("$dir2/DrakX-screenshots");
	}
	$dir1;
    } else {
	$dir2;
    }
}

sub take_screenshot {
    my ($in) = @_;
    my $dir = screenshot_dir__and_move() . '/DrakX-screenshots';
    my $warn;
    if (!-e $dir) {
	mkdir $dir or $in->ask_warn('', _("Can't make screenshots before partitioning")), return;
	$warn = 1;
    }
    my $nb = 1;
    $nb++ while -e "$dir/$nb.png";
    system("fb2png /dev/fb0 $dir/$nb.png 0");

    $in->ask_warn('', _("Screenshots will be available after install in %s", "/root/DrakX-screenshots")) if $warn;
}

sub join_lines {
    my @l;
    my $s;
    foreach (@_) {
	if (/^\s/) {
	    $s .= $_;
	} else {
	    push @l, $s if $s;
	    $s = $_;
	}
    }
    @l, if_($s, $s);
}

sub internal_error {
    die "INTERNAL ERROR: $_[0]\n" . backtrace();
}

#-######################################################################################
#- Wonderful perl :(
#-######################################################################################
1; #
perl-install?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>commit</a><a href='/software/drakx/diff/perl-install?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>diff</a><a href='/software/drakx/stats/perl-install?h=16.16'>stats</a></td><td class='form'><form class='right' method='get' action='/software/drakx/log/perl-install'>
<input type='hidden' name='h' value='16.16'/><input type='hidden' name='id' value='dcdf50206dd91a777dee83515b193987a4fbfe2f'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/software/drakx/commit/?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>root</a>/<a href='/software/drakx/commit/perl-install?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>perl-install</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='h' value='16.16'/><input type='hidden' name='id' value='dcdf50206dd91a777dee83515b193987a4fbfe2f'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Pablo Saratxaga &lt;pablo@mandriva.com&gt;</td><td class='right'>2003-02-13 14:47:05 +0000</td></tr>
<tr><th>committer</th><td>Pablo Saratxaga &lt;pablo@mandriva.com&gt;</td><td class='right'>2003-02-13 14:47:05 +0000</td></tr>
<tr><th>commit</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/perl-install?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>dcdf50206dd91a777dee83515b193987a4fbfe2f</a> (<a href='/software/drakx/patch/perl-install?id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='sha1'><a href='/software/drakx/tree/?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>229707cf928fe0009146e92dfab545d369c7c77d</a> /<a href='/software/drakx/tree/perl-install?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>perl-install</a></td></tr>
<tr><th>parent</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/perl-install?h=16.16&amp;id=4c460d314455b8096367a484d45837871c5efdbb'>4c460d314455b8096367a484d45837871c5efdbb</a> (<a href='/software/drakx/diff/perl-install?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f&amp;id2=4c460d314455b8096367a484d45837871c5efdbb'>diff</a>)</td></tr><tr><th>download</th><td colspan='2' class='sha1'><a href='/software/drakx/snapshot/drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar'>drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar</a><br/><a href='/software/drakx/snapshot/drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar.gz'>drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar.gz</a><br/><a href='/software/drakx/snapshot/drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar.bz2'>drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar.bz2</a><br/><a href='/software/drakx/snapshot/drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar.xz'>drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.tar.xz</a><br/><a href='/software/drakx/snapshot/drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.zip'>drakx-dcdf50206dd91a777dee83515b193987a4fbfe2f.zip</a><br/></td></tr></table>
<div class='commit-subject'>updated Norwegian file</div><div class='commit-msg'></div><div class='diffstat-header'><a href='/software/drakx/diff/?h=16.16&amp;id=dcdf50206dd91a777dee83515b193987a4fbfe2f'>Diffstat</a> (limited to 'perl-install')</div><table summary='diffstat' class='diffstat'>