#!/bin/sh
# $Id$
# By: Yotam Medini  - yotam_medini@yahoo.com
# Available from:  http://hammer.prohosting.com/~yotam/download/index.html
#
# the next line restarts using wish \
exec wish "$0" "$@"

proc usage {} {
   global fwGlob;
   puts stderr \
      "Usage: fwatch \[-show <fmt> <x>\] \[-h | -help\] \[-t <n>\] \[files\]";
   puts stderr   "   where x is binary combination of:";
   foreach i $fwGlob(items) {
      puts stderr [format "     0x%03x - %s" $fwGlob(opt,$i) $i];
   }
   puts "For example: fwatch -show %x 9b9 /etc/passwd";
}; # usage


proc getArgs {argc argv} {
   global fwGlob;
   set fwGlob(display) 0xffff; # all
   set fwGlob(sampleTime) 1000;
   set optionsEnded 0;
   for {set i 0} {[expr ($i < $argc) && !$optionsEnded]} {} {
      set i1 [expr $i+1];
      set i2 [expr $i+2];
      set opt [lindex $argv $i];
      if {![string compare $opt -show]} {
         scan [lindex $argv $i2] [lindex $argv $i1] fwGlob(display);
         set i [expr $i+3];
      } elseif {![string compare $opt -h]} {
         usage;  
         exit 0;
      } elseif {![string compare $opt -t]} {
         set fwGlob(sampleTime) [expr 1000*[lindex $argv $i1]];
         set i [expr $i+2];
      } else {
         set optionsEnded 1;
      }
   }
   set fi 0;
   while {$i < $argc} {
      set fwGlob(file,$fi) [lindex $argv $i];
      incr fi;
      incr i;
   }
   set fwGlob(nFiles) $fi;
   return $fi;
}; # getArgs


proc strtime {t} {
   set s [clock format $t -format "%Y%b%d %H:%M:%S"];
   return $s;
}; # strtime


proc statFile {fi} {
   global fwGlob;
   set fn $fwGlob($fi,name);
   if {![file exists $fn]} {
      foreach i $fwGlob(items) {
         set fwGlob($fi,$i) "";
      }
      set fwGlob($fi,name) $fn;  # restore
   } else {
      file stat $fn a;
      foreach i {uid gid nlink size dev ino type} {
         set fwGlob($fi,$i) $a($i); # as is
      }
      foreach i {mtime atime ctime} {
         set fwGlob($fi,$i) [strtime $a($i)];
      }
      set fwGlob($fi,mode) [format %o $a(mode)];
   }
}; # statFile


proc statFiles {} {
   global fwGlob;
   set nf $fwGlob(nFiles);
   for {set fi 0} {$fi < $nf} {incr fi} {
      statFile $fi;
   }
   foreach i $fwGlob(items) {
      if [expr $fwGlob(opt,$i) & $fwGlob(display)] {
         set max [expr [string length $fwGlob(s2m,$i)] + 1];
         for {set fi 0} {$fi < $nf} {incr fi} {
            set l [string length $fwGlob($fi,$i)];
            if {$max < $l} {set max $l;};
         }
         for {set fi 0} {$fi < $nf} {incr fi} {
            set l [string length fwGlob($fi,$i)];
            eval .f.$i$fi configure -width $max;
         }
      }
   }
   after $fwGlob(sampleTime) statFiles;
}; # statFiles


########################################################################
set fwGlob(items) [list \
   name uid gid ctime mtime atime nlink mode type  dev ino size];

set opt 1;
foreach i $fwGlob(items) {
   set fwGlob(opt,$i) $opt;
   set opt [expr 2*$opt];
}
set nf [getArgs $argc $argv];

pack [frame .f -background green];
# Label strings
set fwGlob(s2m,name) Name;
set fwGlob(s2m,uid) User;
set fwGlob(s2m,gid) Group;
set fwGlob(s2m,ctime) Created;
set fwGlob(s2m,mtime) Modified;
set fwGlob(s2m,atime) Accessed;
set fwGlob(s2m,nlink) "\#link";
set fwGlob(s2m,mode) Mode;
set fwGlob(s2m,type) Type;
set fwGlob(s2m,dev) Dev;
set fwGlob(s2m,ino) inode;
set fwGlob(s2m,size) Size;

set labels {};
foreach i $fwGlob(items) {
   if [expr $fwGlob(opt,$i) & $fwGlob(display)] {
      lappend labels [label .f.$i -text $fwGlob(s2m,$i)];
   }
}
eval grid $labels -sticky ew -padx 1 -pady 2;
for {set fi 0} {$fi < $nf} {incr fi} {
   set labels {};
   set coli 0;
   foreach i $fwGlob(items) {
      if [expr $fwGlob(opt,$i) & $fwGlob(display)] {
         set fwGlob($fi,$i) "?";
         set anchor w;
         if {[lsearch {nlink mode dev inode size} $i] != -1} {
            set anchor e;
         }
         lappend labels [label .f.$i$fi \
                        -font fixed -anchor $anchor \
                        -textvariable fwGlob($fi,$i)];
         grid .f.$i$fi -row [expr $fi+1] -column $coli  -padx 1;
         incr coli;
      }
   }
   set fwGlob($fi,name) $fwGlob(file,$fi);
}
statFiles;
raise .;

# exit 0;
