#!/usr/bin/perl -w

use strict;

my $dev;
my $name;
my $model;

my %device_names;
my %device_models;

while(glob("/dev/video*"))
{
	if(/\/dev\/(video\d+)$/)
	{
		$dev=$1;

		print "$dev\n";

		$name=`cat /sys/class/video4linux/$dev/name`;
		chomp $name;

		if(-e "/sys/class/video4linux/$dev/model")
		{
			$model=`cat /sys/class/video4linux/$dev/model`;
			chomp $model;
		}
		else
		{
			$model="generic";
		}

		print "name:  $name\n";
		print "model: $model\n";

		$device_names{$dev}=$name;
		$device_models{$dev}=$model;
	}
}

-d "/dev/video" or mkdir "/dev/video";
-d "/dev/video/by-name" or mkdir "/dev/video/by-name";
-d "/dev/video/by-model" or mkdir "/dev/video/by-model";

my $i=0;
my $found;
my $dev_stat;
foreach $dev (keys %device_names)
{
	$name=$device_names{$dev};

# gets information about the device, really just using to test if the 
# link already exists
	$dev_stat=stat "/dev/$dev";
	$found=0;
	$i=0;
	while(! $found)
	{
		if( -e "/dev/video/by-name/${name}_$i" and
			$dev_stat != stat("/dev/video/by-name/${name}_$i"))
		{
			$i++;
		}
		else 
		{
			$found=1;
		}
	}

# now check if the target exists, otherwise make a symlink
	if(! -e "/dev/video/by-name/${name}_$i")
	{
		print("linking /dev/$dev -> /dev/video/by-name/${name}_$i\n");
		symlink("/dev/$dev","/dev/video/by-name/${name}_$i");
	}
}

#do the same for models

foreach $dev (keys %device_models)
{
	$model=$device_models{$dev};

	$found=0;
	$i=0;
	while(! $found)
	{
		if( -e "/dev/video/by-model/${model}_$i" and
			$dev_stat != stat("/dev/video/by-model/${model}_$i"))
		{
			$i++;
		}
		else 
		{
			$found=1;
		}
	}
	if(! -e "/dev/video/by-model/${model}_$i")
	{
		print("linking /dev/$dev -> /dev/video/by-model/${model}_$i\n");
		symlink("/dev/$dev","/dev/video/by-model/${model}_$i");
	}

}
