featuremgmt/featureregistry/tools/featregconfig/scripts/checkfeatregconfig.pl
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/featuremgmt/featureregistry/tools/featregconfig/scripts/checkfeatregconfig.pl	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,182 @@
+# Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Feature Registry Configuration File Lister/Checker
+# 
+#
+
+use strict;
+
+# Usage help text
+my $usage = "Feature Registry Configuration File Lister/Checker\n" .
+			"Copyright (c) 2005 Symbian Software Ltd. All rights reserved\n\n" .
+			"Usage: perl $0 BINCONFIGFILE\n\n" .
+			"Returns 0 if config file is valid, non-zero and reasons otherwise\n";
+
+# Process command line
+if (1 != scalar(@ARGV))
+	{
+	print $usage;
+	exit 1;
+	}
+my $binConfigFile = $ARGV[0];
+
+# open config file in binary mode
+my $BINCONFIG;
+if (!open ($BINCONFIG, $binConfigFile))
+	{
+	print "ERROR: Binary config file is missing or cannot be opened";
+	exit 1;
+	}
+binmode $BINCONFIG;
+
+# Check file size
+my ($dev, $ino, $mode, $nlink, $_uid, $_gid, $redv, $size, $atime, $mtime, $ctime, $blksize, $blocks)
+	= stat $BINCONFIG;
+my $headerSize = 16;
+if ($size < $headerSize)
+	{
+	print "INVALID Feature Registry Config File: file is too small, must have at least 16 byte header";
+	exit 1;
+	}
+my $KMaxLargePropertySize = 65535;
+if ($size > $KMaxLargePropertySize)
+	{
+	print "INVALID Feature Registry Config File: File is larger than limit of 65535 bytes";
+	exit 1;
+	}
+if ($size > 4096) # arbitrarily chosen; it may be sensible to change the way featreg works if config files become this big
+	{
+	print "WARNING: Large Feature Registry config file (", $ARGV[0], "); something may be wrong\n";
+	}
+
+# Read and check header
+my $packedHeader;
+if (!read($BINCONFIG, $packedHeader, $headerSize) ||
+	(length $packedHeader < 16))
+	{
+	print "INVALID Feature Registry Config File: Could not read 16-byte header";
+	exit 1;
+	}
+my ($feat, $version, $entryCount, $rangeCount) = unpack 'a4I3', $packedHeader;
+if ($feat ne 'feat')
+	{
+	print "INVALID Feature Registry Config File: First 4 bytes of header must be ASCII 'f' 'e' 'a' 't'";
+	exit 1;
+	}
+if ($version != 0)
+	{
+	print "INVALID Feature Registry Config File: Second 32-bit word in header (version/flags) must be zero";
+	exit 1;
+	}
+my $entrySize = 8;
+my $rangeSize = 8;
+my $expectedSize = $headerSize + $entryCount*$entrySize + $rangeCount*$rangeSize;
+if ($expectedSize != $size)
+	{
+	print "INVALID Feature Registry Config File: Size of file ($size bytes) does not match size expected from header" .
+		  " ($expectedSize bytes) for $entryCount feature entries and $rangeCount default ranges";
+	exit 1;
+	}
+
+# Write information from the header:
+print "Feature Registry Configuration file '$binConfigFile'\n";
+print "Contains $entryCount feature entries and $rangeCount default ranges\n";
+
+print "---\n";
+
+# Check individual feature entries are listed by increasing (and non-repeating) UID, and write them to STDOUT
+my $lastFeatureUid = 0;
+for (my $e = 0; $e < $entryCount; $e++)
+	{
+	my $packedEntry;
+	if (!read($BINCONFIG, $packedEntry, $entrySize) ||
+		(length $packedEntry < $entrySize))
+		{
+		print "INVALID Feature Registry Config File: Unable to read feature entry $e";
+		exit 1;
+		}
+	my ($featureUid, $status) = unpack 'I2', $packedEntry;
+	printf "Feature UID 0x%08X, status = 0x%08X (%s)\n", $featureUid, $status, ($status & 1) ? 'supported' : 'not supported';
+	if (($e > 0) && ($featureUid <= $lastFeatureUid))
+		{
+		print "INVALID Feature Registry Config File: Feature entries not listed by increasing (and non-repeating) UID";
+		exit 1;
+		}
+	if ($status & ~3)
+		{
+		print "WARNING Feature Registry Config File: Feature entry status bits 2-31 should be zero\n";
+		}
+	$lastFeatureUid = $featureUid;
+	}
+
+print "---\n";
+
+# Check default supported ranges are in low-UID / high-UID pairs
+# AND that the Symbian Essential default range is covered:
+my $EssentialDefaultSupportedRangeLowUid = 271030278;
+my $EssentialDefaultSupportedRangeHighUid = 271063045;
+if (($EssentialDefaultSupportedRangeLowUid != 0x10279806) ||
+	($EssentialDefaultSupportedRangeHighUid != 0x10281805))
+	{
+	print "ERROR Mismatch on Feature Registry Symbian essential default-supported range";
+	exit 1;
+	}
+my $haveEssentialRange;
+for (my $r = 0; $r < $rangeCount; $r++)
+	{
+	my $packedRange;
+	if (!read($BINCONFIG, $packedRange, $entrySize) ||
+		(length $packedRange < $rangeSize))
+		{
+		print "INVALID Feature Registry Config File: Unable to read default-supported range $r";
+		exit 1;
+		}
+	my ($lowUid, $highUid) = unpack 'I2', $packedRange;
+	printf "Feature UID range 0x%08X to 0x%08X supported by default\n", $lowUid, $highUid;
+	if (($lowUid <= $EssentialDefaultSupportedRangeLowUid) &&
+		($highUid >= $EssentialDefaultSupportedRangeHighUid))
+		{
+		$haveEssentialRange = 1;
+		}
+	if ($lowUid > $highUid)
+		{
+		print "INVALID Feature Registry Config File: Default-supported range is not listed in order Low-UID High-Uid";
+		exit 1;
+		}
+	}
+
+if (!$haveEssentialRange)
+	{
+	printf "INVALID Feature Registry Config File: Symbian essential default-supported UID range 0x%08X to 0x%08X is not present\n",
+		$EssentialDefaultSupportedRangeLowUid, $EssentialDefaultSupportedRangeHighUid;
+	exit 1;
+	}
+
+# Confirm there's nothing more to read
+my $junk;
+if (read $BINCONFIG, $junk, 1)
+	{
+	printf "INVALID Feature Registry Config File: Unexpected data at end of binary configuration file";
+	exit 1;
+	}
+
+# Warn if the filename is not 'featreg.cfg' (case insensitive)
+if ($binConfigFile !~ m/[Ff][Ee][Aa][Tt][Rr][Ee][Gg]\.[Cc][Ff][Gg]$/)
+	{
+	printf "WARNING Feature Registry Config File must be called 'featreg.cfg'";
+	}
+
+# Success - a valid configuration file (but it's up to you to guarantee the entries and ranges are correct,
+# and to put the file in the correct location
+exit 0;