#!/usr/local/bin/perl

$Index="/var/spool/uucppublic/index";
$HeadList="/usr/libexec/ifmail/extfreq/banner.txt";

#$Index="./";

$IndexMode="664";
$IndexOwner="uucp.uucp";
$Areas='dirs.frq';
$Aliases="aliases.frq";
$FilesDesc="files.desc";

$Station="DEEP GRAVE STATION";
$TempFile='';
$Resume="/tmp/resume";

$ListCols=70;
format ALIAS_HDR =

   FREQ ALIASES ON @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                    $Station


.
format ALIAS_END =


@<<<<<<<<<<<<<<<<<<<<<<<<<<
 $AreaEnd

.
format AREA_HDR =




 ->  AREA  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   ACCESS: @<<<<<<<<<<<<<<< 
             $AreaName                                        $FreqStatus
~~         ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                            
             $AreaName
                          
 -> TOTAL : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                
             $AreaEnd


.

format RESUME_BEG =




       Area Name                                    Files      Size (bytes) 

.

format RESUME_F =
 @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  @<<<<<<<<<  @<<<<<<<<<<<< 
  $AreaNm					    $files       $bytes
.

format RESUME_END =

 TOTAL ON @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  @<<<<<<<<<  @<<<<<<<<<<<< 
           $Station				    $TotalFiles  $TotalSize


.


#  -   .

if( ! open( HeadList )) {
	print STDERR "Warning: Cannot open $HeadList. $!\n";
} else {
	while( <HeadList> ) {
		print $_;
	}
	close( HeadList );
}

rename( $Index."/files.db", $Index."/files.db.b" );
#rename( $Index."/files.pag", $Index."/files.pag.b" );
if( ! dbmopen( Files, $Index."/files", 0664 )) {
	print STDERR "Error: Cannot create dbm files. $!\n";
	&RestoreIndex();
}

if( ! &ProcessAliases()) {
	&RestoreIndex();
}

$TotalFiles = 0;
$TotalSize = 0;

if( ! &ProcessAreas()) {
	&RestoreIndex();
}

#  
#$AreaEnd = "Total $TotalSize bytes in $TotalFiles files.";
#$~ = LIST_END;
#write;
$~ = RESUME_BEG;
write;
if( ! open( Resume )) {
	print STDERR "Warning: Cannot open $Resume. $!\n";
} else {
	while( <Resume> ) {
		print $_;
	}
	close( Resume );
}
unlink ($Resume);
$~ = RESUME_END;
write;

dbmclose( Files );
system "chmod $IndexMode $Index/files.* ; chown $IndexOwner $Index/files.*";
exit( 0 );


sub RestoreIndex {
	rename( $Index."/files.bak", $Index."/files.bak1" );
	system "chmod $IndexMode $Index/files.* ; chown $IndexOwner $Index/files.*";
	exit( 1 );
}

sub ProcessAliases {
	local( $ls );
	local( $file, $path, $desc );
	local( $ipath, $tmp );
	local( $freqstat, $size, $date, $s );
	local( $count ) = 0;

	if( ! open( ls, $Index."/".$Aliases )) {
		print STDERR "Error: Cannnot open $Aliases. $!\n";
		return 0;
	}
#	$AreaName = "Area: Aliases";
	$~ = ALIAS_HDR;
	write;
	while( <ls> ) {
		chop;
		next if( /^[ \t]*$/ );
		next if( /^[ \t]*#/ );
		( $file, $path, $desc ) = split( /[ \t]+/, $_, 3 );
		$file =~ tr/[a-z]/[A-Z]/;
		if( defined( $Files{$file} )) {
			( $ipath, $tmp ) = split( /[ \t]+/, $Files{$file}, 2 );
			print STDERR "Warning: $file($path) already defined. First define $ipath\n";
			next;
		}
		if( ! $desc ) {
			$desc = &ReadDesc( $path );
		}
		$tmp = substr( $path, 0, rindex( $path, "/" ));
#		$freqstat = ( &ReadADesc( $tmp ))[0];
		$freqstat = "a";
		( $size, $date ) = &SizeDate( $path );
		$Files{$file} = $path." ".$freqstat." ".$size." ".$date." ".$desc;
		&PrintList( $file, 0 );
		$count++;
	}
	close( ls );
#		if( ! open( TempFile )) {
#			print STDERR "Warning: Cannot open $TempFile. $!\n";
#       		} else {
#			while( <TempFile> ) {
#				print $_;
#			}
#			close( TempFile );
#		}
	print $TempFile;
	$TempFile='';
	$AreaEnd = "Total ".$count." aliases.";
	$~ = ALIAS_END;
	write;
#        unlink ($TempFile);
	return 1;
}

sub ProcessAreas {
	local( $dir ) = $Index."/".$Areas;
#	local( $dir ) = $Areas;

	if( ! open( dir )) {
		print STDERR "Error: Cannot open $dir $!\n";
		return 0;
	} else { print STDERR "Process $dir.\n"};
	while( <dir> ) {
		chop;
		next if( /^[ \t]*$/ );
		next if( /^[ \t]*#/ );
		&ProcessArea( $_ );
	}
	close( dir );
	return 1;
}

sub ProcessArea {
	local( $areapath ) = $_[0];
	local( $files, $bytes );
	local( $ls, $ipath, $tmp );
	local( $file, $path, $fstat, $size, $date, $desc );
#
	local( %desc_fil );
#
	( $FreqStatus, $AreaName ) = &ReadADesc( $areapath );
	$AreaName = $AreaName;
	$AreaNm = $AreaName;
	$AreaPath = "path: ".$areapath;
	$fstat = $FreqStatus;
	if( $FreqStatus =~ /^p$/ ) {
		$FreqStatus = " PROTECTED.";
	} elsif( $FreqStatus =~ /^l$/ ) {
		$FreqStatus = " LISTED.";
	} elsif( $FreqStatus =~ /^a$/ ) {
		$FreqStatus = " EVERYBODY.";
	} else {
		$FreqStatus = " DISABLE.";
	}
#	$~ = AREA_HDR;
#	write;
	open (RS, ">>".$Resume);
	$files = 0;
	$bytes = 0;
#	  .
	&ReadFiles( $areapath );
#
	if( open( ls, "ls -1tr $areapath/ |" )) {
		while( <ls> ) {
			chop;
			next if( /^\.*$/ );
			next if( /\.desc$/ );
			next if( /^files\..../i );
			$file = $_;
			$path = $areapath."/".$file;
			next if( ! ( -f $path ));
			$file =~ tr/[a-z]/[A-Z]/;
			if( defined( $Files{$file} )) {
				( $ipath, $tmp ) = split( /[ \t]+/, $Files{$file}, 2 );
				print STDERR "Warning: $file($path) already defined. First define $ipath\n";
				next;
			}
#			$desc = &ReadDesc( $path );
			$desc = &ReadDesc( $file );
			( $size, $date ) = &SizeDate( $path );
			$Files{$file} = $path." ".$fstat." ".$size." ".$date." ".$desc;
			&PrintList( $file, 0 );
			$files++;
			$bytes += $size if( $size =~ /^[0-9]+$/ );
		}
		close( ls );
	} else {
		print STDERR "Warning: Cannot read $areapath. $!\n";
	}
	$TotalFiles += $files;
	$TotalSize += $bytes;
	$AreaEnd = "$bytes byte(s) in $files file(s).";
        if ( ($files != 0) || ($bytes != 0))
        {
	$~ = AREA_HDR;
	write;
	print $TempFile;
#		if( ! open( TempFile )) {
#			print STDERR "Warning: Cannot open $TempFile. $!\n";
#       		} else {
#			while( <TempFile> ) {
#				print $_;
#			}
#			close( TempFile );
#		}

#	$~ = AREA_END;
#	write;
	$tt = select(RS);
	$~ = RESUME_F;
	write;
	select($tt);
        close (RS);
	}
#        unlink ($TempFile);
        $TempFile='';
	return 1;
}

sub ReadFiles {
  local($files) = $_[0]."/files.bbs";
  local($last_e) = 0;

if (open(files)) {
 local($file,$count,$desc);

 while (<files>) {
  $s = $_;
  if ((substr($s,0,1) ne ' ') && (length($s) != 1)) {
   @word = split(/ /,$s);
   $last_e = 0;
   $desc = '';
   $count = '';
   for ($i=0;$i <= $#word;$i++) {
    if (length($word[$i]) !=0){
     if ($i == 0) {
      $file = $word[$i];
      $file =~ tr/[a-z]/[A-Z]/;
     };
     if ($word[$i] =~ /\[[0-9][0-9][0-9]\]/) {
      $count = $word[$i];$word[$i]='';
      $count =~ s/\[([0-9])([0-9])([0-9])\]/$1$2$3/g;
      $count =~ s/[\n\r]//g;
     };
     if ($i > 0) {
       $desc = $desc.$word[$i].' ';
       $desc =~ s/[\n\r]//g;
     };
    };
   };
   if (length($count) == 0) {$count = '000'};
# print "F:",$file," C:",$count," D:",$desc,"\n";
   $desc_fil{$file}='['.$count.'] '.$desc;
  } else {
   if ($last_e == 0) {
    if (length($s) == 1) { $last_e = 1;} else {
     $s =~ s/  / /g;
     $s =~ s/[\r\n]//g;
     $desc_fil{$file}=$desc_fil{$file}.' '.$s;
    };
   };
  };
 };
 close (files);
}
};

sub ReadDesc {
	local( $path ) = $_[0].".desc";
	local( $tmp );
	if( !open( path )) {
##	  if(dbmopen(desc_fil,"./files-des",undef)) {
		if (defined($desc_fil{$_[0]})) {$tmp = $desc_fil{$_[0]};
		 close (desc_fil);
		 return $tmp;
		};
##          }
		return "Description missing";
	} else {
		while( <path> ) {
			chop;
			$tmp .= $_." ";
		}
		close( path );
		return $tmp ;
	}
}

sub ReadADesc {
	local( $path ) = $_[0]."/.desc";
	local( @ret, $tmp );

	if( ! open( path )) {
		$ret[0] = "-";
		$ret[1] = "No name";
	} else {
		$tmp = "";
		while( <path> ) {
			chop;
			next if( /^[ \t]*$/ );
			next if( /^[ \t]*#/ );
			$tmp = $_;
			last;
		}
		@ret = split( /[ \t]+/, $tmp, 2 );
		if( $ret[0] =~ /^[pP]/ ) {
			$ret[0] = "p";
		} elsif( $ret[0] =~ /^[lL]/ ) {
			$ret[0] = "l";
		} elsif( $ret[0] =~ /^[aA]/ ) {
			$ret[0] = "a";
		} else {
			$ret[0] = "-";
		}
		close( path );
	}
	return @ret;
}

sub SizeDate {
	local( $file ) = $_[0];
	local( @st, @ret, @tm );
#	local( @month ) = ( Nul, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec );
	local( @month ) = ( Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec );

	if( @st = stat( $file )) {
		$ret[0] = $st[7];
		@tm = localtime( $st[9] );
		$ret[1] = sprintf( "%02d-%3s-%02d", $tm[3], $month[$tm[4]], $tm[5] );
	} else {
		$ret[0] = "off";
		$ret[1] = "line";
	}
	return @ret;
}

sub PrintList {
	local( $file ) = $_[0];
	local( $mode ) = $_[1];
	local( $fstat, $size, $date, $path, $desc );
	local( @_desc, @adesc, $str, $l, $w, $s );

	if( ! defined( $Files{$file} )) {
		return;
	}
#	open (FOUT, ">>".$TempFile );
	( $path, $fstat, $size, $date, $desc ) = split( /[ \t]+/, $Files{$file}, 5 );
	@_desc = split( /[ \t]+/, $desc );
	if( $mode ) {
		$str = sprintf( "%1s %-12s %7s %-8s", $fstat, $file, $size, $date );
	} else {
		$str = sprintf( "%-12s %7s %-8s", $file, $size, $date );
	}
	$l = length( $str ) + 1;
	$adesc[0] = "";
	for( $w = 0, $s = 0;; $w++ ) {
		if(((( length( $adesc[$s] ) + $l + length( $_desc[$w] )) < $ListCols )) && ( $w <= $#_desc )) {
			$adesc[$s] .= " ".$_desc[$w];
		} else {
			if( $s == 0 ) {
#				print FOUT $str.$adesc[$s]."\n";
				$TempFile .= sprintf ($str.$adesc[$s]."\n");
			} else {
#				print FOUT " " x $l, $adesc[$s]."\n";
#				for ( $cc = 0; $cc < $l; $cc++)
#				{
#					$TempFile .= ' ';
#				}
				$TempFile .= sprintf ("%-30s %s\n"," ",$adesc[$s]);
#				$TempFile .= sprintf ("%-$ls %s\n"," ",$adesc[$s]);
			}
			$s++;
			$adesc[$s] = $_desc[$w];
			last if( $w > $#_desc );
		}
	}
#	close (FOUT);
}
