1*b1cdbd2cSJim Jagielski#************************************************************** 2*b1cdbd2cSJim Jagielski# 3*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski# distributed with this work for additional information 6*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski# 11*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski# 13*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski# under the License. 19*b1cdbd2cSJim Jagielski# 20*b1cdbd2cSJim Jagielski#************************************************************** 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielskipackage installer::upx; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse installer::converter; 27*b1cdbd2cSJim Jagielskiuse installer::existence; 28*b1cdbd2cSJim Jagielskiuse installer::globals; 29*b1cdbd2cSJim Jagielskiuse installer::logger; 30*b1cdbd2cSJim Jagielskiuse installer::pathanalyzer; 31*b1cdbd2cSJim Jagielskiuse installer::scriptitems; 32*b1cdbd2cSJim Jagielskiuse installer::systemactions; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski##################################################################### 35*b1cdbd2cSJim Jagielski# Checking whether a file has to be stripped 36*b1cdbd2cSJim Jagielski##################################################################### 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielskisub is_upx_candidate 39*b1cdbd2cSJim Jagielski{ 40*b1cdbd2cSJim Jagielski my ( $filename, $onefile ) = @_; 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski my $useupx = 0; 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski if (( $filename =~ /\.so\s*$/ ) || 45*b1cdbd2cSJim Jagielski ( $filename =~ /\.dll\s*$/ ) || 46*b1cdbd2cSJim Jagielski ( $filename =~ /\.exe\s*$/ ) || 47*b1cdbd2cSJim Jagielski ( $filename =~ /\.bin\s*$/ )) 48*b1cdbd2cSJim Jagielski { 49*b1cdbd2cSJim Jagielski my $styles = ""; 50*b1cdbd2cSJim Jagielski if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } 51*b1cdbd2cSJim Jagielski if ( ! ( $styles =~ /\bDONT_UPX\b/ )) { $useupx = 1; } 52*b1cdbd2cSJim Jagielski } 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski return $useupx; 55*b1cdbd2cSJim Jagielski} 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski##################################################################### 58*b1cdbd2cSJim Jagielski# Checking whether a file has to be stripped 59*b1cdbd2cSJim Jagielski##################################################################### 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielskisub do_upx 62*b1cdbd2cSJim Jagielski{ 63*b1cdbd2cSJim Jagielski my ( $filename ) = @_; 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski my $compression = "9"; 66*b1cdbd2cSJim Jagielski my $systemcall = $installer::globals::upxfile . " -" . $compression . " " . $filename; 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski my $returnvalue = system($systemcall); 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski my $infoline = "Systemcall: $systemcall\n"; 71*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski if ($returnvalue) 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski $infoline = "WARNING: Could not successfully upx $filename! Using original file.\n"; 76*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 77*b1cdbd2cSJim Jagielski } 78*b1cdbd2cSJim Jagielski else 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski $infoline = "SUCCESS: upx $filename!\n"; 81*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski return $returnvalue; 85*b1cdbd2cSJim Jagielski} 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski##################################################################### 88*b1cdbd2cSJim Jagielski# Using upx to decrease file size 89*b1cdbd2cSJim Jagielski##################################################################### 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielskisub upx_on_libraries 92*b1cdbd2cSJim Jagielski{ 93*b1cdbd2cSJim Jagielski my ( $filelist, $languagestringref) = @_; 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("UPX'ing files:"); 96*b1cdbd2cSJim Jagielski my $infoline = ""; 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski if ( ! $installer::globals::upx_in_path ) 99*b1cdbd2cSJim Jagielski { 100*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 101*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 102*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("Warning: This is an UPX product, but upx was not found in PATH!\n"); 103*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski else 106*b1cdbd2cSJim Jagielski { 107*b1cdbd2cSJim Jagielski $infoline = "Using upx: $installer::globals::upxfile\n"; 108*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski my $upxdirbase = installer::systemactions::create_directories("upx", $languagestringref); 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski if (! installer::existence::exists_in_array($upxdirbase, \@installer::globals::removedirs)) 113*b1cdbd2cSJim Jagielski { 114*b1cdbd2cSJim Jagielski push(@installer::globals::removedirs, $upxdirbase); 115*b1cdbd2cSJim Jagielski } 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filelist}; $i++ ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski my $sourcefilename = ${$filelist}[$i]->{'sourcepath'}; 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski if ( is_upx_candidate($sourcefilename, ${$filelist}[$i]) ) 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski my $shortfilename = $sourcefilename; 124*b1cdbd2cSJim Jagielski installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortfilename); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 127*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Upx: %s", $shortfilename); 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski # copy file into directory for stripped libraries 130*b1cdbd2cSJim Jagielski my $onelanguage = ${$filelist}[$i]->{'specificlanguage'}; 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski # files without language into directory "00" 133*b1cdbd2cSJim Jagielski if ($onelanguage eq "") { $onelanguage = "00"; } 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski my $upxdir = $upxdirbase . $installer::globals::separator . $onelanguage; 136*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($upxdir); # creating language specific subdirectories 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski my $destfilename = $upxdir . $installer::globals::separator . $shortfilename; 139*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file($sourcefilename, $destfilename); 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski # change sourcepath in files collector 142*b1cdbd2cSJim Jagielski ${$filelist}[$i]->{'sourcepath'} = $destfilename; 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski # do upx on file 145*b1cdbd2cSJim Jagielski my $return = do_upx($destfilename); 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski # Using original file, if upx was not successful (no reason for error) 148*b1cdbd2cSJim Jagielski if ( $return ) { ${$filelist}[$i]->{'sourcepath'} = $sourcefilename; } 149*b1cdbd2cSJim Jagielski } 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski } 152*b1cdbd2cSJim Jagielski} 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski1; 155