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