summaryrefslogtreecommitdiff
path: root/bin/patch_capabilities.pl
diff options
context:
space:
mode:
Diffstat (limited to 'bin/patch_capabilities.pl')
-rwxr-xr-xbin/patch_capabilities.pl52
1 files changed, 40 insertions, 12 deletions
diff --git a/bin/patch_capabilities.pl b/bin/patch_capabilities.pl
index d51f154528..d3013f6023 100755
--- a/bin/patch_capabilities.pl
+++ b/bin/patch_capabilities.pl
@@ -50,14 +50,23 @@ sub Usage() {
print("This script can be used to set capabilities of all binaries\n");
print("specified for deployment in a .pkg file.\n");
print("If no capabilities are given, the binaries will be given the\n");
- print("capabilities supported by self-signed certificates.\n");
- print("\n *** NOTE: If *_template.pkg file is given, 'target-platform' is REQUIRED. ***\n");
- print("\nUsage: patch_capabilities.pl pkg_filename <target-platform> [capability list]\n");
+ print("capabilities supported by self-signed certificates.\n\n");
+ print(" *** NOTE: If *_template.pkg file is given and one is using symbian-abld or\n");
+ print(" symbian-sbsv2 platform, 'target-platform' is REQUIRED. ***\n");
+ print("\nUsage: patch_capabilities.pl pkg_filename [target-platform [capability list]]\n");
print("\nE.g. patch_capabilities.pl myapp_template.pkg release-armv5 \"All -TCB\"\n");
exit();
}
-my @capabilitiesToSet = ("LocalServices", "NetworkServices", "ReadUserData", "UserEnvironment", "WriteUserData");
+sub trim($) {
+ my $string = shift;
+ $string =~ s/^\s+//;
+ $string =~ s/\s+$//;
+ return $string;
+}
+
+my @capabilitiesToAllow = ("LocalServices", "NetworkServices", "ReadUserData", "UserEnvironment", "WriteUserData");
+my @capabilitiesSpecified = ();
# If arguments were given to the script,
if (@ARGV)
@@ -98,10 +107,10 @@ if (@ARGV)
# If there are more arguments given, parse them as capabilities.
if (@ARGV)
{
- @capabilitiesToSet = ();
+ @capabilitiesSpecified = ();
while (@ARGV)
{
- push (@capabilitiesToSet, pop(@ARGV));
+ push (@capabilitiesSpecified, pop(@ARGV));
}
}
@@ -202,18 +211,37 @@ if (@ARGV)
print ("\n");
- my $baseCommandToExecute = "elftran -vid 0x0 -capability \"";
- if (@capabilitiesToSet)
- {
- $baseCommandToExecute .= join(" ", @capabilitiesToSet);
- }
- $baseCommandToExecute .= "\" ";
+ my $baseCommandToExecute = "elftran -vid 0x0 -capability \"%s\" ";
# Actually set the capabilities of the listed binaries.
foreach my $binaryPath(@binaries)
{
# Create the command line for setting the capabilities.
my $commandToExecute = $baseCommandToExecute;
+ if (@capabilitiesSpecified)
+ {
+ $commandToExecute = sprintf($baseCommandToExecute, join(" ", @capabilitiesSpecified));
+ } else {
+ # Test which capabilities are present and then restrict them to the allowed set.
+ # This avoid raising the capabilities of apps that already have none.
+ my $dllCaps;
+ open($dllCaps, "elftran -dump s $binaryPath |") or die ("Could not execute elftran");
+ my $capsFound = 0;
+ my @capabilitiesToSet;
+ my $capabilitiesToAllow = join(" ", @capabilitiesToAllow);
+ while (<$dllCaps>) {
+ if (!$capsFound) {
+ $capsFound = 1 if (/Capabilities:/);
+ } else {
+ $_ = trim($_);
+ if ($capabilitiesToAllow =~ /$_/) {
+ push(@capabilitiesToSet, $_);
+ }
+ }
+ }
+ close($dllCaps);
+ $commandToExecute = sprintf($baseCommandToExecute, join(" ", @capabilitiesToSet));
+ }
$commandToExecute .= $binaryPath;
# Actually execute the elftran command to set the capabilities.