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