#!/usr/bin/perl

use strict; use warnings;
use File::Type;

my $max_file_size = 10*1024*1024; # 10Mb is max file size

my $ft = File::Type->new;

my ($device, $block_size, @mimetype_extension) = @ARGV;

unless (-r $device && $block_size && @mimetype_extension > 0 && @mimetype_extension % 2 == 0) {
	die "syntax: recoverfiles device block_size mime-type extension ...\n";
}
my %mimetype_extension = @mimetype_extension;

open DEVICE, $device;

my $block;
my $n = 0;
my $in_file = 0;
my $size = 0;
while (read DEVICE, $block, $block_size) {
	my $type = $ft->checktype_contents($block);
	if (my $extension = $mimetype_extension{$type}) {
		++$n;
		if (defined $extension && $extension ne "") {
			$extension = ".$extension";
		} else {
			$extension = "";
		}
		my $filename = sprintf("%06d", $n).$extension;
		print "$filename\n";
		open OUT, ">", $filename;
		print OUT $block;
		$size = $block_size;
		$in_file = 1;
	} elsif ($in_file) {
		if ($block =~ /^\0*$/ || $size >= $max_file_size) {
			$in_file = 0;
		} else {
			print OUT $block;
			$size += $block_size;
		}
	}
}
