#!/usr/bin/perl -w
use strict;
my $DEBUG = 0;

unless (@ARGV == 2) {
	print STDERR "use: $0 {-F|-S} full.host.name > full.host.name.{ftp|netbios}\n";
	print STDERR "\t -F = FTP, -S = SMB\n";
	exit 1;
}

my %options = (Host => $ARGV[1]);
$options{'Debug'} = 1 if $DEBUG;
$options{'debug'} = 10 if $DEBUG;

my ($scan, $scan_type);
if ($ARGV[0] eq '-F') {
	use ShareScanner::FTP;
	$scan = ShareScanner::FTP->new(%options);
	$scan_type = 'FTP';
} elsif ($ARGV[0] eq '-S') {
	use ShareScanner::SMB;
	$scan = ShareScanner::SMB->new(%options);
	$scan_type = 'SMB';
} else {
	die "unknown mode: ".$ARGV[0];
}

die "couldn't connect to $scan_type host: ". $ARGV[1] . "\n" unless defined $scan;

sub netstring
{
	my ($v) = @_;
	return length($v).':'.$v.',';
}

my @dir_fifo = qw(/);
my @dir_levels = qw(0);
my @dir_index = ( 0 );
my $MAX_RECURSION = 32;
my $out_line = 1;

while (@dir_fifo) {
	my $dir = shift @dir_fifo;
	my $level = shift @dir_levels;
	my $dir_index = shift @dir_index;

	my $listing = $scan->scan_directory($dir);
	next unless defined $listing;

	foreach (@$listing) {
		my ($name, $size, $is_dir) = @$_;
		next if $name =~ m/[\/\\]/;
		if ($is_dir) {
			$name .= '/';
			if ($level < $MAX_RECURSION) {
				push @dir_fifo, $dir . $name;
				push @dir_levels, $level + 1;
				push @dir_index, $out_line;
			}
		}
		build_rec($name, $dir_index, $size);
		++$out_line;
	}
}

sub build_rec
{
	my ($name, $dir_index, $size) = @_;

	print netstring($name)."$dir_index,$size,\n";
}

