1*cdf0e10cSrcweir#************************************************************************* 2*cdf0e10cSrcweir# 3*cdf0e10cSrcweir# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir# 5*cdf0e10cSrcweir# Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir# 7*cdf0e10cSrcweir# OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir# 9*cdf0e10cSrcweir# This file is part of OpenOffice.org. 10*cdf0e10cSrcweir# 11*cdf0e10cSrcweir# OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir# it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir# only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir# 15*cdf0e10cSrcweir# OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir# but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir# GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir# (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir# 21*cdf0e10cSrcweir# You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir# version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir# <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir# for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir# 26*cdf0e10cSrcweir#************************************************************************* 27*cdf0e10cSrcweir 28*cdf0e10cSrcweirpackage installer::systemactions; 29*cdf0e10cSrcweir 30*cdf0e10cSrcweiruse Cwd; 31*cdf0e10cSrcweiruse File::Copy; 32*cdf0e10cSrcweiruse installer::converter; 33*cdf0e10cSrcweiruse installer::exiter; 34*cdf0e10cSrcweiruse installer::globals; 35*cdf0e10cSrcweiruse installer::pathanalyzer; 36*cdf0e10cSrcweiruse installer::remover; 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir###################################################### 39*cdf0e10cSrcweir# Creating a new direcotory 40*cdf0e10cSrcweir###################################################### 41*cdf0e10cSrcweir 42*cdf0e10cSrcweirsub create_directory 43*cdf0e10cSrcweir{ 44*cdf0e10cSrcweir my ($directory) = @_; 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir my $returnvalue = 1; 47*cdf0e10cSrcweir my $infoline = ""; 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir if (!(-d $directory)) 50*cdf0e10cSrcweir { 51*cdf0e10cSrcweir $returnvalue = mkdir($directory, 0775); 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir if ($returnvalue) 54*cdf0e10cSrcweir { 55*cdf0e10cSrcweir $infoline = "\nCreated directory: $directory\n"; 56*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir my $localcall = "chmod 0775 $directory \>\/dev\/null 2\>\&1"; 59*cdf0e10cSrcweir system($localcall); 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir # chmod 0775 is not sufficient on mac to remove sticky tag 62*cdf0e10cSrcweir $localcall = "chmod a-s $directory \>\/dev\/null 2\>\&1"; 63*cdf0e10cSrcweir system($localcall); 64*cdf0e10cSrcweir } 65*cdf0e10cSrcweir else 66*cdf0e10cSrcweir { 67*cdf0e10cSrcweir # New solution in parallel packing: It is possible, that the directory now exists, although it 68*cdf0e10cSrcweir # was not created in this process. There is only an important error, if the directory does not 69*cdf0e10cSrcweir # exist now. 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir $infoline = "\nDid not succeed in creating directory: \"$directory\". Further attempts will follow.\n"; 72*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir if (!(-d $directory)) 75*cdf0e10cSrcweir { 76*cdf0e10cSrcweir # Problem with parallel packaging? -> Try a little harder, before exiting. 77*cdf0e10cSrcweir # Did someone else remove the parent directory in the meantime? 78*cdf0e10cSrcweir my $parentdir = $directory; 79*cdf0e10cSrcweir installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); 80*cdf0e10cSrcweir if (!(-d $parentdir)) 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir $returnvalue = mkdir($parentdir, 0775); 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir if ($returnvalue) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir $infoline = "\nAttention: Successfully created parent directory (should already be created before): $parentdir\n"; 87*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir my $localcall = "chmod 775 $parentdir \>\/dev\/null 2\>\&1"; 90*cdf0e10cSrcweir system($localcall); 91*cdf0e10cSrcweir } 92*cdf0e10cSrcweir else 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir $infoline = "\Error: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n"; 95*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 96*cdf0e10cSrcweir if ( -d $parentdir ) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir $infoline = "\nAttention: Finally the parent directory \"$parentdir\" exists, but I could not create it.\n"; 99*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir else 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir # Now it is time to exit, even the parent could not be created. 104*cdf0e10cSrcweir installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory"); 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir # At this point we have to assume, that the parent directory exist. 110*cdf0e10cSrcweir # Trying once more to create the desired directory 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir $returnvalue = mkdir($directory, 0775); 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir if ($returnvalue) 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir $infoline = "\nAttention: Created directory \"$directory\" in the second try.\n"; 117*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1"; 120*cdf0e10cSrcweir system($localcall); 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir else 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir if ( -d $directory ) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir $infoline = "\nAttention: Finally the directory \"$directory\" exists, but I could not create it.\n"; 127*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir else 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir # It is time to exit, even the second try failed. 132*cdf0e10cSrcweir installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory"); 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir } 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir else 137*cdf0e10cSrcweir { 138*cdf0e10cSrcweir $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n"; 139*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir } 143*cdf0e10cSrcweir else 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir $infoline = "\nAlready existing directory, did not create: $directory\n"; 146*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 147*cdf0e10cSrcweir } 148*cdf0e10cSrcweir} 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir###################################################### 151*cdf0e10cSrcweir# Creating a new direcotory with defined privileges 152*cdf0e10cSrcweir###################################################### 153*cdf0e10cSrcweir 154*cdf0e10cSrcweirsub create_directory_with_privileges 155*cdf0e10cSrcweir{ 156*cdf0e10cSrcweir my ($directory, $privileges) = @_; 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir my $returnvalue = 1; 159*cdf0e10cSrcweir my $infoline = ""; 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir if (!(-d $directory)) 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir my $localprivileges = oct("0".$privileges); # changes "777" to 0777 164*cdf0e10cSrcweir $returnvalue = mkdir($directory, $localprivileges); 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir if ($returnvalue) 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir $infoline = "\nCreated directory: $directory\n"; 169*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 172*cdf0e10cSrcweir system($localcall); 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir else 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir # New solution in parallel packing: It is possible, that the directory now exists, although it 177*cdf0e10cSrcweir # was not created in this process. There is only an important error, if the directory does not 178*cdf0e10cSrcweir # exist now. 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir $infoline = "\nDid not succeed in creating directory: \"$directory\". Further attempts will follow.\n"; 181*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir if (!(-d $directory)) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir # Problem with parallel packaging? -> Try a little harder, before exiting. 186*cdf0e10cSrcweir # Did someone else remove the parent directory in the meantime? 187*cdf0e10cSrcweir my $parentdir = $directory; 188*cdf0e10cSrcweir installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); 189*cdf0e10cSrcweir if (!(-d $parentdir)) 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir $returnvalue = mkdir($directory, $localprivileges); 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir if ($returnvalue) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir $infoline = "\nAttention: Successfully created parent directory (should already be created before): $parentdir\n"; 196*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir my $localcall = "chmod $privileges $parentdir \>\/dev\/null 2\>\&1"; 199*cdf0e10cSrcweir system($localcall); 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir else 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir $infoline = "\Error: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n"; 204*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 205*cdf0e10cSrcweir if ( -d $parentdir ) 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir $infoline = "\nAttention: Finally the parent directory \"$parentdir\" exists, but I could not create it.\n"; 208*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir else 211*cdf0e10cSrcweir { 212*cdf0e10cSrcweir # Now it is time to exit, even the parent could not be created. 213*cdf0e10cSrcweir installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory_with_privileges"); 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir } 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir # At this point we have to assume, that the parent directory exist. 219*cdf0e10cSrcweir # Trying once more to create the desired directory 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir $returnvalue = mkdir($directory, $localprivileges); 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir if ($returnvalue) 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir $infoline = "\nAttention: Created directory \"$directory\" in the second try.\n"; 226*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 229*cdf0e10cSrcweir system($localcall); 230*cdf0e10cSrcweir } 231*cdf0e10cSrcweir else 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir if ( -d $directory ) 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir $infoline = "\nAttention: Finally the directory \"$directory\" exists, but I could not create it.\n"; 236*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 237*cdf0e10cSrcweir } 238*cdf0e10cSrcweir else 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir # It is time to exit, even the second try failed. 241*cdf0e10cSrcweir installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory_with_privileges"); 242*cdf0e10cSrcweir } 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir } 245*cdf0e10cSrcweir else 246*cdf0e10cSrcweir { 247*cdf0e10cSrcweir $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n"; 248*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir else 253*cdf0e10cSrcweir { 254*cdf0e10cSrcweir $infoline = "\nAlready existing directory, did not create: $directory\n"; 255*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1"; 258*cdf0e10cSrcweir system($localcall); 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir} 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir###################################################### 263*cdf0e10cSrcweir# Removing a new direcotory 264*cdf0e10cSrcweir###################################################### 265*cdf0e10cSrcweir 266*cdf0e10cSrcweirsub remove_empty_directory 267*cdf0e10cSrcweir{ 268*cdf0e10cSrcweir my ($directory) = @_; 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir my $returnvalue = 1; 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir if (-d $directory) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir my $systemcall = "rmdir $directory"; 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir $returnvalue = system($systemcall); 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir my $infoline = "Systemcall: $systemcall\n"; 279*cdf0e10cSrcweir push( @installer::globals::logfileinfo, $infoline); 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir if ($returnvalue) 282*cdf0e10cSrcweir { 283*cdf0e10cSrcweir $infoline = "ERROR: Could not remove \"$directory\"!\n"; 284*cdf0e10cSrcweir push( @installer::globals::logfileinfo, $infoline); 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir else 287*cdf0e10cSrcweir { 288*cdf0e10cSrcweir $infoline = "Success: Removed \"$directory\"!\n"; 289*cdf0e10cSrcweir push( @installer::globals::logfileinfo, $infoline); 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir } 292*cdf0e10cSrcweir} 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir####################################################################### 295*cdf0e10cSrcweir# Calculating the number of languages in the string 296*cdf0e10cSrcweir####################################################################### 297*cdf0e10cSrcweir 298*cdf0e10cSrcweirsub get_number_of_langs 299*cdf0e10cSrcweir{ 300*cdf0e10cSrcweir my ($languagestring) = @_; 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir my $number = 1; 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir my $workstring = $languagestring; 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir while ( $workstring =~ /^\s*(.*)_(.*?)\s*$/ ) 307*cdf0e10cSrcweir { 308*cdf0e10cSrcweir $workstring = $1; 309*cdf0e10cSrcweir $number++; 310*cdf0e10cSrcweir } 311*cdf0e10cSrcweir 312*cdf0e10cSrcweir return $number; 313*cdf0e10cSrcweir} 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir####################################################################### 316*cdf0e10cSrcweir# Creating the directories, in which files are generated or unzipped 317*cdf0e10cSrcweir####################################################################### 318*cdf0e10cSrcweir 319*cdf0e10cSrcweirsub create_directories 320*cdf0e10cSrcweir{ 321*cdf0e10cSrcweir my ($newdirectory, $languagesref) =@_; 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir my $path = ""; 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir if (( $newdirectory eq "uno" ) || ( $newdirectory eq "zip" ) || ( $newdirectory eq "cab" ) || ( $newdirectory =~ /rdb\s*$/i )) # special handling for zip files, cab files and services file because of performance reasons 328*cdf0e10cSrcweir { 329*cdf0e10cSrcweir if ( $installer::globals::temppathdefined ) { $path = $installer::globals::temppath; } 330*cdf0e10cSrcweir else { $path = $installer::globals::unpackpath; } 331*cdf0e10cSrcweir $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 332*cdf0e10cSrcweir $path = $path . $installer::globals::separator; 333*cdf0e10cSrcweir } 334*cdf0e10cSrcweir elsif ( ( $newdirectory eq "jds" ) ) 335*cdf0e10cSrcweir { 336*cdf0e10cSrcweir if ( $installer::globals::jdstemppathdefined ) { $path = $installer::globals::jdstemppath; } 337*cdf0e10cSrcweir else { $path = $installer::globals::unpackpath; } 338*cdf0e10cSrcweir $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes 339*cdf0e10cSrcweir $path = $path . $installer::globals::separator; 340*cdf0e10cSrcweir installer::systemactions::create_directory($path); 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir else 343*cdf0e10cSrcweir { 344*cdf0e10cSrcweir $path = $installer::globals::unpackpath . $installer::globals::separator; 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir # special handling, if LOCALINSTALLDIR is set 347*cdf0e10cSrcweir if (( $installer::globals::localinstalldirset ) && ( $newdirectory eq "install" )) 348*cdf0e10cSrcweir { 349*cdf0e10cSrcweir $installer::globals::localinstalldir =~ s/\Q$installer::globals::separator\E\s*$//; 350*cdf0e10cSrcweir $path = $installer::globals::localinstalldir . $installer::globals::separator; 351*cdf0e10cSrcweir } 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir $infoline = "create_directories: Using $path for $newdirectory !\n"; 355*cdf0e10cSrcweir push( @installer::globals::logfileinfo, $infoline); 356*cdf0e10cSrcweir 357*cdf0e10cSrcweir if ($newdirectory eq "unzip" ) # special handling for common directory 358*cdf0e10cSrcweir { 359*cdf0e10cSrcweir $path = $path . ".." . $installer::globals::separator . "common" . $installer::globals::productextension . $installer::globals::separator; 360*cdf0e10cSrcweir create_directory($path); 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir $path = $path . $newdirectory . $installer::globals::separator; 363*cdf0e10cSrcweir create_directory($path); 364*cdf0e10cSrcweir } 365*cdf0e10cSrcweir else 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir my $localproductname = $installer::globals::product; 368*cdf0e10cSrcweir my $localproductsubdir = ""; 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir if ( $installer::globals::product =~ /^\s*(.+?)\_\_(.+?)\s*$/ ) 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir $localproductname = $1; 373*cdf0e10cSrcweir $localproductsubdir = $2; 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir if ( $installer::globals::languagepack ) { $path = $path . $localproductname . "_languagepack" . $installer::globals::separator; } 377*cdf0e10cSrcweir elsif ( $installer::globals::patch ) { $path = $path . $localproductname . "_patch" . $installer::globals::separator; } 378*cdf0e10cSrcweir else { $path = $path . $localproductname . $installer::globals::separator; } 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir create_directory($path); 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir if ( $localproductsubdir ) 383*cdf0e10cSrcweir { 384*cdf0e10cSrcweir $path = $path . $localproductsubdir . $installer::globals::separator; 385*cdf0e10cSrcweir create_directory($path); 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir $path = $path . $installer::globals::installertypedir . $installer::globals::separator; 389*cdf0e10cSrcweir create_directory($path); 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir $path = $path . $newdirectory . $installer::globals::separator; 392*cdf0e10cSrcweir create_directory($path); 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir my $locallanguagesref = ""; 395*cdf0e10cSrcweir 396*cdf0e10cSrcweir if ( $$languagesref ) { $locallanguagesref = $$languagesref; } 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir if (!($locallanguagesref eq "" )) # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir my $languagestring = $$languagesref; 401*cdf0e10cSrcweir 402*cdf0e10cSrcweir if (length($languagestring) > $installer::globals::max_lang_length ) 403*cdf0e10cSrcweir { 404*cdf0e10cSrcweir my $number_of_languages = get_number_of_langs($languagestring); 405*cdf0e10cSrcweir chomp(my $shorter = `echo $languagestring | md5sum | sed -e "s/ .*//g"`); 406*cdf0e10cSrcweir # $languagestring = $shorter; 407*cdf0e10cSrcweir my $id = substr($shorter, 0, 8); # taking only the first 8 digits 408*cdf0e10cSrcweir $languagestring = "lang_" . $number_of_languages . "_id_" . $id; 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir $path = $path . $languagestring . $installer::globals::separator; 412*cdf0e10cSrcweir create_directory($path); 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir } 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir installer::remover::remove_ending_pathseparator(\$path); 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir $path = installer::converter::make_path_conform($path); 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir return $path; 421*cdf0e10cSrcweir} 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir######################## 424*cdf0e10cSrcweir# Copying one file 425*cdf0e10cSrcweir######################## 426*cdf0e10cSrcweir 427*cdf0e10cSrcweirsub copy_one_file 428*cdf0e10cSrcweir{ 429*cdf0e10cSrcweir my ($source, $dest) = @_; 430*cdf0e10cSrcweir 431*cdf0e10cSrcweir my ($returnvalue, $infoline); 432*cdf0e10cSrcweir 433*cdf0e10cSrcweir my $copyreturn = copy($source, $dest); 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir if ($copyreturn) 436*cdf0e10cSrcweir { 437*cdf0e10cSrcweir $infoline = "Copy: $source to $dest\n"; 438*cdf0e10cSrcweir $returnvalue = 1; 439*cdf0e10cSrcweir } 440*cdf0e10cSrcweir else 441*cdf0e10cSrcweir { 442*cdf0e10cSrcweir $infoline = "ERROR: Could not copy $source to $dest\n"; 443*cdf0e10cSrcweir $returnvalue = 0; 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir if ( !$returnvalue ) { 449*cdf0e10cSrcweir return $returnvalue; 450*cdf0e10cSrcweir } 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir # taking care of file attributes 453*cdf0e10cSrcweir if ($installer::globals::iswin && -f $dest) { 454*cdf0e10cSrcweir my $mode = -x $source ? 0775 : 0664; 455*cdf0e10cSrcweir my $mode_str = sprintf("%o", $mode); 456*cdf0e10cSrcweir my $chmodreturn = chmod($mode, $dest); 457*cdf0e10cSrcweir if ($chmodreturn) 458*cdf0e10cSrcweir { 459*cdf0e10cSrcweir $infoline = "chmod $mode_str, $dest\n"; 460*cdf0e10cSrcweir $returnvalue = 1; 461*cdf0e10cSrcweir } 462*cdf0e10cSrcweir else 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir $infoline = "WARNING: Could not chmod $dest: $!\n"; 465*cdf0e10cSrcweir $returnvalue = 0; 466*cdf0e10cSrcweir } 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir return $returnvalue; 472*cdf0e10cSrcweir} 473*cdf0e10cSrcweir 474*cdf0e10cSrcweir########################## 475*cdf0e10cSrcweir# Hard linking one file 476*cdf0e10cSrcweir########################## 477*cdf0e10cSrcweir 478*cdf0e10cSrcweirsub hardlink_one_file 479*cdf0e10cSrcweir{ 480*cdf0e10cSrcweir my ($source, $dest) = @_; 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir my ($returnvalue, $infoline); 483*cdf0e10cSrcweir 484*cdf0e10cSrcweir my $copyreturn = link($source, $dest); 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir if ($copyreturn) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir $infoline = "Link: $source to $dest\n"; 489*cdf0e10cSrcweir $returnvalue = 1; 490*cdf0e10cSrcweir } 491*cdf0e10cSrcweir else 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir $infoline = "ERROR: Could not link $source to $dest\n"; 494*cdf0e10cSrcweir $returnvalue = 0; 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir 497*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir return $returnvalue; 500*cdf0e10cSrcweir} 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir########################## 503*cdf0e10cSrcweir# Soft linking one file 504*cdf0e10cSrcweir########################## 505*cdf0e10cSrcweir 506*cdf0e10cSrcweirsub softlink_one_file 507*cdf0e10cSrcweir{ 508*cdf0e10cSrcweir my ($source, $dest) = @_; 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir my ($returnvalue, $infoline); 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir my $linkreturn = symlink($source, $dest); 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir if ($linkreturn) 515*cdf0e10cSrcweir { 516*cdf0e10cSrcweir $infoline = "Symlink: $source to $dest\n"; 517*cdf0e10cSrcweir $returnvalue = 1; 518*cdf0e10cSrcweir } 519*cdf0e10cSrcweir else 520*cdf0e10cSrcweir { 521*cdf0e10cSrcweir $infoline = "ERROR: Could not symlink $source to $dest\n"; 522*cdf0e10cSrcweir $returnvalue = 0; 523*cdf0e10cSrcweir } 524*cdf0e10cSrcweir 525*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir return $returnvalue; 528*cdf0e10cSrcweir} 529*cdf0e10cSrcweir 530*cdf0e10cSrcweir######################## 531*cdf0e10cSrcweir# Renaming one file 532*cdf0e10cSrcweir######################## 533*cdf0e10cSrcweir 534*cdf0e10cSrcweirsub rename_one_file 535*cdf0e10cSrcweir{ 536*cdf0e10cSrcweir my ($source, $dest) = @_; 537*cdf0e10cSrcweir 538*cdf0e10cSrcweir my ($returnvalue, $infoline); 539*cdf0e10cSrcweir 540*cdf0e10cSrcweir my $renamereturn = rename($source, $dest); 541*cdf0e10cSrcweir 542*cdf0e10cSrcweir if ($renamereturn) 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir $infoline = "Rename: $source to $dest\n"; 545*cdf0e10cSrcweir $returnvalue = 1; 546*cdf0e10cSrcweir } 547*cdf0e10cSrcweir else 548*cdf0e10cSrcweir { 549*cdf0e10cSrcweir $infoline = "ERROR: Could not rename $source to $dest\n"; 550*cdf0e10cSrcweir $returnvalue = 0; 551*cdf0e10cSrcweir } 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir return $returnvalue; 556*cdf0e10cSrcweir} 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir########################################## 559*cdf0e10cSrcweir# Copying all files from one directory 560*cdf0e10cSrcweir# to another directory 561*cdf0e10cSrcweir########################################## 562*cdf0e10cSrcweir 563*cdf0e10cSrcweirsub copy_directory 564*cdf0e10cSrcweir{ 565*cdf0e10cSrcweir my ($sourcedir, $destdir) = @_; 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir my @sourcefiles = (); 568*cdf0e10cSrcweir 569*cdf0e10cSrcweir $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 570*cdf0e10cSrcweir $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir my $infoline = "\n"; 573*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 574*cdf0e10cSrcweir $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; 575*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir opendir(DIR, $sourcedir); 578*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 579*cdf0e10cSrcweir closedir(DIR); 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir my $onefile; 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 586*cdf0e10cSrcweir { 587*cdf0e10cSrcweir my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; 588*cdf0e10cSrcweir my $destfile = $destdir . $installer::globals::separator . $onefile; 589*cdf0e10cSrcweir if ( -f $sourcefile ) # only files, no directories 590*cdf0e10cSrcweir { 591*cdf0e10cSrcweir copy_one_file($sourcefile, $destfile); 592*cdf0e10cSrcweir } 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir } 595*cdf0e10cSrcweir} 596*cdf0e10cSrcweir 597*cdf0e10cSrcweir########################################## 598*cdf0e10cSrcweir# Copying all files from one directory 599*cdf0e10cSrcweir# to another directory 600*cdf0e10cSrcweir########################################## 601*cdf0e10cSrcweir 602*cdf0e10cSrcweirsub is_empty_dir 603*cdf0e10cSrcweir{ 604*cdf0e10cSrcweir my ($dir) = @_; 605*cdf0e10cSrcweir 606*cdf0e10cSrcweir my $directory_is_empty = 1; 607*cdf0e10cSrcweir my @sourcefiles = (); 608*cdf0e10cSrcweir 609*cdf0e10cSrcweir opendir(DIR, $dir); 610*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 611*cdf0e10cSrcweir closedir(DIR); 612*cdf0e10cSrcweir 613*cdf0e10cSrcweir my $onefile; 614*cdf0e10cSrcweir my @realcontent = (); 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 617*cdf0e10cSrcweir { 618*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 619*cdf0e10cSrcweir { 620*cdf0e10cSrcweir push(@realcontent, $onefile); 621*cdf0e10cSrcweir } 622*cdf0e10cSrcweir } 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir if ( $#realcontent > -1 ) { $directory_is_empty = 0; } 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir return $directory_is_empty; 627*cdf0e10cSrcweir} 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir##################################################################### 630*cdf0e10cSrcweir# Creating hard links to a complete directory with sub directories. 631*cdf0e10cSrcweir##################################################################### 632*cdf0e10cSrcweir 633*cdf0e10cSrcweirsub hardlink_complete_directory 634*cdf0e10cSrcweir{ 635*cdf0e10cSrcweir my ($sourcedir, $destdir) = @_; 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir my @sourcefiles = (); 638*cdf0e10cSrcweir 639*cdf0e10cSrcweir $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 640*cdf0e10cSrcweir $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 641*cdf0e10cSrcweir 642*cdf0e10cSrcweir if ( ! -d $destdir ) { create_directory($destdir); } 643*cdf0e10cSrcweir 644*cdf0e10cSrcweir my $infoline = "\n"; 645*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 646*cdf0e10cSrcweir $infoline = "Creating hard links for all files from directory $sourcedir to directory $destdir\n"; 647*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 648*cdf0e10cSrcweir 649*cdf0e10cSrcweir opendir(DIR, $sourcedir); 650*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 651*cdf0e10cSrcweir closedir(DIR); 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir my $onefile; 654*cdf0e10cSrcweir 655*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 656*cdf0e10cSrcweir { 657*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 658*cdf0e10cSrcweir { 659*cdf0e10cSrcweir my $source = $sourcedir . $installer::globals::separator . $onefile; 660*cdf0e10cSrcweir my $dest = $destdir . $installer::globals::separator . $onefile; 661*cdf0e10cSrcweir if ( -f $source ) # only files, no directories 662*cdf0e10cSrcweir { 663*cdf0e10cSrcweir hardlink_one_file($source, $dest); 664*cdf0e10cSrcweir } 665*cdf0e10cSrcweir if ( -d $source ) # recursive 666*cdf0e10cSrcweir { 667*cdf0e10cSrcweir hardlink_complete_directory($source, $dest); 668*cdf0e10cSrcweir } 669*cdf0e10cSrcweir } 670*cdf0e10cSrcweir } 671*cdf0e10cSrcweir} 672*cdf0e10cSrcweir 673*cdf0e10cSrcweir##################################################################### 674*cdf0e10cSrcweir# Creating hard links to a complete directory with sub directories. 675*cdf0e10cSrcweir##################################################################### 676*cdf0e10cSrcweir 677*cdf0e10cSrcweirsub softlink_complete_directory 678*cdf0e10cSrcweir{ 679*cdf0e10cSrcweir my ($sourcedir, $destdir, $depth) = @_; 680*cdf0e10cSrcweir 681*cdf0e10cSrcweir my @sourcefiles = (); 682*cdf0e10cSrcweir 683*cdf0e10cSrcweir $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 684*cdf0e10cSrcweir $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir if ( ! -d $destdir ) { create_directory($destdir); } 687*cdf0e10cSrcweir 688*cdf0e10cSrcweir my $infoline = "\n"; 689*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 690*cdf0e10cSrcweir $infoline = "Creating soft links for all files from directory $sourcedir to directory $destdir\n"; 691*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 692*cdf0e10cSrcweir 693*cdf0e10cSrcweir opendir(DIR, $sourcedir); 694*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 695*cdf0e10cSrcweir closedir(DIR); 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir my $onefile; 698*cdf0e10cSrcweir 699*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 702*cdf0e10cSrcweir { 703*cdf0e10cSrcweir my $source = $sourcedir . $installer::globals::separator . $onefile; 704*cdf0e10cSrcweir my $dest = $destdir . $installer::globals::separator . $onefile; 705*cdf0e10cSrcweir if ( -f $source ) # only files, no directories 706*cdf0e10cSrcweir { 707*cdf0e10cSrcweir my $localsource = $source; 708*cdf0e10cSrcweir if ( $depth > 0 ) { for ( my $i = 1; $i <= $depth; $i++ ) { $localsource = "../" . $localsource; } } 709*cdf0e10cSrcweir softlink_one_file($localsource, $dest); 710*cdf0e10cSrcweir } 711*cdf0e10cSrcweir if ( -d $source ) # recursive 712*cdf0e10cSrcweir { 713*cdf0e10cSrcweir my $newdepth = $depth + 1; 714*cdf0e10cSrcweir softlink_complete_directory($source, $dest, $newdepth); 715*cdf0e10cSrcweir } 716*cdf0e10cSrcweir } 717*cdf0e10cSrcweir } 718*cdf0e10cSrcweir} 719*cdf0e10cSrcweir 720*cdf0e10cSrcweir##################################################### 721*cdf0e10cSrcweir# Copying a complete directory with sub directories. 722*cdf0e10cSrcweir##################################################### 723*cdf0e10cSrcweir 724*cdf0e10cSrcweirsub copy_complete_directory 725*cdf0e10cSrcweir{ 726*cdf0e10cSrcweir my ($sourcedir, $destdir) = @_; 727*cdf0e10cSrcweir 728*cdf0e10cSrcweir my @sourcefiles = (); 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 731*cdf0e10cSrcweir $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 732*cdf0e10cSrcweir 733*cdf0e10cSrcweir if ( ! -d $destdir ) { create_directory($destdir); } 734*cdf0e10cSrcweir 735*cdf0e10cSrcweir my $infoline = "\n"; 736*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 737*cdf0e10cSrcweir $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; 738*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 739*cdf0e10cSrcweir 740*cdf0e10cSrcweir opendir(DIR, $sourcedir); 741*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 742*cdf0e10cSrcweir closedir(DIR); 743*cdf0e10cSrcweir 744*cdf0e10cSrcweir my $onefile; 745*cdf0e10cSrcweir 746*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 747*cdf0e10cSrcweir { 748*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 749*cdf0e10cSrcweir { 750*cdf0e10cSrcweir my $source = $sourcedir . $installer::globals::separator . $onefile; 751*cdf0e10cSrcweir my $dest = $destdir . $installer::globals::separator . $onefile; 752*cdf0e10cSrcweir if ( -f $source ) # only files, no directories 753*cdf0e10cSrcweir { 754*cdf0e10cSrcweir copy_one_file($source, $dest); 755*cdf0e10cSrcweir } 756*cdf0e10cSrcweir if ( -d $source ) # recursive 757*cdf0e10cSrcweir { 758*cdf0e10cSrcweir if ((!( $source =~ /packages\/SUNW/ )) && (!( $source =~ /packages\/OOO/ ))) # do not copy complete Solaris packages! 759*cdf0e10cSrcweir { 760*cdf0e10cSrcweir copy_complete_directory($source, $dest); 761*cdf0e10cSrcweir } 762*cdf0e10cSrcweir } 763*cdf0e10cSrcweir } 764*cdf0e10cSrcweir } 765*cdf0e10cSrcweir} 766*cdf0e10cSrcweir 767*cdf0e10cSrcweir##################################################################################### 768*cdf0e10cSrcweir# Copying a complete directory with sub directories, but not the CVS directories. 769*cdf0e10cSrcweir##################################################################################### 770*cdf0e10cSrcweir 771*cdf0e10cSrcweirsub copy_complete_directory_without_cvs 772*cdf0e10cSrcweir{ 773*cdf0e10cSrcweir my ($sourcedir, $destdir) = @_; 774*cdf0e10cSrcweir 775*cdf0e10cSrcweir my @sourcefiles = (); 776*cdf0e10cSrcweir 777*cdf0e10cSrcweir $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 778*cdf0e10cSrcweir $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 779*cdf0e10cSrcweir 780*cdf0e10cSrcweir if ( ! -d $destdir ) { create_directory($destdir); } 781*cdf0e10cSrcweir 782*cdf0e10cSrcweir my $infoline = "\n"; 783*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 784*cdf0e10cSrcweir $infoline = "Copying files from directory $sourcedir to directory $destdir (without CVS)\n"; 785*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 786*cdf0e10cSrcweir 787*cdf0e10cSrcweir opendir(DIR, $sourcedir); 788*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 789*cdf0e10cSrcweir closedir(DIR); 790*cdf0e10cSrcweir 791*cdf0e10cSrcweir my $onefile; 792*cdf0e10cSrcweir 793*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 794*cdf0e10cSrcweir { 795*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq "..")) && (!($onefile eq "CVS"))) 796*cdf0e10cSrcweir { 797*cdf0e10cSrcweir my $source = $sourcedir . $installer::globals::separator . $onefile; 798*cdf0e10cSrcweir my $dest = $destdir . $installer::globals::separator . $onefile; 799*cdf0e10cSrcweir if ( -f $source ) # only files, no directories 800*cdf0e10cSrcweir { 801*cdf0e10cSrcweir copy_one_file($source, $dest); 802*cdf0e10cSrcweir } 803*cdf0e10cSrcweir if ( -d $source ) # recursive 804*cdf0e10cSrcweir { 805*cdf0e10cSrcweir copy_complete_directory_without_cvs($source, $dest); 806*cdf0e10cSrcweir } 807*cdf0e10cSrcweir } 808*cdf0e10cSrcweir } 809*cdf0e10cSrcweir} 810*cdf0e10cSrcweir 811*cdf0e10cSrcweir##################################################### 812*cdf0e10cSrcweir# Copying all files with a specified file extension 813*cdf0e10cSrcweir# from one directory to another directory. 814*cdf0e10cSrcweir##################################################### 815*cdf0e10cSrcweir 816*cdf0e10cSrcweirsub copy_directory_with_fileextension 817*cdf0e10cSrcweir{ 818*cdf0e10cSrcweir my ($sourcedir, $destdir, $extension) = @_; 819*cdf0e10cSrcweir 820*cdf0e10cSrcweir my @sourcefiles = (); 821*cdf0e10cSrcweir 822*cdf0e10cSrcweir $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 823*cdf0e10cSrcweir $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 824*cdf0e10cSrcweir 825*cdf0e10cSrcweir $infoline = "\n"; 826*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 827*cdf0e10cSrcweir $infoline = "Copying files with extension $extension from directory $sourcedir to directory $destdir\n"; 828*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 829*cdf0e10cSrcweir 830*cdf0e10cSrcweir opendir(DIR, $sourcedir); 831*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 832*cdf0e10cSrcweir closedir(DIR); 833*cdf0e10cSrcweir 834*cdf0e10cSrcweir my $onefile; 835*cdf0e10cSrcweir 836*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 837*cdf0e10cSrcweir { 838*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 839*cdf0e10cSrcweir { 840*cdf0e10cSrcweir if ( $onefile =~ /\.$extension\s*$/ ) # only copying specified files 841*cdf0e10cSrcweir { 842*cdf0e10cSrcweir my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; 843*cdf0e10cSrcweir my $destfile = $destdir . $installer::globals::separator . $onefile; 844*cdf0e10cSrcweir if ( -f $sourcefile ) # only files, no directories 845*cdf0e10cSrcweir { 846*cdf0e10cSrcweir copy_one_file($sourcefile, $destfile); 847*cdf0e10cSrcweir } 848*cdf0e10cSrcweir } 849*cdf0e10cSrcweir } 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir} 852*cdf0e10cSrcweir 853*cdf0e10cSrcweir######################################################### 854*cdf0e10cSrcweir# Copying all files without a specified file extension 855*cdf0e10cSrcweir# from one directory to another directory. 856*cdf0e10cSrcweir######################################################### 857*cdf0e10cSrcweir 858*cdf0e10cSrcweirsub copy_directory_except_fileextension 859*cdf0e10cSrcweir{ 860*cdf0e10cSrcweir my ($sourcedir, $destdir, $extension) = @_; 861*cdf0e10cSrcweir 862*cdf0e10cSrcweir my @sourcefiles = (); 863*cdf0e10cSrcweir 864*cdf0e10cSrcweir $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; 865*cdf0e10cSrcweir $destdir =~ s/\Q$installer::globals::separator\E\s*$//; 866*cdf0e10cSrcweir 867*cdf0e10cSrcweir $infoline = "\n"; 868*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 869*cdf0e10cSrcweir $infoline = "Copying files without extension $extension from directory $sourcedir to directory $destdir\n"; 870*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 871*cdf0e10cSrcweir 872*cdf0e10cSrcweir opendir(DIR, $sourcedir); 873*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 874*cdf0e10cSrcweir closedir(DIR); 875*cdf0e10cSrcweir 876*cdf0e10cSrcweir my $onefile; 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 879*cdf0e10cSrcweir { 880*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 881*cdf0e10cSrcweir { 882*cdf0e10cSrcweir if ( ! ( $onefile =~ /\.$extension\s*$/ )) # only copying not having the specified extension 883*cdf0e10cSrcweir { 884*cdf0e10cSrcweir my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; 885*cdf0e10cSrcweir my $destfile = $destdir . $installer::globals::separator . $onefile; 886*cdf0e10cSrcweir if ( -f $sourcefile ) # only files, no directories 887*cdf0e10cSrcweir { 888*cdf0e10cSrcweir copy_one_file($sourcefile, $destfile); 889*cdf0e10cSrcweir } 890*cdf0e10cSrcweir } 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir } 893*cdf0e10cSrcweir} 894*cdf0e10cSrcweir 895*cdf0e10cSrcweir######################################################## 896*cdf0e10cSrcweir# Renaming all files with a specified file extension 897*cdf0e10cSrcweir# in a specified directory. 898*cdf0e10cSrcweir# Example: "Feature.idt.01" -> "Feature.idt" 899*cdf0e10cSrcweir######################################################## 900*cdf0e10cSrcweir 901*cdf0e10cSrcweirsub rename_files_with_fileextension 902*cdf0e10cSrcweir{ 903*cdf0e10cSrcweir my ($dir, $extension) = @_; 904*cdf0e10cSrcweir 905*cdf0e10cSrcweir my @sourcefiles = (); 906*cdf0e10cSrcweir 907*cdf0e10cSrcweir $dir =~ s/\Q$installer::globals::separator\E\s*$//; 908*cdf0e10cSrcweir 909*cdf0e10cSrcweir my $infoline = "\n"; 910*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 911*cdf0e10cSrcweir $infoline = "Renaming files with extension \"$extension\" in the directory $dir\n"; 912*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 913*cdf0e10cSrcweir 914*cdf0e10cSrcweir opendir(DIR, $dir); 915*cdf0e10cSrcweir @sourcefiles = readdir(DIR); 916*cdf0e10cSrcweir closedir(DIR); 917*cdf0e10cSrcweir 918*cdf0e10cSrcweir my $onefile; 919*cdf0e10cSrcweir 920*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 921*cdf0e10cSrcweir { 922*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 923*cdf0e10cSrcweir { 924*cdf0e10cSrcweir if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) # only renaming specified files 925*cdf0e10cSrcweir { 926*cdf0e10cSrcweir my $destfile = $1; 927*cdf0e10cSrcweir my $sourcefile = $dir . $installer::globals::separator . $onefile; 928*cdf0e10cSrcweir $destfile = $dir . $installer::globals::separator . $destfile; 929*cdf0e10cSrcweir if ( -f $sourcefile ) # only files, no directories 930*cdf0e10cSrcweir { 931*cdf0e10cSrcweir rename_one_file($sourcefile, $destfile); 932*cdf0e10cSrcweir } 933*cdf0e10cSrcweir } 934*cdf0e10cSrcweir } 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir} 937*cdf0e10cSrcweir 938*cdf0e10cSrcweir######################################################## 939*cdf0e10cSrcweir# Finding all files with a specified file extension 940*cdf0e10cSrcweir# in a specified directory. 941*cdf0e10cSrcweir######################################################## 942*cdf0e10cSrcweir 943*cdf0e10cSrcweirsub find_file_with_file_extension 944*cdf0e10cSrcweir{ 945*cdf0e10cSrcweir my ($extension, $dir) = @_; 946*cdf0e10cSrcweir 947*cdf0e10cSrcweir my @allfiles = (); 948*cdf0e10cSrcweir 949*cdf0e10cSrcweir $dir =~ s/\Q$installer::globals::separator\E\s*$//; 950*cdf0e10cSrcweir 951*cdf0e10cSrcweir my $infoline = "\n"; 952*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 953*cdf0e10cSrcweir $infoline = "Searching files with extension \"$extension\" in the directory $dir\n"; 954*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 955*cdf0e10cSrcweir 956*cdf0e10cSrcweir opendir(DIR, $dir); 957*cdf0e10cSrcweir @sourcefiles = sort readdir(DIR); 958*cdf0e10cSrcweir closedir(DIR); 959*cdf0e10cSrcweir 960*cdf0e10cSrcweir my $onefile; 961*cdf0e10cSrcweir 962*cdf0e10cSrcweir foreach $onefile (@sourcefiles) 963*cdf0e10cSrcweir { 964*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 965*cdf0e10cSrcweir { 966*cdf0e10cSrcweir if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) 967*cdf0e10cSrcweir { 968*cdf0e10cSrcweir push(@allfiles, $onefile) 969*cdf0e10cSrcweir } 970*cdf0e10cSrcweir } 971*cdf0e10cSrcweir } 972*cdf0e10cSrcweir 973*cdf0e10cSrcweir return \@allfiles; 974*cdf0e10cSrcweir} 975*cdf0e10cSrcweir 976*cdf0e10cSrcweir############################################################## 977*cdf0e10cSrcweir# Creating a unique directory, for example "01_inprogress_7" 978*cdf0e10cSrcweir# in the install directory. 979*cdf0e10cSrcweir############################################################## 980*cdf0e10cSrcweir 981*cdf0e10cSrcweirsub make_numbered_dir 982*cdf0e10cSrcweir{ 983*cdf0e10cSrcweir my ($newstring, $olddir) = @_; 984*cdf0e10cSrcweir 985*cdf0e10cSrcweir my $basedir = $olddir; 986*cdf0e10cSrcweir installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); 987*cdf0e10cSrcweir 988*cdf0e10cSrcweir my $alldirs = get_all_directories($basedir); 989*cdf0e10cSrcweir 990*cdf0e10cSrcweir # searching for the highest number extension 991*cdf0e10cSrcweir 992*cdf0e10cSrcweir my $maxnumber = 0; 993*cdf0e10cSrcweir 994*cdf0e10cSrcweir for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) 995*cdf0e10cSrcweir { 996*cdf0e10cSrcweir if ( ${$alldirs}[$i] =~ /\_(\d+)\s*$/ ) 997*cdf0e10cSrcweir { 998*cdf0e10cSrcweir my $number = $1; 999*cdf0e10cSrcweir if ( $number > $maxnumber ) { $maxnumber = $number; } 1000*cdf0e10cSrcweir } 1001*cdf0e10cSrcweir } 1002*cdf0e10cSrcweir 1003*cdf0e10cSrcweir my $newnumber = $maxnumber + 1; 1004*cdf0e10cSrcweir 1005*cdf0e10cSrcweir my $newdir = $olddir . "_" . $newstring . "_" . $newnumber; 1006*cdf0e10cSrcweir 1007*cdf0e10cSrcweir my $returndir = ""; 1008*cdf0e10cSrcweir 1009*cdf0e10cSrcweir if ( move($olddir, $newdir) ) 1010*cdf0e10cSrcweir { 1011*cdf0e10cSrcweir $infoline = "\nMoved directory from $olddir to $newdir\n"; 1012*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1013*cdf0e10cSrcweir $returndir = $newdir; 1014*cdf0e10cSrcweir } 1015*cdf0e10cSrcweir else 1016*cdf0e10cSrcweir { 1017*cdf0e10cSrcweir $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"make_numbered_dir\"\n"; 1018*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1019*cdf0e10cSrcweir $returndir = $olddir; 1020*cdf0e10cSrcweir } 1021*cdf0e10cSrcweir 1022*cdf0e10cSrcweir return $returndir; 1023*cdf0e10cSrcweir} 1024*cdf0e10cSrcweir 1025*cdf0e10cSrcweir############################################################## 1026*cdf0e10cSrcweir# Determining the highest number in the install directory. 1027*cdf0e10cSrcweir############################################################## 1028*cdf0e10cSrcweir 1029*cdf0e10cSrcweirsub determine_maximum_number 1030*cdf0e10cSrcweir{ 1031*cdf0e10cSrcweir my ($dir, $languagestringref) = @_; 1032*cdf0e10cSrcweir 1033*cdf0e10cSrcweir my $basedir = $dir; 1034*cdf0e10cSrcweir installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); 1035*cdf0e10cSrcweir 1036*cdf0e10cSrcweir my $alldirs = get_all_directories($basedir); 1037*cdf0e10cSrcweir 1038*cdf0e10cSrcweir my $maxnumber = 1; 1039*cdf0e10cSrcweir 1040*cdf0e10cSrcweir # In control.pm the installation directory is determined as: 1041*cdf0e10cSrcweir # $installer::globals::build . "_" . $installer::globals::lastminor . "_" . 1042*cdf0e10cSrcweir # "native_inprogress-number_" . $$languagesref . "\." . $installer::globals::buildid; 1043*cdf0e10cSrcweir 1044*cdf0e10cSrcweir # searching for the highest number extension after the first "-", which belongs to 1045*cdf0e10cSrcweir # $installer::globals::build, $installer::globals::lastminor and $installer::globals::buildid 1046*cdf0e10cSrcweir # In this step not looking for the language! 1047*cdf0e10cSrcweir 1048*cdf0e10cSrcweir my @correctbuildiddirs = (); 1049*cdf0e10cSrcweir 1050*cdf0e10cSrcweir for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) 1051*cdf0e10cSrcweir { 1052*cdf0e10cSrcweir my $onedir = ${$alldirs}[$i]; 1053*cdf0e10cSrcweir installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$onedir); 1054*cdf0e10cSrcweir 1055*cdf0e10cSrcweir if ( $onedir =~ /^\s*\Q$installer::globals::build\E\_\Q$installer::globals::lastminor\E\_(.*?)\-(\d+)\_(.*?)\.\Q$installer::globals::buildid\E\s*$/ ) 1056*cdf0e10cSrcweir { 1057*cdf0e10cSrcweir my $number = $2; 1058*cdf0e10cSrcweir if ( $number > $maxnumber ) { $maxnumber = $number; } 1059*cdf0e10cSrcweir push(@correctbuildiddirs, $onedir); 1060*cdf0e10cSrcweir } 1061*cdf0e10cSrcweir } 1062*cdf0e10cSrcweir 1063*cdf0e10cSrcweir # From all directories with correct $installer::globals::build, $installer::globals::lastminor 1064*cdf0e10cSrcweir # and $installer::globals::buildid, those directories, which already have the maximum number 1065*cdf0e10cSrcweir # have to be selected 1066*cdf0e10cSrcweir 1067*cdf0e10cSrcweir my @maximumnumberdirs = (); 1068*cdf0e10cSrcweir 1069*cdf0e10cSrcweir for ( my $i = 0; $i <= $#correctbuildiddirs; $i++ ) 1070*cdf0e10cSrcweir { 1071*cdf0e10cSrcweir my $onedir = $correctbuildiddirs[$i]; 1072*cdf0e10cSrcweir 1073*cdf0e10cSrcweir if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ ) 1074*cdf0e10cSrcweir { 1075*cdf0e10cSrcweir my $number = $2; 1076*cdf0e10cSrcweir 1077*cdf0e10cSrcweir if ( $number == $maxnumber ) 1078*cdf0e10cSrcweir { 1079*cdf0e10cSrcweir push(@maximumnumberdirs, $onedir); 1080*cdf0e10cSrcweir } 1081*cdf0e10cSrcweir } 1082*cdf0e10cSrcweir } 1083*cdf0e10cSrcweir 1084*cdf0e10cSrcweir # @maximumnumberdirs contains only those directories with correct $installer::globals::build, 1085*cdf0e10cSrcweir # $installer::globals::lastminor and $installer::globals::buildid, which already have the maximum number. 1086*cdf0e10cSrcweir # If the current language is part of this directory, the number has to be increased. 1087*cdf0e10cSrcweir 1088*cdf0e10cSrcweir my $increase_counter = 0; 1089*cdf0e10cSrcweir 1090*cdf0e10cSrcweir for ( my $i = 0; $i <= $#maximumnumberdirs; $i++ ) 1091*cdf0e10cSrcweir { 1092*cdf0e10cSrcweir my $onedir = $maximumnumberdirs[$i]; 1093*cdf0e10cSrcweir 1094*cdf0e10cSrcweir if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ ) 1095*cdf0e10cSrcweir { 1096*cdf0e10cSrcweir my $number = $2; 1097*cdf0e10cSrcweir my $languagestring = $3; 1098*cdf0e10cSrcweir 1099*cdf0e10cSrcweir if ( $languagestring eq $$languagestringref ) 1100*cdf0e10cSrcweir { 1101*cdf0e10cSrcweir $increase_counter = 1; 1102*cdf0e10cSrcweir } 1103*cdf0e10cSrcweir } 1104*cdf0e10cSrcweir } 1105*cdf0e10cSrcweir 1106*cdf0e10cSrcweir if ( $increase_counter ) 1107*cdf0e10cSrcweir { 1108*cdf0e10cSrcweir $maxnumber = $maxnumber + 1; 1109*cdf0e10cSrcweir } 1110*cdf0e10cSrcweir 1111*cdf0e10cSrcweir return $maxnumber; 1112*cdf0e10cSrcweir} 1113*cdf0e10cSrcweir 1114*cdf0e10cSrcweir##################################################################################### 1115*cdf0e10cSrcweir# Renaming a directory by exchanging a string, for example from "01_inprogress_7" 1116*cdf0e10cSrcweir# to "01_witherror_7". 1117*cdf0e10cSrcweir##################################################################################### 1118*cdf0e10cSrcweir 1119*cdf0e10cSrcweirsub rename_string_in_directory 1120*cdf0e10cSrcweir{ 1121*cdf0e10cSrcweir my ($olddir, $oldstring, $newstring) = @_; 1122*cdf0e10cSrcweir 1123*cdf0e10cSrcweir my $newdir = $olddir; 1124*cdf0e10cSrcweir my $infoline = ""; 1125*cdf0e10cSrcweir 1126*cdf0e10cSrcweir $newdir =~ s/$oldstring/$newstring/g; 1127*cdf0e10cSrcweir 1128*cdf0e10cSrcweir if (( -d $newdir ) && ( $olddir ne $newdir )) { remove_complete_directory($newdir, 1); } 1129*cdf0e10cSrcweir 1130*cdf0e10cSrcweir if ( move($olddir, $newdir) ) 1131*cdf0e10cSrcweir { 1132*cdf0e10cSrcweir $infoline = "\nMoved directory from $olddir to $newdir\n"; 1133*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1134*cdf0e10cSrcweir } 1135*cdf0e10cSrcweir else 1136*cdf0e10cSrcweir { 1137*cdf0e10cSrcweir $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"rename_string_in_directory\"\n"; 1138*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1139*cdf0e10cSrcweir } 1140*cdf0e10cSrcweir 1141*cdf0e10cSrcweir return $newdir; 1142*cdf0e10cSrcweir} 1143*cdf0e10cSrcweir 1144*cdf0e10cSrcweir###################################################### 1145*cdf0e10cSrcweir# Returning the complete directory name, 1146*cdf0e10cSrcweir# input is the first part of the directory name. 1147*cdf0e10cSrcweir###################################################### 1148*cdf0e10cSrcweir 1149*cdf0e10cSrcweirsub get_directoryname 1150*cdf0e10cSrcweir{ 1151*cdf0e10cSrcweir my ($searchdir, $startstring) = @_; 1152*cdf0e10cSrcweir 1153*cdf0e10cSrcweir my $dirname = ""; 1154*cdf0e10cSrcweir my $founddir = 0; 1155*cdf0e10cSrcweir my $direntry; 1156*cdf0e10cSrcweir 1157*cdf0e10cSrcweir opendir(DIR, $searchdir); 1158*cdf0e10cSrcweir 1159*cdf0e10cSrcweir foreach $direntry (readdir (DIR)) 1160*cdf0e10cSrcweir { 1161*cdf0e10cSrcweir next if $direntry eq "."; 1162*cdf0e10cSrcweir next if $direntry eq ".."; 1163*cdf0e10cSrcweir 1164*cdf0e10cSrcweir if (( -d $direntry ) && ( $direntry =~ /^\s*\Q$startstring\E/ )) 1165*cdf0e10cSrcweir { 1166*cdf0e10cSrcweir $dirname = $direntry; 1167*cdf0e10cSrcweir $founddir = 1; 1168*cdf0e10cSrcweir last; 1169*cdf0e10cSrcweir } 1170*cdf0e10cSrcweir } 1171*cdf0e10cSrcweir 1172*cdf0e10cSrcweir closedir(DIR); 1173*cdf0e10cSrcweir 1174*cdf0e10cSrcweir if ( ! $founddir ) { installer::exiter::exit_program("ERROR: Did not find directory beginning with $startstring in directory $searchdir", "get_directoryname"); } 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir return $dirname; 1177*cdf0e10cSrcweir} 1178*cdf0e10cSrcweir 1179*cdf0e10cSrcweir 1180*cdf0e10cSrcweir################################### 1181*cdf0e10cSrcweir# Renaming a directory 1182*cdf0e10cSrcweir################################### 1183*cdf0e10cSrcweir 1184*cdf0e10cSrcweirsub rename_directory 1185*cdf0e10cSrcweir{ 1186*cdf0e10cSrcweir my ($olddir, $newdir) = @_; 1187*cdf0e10cSrcweir 1188*cdf0e10cSrcweir my $infoline = ""; 1189*cdf0e10cSrcweir 1190*cdf0e10cSrcweir if ( move($olddir, $newdir) ) 1191*cdf0e10cSrcweir { 1192*cdf0e10cSrcweir $infoline = "\nMoved directory from $olddir to $newdir\n"; 1193*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1194*cdf0e10cSrcweir } 1195*cdf0e10cSrcweir else 1196*cdf0e10cSrcweir { 1197*cdf0e10cSrcweir installer::exiter::exit_program("ERROR: Could not move directory from $olddir to $newdir", "rename_directory"); 1198*cdf0e10cSrcweir # $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"rename_directory\"\n"; 1199*cdf0e10cSrcweir # push(@installer::globals::logfileinfo, $infoline); 1200*cdf0e10cSrcweir } 1201*cdf0e10cSrcweir 1202*cdf0e10cSrcweir return $newdir; 1203*cdf0e10cSrcweir} 1204*cdf0e10cSrcweir 1205*cdf0e10cSrcweir############################################################## 1206*cdf0e10cSrcweir# Creating a directory next to an existing directory 1207*cdf0e10cSrcweir############################################################## 1208*cdf0e10cSrcweir 1209*cdf0e10cSrcweirsub create_directory_next_to_directory 1210*cdf0e10cSrcweir{ 1211*cdf0e10cSrcweir my ($topdir, $dirname) = @_; 1212*cdf0e10cSrcweir 1213*cdf0e10cSrcweir my $basedir = $topdir; 1214*cdf0e10cSrcweir installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); 1215*cdf0e10cSrcweir 1216*cdf0e10cSrcweir $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1217*cdf0e10cSrcweir 1218*cdf0e10cSrcweir my $newdir = $basedir . $installer::globals::separator . $dirname; 1219*cdf0e10cSrcweir 1220*cdf0e10cSrcweir create_directory($newdir); 1221*cdf0e10cSrcweir 1222*cdf0e10cSrcweir return $newdir; 1223*cdf0e10cSrcweir} 1224*cdf0e10cSrcweir 1225*cdf0e10cSrcweir############################################################## 1226*cdf0e10cSrcweir# Collecting all directories inside a directory 1227*cdf0e10cSrcweir############################################################## 1228*cdf0e10cSrcweir 1229*cdf0e10cSrcweirsub get_all_directories 1230*cdf0e10cSrcweir{ 1231*cdf0e10cSrcweir my ($basedir) = @_; 1232*cdf0e10cSrcweir 1233*cdf0e10cSrcweir my @alldirs = (); 1234*cdf0e10cSrcweir my $direntry; 1235*cdf0e10cSrcweir 1236*cdf0e10cSrcweir $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1237*cdf0e10cSrcweir 1238*cdf0e10cSrcweir opendir(DIR, $basedir); 1239*cdf0e10cSrcweir 1240*cdf0e10cSrcweir foreach $direntry (readdir (DIR)) 1241*cdf0e10cSrcweir { 1242*cdf0e10cSrcweir next if $direntry eq "."; 1243*cdf0e10cSrcweir next if $direntry eq ".."; 1244*cdf0e10cSrcweir 1245*cdf0e10cSrcweir my $completeentry = $basedir . $installer::globals::separator . $direntry; 1246*cdf0e10cSrcweir 1247*cdf0e10cSrcweir if ( -d $completeentry ) { push(@alldirs, $completeentry); } 1248*cdf0e10cSrcweir } 1249*cdf0e10cSrcweir 1250*cdf0e10cSrcweir closedir(DIR); 1251*cdf0e10cSrcweir 1252*cdf0e10cSrcweir return \@alldirs; 1253*cdf0e10cSrcweir} 1254*cdf0e10cSrcweir 1255*cdf0e10cSrcweir############################################################## 1256*cdf0e10cSrcweir# Collecting all directories inside a directory 1257*cdf0e10cSrcweir# Returning without path 1258*cdf0e10cSrcweir############################################################## 1259*cdf0e10cSrcweir 1260*cdf0e10cSrcweirsub get_all_directories_without_path 1261*cdf0e10cSrcweir{ 1262*cdf0e10cSrcweir my ($basedir) = @_; 1263*cdf0e10cSrcweir 1264*cdf0e10cSrcweir my @alldirs = (); 1265*cdf0e10cSrcweir my $direntry; 1266*cdf0e10cSrcweir 1267*cdf0e10cSrcweir $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1268*cdf0e10cSrcweir 1269*cdf0e10cSrcweir opendir(DIR, $basedir); 1270*cdf0e10cSrcweir 1271*cdf0e10cSrcweir foreach $direntry (readdir (DIR)) 1272*cdf0e10cSrcweir { 1273*cdf0e10cSrcweir next if $direntry eq "."; 1274*cdf0e10cSrcweir next if $direntry eq ".."; 1275*cdf0e10cSrcweir 1276*cdf0e10cSrcweir my $completeentry = $basedir . $installer::globals::separator . $direntry; 1277*cdf0e10cSrcweir 1278*cdf0e10cSrcweir if ( -d $completeentry ) { push(@alldirs, $direntry); } 1279*cdf0e10cSrcweir } 1280*cdf0e10cSrcweir 1281*cdf0e10cSrcweir closedir(DIR); 1282*cdf0e10cSrcweir 1283*cdf0e10cSrcweir return \@alldirs; 1284*cdf0e10cSrcweir} 1285*cdf0e10cSrcweir 1286*cdf0e10cSrcweir############################################################## 1287*cdf0e10cSrcweir# Collecting all files inside one directory 1288*cdf0e10cSrcweir############################################################## 1289*cdf0e10cSrcweir 1290*cdf0e10cSrcweirsub get_all_files_from_one_directory 1291*cdf0e10cSrcweir{ 1292*cdf0e10cSrcweir my ($basedir) = @_; 1293*cdf0e10cSrcweir 1294*cdf0e10cSrcweir my @allfiles = (); 1295*cdf0e10cSrcweir my $direntry; 1296*cdf0e10cSrcweir 1297*cdf0e10cSrcweir $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1298*cdf0e10cSrcweir 1299*cdf0e10cSrcweir opendir(DIR, $basedir); 1300*cdf0e10cSrcweir 1301*cdf0e10cSrcweir foreach $direntry (readdir (DIR)) 1302*cdf0e10cSrcweir { 1303*cdf0e10cSrcweir next if $direntry eq "."; 1304*cdf0e10cSrcweir next if $direntry eq ".."; 1305*cdf0e10cSrcweir 1306*cdf0e10cSrcweir my $completeentry = $basedir . $installer::globals::separator . $direntry; 1307*cdf0e10cSrcweir 1308*cdf0e10cSrcweir if ( -f $completeentry ) { push(@allfiles, $completeentry); } 1309*cdf0e10cSrcweir } 1310*cdf0e10cSrcweir 1311*cdf0e10cSrcweir closedir(DIR); 1312*cdf0e10cSrcweir 1313*cdf0e10cSrcweir return \@allfiles; 1314*cdf0e10cSrcweir} 1315*cdf0e10cSrcweir 1316*cdf0e10cSrcweir############################################################## 1317*cdf0e10cSrcweir# Collecting all files inside one directory 1318*cdf0e10cSrcweir############################################################## 1319*cdf0e10cSrcweir 1320*cdf0e10cSrcweirsub get_all_files_from_one_directory_without_path 1321*cdf0e10cSrcweir{ 1322*cdf0e10cSrcweir my ($basedir) = @_; 1323*cdf0e10cSrcweir 1324*cdf0e10cSrcweir my @allfiles = (); 1325*cdf0e10cSrcweir my $direntry; 1326*cdf0e10cSrcweir 1327*cdf0e10cSrcweir $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1328*cdf0e10cSrcweir 1329*cdf0e10cSrcweir opendir(DIR, $basedir); 1330*cdf0e10cSrcweir 1331*cdf0e10cSrcweir foreach $direntry (readdir (DIR)) 1332*cdf0e10cSrcweir { 1333*cdf0e10cSrcweir next if $direntry eq "."; 1334*cdf0e10cSrcweir next if $direntry eq ".."; 1335*cdf0e10cSrcweir 1336*cdf0e10cSrcweir my $completeentry = $basedir . $installer::globals::separator . $direntry; 1337*cdf0e10cSrcweir 1338*cdf0e10cSrcweir if ( -f $completeentry ) { push(@allfiles, $direntry); } 1339*cdf0e10cSrcweir } 1340*cdf0e10cSrcweir 1341*cdf0e10cSrcweir closedir(DIR); 1342*cdf0e10cSrcweir 1343*cdf0e10cSrcweir return \@allfiles; 1344*cdf0e10cSrcweir} 1345*cdf0e10cSrcweir 1346*cdf0e10cSrcweir############################################################## 1347*cdf0e10cSrcweir# Collecting all files and directories inside one directory 1348*cdf0e10cSrcweir############################################################## 1349*cdf0e10cSrcweir 1350*cdf0e10cSrcweirsub read_directory 1351*cdf0e10cSrcweir{ 1352*cdf0e10cSrcweir my ($basedir) = @_; 1353*cdf0e10cSrcweir 1354*cdf0e10cSrcweir my @allcontent = (); 1355*cdf0e10cSrcweir my $direntry; 1356*cdf0e10cSrcweir 1357*cdf0e10cSrcweir $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1358*cdf0e10cSrcweir 1359*cdf0e10cSrcweir opendir(DIR, $basedir); 1360*cdf0e10cSrcweir 1361*cdf0e10cSrcweir foreach $direntry (readdir (DIR)) 1362*cdf0e10cSrcweir { 1363*cdf0e10cSrcweir next if $direntry eq "."; 1364*cdf0e10cSrcweir next if $direntry eq ".."; 1365*cdf0e10cSrcweir 1366*cdf0e10cSrcweir my $completeentry = $basedir . $installer::globals::separator . $direntry; 1367*cdf0e10cSrcweir 1368*cdf0e10cSrcweir if (( -f $completeentry ) || ( -d $completeentry )) { push(@allcontent, $completeentry); } 1369*cdf0e10cSrcweir } 1370*cdf0e10cSrcweir 1371*cdf0e10cSrcweir closedir(DIR); 1372*cdf0e10cSrcweir 1373*cdf0e10cSrcweir return \@allcontent; 1374*cdf0e10cSrcweir} 1375*cdf0e10cSrcweir 1376*cdf0e10cSrcweir############################################################## 1377*cdf0e10cSrcweir# Finding the new content in a directory 1378*cdf0e10cSrcweir############################################################## 1379*cdf0e10cSrcweir 1380*cdf0e10cSrcweirsub find_new_content_in_directory 1381*cdf0e10cSrcweir{ 1382*cdf0e10cSrcweir my ( $basedir, $oldcontent ) = @_; 1383*cdf0e10cSrcweir 1384*cdf0e10cSrcweir my @newcontent = (); 1385*cdf0e10cSrcweir my @allcontent = (); 1386*cdf0e10cSrcweir 1387*cdf0e10cSrcweir my $direntry; 1388*cdf0e10cSrcweir 1389*cdf0e10cSrcweir $basedir =~ s/\Q$installer::globals::separator\E\s*$//; 1390*cdf0e10cSrcweir 1391*cdf0e10cSrcweir opendir(DIR, $basedir); 1392*cdf0e10cSrcweir 1393*cdf0e10cSrcweir foreach $direntry (readdir (DIR)) 1394*cdf0e10cSrcweir { 1395*cdf0e10cSrcweir next if $direntry eq "."; 1396*cdf0e10cSrcweir next if $direntry eq ".."; 1397*cdf0e10cSrcweir 1398*cdf0e10cSrcweir my $completeentry = $basedir . $installer::globals::separator . $direntry; 1399*cdf0e10cSrcweir 1400*cdf0e10cSrcweir if (( -f $completeentry ) || ( -d $completeentry )) 1401*cdf0e10cSrcweir { 1402*cdf0e10cSrcweir push(@allcontent, $completeentry); 1403*cdf0e10cSrcweir if (! installer::existence::exists_in_array($completeentry, $oldcontent)) 1404*cdf0e10cSrcweir { 1405*cdf0e10cSrcweir push(@newcontent, $completeentry); 1406*cdf0e10cSrcweir } 1407*cdf0e10cSrcweir } 1408*cdf0e10cSrcweir } 1409*cdf0e10cSrcweir 1410*cdf0e10cSrcweir closedir(DIR); 1411*cdf0e10cSrcweir 1412*cdf0e10cSrcweir return (\@newcontent, \@allcontent); 1413*cdf0e10cSrcweir} 1414*cdf0e10cSrcweir 1415*cdf0e10cSrcweir############################################################## 1416*cdf0e10cSrcweir# Trying to create a directory, no error if this fails 1417*cdf0e10cSrcweir############################################################## 1418*cdf0e10cSrcweir 1419*cdf0e10cSrcweirsub try_to_create_directory 1420*cdf0e10cSrcweir{ 1421*cdf0e10cSrcweir my ($directory) = @_; 1422*cdf0e10cSrcweir 1423*cdf0e10cSrcweir my $returnvalue = 1; 1424*cdf0e10cSrcweir my $created_directory = 0; 1425*cdf0e10cSrcweir 1426*cdf0e10cSrcweir if (!(-d $directory)) 1427*cdf0e10cSrcweir { 1428*cdf0e10cSrcweir $returnvalue = mkdir($directory, 0775); 1429*cdf0e10cSrcweir 1430*cdf0e10cSrcweir if ($returnvalue) 1431*cdf0e10cSrcweir { 1432*cdf0e10cSrcweir $created_directory = 1; 1433*cdf0e10cSrcweir $infoline = "\nCreated directory: $directory\n"; 1434*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1435*cdf0e10cSrcweir 1436*cdf0e10cSrcweir my $localcall = "chmod 0775 $directory \>\/dev\/null 2\>\&1"; 1437*cdf0e10cSrcweir system($localcall); 1438*cdf0e10cSrcweir 1439*cdf0e10cSrcweir # chmod 0775 is not sufficient on mac to remove sticky tag 1440*cdf0e10cSrcweir $localcall = "chmod a-s $directory \>\/dev\/null 2\>\&1"; 1441*cdf0e10cSrcweir system($localcall); 1442*cdf0e10cSrcweir } 1443*cdf0e10cSrcweir else 1444*cdf0e10cSrcweir { 1445*cdf0e10cSrcweir $created_directory = 0; 1446*cdf0e10cSrcweir } 1447*cdf0e10cSrcweir } 1448*cdf0e10cSrcweir else 1449*cdf0e10cSrcweir { 1450*cdf0e10cSrcweir $created_directory = 1; 1451*cdf0e10cSrcweir } 1452*cdf0e10cSrcweir 1453*cdf0e10cSrcweir return $created_directory; 1454*cdf0e10cSrcweir} 1455*cdf0e10cSrcweir 1456*cdf0e10cSrcweir############################################################## 1457*cdf0e10cSrcweir# Creating a complete directory structure 1458*cdf0e10cSrcweir############################################################## 1459*cdf0e10cSrcweir 1460*cdf0e10cSrcweirsub create_directory_structure 1461*cdf0e10cSrcweir{ 1462*cdf0e10cSrcweir my ($directory) = @_; 1463*cdf0e10cSrcweir 1464*cdf0e10cSrcweir if ( ! try_to_create_directory($directory) ) 1465*cdf0e10cSrcweir { 1466*cdf0e10cSrcweir my $parentdir = $directory; 1467*cdf0e10cSrcweir installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); 1468*cdf0e10cSrcweir 1469*cdf0e10cSrcweir my $infoline = "INFO: Did not create directory $directory\n"; 1470*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1471*cdf0e10cSrcweir $infoline = "Now trying to create parent directory $parentdir\n"; 1472*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1473*cdf0e10cSrcweir 1474*cdf0e10cSrcweir create_directory_structure($parentdir); # recursive 1475*cdf0e10cSrcweir } 1476*cdf0e10cSrcweir 1477*cdf0e10cSrcweir create_directory($directory); # now it has to succeed 1478*cdf0e10cSrcweir} 1479*cdf0e10cSrcweir 1480*cdf0e10cSrcweir###################################################### 1481*cdf0e10cSrcweir# Removing a complete directory with subdirectories 1482*cdf0e10cSrcweir###################################################### 1483*cdf0e10cSrcweir 1484*cdf0e10cSrcweirsub remove_complete_directory 1485*cdf0e10cSrcweir{ 1486*cdf0e10cSrcweir my ($directory, $start) = @_; 1487*cdf0e10cSrcweir 1488*cdf0e10cSrcweir my @content = (); 1489*cdf0e10cSrcweir my $infoline = ""; 1490*cdf0e10cSrcweir 1491*cdf0e10cSrcweir $directory =~ s/\Q$installer::globals::separator\E\s*$//; 1492*cdf0e10cSrcweir 1493*cdf0e10cSrcweir if ( -d $directory ) 1494*cdf0e10cSrcweir { 1495*cdf0e10cSrcweir if ( $start ) 1496*cdf0e10cSrcweir { 1497*cdf0e10cSrcweir $infoline = "\n"; 1498*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1499*cdf0e10cSrcweir $infoline = "Removing directory $directory\n"; 1500*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1501*cdf0e10cSrcweir } 1502*cdf0e10cSrcweir 1503*cdf0e10cSrcweir opendir(DIR, $directory); 1504*cdf0e10cSrcweir @content = readdir(DIR); 1505*cdf0e10cSrcweir closedir(DIR); 1506*cdf0e10cSrcweir 1507*cdf0e10cSrcweir my $oneitem; 1508*cdf0e10cSrcweir 1509*cdf0e10cSrcweir foreach $oneitem (@content) 1510*cdf0e10cSrcweir { 1511*cdf0e10cSrcweir if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 1512*cdf0e10cSrcweir { 1513*cdf0e10cSrcweir my $item = $directory . $installer::globals::separator . $oneitem; 1514*cdf0e10cSrcweir 1515*cdf0e10cSrcweir if ( -f $item || -l $item ) # deleting files or links 1516*cdf0e10cSrcweir { 1517*cdf0e10cSrcweir unlink($item); 1518*cdf0e10cSrcweir } 1519*cdf0e10cSrcweir 1520*cdf0e10cSrcweir if ( -d $item ) # recursive 1521*cdf0e10cSrcweir { 1522*cdf0e10cSrcweir remove_complete_directory($item, 0); 1523*cdf0e10cSrcweir } 1524*cdf0e10cSrcweir } 1525*cdf0e10cSrcweir } 1526*cdf0e10cSrcweir 1527*cdf0e10cSrcweir # try to remove empty directory 1528*cdf0e10cSrcweir 1529*cdf0e10cSrcweir my $returnvalue = rmdir $directory; 1530*cdf0e10cSrcweir 1531*cdf0e10cSrcweir if ( ! $returnvalue ) 1532*cdf0e10cSrcweir { 1533*cdf0e10cSrcweir $infoline = "Warning: Problem with removing empty dir $directory\n"; 1534*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1535*cdf0e10cSrcweir } 1536*cdf0e10cSrcweir 1537*cdf0e10cSrcweir # try a little bit harder (sometimes there is a performance problem) 1538*cdf0e10cSrcweir if ( -d $directory ) 1539*cdf0e10cSrcweir { 1540*cdf0e10cSrcweir for ( my $j = 1; $j <= 3; $j++ ) 1541*cdf0e10cSrcweir { 1542*cdf0e10cSrcweir if ( -d $directory ) 1543*cdf0e10cSrcweir { 1544*cdf0e10cSrcweir $infoline = "\n"; 1545*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1546*cdf0e10cSrcweir $infoline = "Warning (Try $j): Problems with removing directory $directory\n"; 1547*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1548*cdf0e10cSrcweir 1549*cdf0e10cSrcweir $returnvalue = rmdir $directory; 1550*cdf0e10cSrcweir 1551*cdf0e10cSrcweir if ( $returnvalue ) 1552*cdf0e10cSrcweir { 1553*cdf0e10cSrcweir $infoline = "Successfully removed empty dir $directory\n"; 1554*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1555*cdf0e10cSrcweir } else { 1556*cdf0e10cSrcweir $infoline = "Warning: rmdir $directory failed.\n"; 1557*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1558*cdf0e10cSrcweir } 1559*cdf0e10cSrcweir } 1560*cdf0e10cSrcweir } 1561*cdf0e10cSrcweir } 1562*cdf0e10cSrcweir } 1563*cdf0e10cSrcweir} 1564*cdf0e10cSrcweir 1565*cdf0e10cSrcweir###################################################### 1566*cdf0e10cSrcweir# Creating a unique directory with number extension 1567*cdf0e10cSrcweir###################################################### 1568*cdf0e10cSrcweir 1569*cdf0e10cSrcweirsub create_unique_directory 1570*cdf0e10cSrcweir{ 1571*cdf0e10cSrcweir my ($directory) = @_; 1572*cdf0e10cSrcweir 1573*cdf0e10cSrcweir $directory =~ s/\Q$installer::globals::separator\E\s*$//; 1574*cdf0e10cSrcweir $directory = $directory . "_INCREASINGNUMBER"; 1575*cdf0e10cSrcweir 1576*cdf0e10cSrcweir my $counter = 1; 1577*cdf0e10cSrcweir my $created = 0; 1578*cdf0e10cSrcweir my $localdirectory = ""; 1579*cdf0e10cSrcweir 1580*cdf0e10cSrcweir do 1581*cdf0e10cSrcweir { 1582*cdf0e10cSrcweir $localdirectory = $directory; 1583*cdf0e10cSrcweir $localdirectory =~ s/INCREASINGNUMBER/$counter/; 1584*cdf0e10cSrcweir $counter++; 1585*cdf0e10cSrcweir 1586*cdf0e10cSrcweir if ( ! -d $localdirectory ) 1587*cdf0e10cSrcweir { 1588*cdf0e10cSrcweir create_directory($localdirectory); 1589*cdf0e10cSrcweir $created = 1; 1590*cdf0e10cSrcweir } 1591*cdf0e10cSrcweir } 1592*cdf0e10cSrcweir while ( ! $created ); 1593*cdf0e10cSrcweir 1594*cdf0e10cSrcweir return $localdirectory; 1595*cdf0e10cSrcweir} 1596*cdf0e10cSrcweir 1597*cdf0e10cSrcweir###################################################### 1598*cdf0e10cSrcweir# Creating a unique directory with pid extension 1599*cdf0e10cSrcweir###################################################### 1600*cdf0e10cSrcweir 1601*cdf0e10cSrcweirsub create_pid_directory 1602*cdf0e10cSrcweir{ 1603*cdf0e10cSrcweir my ($directory) = @_; 1604*cdf0e10cSrcweir 1605*cdf0e10cSrcweir $directory =~ s/\Q$installer::globals::separator\E\s*$//; 1606*cdf0e10cSrcweir my $pid = $$; # process id 1607*cdf0e10cSrcweir my $time = time(); # time 1608*cdf0e10cSrcweir 1609*cdf0e10cSrcweir $directory = $directory . "_" . $pid . $time; 1610*cdf0e10cSrcweir 1611*cdf0e10cSrcweir if ( ! -d $directory ) { create_directory($directory); } 1612*cdf0e10cSrcweir else { installer::exiter::exit_program("ERROR: Directory $directory already exists!", "create_pid_directory"); } 1613*cdf0e10cSrcweir 1614*cdf0e10cSrcweir return $directory; 1615*cdf0e10cSrcweir} 1616*cdf0e10cSrcweir 1617*cdf0e10cSrcweir############################################################## 1618*cdf0e10cSrcweir# Reading all files from a directory and its subdirectories 1619*cdf0e10cSrcweir############################################################## 1620*cdf0e10cSrcweir 1621*cdf0e10cSrcweirsub read_complete_directory 1622*cdf0e10cSrcweir{ 1623*cdf0e10cSrcweir my ($directory, $pathstring, $filecollector) = @_; 1624*cdf0e10cSrcweir 1625*cdf0e10cSrcweir my @content = (); 1626*cdf0e10cSrcweir opendir(DIR, $directory); 1627*cdf0e10cSrcweir @content = readdir(DIR); 1628*cdf0e10cSrcweir closedir(DIR); 1629*cdf0e10cSrcweir 1630*cdf0e10cSrcweir my $onefile; 1631*cdf0e10cSrcweir 1632*cdf0e10cSrcweir foreach $onefile (@content) 1633*cdf0e10cSrcweir { 1634*cdf0e10cSrcweir if ((!($onefile eq ".")) && (!($onefile eq ".."))) 1635*cdf0e10cSrcweir { 1636*cdf0e10cSrcweir my $completefilename = $directory . $installer::globals::separator . $onefile; 1637*cdf0e10cSrcweir my $sep = ""; 1638*cdf0e10cSrcweir if ( $pathstring ne "" ) { $sep = $installer::globals::separator; } 1639*cdf0e10cSrcweir 1640*cdf0e10cSrcweir if ( ! -d $completefilename ) # only files, no directories 1641*cdf0e10cSrcweir { 1642*cdf0e10cSrcweir my $content = $pathstring . $sep . $onefile; 1643*cdf0e10cSrcweir push(@{$filecollector}, $content); 1644*cdf0e10cSrcweir } 1645*cdf0e10cSrcweir else # recursive for directories 1646*cdf0e10cSrcweir { 1647*cdf0e10cSrcweir my $newpathstring = $pathstring . $sep . $onefile; 1648*cdf0e10cSrcweir read_complete_directory($completefilename, $newpathstring, $filecollector); 1649*cdf0e10cSrcweir } 1650*cdf0e10cSrcweir } 1651*cdf0e10cSrcweir } 1652*cdf0e10cSrcweir} 1653*cdf0e10cSrcweir 1654*cdf0e10cSrcweir############################################################## 1655*cdf0e10cSrcweir# Reading all files from a directory and its subdirectories 1656*cdf0e10cSrcweir# Version 2 1657*cdf0e10cSrcweir############################################################## 1658*cdf0e10cSrcweir 1659*cdf0e10cSrcweirsub read_full_directory { 1660*cdf0e10cSrcweir my ( $currentdir, $pathstring, $collector ) = @_; 1661*cdf0e10cSrcweir my $item; 1662*cdf0e10cSrcweir my $fullname; 1663*cdf0e10cSrcweir local *DH; 1664*cdf0e10cSrcweir 1665*cdf0e10cSrcweir unless (opendir(DH, $currentdir)) 1666*cdf0e10cSrcweir { 1667*cdf0e10cSrcweir return; 1668*cdf0e10cSrcweir } 1669*cdf0e10cSrcweir while (defined ($item = readdir(DH))) 1670*cdf0e10cSrcweir { 1671*cdf0e10cSrcweir next if($item eq "." or $item eq ".."); 1672*cdf0e10cSrcweir $fullname = $currentdir . $installer::globals::separator . $item; 1673*cdf0e10cSrcweir my $sep = ""; 1674*cdf0e10cSrcweir if ( $pathstring ne "" ) { $sep = $installer::globals::separator; } 1675*cdf0e10cSrcweir 1676*cdf0e10cSrcweir if( -d $fullname) 1677*cdf0e10cSrcweir { 1678*cdf0e10cSrcweir my $newpathstring = $pathstring . $sep . $item; 1679*cdf0e10cSrcweir read_full_directory($fullname, $newpathstring, $collector) if(-d $fullname); 1680*cdf0e10cSrcweir } 1681*cdf0e10cSrcweir else 1682*cdf0e10cSrcweir { 1683*cdf0e10cSrcweir my $content = $pathstring . $sep . $item; 1684*cdf0e10cSrcweir push(@{$collector}, $content); 1685*cdf0e10cSrcweir } 1686*cdf0e10cSrcweir } 1687*cdf0e10cSrcweir closedir(DH); 1688*cdf0e10cSrcweir return 1689*cdf0e10cSrcweir} 1690*cdf0e10cSrcweir 1691*cdf0e10cSrcweir############################################################## 1692*cdf0e10cSrcweir# Removing all empty directories below a specified directory 1693*cdf0e10cSrcweir############################################################## 1694*cdf0e10cSrcweir 1695*cdf0e10cSrcweirsub remove_empty_dirs_in_folder 1696*cdf0e10cSrcweir{ 1697*cdf0e10cSrcweir my ( $dir ) = @_; 1698*cdf0e10cSrcweir 1699*cdf0e10cSrcweir my @content = (); 1700*cdf0e10cSrcweir my $infoline = ""; 1701*cdf0e10cSrcweir 1702*cdf0e10cSrcweir $dir =~ s/\Q$installer::globals::separator\E\s*$//; 1703*cdf0e10cSrcweir 1704*cdf0e10cSrcweir if ( -d $dir ) 1705*cdf0e10cSrcweir { 1706*cdf0e10cSrcweir opendir(DIR, $dir); 1707*cdf0e10cSrcweir @content = readdir(DIR); 1708*cdf0e10cSrcweir closedir(DIR); 1709*cdf0e10cSrcweir 1710*cdf0e10cSrcweir my $oneitem; 1711*cdf0e10cSrcweir 1712*cdf0e10cSrcweir foreach $oneitem (@content) 1713*cdf0e10cSrcweir { 1714*cdf0e10cSrcweir if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) 1715*cdf0e10cSrcweir { 1716*cdf0e10cSrcweir my $item = $dir . $installer::globals::separator . $oneitem; 1717*cdf0e10cSrcweir 1718*cdf0e10cSrcweir if ( -d $item ) # recursive 1719*cdf0e10cSrcweir { 1720*cdf0e10cSrcweir remove_empty_dirs_in_folder($item); 1721*cdf0e10cSrcweir } 1722*cdf0e10cSrcweir } 1723*cdf0e10cSrcweir } 1724*cdf0e10cSrcweir 1725*cdf0e10cSrcweir # try to remove empty directory 1726*cdf0e10cSrcweir my $returnvalue = rmdir $dir; 1727*cdf0e10cSrcweir 1728*cdf0e10cSrcweir if ( $returnvalue ) 1729*cdf0e10cSrcweir { 1730*cdf0e10cSrcweir $infoline = "Successfully removed empty dir $dir\n"; 1731*cdf0e10cSrcweir push(@installer::globals::logfileinfo, $infoline); 1732*cdf0e10cSrcweir } 1733*cdf0e10cSrcweir 1734*cdf0e10cSrcweir } 1735*cdf0e10cSrcweir 1736*cdf0e10cSrcweir} 1737*cdf0e10cSrcweir 1738*cdf0e10cSrcweir1; 1739