xref: /AOO41X/main/solenv/bin/modules/installer/systemactions.pm (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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