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