view TOOLS/w32codec_dl.pl @ 8575:1d15ca298dda

Fix DVD authentication on Solaris 9. Solaris 9 does not allow USCSICMD ioctls for non-root users on vold devices any more; they are failing with an EPERM "permission denied" error. Now, only root is allowed to run USCSICMD ioctls on vold devices. Fortunatelly there's a new subroutine exported from libsmedia.so (smedia_uscsi_cmd) which allows non-root users to perform user mode SCSI commands on a vold device. (This works with a help of a daemon running as user root, /usr/lib/smedia/rpc.smserverd) This change detects the presence of function "smedia_uscsi_cmd" in library libsmedia.so at runtime, and uses this function if it's found (i.e. on solaris 9 smedia_uscsi_cmd() is used to execture user mode scsi commands). On solaris 8 or older, "smedia_uscsi_cmd" is not available and the code falls back to the old ioctl(.. USCSICMD ..) method.
author jkeil
date Fri, 27 Dec 2002 16:29:11 +0000
parents 39805251ef61
children 0f1b5b68af32
line wrap: on
line source

#!/usr/bin/perl

## usage: w32codec_dl.pl (codec.conf location)

# this script will use MS's codec dl interface as used by MS Media Player
# to attempt to locate the codecs listed in codecs.conf. It will download
# them to a directory "codecs/" below the current dir.
# you will need the libwww-perl stuff and the utility "cabextract"
# which may be found at http://www.kyz.uklinux.net/cabextract.php3

# By Tom Lees, 2002. I hereby place this script into the public domain.

#use LWP::Debug qw(+);
use LWP::UserAgent;

$ua = LWP::UserAgent->new;
$ua->agent ("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");

# Parse the etc/codecs.conf file
my $cconf = $ARGV[0];
open CCONF, "<$cconf";

my $codec = "(none)";
my $mscodec = 0;

my $cc, @ccl;

mkdir "codecs";
chdir "codecs";

CC: while (<CCONF>)
{
	next CC if (m/^[ \t]*\;/);
	s/\;.*//g;
	s/#.*//g;
	
	if (m/^videocodec (.*)/)
	{
		$codec = $1;
	}
	elsif (m/^[ \t]+driver (.*)/)
	{
		if ($1 eq "dshow" || $1 eq "vfw")
		{
			$mscodec = 1;
		}
		else
		{
			$mscodec = 0;
		}
	}
	elsif (m/^[ \t]+fourcc (.*)/ && $mscodec == 1)
	{
		$cclist = $1;
		chomp $cclist;
		#@ccl = ();
		do
		{
			if ($cclist =~ m/\"(....)\"[, ]*(.*)/)
			{
				$cc = $1;
				$cclist = $2;
			}
			elsif ($cclist =~ m/[, ]*(....)[, ]*(.*)/)
			{
				$cc = $1;
				$cclist = $2;
			}
			else
			{
				$cc = $cclist;
				$cclist = "";
			}
			if (!($cc =~ m/^[ \t]+/))
			{
				push @ccl, ($cc);
			}
		} while (length ($cclist) > 0);
	}
}
close CCONF;

# Find the codecs
open CODEC_CABS, ">codecs.locations.info";
%fcc_try = ();
while ($#ccl > 0)
{
	$cc = pop (@ccl);
	if (!$fcc_try{"$cc"})
	{
		$fcc_try{"$cc"} = 1;
		if (!find_codec ($cc))
		{
			print "$cc found\n";
		}
		else
		{
			print "MS didn't find $cc\n";
		}
	}
}
close CODEC_CABS;

%got_codecs = ();
sub find_codec
{
	my ($fourcc) = @_;
	
	my $guid = sprintf ("%08X", unpack ("V", $fourcc))."-0000-0010-8000-00AA00389B71";
	
	my $req = HTTP::Request->new (POST => "http://activex.microsoft.com/objects/ocget.dll");
	$req->header ('Accept', '*/*');
	$req->content_type ('application/x-www-form-urlencoded');
	$req->content ("CLSID=%7B${guid}%7D\n");
	#$req->content ('CLSID={'.${guid}.'}');
	
	my $res = $ua->request ($req);
	
	if ($res->is_success) {
		print "Lookup returned success... weird!\n";
		return 1;
	} else {
		# Codec location
		if ($res->code == 302)
		{
			my $loc = $res->headers->header ("Location");
			if (!$got_codecs{"$loc"})
			{
				print CODEC_CABS "$loc\n";
				$got_codecs{"$loc"} = 1;
				get_codec ($loc);
			}
#			else
#			{
#				print "Already have $loc\n";
#			}
			return 0;
		}
		else
		{
#			print "Lookup failed (Microsoft probably doesn't know this codec)\n";
			return 1;
		}
	}
}

sub get_codec
{
	my ($url) = @_;
	
	my $req = HTTP::Request->new (GET => $url);
	$req->header ("Accept", "*/*");
	my $res = $ua->request ($req);
	
	if ($res->is_success)
	{
		open TMP, ">tmp.cab" or die "Unable to open tmp.cab";
		print TMP $res->content;
		close TMP;
		
		system "cabextract tmp.cab";
		unlink "tmp.cab";
	}
	else
	{
		print "No such file!\n";
	}
}