#!/usr/bin/perl
use strict;
use warnings;

my $typ_souboru;

#hlavní smyčka programu
foreach (@ARGV){
    next unless -e;

    my @data = stat;

    my $typ_souboru = ziskej_typ_souboru($_);
    my $prava = ziskej_prava($data[2]);
    my $odkazu = $data[3];
    my $uid = getpwuid $data[4];
    my $gid = getgrgid $data[5];
    my $velikost = $data[7];
    my $cas = zjisti_cas($data[9]);

    printf("%1s%9s %3s %7s %7s %10d %16s %s\n", $typ_souboru, $prava, $odkazu, $uid, $gid, $velikost, $cas, $_);
}


#--------------------------------------------------------------#


sub ziskej_typ_souboru {
    my($soubor) = @_;

    if    (-d $soubor){return "d";} #adresar
    elsif (-l $soubor){return "l";} #symbolicky odkaz
    elsif (-f $soubor){return "-";} #klasicky soubor
    elsif (-p $soubor){return "p";} #roura
    elsif (-b $soubor){return "b";} #blokovy
    elsif (-c $soubor){return "c";} #znakovy
    elsif (-S $soubor){return "s";} #socket
    else              {return "?";} #neznamy
}


#VSTUP: desitkovy format pristupovych prav
#VYSTUP: pristupova prava ve formatu retezce rwxrwxrwx
sub ziskej_prava {
    my $dec_prava = shift;
    my $oct_prava = sprintf "%o", $dec_prava & 07777;
    my($sbit, $suid, $sgid);
    my $retezec;

    if(length $oct_prava == 4){
        if (($oct_prava - 4000) >= 0){$oct_prava -= 4000; $suid = 1};
        if (($oct_prava - 2000) >= 0){$oct_prava -= 2000; $sgid = 1};
        if (($oct_prava - 1000) >= 0){$oct_prava -= 1000; $sbit = 1};
    }

    my($vlastnik, $skupina, $ostatni) = split "", $oct_prava;
    foreach my $us ($vlastnik, $skupina, $ostatni){
        if (($us - 4) >= 0){$us -= 4; $retezec .= "r";} else {$retezec .= "-";}
        if (($us - 2) >= 0){$us -= 2; $retezec .= "w";} else {$retezec .= "-";}
        if (($us - 1) >= 0){$us -= 1; $retezec .= "x";} else {$retezec .= "-";}
    }

    if ($suid and $suid == 1){
        substr $retezec, 2, 1, ((substr $retezec, 2, 1) eq "x") ? "s" : "S";}
    if ($sgid and $sgid == 1){
        substr $retezec, 5, 1, ((substr $retezec, 5, 1) eq "x") ? "s" : "S";}
    if ($sbit and $sbit == 1){
        substr $retezec, 8, 1, ((substr $retezec, 8, 1) eq "x") ? "t" : "T";}

    return $retezec;
}

#VSTUP: pocet sekund od 1.1.1970 0:00
#VYSTUP: datum ve formatu RRRR-MM-DD HH-MM
sub zjisti_cas {
    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($_[0]);
    return sprintf("%4d-%02d-%02d %02d:%02d", $year + 1900, $mon, $mday, $hour, $min)
}
